Skip to main content
在 GitHub 上打开

Few-shot 提示

先决条件

概述

提高模型性能的最有效方法之一是给出 您希望它做什么。添加示例输入和预期输出的技术 到模型提示称为 “Few-shot Prompting”。该技术基于语言模型是 Few-Shot Learners 论文。 在进行 few-shot 提示时,需要考虑一些事项:

  1. 示例是如何生成的?
  2. 每个提示中有多少个示例?
  3. 如何在运行时选择示例?
  4. 提示中的示例格式如何?

以下是每个项目的注意事项。

1. 生成示例

小样本提示的第一步也是最重要的一步是提出一个好的示例数据集。好的例子应该在运行时是相关的、清晰的、信息丰富的,并提供模型尚不知道的信息。

概括地说,生成示例的基本方法是:

  • 手动:一个人或几个人生成他们认为有用的例子。
  • 更好的模型:更好的(可能更昂贵/更慢的)模型的响应被用作更差(可能更便宜/更快)模型的示例。
  • 用户反馈:用户(或标签添加者)在与应用程序的交互中留下反馈,并根据该反馈生成示例(例如,所有具有积极反馈的交互都可以转换为示例)。
  • LLM 反馈:与用户反馈相同,但该过程是通过让模型自我评估来自动化的。

哪种方法最好取决于您的任务。对于需要真正很好地理解少量核心原则的任务,手工制作一些非常好的例子可能是有价值的。 对于正确行为空间更广泛、更细致的任务,以更自动化的方式生成许多示例可能很有用,这样就更有可能为任何运行时输入提供一些高度相关的示例。

单圈与多圈示例

生成示例时要考虑的另一个维度是示例实际显示的内容。

最简单的示例类型只有用户输入和预期的模型输出。这些是单轮示例。

一种更复杂的示例类型是示例是整个对话,通常模型最初响应不正确,然后用户告诉模型如何纠正其答案。 这称为多轮示例。多轮次示例对于更细微的任务非常有用,在这些任务中,显示常见错误并准确说明它们出错的原因以及应该做什么非常有用。

2. 示例数量

一旦我们有了示例数据集,我们就需要考虑每个 Prompt 中应该有多少示例。 关键的权衡是,示例越多通常会提高性能,但更大的提示会增加成本和延迟。 超过某个阈值,拥有太多示例可能会开始使模型感到困惑。 找到正确数量的示例在很大程度上取决于模型、任务、示例的质量以及您的成本和延迟限制。 有趣的是,模型越好,它需要执行良好的示例就越少,并且添加更多示例的回报急剧递减的速度就越快。 但是,可靠地回答这个问题的最佳/唯一方法是使用不同数量的示例运行一些实验。

3. 选择示例

假设我们没有将整个示例数据集添加到每个 Prompt 中,我们需要有一种根据给定输入从数据集中选择示例的方法。我们可以这样做:

  • 随机
  • 按输入的 (语义或基于关键字的) 相似性
  • 基于一些其他约束,例如令牌大小

LangChain 有许多ExampleSelectors这使得使用这些技术中的任何一种都变得容易。

通常,按语义相似性进行选择可获得最佳模型性能。但这有多重要又是特定于模型和任务的,并且值得尝试。

4. 格式示例

现在大多数最先进的模型都是聊天模型,因此我们将重点介绍这些模型的格式示例。我们的基本选项是插入示例:

  • 在系统提示符中作为字符串
  • 作为自己的消息

如果我们将示例作为字符串插入系统提示符中,则需要确保模型清楚每个示例的开始位置以及哪些部分是输入与输出。不同的模型对不同的语法(如 ChatML、XML、TypeScript 等)的响应更好。

如果我们将示例作为消息插入,其中每个示例都表示为一系列 Human、AI 消息,我们可能还希望为消息分配名称,例如"example_user""example_assistant"以明确这些消息对应于与最新输入消息不同的参与者。

格式化工具调用示例

将示例格式化为消息的一个方面是当我们的示例输出具有工具调用时。这是因为不同的模型对生成任何工具调用时允许的消息序列类型具有不同的约束。

  • 某些模型要求每个工具调用,任何具有工具调用的 AIMessage 都紧跟 ToolMessages。
  • 一些模型还要求任何 ToolMessages 在下一个 HumanMessage 之前紧跟一个 AIMessage。
  • 如果聊天历史记录中有任何工具调用/ToolMessages,某些模型要求将工具传递到模型中。

这些要求是特定于模型的,应针对您正在使用的模型进行检查。如果您的模型在工具调用后需要 ToolMessages 和/或在 ToolMessages 之后需要 AIMessages,并且您的示例仅包含预期的工具调用,而不包含实际的工具输出,您可以尝试将虚拟 ToolMessages/AIMessages 添加到每个示例的末尾,其中包含通用内容,以满足 API 约束。 在这些情况下,特别值得尝试将示例作为字符串插入,而不是消息,因为虚拟消息可能会对某些模型产生不利影响。

您可以在此处查看 Anthropic 和 OpenAI 如何在两个不同的工具调用基准测试中响应不同的 few-shot 提示技术的案例研究。