少样本提示
概览
提高模型性能最有效的方法之一是向模型提供你希望它执行任务的示例。将示例输入和预期输出添加到模型提示中的技术被称为“少样本提示”。该技术基于《语言模型是少样本学习者》论文。 进行少样本提示时,有几点需要考虑:
- 示例是如何生成的?
- 每个提示中包含多少个示例?
- 运行时如何选择示例?
- 提示中的示例是如何格式化的?
以下是每个方面的考虑因素。
1. 生成示例
少样本提示的第一步也是最重要的一步是构思一组好的示例数据集。好的示例应当在运行时相关,清晰明了,富有信息量,并提供模型之前未知的信息。
从高层次来看,生成示例的基本方法有:
- 手册:由人工生成他们认为有用的示例。
- 更好的模型:使用更好的( presumably 更昂贵/更慢)模型的响应作为示例,来训练更差的(presumably 更便宜/更快)模型。
- 用户反馈:用户(或标注者)对与应用程序的交互留下反馈,系统会根据这些反馈生成示例(例如,所有带有正面反馈的交互都可以转化为示例)。
- LLM反馈:与用户反馈相同,但该过程通过模型自我评估实现自动化。
哪种方法最好取决于你的任务。如果任务需要深刻理解少量核心原则,手动精心设计几个优秀的示例可能会很有价值。 如果任务中正确行为的范围更广泛且更复杂,通过更自动化的方式生成大量示例会更有帮助,这样在任何运行时输入下都有更高的可能性找到高度相关的示例。
单轮对话与多轮对话示例
在生成示例时需要考虑的另一个维度是,这个示例实际上展示了什么。
最简单的示例仅包含用户输入和预期的模型输出。这些是单轮次示例。
另一种复杂的示例类型是整个对话的示例,通常情况下,模型最初回答错误,然后用户告诉模型如何纠正其答案。 这被称为多轮示例。多轮示例对于更细致的任务很有用,因为可以通过展示常见错误,并明确说明这些错误的原因以及应该如何改正,从而帮助模型更好地学习。
2. 示例数量
一旦我们有了示例数据集,就需要考虑每个提示中应该包含多少示例。 关键的权衡在于,更多的示例通常能提升性能,但更大的提示会增加成本和延迟。 而且,超过某个阈值后,过多的示例可能会开始让模型感到困惑。 找到合适的示例数量高度依赖于模型、任务、示例的质量以及你的成本和延迟限制。 据经验而言,模型越好,所需的示例就越少,同时添加更多示例带来的收益也会更快地进入显著递减阶段。 不过,要可靠地回答这个问题,最好的(也是唯一的方法)是用不同数量的示例进行一些实验。
3. 选择示例
假设我们不会将整个示例数据集添加到每个提示中,我们需要一种根据给定输入从数据集中选择示例的方法。我们可以这样做:
- 随机地
- 通过输入内容的(语义或基于关键词的)相似性
- 基于一些其他约束条件,例如标记符大小
LangChain 包含多个 ExampleSelectors,使您能够轻松使用这些技术。
通常,通过语义相似性进行选择能带来最佳的模型性能。但这一点的重要性再次取决于具体的模型和任务,值得进行实验探索。
4. 格式化示例
如今,最先进的模型大多是对话模型,因此我们将重点放在为这类模型格式化示例上。我们的基本选项是插入示例:
- 在系统提示中作为字符串
- 作为他们自己的消息
如果我们把示例作为字符串插入到系统提示中,我们需要确保模型清楚地知道每个示例的开始位置,以及哪些部分是输入,哪些部分是输出。不同的模型对不同的语法响应效果更好,比如 ChatML、XML、TypeScript 等。
如果我们把示例作为消息插入,其中每个示例都表示为一系列 Human(人类)和 AI(人工智能)消息,我们可能还想给我们的消息分配 名称,比如 "example_user" 和 "example_assistant",以明确这些消息对应的是不同的参与者,而不是最新的输入消息。
格式化工具调用示例
格式化示例为消息时,一个棘手的领域是当我们的示例输出包含工具调用时。这是因为不同的模型在生成任何工具调用时,对允许的消息序列类型有不同的限制。
- 某些模型要求,任何包含工具调用的 AIMessage 必须立即跟随为每个工具调用生成的 ToolMessage。
- 某些模型还要求,在下一个 HumanMessage 之前,任何 ToolMessage 必须立即跟一个 AIMessage。
- 某些模型要求,如果聊天历史中包含工具调用或工具消息,则必须将工具传递给模型。
这些要求是特定于模型的,应针对你所使用的模型进行检查。如果你的模型在工具调用后需要 ToolMessages,或在 ToolMessages 后需要 AIMessages,而你的示例中仅包含预期的工具调用,未包含实际的工具输出,你可以尝试在每个示例末尾添加带有通用内容的虚拟 ToolMessages / AIMessages,以满足 API 的约束条件。 在这种情况下,特别值得尝试将示例作为字符串插入与作为消息插入的区别,因为添加虚拟消息可能会对某些模型产生不利影响。
你可以看到一个案例研究,其中展示了Anthropic和OpenAI如何在两个不同的工具调用基准测试中对不同的少样本提示技术做出响应 这里。