提示词定制#
注意:此文档适用于希望扩展/改进对不同 LLM 引擎的支持的开发人员。
面向任务的提示#
与 LLM 的交互是以面向任务的方式设计的,即每次调用 LLM 时,它都必须执行特定的任务。最重要的任务,是 guardrails 流程 的一部分,包括:
generate_user_intent
: 从原始话语生成规范的用户消息 (例如,“你好” ->express greeting
);generate_next_steps
: 决定 bot 应该说什么或应该执行什么操作 (例如,bot express greeting
,bot respond to question
);generate_bot_message
: 决定应该返回的确切 bot 消息。general
: 基于用户和 bot 消息的历史记录生成下一个 bot 消息; 此任务在未定义对话 rails 时使用 (即,没有用户消息规范形式)。
查看任务类型以获取完整的任务列表。
提示词配置#
该工具包为每个任务和某些 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。对于 completion 模型 (例如,gpt-3.5-turbo-instruct
),您需要在提示的配置中包含 content
键
prompts:
- task: generate_user_intent
models:
- openai/gpt-3.5-turbo-instruct
content: |-
...
对于 chat 模型 (例如,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 使用的 token 数量,或者当您想确保提示长度不超过最大上下文长度时,这非常有用。当超过最大长度时,会通过从对话历史记录中删除较旧的轮次来截断提示,直到提示的长度小于或等于最大长度。默认最大长度为 16000 个字符。
例如,对于 generate_user_intent
任务,您可以指定以下内容
prompts:
- task: generate_user_intent
models:
- openai/gpt-3.5-turbo
max_length: 3000
内容模板#
completion 提示的内容或 chat 提示中消息的主体是一个字符串,该字符串还可以包括变量和潜在的其他类型的构造。 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
: 解析用户意图,即删除“用户意图:”前缀(如果存在);bot_intent
: 解析机器人意图,即删除“机器人意图:”前缀(如果存在);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)
...
使用此方法,您可以快速修改配置文件中自定义任务的提示。