AI 博客

BootstrapFewShot vs MIPROv2 vs GEPA vs TextGrad:挑优化器的其实是你的指标

GEPA 报出的优势幅度——较 GRPO 最多 20%、较 MIPROv2 13%——全都测在自动检查器免费、且失败运行可以被用词句描述的场景上。这四个优化器里,两个靠一个裸标量就能跑,两个需要一句话。你的评测函数返回什么,决定了你能用上这个领域的哪一半;所以先改指标,再改优化器。

作者 智能体 AI 维基 23 分钟读完

所有已发表的四者对比,都按"能买到多少准确率"来排序,而那个排序对你是用不上的——因为它们各自消费的反馈形状不同,而你能提供的形状,在你写下评测函数那天就已经定死了。在你去读下一张基准表之前,先回答一个关于你自己指标的问题:它返回的是一个数字,还是一个数字加一句话?这个答案会直接淘汰掉这个领域的一半。

先看全貌

其中三个活在 DSPy 里、优化一个编译后的程序;一个是独立框架,把你系统里的任何一段文本都当作变量。区分它们的不是搜索算法,而是它们能从什么东西里学到东西。

优化器它改什么它从什么里学归属
BootstrapFewShot 只改示例 一条轨迹是否通过 DSPy
MIPROv2 指令与示例,联合改 多轮 rollout 上的一个标量分 DSPy
GEPA 指令文本,靠反思 整条轨迹,外加任何诊断性文字 DSPy;也有独立库
TextGrad 图里任何一个文本变量 另一个模型写出的批评意见 独立
What each prompt optimizer mutates, and what signal it consumes A program box on the left feeds an evaluation box on the right, and a return path runs back to four optimizers. BootstrapFewShot mutates only the demonstration examples and consumes a pass or fail score. MIPROv2 mutates instructions and demonstrations together and consumes a scalar score over many rollouts. GEPA mutates instruction text by reflecting on the run trajectory and consumes a score plus any diagnostic text the metric returns. TextGrad mutates any text variable in the graph and consumes a natural-language critique written by a second model. The return arrow carries a different payload for each. Same loop, four different return payloads Your program instructions + demos + calls Your metric what it returns is the choice Score, and maybe a sentence BootstrapFewShot Mutates: demos keeps traces that passed needs: pass / fail MIPROv2 Mutates: both joint instruction + demo search needs: a scalar, many rollouts GEPA Mutates: instructions reflects on the trajectory wants: score + diagnosis TextGrad Mutates: any text var critique flows back through needs: a written critique A new program fitted to this model version THE LEFT TWO CAN RUN ON A BARE NUMBER. THE RIGHT TWO WANT WORDS, AND LOSE MOST OF THEIR EDGE WITHOUT THEM THE OUTPUT IS A FITTED ARTEFACT: SWAP THE MODEL AND THE SEARCH HAS TO RUN AGAIN
这四者的回路完全一样。不同的是回传箭头上的载荷——而那份载荷是由你的指标写出来的。
Which optimizer your evaluation function can actually feed A four by four heatmap. Rows are BootstrapFewShot, MIPROv2, GEPA and TextGrad. Columns are works on a bare scalar, exploits text feedback, small labelled set is enough, and cheap to run. BootstrapFewShot is strong on the scalar, weak on text feedback, and strong on both set size and cost. MIPROv2 is strong on the scalar, weak on text feedback, and medium on set size and cost. GEPA is medium on the scalar, strong on text feedback and set size, medium on cost. TextGrad is weak on the scalar, strong on text feedback and set size, medium on cost. The left column and the second column are close to mutually exclusive. The first two columns are nearly mutually exclusive Runs on a bare scalar Exploits text feedback Small labelled set OK Cheap to run BootstrapFewShot Strong (all it needs) Weak (ignores it) Strong (tens) Strong (one pass) MIPROv2 Strong (designed for) Weak (ignores it) Medium (hundreds) Medium (search) GEPA Medium (works, dulled) Strong (its edge) Strong (sample-efficient) Medium (reflection calls) TextGrad Weak (needs a critic) Strong (is the gradient) Strong (few examples) Medium (critic calls) Strong Medium Weak READ THE FIRST TWO COLUMNS AGAINST YOUR OWN METRIC BEFORE READING ANY BENCHMARK TABLE
在读任何人的准确率表格之前,先拿前两列去对照你自己的评测函数。

指标才是那个接口,而几乎没人是这么设计它的

在一个 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 内可能彼此矛盾,而且没有学习率,也没有收敛保证。

Reported gains for GEPA over its published baselines Horizontal bar chart of four reported margins from the GEPA literature. GEPA over GRPO reaches up to twenty percent. GEPA over MIPROv2 is thirteen percent aggregate on Qwen3 8B across six tasks. On AIME 2025 with GPT-4.1 Mini, GEPA is twelve percent over MIPROv2 and ten percent over the unoptimized baseline. Every one of these margins was measured on a task with a free automatic checker, which is the condition most production tasks do not meet. Reported margins, and what they were measured on GEPA over GRPO six tasks, Qwen3 8B up to +20% GEPA over MIPROv2 aggregate, same setup +13% GEPA over MIPROv2 AIME 2025, GPT-4.1 Mini +12% GEPA over no optimizer AIME 2025, GPT-4.1 Mini +10% 0 +5% +10% +15% +20% ALL FOUR MARGINS COME FROM TASKS WITH A FREE AUTOMATIC CHECKER — MATH ANSWERS, NOT HUMAN JUDGEMENT THE SPREAD BETWEEN THE TOP AND BOTTOM ROW IS THE BASELINE CHANGING, NOT THE OPTIMIZER
四个已报告的幅度,全都测在自动检查器免费的场景上。最下面两行的差别只在于被拿来对比的是谁。

基准表格不会告诉你的三件事

1. 你的任务多半没有免费的检查器

那些已发表的幅度来自数学、代码与检索——之所以选这些领域,恰恰是因为标准答案很便宜。如果你任务的标准答案是某位客服主管每周收集一次的判断,那你就无法按论文的 rollout 预算跑这里的任何一个,而你的紧约束是标注集而不是算法。正确的第一步不是挑一个优化器,而是去买一个检查器——通常意味着一个由评分细则驱动、并对齐过人工标注的裁判模型,也就是裁判校准与元评测所主张的那种。针对一个未经校准的裁判做优化,是把你的提示词拟合到那个裁判偏见上的最快方式。

2. 优化出来的提示词是一件拟合产物,不是一项资产

从这些东西里出来的,是一套针对某个模型某个版本调好的指令与示例。换模型——因为厂商下线了它、因为出现了更便宜的、因为你为省钱换到了更小的——搜索就得重跑一遍。这是一项真实存在、却普遍没有列进预算的运维成本,它理应和模型退役与迁移里的其他一切放进同一份迁移计划。这也意味着优化器自身的运行开销是周期性的,不是一次性的。

3. 增益经常落在你不想要的地方

优化器最大化的是指标。如果指标奖励最终答案的正确性,它会痛快地找出那些通过你并不认可的推理抵达终点、或者过拟合到你训练切片某个怪癖上的指令。这就是普通的奖励作弊,只不过动作空间是文本形状的;防守手段也一样:一个优化器永远看不到的留出集、去看它产出的提示词本身而不只看分数,以及奖励设计与奖励作弊里那条过程与结果之分。上线之前先读一遍优化出来的指令。它很短,它是大白话,而且它偶尔会说出些让人心惊的东西。

什么时候选哪个

你的处境先上因为
指标返回通过/失败,你有几十条样例 BootstrapFewShot 可能的最便宜实验;往往就是可获取增益的大头
标量指标、几百条样例、有 rollout 预算 MIPROv2 指令与示例联合搜索的成熟默认选项
你的指标能用一句话解释失败 GEPA 那句诊断文字,正是它反思步骤所消费的东西
样例很少,但有一个强模型可当批评者 TextGrad 它要的是一份批评意见,而不是一个标注集
多模块程序,且你不知道是哪一段在失败 GEPA 或 TextGrad 两者都能顺着轨迹做功劳分配;标量搜索做不到
压根没有可靠的指标 暂时哪个都不要 先把评测建起来——这里每一个都会放大它所度量的东西

有一个动作压过上面所有条目,而且只要一个下午:把你的指标改成同时返回一个分数一小段原因文字。基于搜索的优化器会无害地忽略那段字符串;反思型的则拿到了它们的主输入。你不必先选定优化器就能做这个改动,而没有它,这个领域的一半你根本用不了。

常见问题

提示词优化是不是只是一种更差的微调?

它们回答的是不同的问题。微调改的是权重,需要训练集、一套服务方案,并且每换一个模型就要把整件事重做一遍。提示词优化改的是文本,几分钟到几小时就能跑完,并且跨厂商迁移的能力和任何提示词差不多——也就是说很差,但可以补救。决策框架在提示、微调还是 RL;实践中,多数团队在伸手去动权重之前,并没有把提示词优化榨干。

在 DSPy 里,GEPA 是不是取代了 MIPROv2?

不自动取代。它在论文的任务上、论文的条件下报出了更好的结果,而那些条件包含一份丰富的反馈信号。对于一个指标只是裸布尔值、失败主要是示例形状的程序,MIPROv2 甚至 BootstrapFewShot 都可能用更少的钱打平。先跑便宜的那个——它只要一小时,而且能告诉你在花钱做反思调用之前还剩多少上升空间。

我到底需要多少条样例?

对基于示例的优化器来说,比人们预期的少——几十条是一个真实可用的起点;更硬的约束是留出集要大到让你测出的提升不是噪声。这与任何其他评测面对的是同一个统计功效问题,评测方差与统计功效里有正经处理。在 50 条留出样例上的 3% 提升,不算提升。

能用这种方式优化一个多智能体系统吗?

能优化一部分,而难点正是功劳分配问题:当一条五步流水线给出错误答案时,是哪个模块的指令有问题?反思型优化器在这里确有优势,因为轨迹会把中间输出点出来;但失败归因仍然是瓶颈——正是多智能体失败模式里描述的那一个。

那 COPRO 以及 DSPy 里其他的优化器呢?

COPRO 做的是只针对指令的坐标上升,当你的示例已经不错、只有指令偏弱时,它是一个合理的中间选项。它与 MIPROv2 同处这条分界线的"标量信号"一侧,所以本文的核心论证对它不变。DSPy 的优化器集合迭代很快;该一直带着走的问题永远是:新来的这个消费的是什么形状的反馈。

延伸阅读

本站相关:

项目来源: