Few-shot prompting

Few-shot prompting #

https://python.langchain.com/docs/concepts/#few-shot-prompting

提高模型性能的最有效方法之一是给模型提供示例,告诉它你希望它做什么。这种在模型提示中添加示例输入和预期输出的技术称为“少样本提示(few-shot prompting)”。该技术基于《Language Models are Few-Shot Learners》论文。

在进行少样本提示时,需要考虑以下几点:

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

以下是对每个问题的考虑。

1. 生成示例 #

少样本提示的第一步也是最重要的一步是构建一个好的示例数据集。好的示例在运行时应具有相关性、清晰性、信息性,并且提供模型先前未掌握的信息。

从高层次来看,生成示例的基本方法有:

  • 手动:由人类生成他们认为有用的示例。
  • 更好的模型:使用更好(假定更昂贵/较慢)的模型的响应作为较差(假定更便宜/较快)模型的示例。
  • 用户反馈:用户(或标注员)对与应用的交互进行反馈,并基于该反馈生成示例(例如,所有获得正面反馈的交互都可以转化为示例)。
  • LLM反馈:与用户反馈类似,但该过程通过让模型自我评估来自动化。

最佳方法取决于具体任务。对于需要深入理解少量核心原则的任务,手工制作几个高质量的示例可能非常有价值。对于正确行为空间更广泛且更复杂的任务,生成大量自动化的示例可以提高在运行时找到相关示例的可能性。

单轮与多轮示例

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

最简单的示例仅包含用户输入和预期的模型输出,这些是单轮示例。

更复杂的示例则展示整个对话,通常模型最初给出错误的响应,用户随后告诉模型如何修正答案。这被称为多轮示例。对于需要展示常见错误及其修正过程的复杂任务,多轮示例会非常有用。

2. 示例数量 #

一旦我们有了一个示例数据集,就需要考虑每个提示中应包含多少个示例。关键的权衡在于,更多的示例通常可以提高性能,但较大的提示会增加成本和延迟。而且,超过某个阈值后,过多的示例可能会让模型感到困惑。找到合适的示例数量高度依赖于模型、任务、示例的质量以及你的成本和延迟限制。

根据经验,模型越好,所需的示例越少,并且添加更多示例的收益递减得更快。然而,可靠地回答这个问题的最佳或唯一方法是通过实验不同数量的示例来进行测试。

3. 选择示例 #

假设我们不会将整个示例数据集添加到每个提示中,那么我们需要一种根据给定输入从数据集中选择示例的方法。我们可以通过以下方式进行选择:

  • 随机选择
  • 基于输入的语义相似性或关键词相似性
  • 基于其他限制条件,如 token 大小

LangChain 提供了多个ExampleSelector,可以轻松使用这些技术。

通常,按语义相似性选择示例能够带来最佳的模型性能。但这一点的重要性仍然取决于具体的模型和任务,值得进行实验来确定最佳选择方案。

4. 示例格式化 #

如今大多数最先进的模型都是聊天模型,因此我们将重点讨论为这些模型格式化示例。基本的选择包括:

  • 将示例作为字符串插入系统提示中
  • 将示例作为独立消息插入

如果我们将示例作为字符串插入系统提示中,需要确保模型能够清楚地分辨每个示例的起始位置,并区分输入和输出部分。不同的模型对不同的语法反应更好,如ChatML、XML、TypeScript等。

如果将示例作为消息插入,每个示例由一系列用户和 AI 消息组成,可能需要为消息分配名称(name),如 “example_user” 和 “example_assistant”,以明确这些消息与最新的输入消息来自不同的参与者。

格式化工具调用示例

当示例输出涉及工具调用时,将示例格式化为消息可能会比较复杂。这是因为不同的模型在生成工具调用时对消息序列的类型有不同的要求。

  • 某些模型要求所有带有工具调用的 AIMessage 之后必须紧跟对应的 ToolMessage
  • 有些模型还要求 ToolMessage 之后必须紧跟 AIMessage,然后才能出现下一个 HumanMessage
  • 某些模型要求如果在聊天记录中存在工具调用或 ToolMessage,工具必须传递给模型。

这些要求是特定于模型的,因此在使用模型时应检查其要求。如果模型需要在工具调用后紧跟 ToolMessage 或在 ToolMessage 后紧跟 AIMessage,而你的示例只包含预期的工具调用而不包含实际的工具输出,可以尝试在每个示例的末尾添加虚拟的 ToolMessageAIMessage,以满足 API 的要求。在这种情况下,尤其值得尝试将示例作为字符串插入,而不是消息插入,因为虚拟消息可能会对某些模型产生负面影响。

你可以在这里看到 Anthropic 和 OpenAI 在不同工具调用基准上对不同少样本提示技术的案例研究

© 2024 青蛙小白