提示定制
注意:此文档适用于希望扩展/改进对不同 LLM 引擎支持的开发人员。
面向任务的提示
与 LLM 的交互是以面向任务的方式设计的,即,每次调用 LLM 时,它都必须执行特定的任务。最重要的任务是 guardrails 流程 的一部分,它们是
generate_user_intent
:从原始话语生成规范的用户消息(例如,“Hello there” ->express greeting
);generate_next_steps
:决定机器人应该说什么或应该执行什么操作(例如,bot express greeting
,bot respond to question
);generate_bot_message
:决定应该返回的确切机器人消息。general
:根据用户和机器人消息的历史记录生成下一个机器人消息;当没有定义对话 rail(即,没有用户消息规范形式)时,使用此任务。
查看 任务类型 以获取完整的任务列表。
提示配置
该工具包为每个任务和某些 LLM 模型提供了预定义的提示。它们位于 nemoguardrails/llm/prompts 文件夹中。您可以通过在 guardrails 配置中包含 prompts.yml
文件来进一步自定义提示(从技术上讲,文件名不是必需的,您也可以在常规 config.yml
文件中包含 prompts
键)。
此外,如果设置了环境变量 PROMPTS_DIR
,则工具包还将加载在指定目录中定义的任何提示。加载操作在 python 模块加载时执行一次。该文件夹必须包含一个或多个 .yml
文件,其中包含提示定义(在 prompts
键内)。
要覆盖特定模型的提示,您需要指定 models
键
prompts:
- task: general
models:
- databricks/dolly-v2-3b
content: |-
...
- task: generate_user_intent
models:
- databricks/dolly-v2-3b
content: |-
...
- ...
您可以将特定任务的提示与多个 LLM 模型关联
prompts:
- task: generate_user_intent
models:
- openai/gpt-3.5-turbo
- openai/gpt-4
...
要覆盖任何其他自定义用途的提示,您可以指定 mode
键。如果使用相同的 prompting_mode
运行相应的任务配置,则将使用自定义提示。
作为示例,让我们考虑压缩的情况。某些应用程序可能需要简洁的提示,例如为了避免处理长上下文,并在降低延迟的同时,承担因上下文较小而导致性能略有下降的风险。为此,您可能希望为同一任务和同一模型提供多个版本的提示。这可以通过以下方式实现
任务配置
models:
- type: main
engine: openai
model: gpt-3.5-turbo
prompting_mode: "compact" # Default value is "standard"
提示配置
prompts:
- task: generate_user_intent
models:
- openai/gpt-3.5-turbo
- openai/gpt-4
content: |-
Default prompt tailored for high accuracy with the given models for example by adding the fill {{ history }}
- task: generate_user_intent
models:
- openai/gpt-3.5-turbo
- openai/gpt-4
content: |-
Smaller prompt tailored for high accuracy by reducing number of few shot examples or other means
mode: compact
...
对于给定的任务和模型,您可以拥有任意多种不同的模式,只要提示配置中的 mode
键与顶级任务配置中的 prompting_mode
键匹配,从而为提示工程实验实现轻松设置。
请注意,如果您指定了自定义 prompting_mode
,但未定义具有相同自定义 mode
的提示定义,则将使用该任务的 standard
提示模板。
提示模板
根据 LLM 的类型,您可以定义两种类型的模板:completion 和 chat。对于完成模型(例如,gpt-3.5-turbo-instruct
),您需要在提示的配置中包含 content
键
prompts:
- task: generate_user_intent
models:
- openai/gpt-3.5-turbo-instruct
content: |-
...
对于聊天模型(例如,gpt-3.5-turbo
),您需要在提示的配置中包含 messages
键
prompts:
- task: generate_user_intent
models:
- openai/gpt-3.5-turbo
messages:
- type: system
content: ...
- type: user
content: ...
- type: bot
content: ...
# ...
对于每个任务,您还可以指定用于 LLM 调用的提示的最大长度(以字符数计)。如果您想限制 LLM 使用的令牌数量,或者当您想确保提示长度不超过最大上下文长度时,这非常有用。当超过最大长度时,提示将被截断,方法是从对话历史记录中删除较旧的轮次,直到提示的长度小于或等于最大长度。默认最大长度为 16000 个字符。
例如,对于 generate_user_intent
任务,您可以指定以下内容
prompts:
- task: generate_user_intent
models:
- openai/gpt-3.5-turbo
max_length: 3000
内容模板
完成提示的内容或聊天提示中消息的正文是一个字符串,它也可以包含变量以及可能的其他类型的构造。NeMo Guardrails 使用 Jinja2 作为模板引擎。查看 Jinja 概要 以获取快速入门。
例如,generate_user_intent
任务的默认模板如下
"""
{{ general_instructions }}
"""
# This is how a conversation between a user and the bot can go:
{{ sample_conversation }}
# This is how the user talks:
{{ examples }}
# This is the current conversation between the user and the bot:
{{ sample_conversation | first_turns(2) }}
{{ history | colang }}
变量
提示中可以包含三种类型的变量
系统变量
提示变量
上下文变量
系统变量
以下是系统变量的列表
提示变量
可以使用 LLMRails.register_prompt_context(name, value_or_fn)
方法注册提示变量。如果提供了函数,则将在每次呈现时计算变量的值。
上下文变量
guardrails 配置中包含的流程可以定义(和更新)各种 上下文变量。如果需要,这些变量也可以包含在提示中。
过滤器
过滤器的概念与 Jinja 中的概念相同(请参阅 Jinja 过滤器)。过滤器可以修改变量的内容,您可以使用管道符号 (|
) 应用多个过滤器。
预定义过滤器列表如下
colang
:将事件数组转换为等效的 colang 表示形式;remove_text_messages
:从 colang 历史记录中删除文本消息(仅留下用户意图、机器人意图和其他操作);first_turns(n)
:将 colang 历史记录限制为前n
轮;user_assistant_sequence
:将事件数组转换为“用户:…/助手:…”序列;to_messages
:将 colang 历史记录转换为用户和机器人消息序列(用于聊天模型);verbose_v1
:将 colang 历史记录转换为更详细和显式的形式。
输出解析器
可选地,可以使用输出解析器解析来自 LLM 的输出。预定义解析器列表如下
user_intent
:解析用户意图,即,如果存在,则删除“User intent:”前缀;bot_intent
:解析机器人意图,即,如果存在,则删除“Bot intent:”前缀;bot_message
:解析机器人消息,即,如果存在,则删除“Bot message:”前缀;verbose_v1
:解析verbose_v1
过滤器的输出。
预定义提示
目前,NeMo Guardrails 工具包包含用于 openai/gpt-3.5-turbo-instruct
、openai/gpt-3.5-turbo
、openai/gpt-4
、databricks/dolly-v2-3b
、cohere/command
、cohere/command-light
、cohere/command-light-nightly
的提示。
免责声明:评估和改进提供的提示是一项正在进行的工作。我们不建议在生产环境中使用这些提示部署此 alpha 版本。
自定义任务和提示
如果您想创建超出 默认任务 中包含的自定义任务,您可以包含任务和关联的提示,如下例所示
prompts:
- task: summarize_text
content: |-
Text: {{ user_input }}
Summarize the above text.
请参阅 “提示定制”,了解在何处包含此自定义任务和提示。
在操作中,可以通过 LLMTaskManager
呈现此提示
prompt = llm_task_manager.render_task_prompt(
task="summarize_text",
context={
"user_input": user_input,
},
)
with llm_params(llm, temperature=0.0):
check = await llm_call(llm, prompt)
...
使用这种方法,您可以快速修改配置文件中自定义任务的提示。