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