作者:Krish Maniar 和 William Fu-Hinthorn
在编写提示词时,我们试图向大语言模型(LLM)传达我们的意图,以便它们能在复杂数据上应用这些指令。然而,一次性清晰表达所有细微之处并不容易。提示工程通常通过手动试错、测试和调整来优化,但像 DSPy 和 promptim 这样的工具展示了“提示编程”和系统化提示优化的价值。它们通过测量和在真实数据上测试,缩小意图与指令之间的差距。在本文中,我们:
- 选择了五个带有可验证结果的数据集,用于基准测试提示优化
- 实现并对比了五种系统性改进提示的方法
- 评估了三种不同模型(
gpt-4o
、claude-sonnet
、o1
)在提示优化中的表现
我们的结论:
- 我们推荐用于提示优化的模型是
claude-sonnet
(优于o1
) - 提示优化在模型缺乏领域知识的任务中最有效
- 在这些情况下,提示优化可以比基础提示提高约 200% 的准确率
- 提示优化还可被视为一种长期记忆:直接从数据中学习并适应
我们测试了什么
我们基准测试了五种流行的提示优化方法(详细解释在后文):
- 少样本提示(Few-shot prompting):使用训练示例作为期望行为的演示
- 元提示(Meta-prompting):使用 LLM 分析和改进提示
- 反思元提示(Meta-prompting with reflection):让 LLM 先思考并批判性分析其修改建议,再提交更新的提示
- 提示梯度(Prompt gradients):针对每个示例生成“文本梯度”作为改进建议,然后在另一次 LLM 调用中应用这些建议
- 进化优化(Evolutionary optimization):通过受控变异探索提示空间
我们在三个模型(O1、GPT-4o 和 Claude-3.5-Sonnet)上运行这些方法,并在五个代表常见任务的数据集上测试,以回答以下核心问题:
- 何时提示优化最有效?
- 哪些前沿模型适合提示优化?
- 哪些算法最可靠?
算法
我们测试了五种提示优化方法,每种方法都有其独特的优化理论:
少样本提示(Few-shot prompting)
这种方法最为简单,我们从训练集中选择最多 50 个示例(跨多个训练周期采样),并将其包含在提示中,作为期望行为的演示。这种方法学习成本较低(无需 LLM 调用来提议更改),但在测试时 Token 成本较高(因为演示示例通常比直接指令包含更多内容)。
元提示(Meta-prompting)
这是一种最基础的指令调整方法。我们首先让目标 LLM 运行示例,然后计算输出的评分(注意:需要设置评估器)。接着,我们向元提示 LLM 提供输入、输出、参考输出(如果有的话)及当前提示在这些输出上的评分,并要求 LLM 编写更好的提示。此过程会在小批量数据上重复进行,并定期在保留的开发集(dev set)上进行评估,以保留得分最高的提示。
反思元提示(Meta-prompting with reflection)
在元提示的基础上,提供“思考”和“批判”工具。这些工具仅允许 LLM 在提交提示更新前先在草稿区记录思考内容,以便利用更多的计算能力分析之前的提示,并在提交最终版本前发现数据中的隐藏模式。
提示梯度(Prompt Gradients)
受 Pryzant 等人论文《Automatic Prompt Optimization》的启发,这种方法将优化过程拆分为多个步骤:
- 评分当前提示的输出
- 让 LLM 针对失败示例生成具体反馈(即“梯度”)
- 根据这些“梯度”提出提示更新
该方法的核心思想是,在修改前先收集细粒度的反馈,可以比元提示方法提供更具针对性的改进建议。
进化优化(Evolutionary Optimization)
这些算法按“世代”运行,每一代通过不同的阶段进行优化。在每一代中,算法会对提示应用半随机的“变异”(在本实验中,这些变异由 LLM 生成不同类型的提示更新),然后保留表现最佳的提示。
在这些实验中,我们采用了 Cui 等人提出的最新技术 PhaseEvo,它结合了“文本梯度”方法和更全局的变异策略,以更大范围地探索提示空间,从而克服局部最优问题。
数据集
我们创建了五个数据集来进行基准测试:
- 支持邮件分配 3:对每封收到的电子邮件进行分类,并分配给 3 位处理人员之一。
- 支持邮件分配 10:与(1)类似,但增加到 10 个处理人员,任务更具挑战性,因为每位处理人员的“领域专长”不够明确。
- 多语言数学:LLM 需要解答数学应用题,并用 5 种语言之一拼写出答案。目标语言由题目主题决定(体育→韩语,太空→阿拉伯语,烹饪→德语,音乐→英语,野生动物→俄语)。优化器需从数据中发现这一隐藏模式。
- 邮件助手(简单):这是一个合成数据集,用于测试提示优化是否对 LLM 已具备领域知识的任务有帮助。LLM 需要判断是否应忽略、回复或通知用户处理某封邮件。
- 邮件助手(偏好):与上一个数据集类似,但任务规则更隐蔽。我们设定了一位忙碌且“古怪”的科技大佬作为邮件偏好规则的制定者,以提供地面事实(ground truth)标签。
结果
我们在五个数据集上使用 OpenAI 的 GPT-4o 和 O1,以及 Anthropic 的 Claude-3.5-Sonnet 作为元提示 LLM 进行优化。目标 LLM 是 GPT-4o-mini(即,我们使用其他模型来优化 GPT-4o-mini 的提示)。
下图展示了不同数据集和算法的优化效果:
所有测试数据集的平均相对改进值,100% 代表准确率翻倍,200% 代表准确率提升至原来的三倍。
从结果来看,Claude 是更稳定的优化器模型,比 O1 更可靠。此外,O1 在处理时间、成本和 API 可靠性方面存在劣势(OpenAI 端点有时错误地标记请求违反 ToS)。因此,我们目前推荐 Claude-3.5-Sonnet 作为提示优化的首选模型。随着 O3 和其他新模型的推出,我们会更新这一建议。
我们的发现
上述结果总体支持现有文献的观点,即大语言模型(LLM)在输入提示工程方面表现优异。这些实验还揭示了 LLM 何时会(或不会)有效。
- 元提示(Meta-prompting) 在发现规则或偏好 以及其他清晰的模式时尤其有用,特别是当这些信息不属于 LLM 的原始知识领域时。这意味着你可以通过示例定义所需的行为,并依靠优化器将这些行为转换到其他 LLM 上,只要它们能够遵循合理的指令。这使得声明式输入提示编程模型成为可能。
- 元提示(通过指令微调) 在传达偏好中的细微差别 方面的作用较小,例如在简单的电子邮件分类数据集中,所有输入提示微调方法的表现都不如少样本(few-shot)输入提示方法。在该数据集中,分类主要基于模糊规则和条件判断,而非明确的规则。
- 结合少样本输入提示与指令微调 可能带来互补的提升。这与 Opsahl Ong 等人 和 Wan 等人 的研究结论一致。少样本示例能比简单指令传达更多信息,但无法涵盖复杂的条件和规则 ,这些可能是企业智能体(agents)所需的重要部分。另一方面,通过反思(reflection)、“文本梯度”(text gradients)或进化算法(evolutionary algorithms)进行输入提示优化,可以根据现有性能和数据集特征进行更有针对性的改进,同时提高 Token 效率。
- 元提示无法赋予模型新的能力 。例如,在多语言数学数据集中,即使在优化配置下,GPT-4o-mini 仍未能突破 65% 的通过率,主要是因为推理错误。虽然优化器可以指导模型如何 表现 (有时通过示例推理路径可以诱导更好的思考方式 ),但它们无法解锁更强的推理能力或更复杂的特定领域知识。
超越评估
我们一直在构建 LangSmith ,帮助团队系统性地评估 LLM 应用。良好的评估可以让你发现问题并理解系统的行为。但评估过程中构建的数据集和指标还能解锁更重要的价值:通过优化系统性地提升模型表现。
我们实验中的数据集在优化过程中表现良好,因为它们具有清晰的、可验证的结果 :
- 具有真实标签的路由决策
- 可验证的数学答案
- 可通过程序检查的语言约束
这很重要,因为针对模糊或不可靠的指标进行优化,往往会使输入提示变得更糟而不是更好。如果 LLM 仅基于模糊标准评判输出,它将倾向于优化自身的偏见,而不是满足你的实际需求。
如果你正在 LangSmith 中追踪应用程序的表现,你已经在为有效的输入提示优化奠定基础。同样的数据集不仅能帮助你理解失败的原因,还能推动系统性的改进。数据、指标和学习形成闭环。
输入提示优化即长期记忆
优化即学习,因此,我们可以将输入提示优化视为长期记忆的一种特殊形式,它能捕捉“始终启用”的行为模式。
传统记忆系统将信息存储在数据库(向量、图或其他格式)中,而输入提示优化直接将信息存储在智能体的输入提示中,使其始终可用,并影响每个决策。这种方法特别适用于存储核心模式,例如行为规则、风格偏好和关键个性特征。
“学习与改进”的过程与传统的输入提示优化极为相似,只是在更新调度方式和存储位置上略有不同。用于输入提示优化和学习算法的技术,也可能适用于记忆系统。这是我们正在积极研究的方向。
重要性
这些结果支持我们(以及 DSPy 等研究人员)的观察:LLM 驱动的输入提示优化可以系统性地改进输入提示,并自动化当前以手动试错为主的输入提示工程过程。让这种方法更容易被所有相关方使用,可以帮助我们构建更优、更强的系统。
但这并不是万能方案。我们优化后的输入提示并未在测试集上达到最优,且不同任务的改进幅度存在差异。这表明,输入提示优化应该被视为 LLM 应用优化工具箱中的一种工具,而不是唯一的方法。
我们计划将这些见解直接整合到 LangSmith 中,帮助团队超越手动输入提示工程。我们的目标不是消除人为判断,而是让决策更加系统化和数据驱动。
复现实验
你可以运行 GitHub 仓库 中的 all_sweeps.sh
脚本来复现这些实验。
附录
训练动态
在前面的部分,我们主要讨论了最终 输入提示在测试集上的表现。下面,我们展示各个数据集在开发集上的训练动态图表。这些图表展示了不同算法如何拟合数据集,并可用于对比最终得分,以揭示算法是否以不稳定的方式过拟合 数据,从而无法带来一致的提升。
支持邮件路由(3 类)
大多数优化器在基线输入提示的基础上都有所改进,梯度和进化方法表现相似。值得注意的是,Claude 在所有方法上均优于 GPT-4o。然而,在开发集中,Claude 和 GPT-4o 在使用元提示方法时未能明显改进。
支持邮件路由(10 类)
使用 GPT-4o 进行的元提示和元提示+反思设置未能学习数据集中的分类规则。一个常见的模式开始显现:如果曲线保持平坦,则说明算法未能学习。如果曲线迅速接近满分,则可能存在过拟合。最好的测试集表现往往来自于那些在开发集中呈现稳定改进的算法。
多语言数学数据集
该数据集的训练表现不连续 ,因为某些设置直到第 2 或 3 轮(甚至更晚)才获得显著提升。这凸显了跟踪编辑历史 的重要性,而不仅仅是关注最近的一两次尝试。LLM 作为元优化器,能够根据编辑历史翻译出更有效的更新策略。
输入提示对比
虽然我们最终更关心下游指标,而不是输入提示的具体内容,但分析优化器学到了哪些修改内容,以及哪些改动带来了提升,仍然很有价值。
以支持邮件 10 类分类数据集为例,比较四种不同的优化算法:
所有四种算法都学会了主要的分类规则。但梯度方法在发现模糊边界方面表现较弱,而其他方法更倾向于制定“优先级规则”或构建决策树来明确分类标准。
在相同算法下比较不同优化器模型,也可以看到行为差异。例如,O1 似乎更倾向于结合不同技术(如合成少样本示例和分步指令),并使用其特有的分隔符(“—”)来区分规则集。而 Claude 更简洁直接,但同样学到了优先级规则和领域映射。相比之下,GPT-4o 生成的信息密度最低。