所有已发表的四者对比,都按"能买到多少准确率"来排序,而那个排序对你是用不上的——因为它们各自消费的反馈形状不同,而你能提供的形状,在你写下评测函数那天就已经定死了。在你去读下一张基准表之前,先回答一个关于你自己指标的问题:它返回的是一个数字,还是一个数字加一句话?这个答案会直接淘汰掉这个领域的一半。
先看全貌
其中三个活在 DSPy 里、优化一个编译后的程序;一个是独立框架,把你系统里的任何一段文本都当作变量。区分它们的不是搜索算法,而是它们能从什么东西里学到东西。
| 优化器 | 它改什么 | 它从什么里学 | 归属 |
|---|---|---|---|
| BootstrapFewShot | 只改示例 | 一条轨迹是否通过 | DSPy |
| MIPROv2 | 指令与示例,联合改 | 多轮 rollout 上的一个标量分 | DSPy |
| GEPA | 指令文本,靠反思 | 整条轨迹,外加任何诊断性文字 | DSPy;也有独立库 |
| TextGrad | 图里任何一个文本变量 | 另一个模型写出的批评意见 | 独立 |
指标才是那个接口,而几乎没人是这么设计它的
在一个 DSPy 程序里,指标是你写的一个函数,用来给预测相对样例打分。多数人写一次、返回 True 或一个浮点数,然后再也不去想它——它是管道。它不是管道。它是这些优化器学到任何东西的唯一通道,而它的返回类型决定了它们当中哪一个能干出有用的活。
对基于搜索的那两个,一个裸浮点数就够了
BootstrapFewShot 把你的程序在训练样例上跑一遍,留下指标说"是"的那些轨迹,把它们装成少样本示例。它只需要一个通过/失败的判定,别的什么都不要;它很快就停;而对于失败大多出在格式或缺少范式的程序,它能用一小时的工夫换来可获取增益中相当惊人的一部分。
MIPROv2 用同一份信号做了更有野心的事:它提出候选指令,把它们与候选示例集配对,在给定的 rollout 预算内针对你的标量搜索这个联合空间。当你有几百条标注样例和一个自动检查器时,它是那个明智的默认选项。它做不到的,是知道一个候选为什么输了——分数是个标量,所以搜索是被曲面的形状引导的,而不是被对失败的任何理解引导的。
反思型的那两个想要词句,没有词句就明显变差
GEPA 在 ICLR 2026 上作为一个无梯度的反思式优化器提出,它把上面那件事反了过来。它不是采样空间然后跟着分数走,而是去读程序自己的轨迹——输入、中间输出、指标说了什么——然后像一个人读完一次失败运行后那样,写出一条更好的指令。随后它沿着一条帕累托前沿演化这些候选的种群,这样一个在某个数据切片上很强的候选,不会因为在另一个切片上弱而被丢掉。
这就是它那些数字为什么长成那样。在 Qwen3 8B 上的六项任务里,论文报告 GEPA 以最多 20% 的幅度胜过 GRPO——一个正经的强化学习基线——并以 13% 的总体幅度胜过 MIPROv2。在 MATH 上,经 GEPA 优化的程序被报告为 93%,而朴素思维链模块是 67%。在 AIME 2025 上配 GPT-4.1 Mini,它比未优化基线高约 10%,比 MIPROv2 高约 12%。
现在注意上述每一项任务的共同点:一个免费、自动、无歧义的检查器。一个数学答案非对即错,而且——这才是那个承重的部分——一条失败的数学轨迹是可以被描述的。指标能说出模型把第二行的约束丢了。那句话就是 GEPA 的燃料。给它一个只返回 0.0 的指标,你并没有让它失效,但你拿走了它用来赢过 MIPROv2 的那样东西。
TextGrad 把同一个想法推得更远,并把它做成了整个系统。它把一个复合 LLM 应用当作一张计算图,图里的"梯度"是由 LLM 写出的自然语言批评,按链式法则用文本代替导数反向传播。通常意义上的标量损失在这里根本不存在;存在的是一个说清"哪里错了、该往哪边推"的批评者。这个设计的诚实之处在于其作者对局限直言不讳——这些梯度是近似的、随机的,在一个 batch 内可能彼此矛盾,而且没有学习率,也没有收敛保证。
基准表格不会告诉你的三件事
1. 你的任务多半没有免费的检查器
那些已发表的幅度来自数学、代码与检索——之所以选这些领域,恰恰是因为标准答案很便宜。如果你任务的标准答案是某位客服主管每周收集一次的判断,那你就无法按论文的 rollout 预算跑这里的任何一个,而你的紧约束是标注集而不是算法。正确的第一步不是挑一个优化器,而是去买一个检查器——通常意味着一个由评分细则驱动、并对齐过人工标注的裁判模型,也就是裁判校准与元评测所主张的那种。针对一个未经校准的裁判做优化,是把你的提示词拟合到那个裁判偏见上的最快方式。
2. 优化出来的提示词是一件拟合产物,不是一项资产
从这些东西里出来的,是一套针对某个模型某个版本调好的指令与示例。换模型——因为厂商下线了它、因为出现了更便宜的、因为你为省钱换到了更小的——搜索就得重跑一遍。这是一项真实存在、却普遍没有列进预算的运维成本,它理应和模型退役与迁移里的其他一切放进同一份迁移计划。这也意味着优化器自身的运行开销是周期性的,不是一次性的。
3. 增益经常落在你不想要的地方
优化器最大化的是指标。如果指标奖励最终答案的正确性,它会痛快地找出那些通过你并不认可的推理抵达终点、或者过拟合到你训练切片某个怪癖上的指令。这就是普通的奖励作弊,只不过动作空间是文本形状的;防守手段也一样:一个优化器永远看不到的留出集、去看它产出的提示词本身而不只看分数,以及奖励设计与奖励作弊里那条过程与结果之分。上线之前先读一遍优化出来的指令。它很短,它是大白话,而且它偶尔会说出些让人心惊的东西。
什么时候选哪个
| 你的处境 | 先上 | 因为 |
|---|---|---|
| 指标返回通过/失败,你有几十条样例 | BootstrapFewShot | 可能的最便宜实验;往往就是可获取增益的大头 |
| 标量指标、几百条样例、有 rollout 预算 | MIPROv2 | 指令与示例联合搜索的成熟默认选项 |
| 你的指标能用一句话解释失败 | GEPA | 那句诊断文字,正是它反思步骤所消费的东西 |
| 样例很少,但有一个强模型可当批评者 | TextGrad | 它要的是一份批评意见,而不是一个标注集 |
| 多模块程序,且你不知道是哪一段在失败 | GEPA 或 TextGrad | 两者都能顺着轨迹做功劳分配;标量搜索做不到 |
| 压根没有可靠的指标 | 暂时哪个都不要 | 先把评测建起来——这里每一个都会放大它所度量的东西 |
有一个动作压过上面所有条目,而且只要一个下午:把你的指标改成同时返回一个分数和一小段原因文字。基于搜索的优化器会无害地忽略那段字符串;反思型的则拿到了它们的主输入。你不必先选定优化器就能做这个改动,而没有它,这个领域的一半你根本用不了。
常见问题
提示词优化是不是只是一种更差的微调?
它们回答的是不同的问题。微调改的是权重,需要训练集、一套服务方案,并且每换一个模型就要把整件事重做一遍。提示词优化改的是文本,几分钟到几小时就能跑完,并且跨厂商迁移的能力和任何提示词差不多——也就是说很差,但可以补救。决策框架在提示、微调还是 RL;实践中,多数团队在伸手去动权重之前,并没有把提示词优化榨干。
在 DSPy 里,GEPA 是不是取代了 MIPROv2?
不自动取代。它在论文的任务上、论文的条件下报出了更好的结果,而那些条件包含一份丰富的反馈信号。对于一个指标只是裸布尔值、失败主要是示例形状的程序,MIPROv2 甚至 BootstrapFewShot 都可能用更少的钱打平。先跑便宜的那个——它只要一小时,而且能告诉你在花钱做反思调用之前还剩多少上升空间。
我到底需要多少条样例?
对基于示例的优化器来说,比人们预期的少——几十条是一个真实可用的起点;更硬的约束是留出集要大到让你测出的提升不是噪声。这与任何其他评测面对的是同一个统计功效问题,评测方差与统计功效里有正经处理。在 50 条留出样例上的 3% 提升,不算提升。
能用这种方式优化一个多智能体系统吗?
能优化一部分,而难点正是功劳分配问题:当一条五步流水线给出错误答案时,是哪个模块的指令有问题?反思型优化器在这里确有优势,因为轨迹会把中间输出点出来;但失败归因仍然是瓶颈——正是多智能体失败模式里描述的那一个。
那 COPRO 以及 DSPy 里其他的优化器呢?
COPRO 做的是只针对指令的坐标上升,当你的示例已经不错、只有指令偏弱时,它是一个合理的中间选项。它与 MIPROv2 同处这条分界线的"标量信号"一侧,所以本文的核心论证对它不变。DSPy 的优化器集合迭代很快;该一直带着走的问题永远是:新来的这个消费的是什么形状的反馈。
延伸阅读
本站相关:
- DSPy 3 与 GEPA 用于智能体优化 —— 这一套栈的长篇处理。
- 提示词优化 —— 概念层面的入门。
- 裁判校准与元评测 —— 如何造出这些东西所需的检查器。
- 评测驱动开发与 CI —— 优化后的程序必须持续自证的地方。