GEPA 阅读笔记:把 Agent 的失败轨迹变成更好的提示词

日期: 2026 年 9 月 21 日
作者: Zhongzhu Zhou
所读论文: GEPA: Reflective Prompt Evolution Can Outperform Reinforcement Learning
论文作者: Lakshya A Agrawal、Shangyin Tan、Dilara Soylu、Noah Ziems、Rishi Khare、Krista Opsahl-Ong、Arnav Singhvi、Herumb Shandilya、Michael J Ryan、Meng Jiang、Christopher Potts、Koushik Sen、Alexandros G. Dimakis、Ion Stoica、Dan Klein、Matei Zaharia、Omar Khattab
arXiv: 2507.19457v2,2026 年 2 月 14 日修订;首版发布于 2025 年 7 月 25 日

阅读范围: 96 页全文及附录,包括算法、数据划分、演化后的提示词和反思模型调用次数。下文实验数字来自论文;示意例子、推导及后续实验建议属于本文分析,不代表新的复现实验。

1. 先从一个常见的 Agent 错误讲起

假设一个问答 Agent 要回答“某位人物的合作伙伴出生在哪里”。它先找到这个人物的资料,再做摘要,然后发起第二次检索,最后生成答案。第一步没有明显错误,但摘要没有保留合作伙伴的名字。第二步检索只好重复原问题,最后系统答错了。

如果只给整条轨迹一个零分,我们知道系统失败了,却丢掉了很有价值的区别:这次失败究竟来自检索目标选错、摘要漏掉关联实体,还是答案生成阶段误读了证据?这些错误的最终得分可能相同,应该修改的指令却完全不同。

GEPA 的切入点就是保留这种区别。它让反思模型读取系统执行过程和评价器给出的文字反馈,提出一条新的模块提示词,例如要求摘要保留后续检索所需的关联实体。接着运行修改后的系统,判断这条规则有没有帮助。整个过程中,被优化系统的模型权重保持不变,变化的是各个模块的文字指令。

这个思路并不依赖“反思一定正确”。反思只是产生一个有根据的修改建议,后续测量决定建议是否进入候选集合。真正完整的方法还包括:保存多个提示词版本、决定从哪个版本继续演化,以及可选地合并不同分支上的模块改进。如果只把 GEPA 理解为“让模型帮我改提示词”,就漏掉了搜索过程本身。

图 1:根据论文算法 1 绘制的核心流程。先选父候选,在三个反馈样本上提出和比较一次单模块修改,通过后才进行完整验证。权重不变,最终返回一个提示词程序。

论文最醒目的结果是:在六项任务上,Qwen3-8B 配合 GEPA 的平均分为 54.85,论文 GRPO 配置为 48.91,相差 5.94 个百分点。但六项里有一项 AIME-2025 是 GRPO 更好。标题里的“can”非常重要:这些实验说明提示词优化在一些条件下可以超过一种具体的强化学习配置,没有证明提示词会全面替代权重训练。

另一个需要从开头就说清的数字是“最多节省 35 倍 rollout”。它对应 IFBench 某次搜索里找到最佳提示词的时刻。整个搜索的预算、模型反思的成本和实际部署后的每次调用成本,是另外几件事。后文会逐项拆开。

2. 读懂方法需要的三个前置概念

2.1 优化的是一个组合系统

这里的 Agent 不是只有一段总提示词。可以把系统想成若干模块通过控制流程连接起来:查询生成、检索、摘要、再查询、最终回答。每个模块有自己的指令、模型、输入字段和输出字段。

用 Π=(π1,…,πm)\Pi=(\pi_1,\ldots,\pi_m) 表示全部模块的提示词,用 Θ\Theta 表示模型权重,用 ΦΠ,Θ(x)\Phi_{\Pi,\Theta}(x) 表示系统收到输入 xx 后的最终输出。评价所需的信息记为 zz,它可能是标准答案、必须找到的文档,或者一组格式要求。目标可以写成:

J(Π;Θ)=E(x,z)∼D[μ(ΦΠ,Θ(x),z)],0≤μ≤1.J(\Pi;\Theta)=\mathbb E_{(x,z)\sim\mathcal D} \left[\mu\bigl(\Phi_{\Pi,\Theta}(x),z\bigr)\right], \qquad 0\leq\mu\leq1.

读这条式子时,先看清被优化的变量。GEPA 固定 Θ\Theta,搜索 Π\Pi。它不直接修改模型参数,也没有对离散提示词逐 token 求导。评价对象则仍是整套系统的最终表现,因此一个摘要模块的修改,完全可能通过后续检索影响最终答案。

期望符号还提醒我们有两类随机性:一类来自不同输入,另一类来自模型对同一输入的不同采样。一次改写刚好答对,不等于规则稳定变好。后面的小批次筛选、逐样本冠军选择,都受这两类随机性影响。

2.2 执行轨迹和评价轨迹不是同一回事

执行轨迹记录系统做了什么,比如模块收到的输入、输出的文字、调用的工具和工具返回结果。评价轨迹记录评价器为什么给出这个分数,比如少了一篇支持文档、违反了某个词数要求、泄露了某类个人信息,或者出现了某条编译错误。

这两类信息都比一个标量分数丰富。一个零分无法区分“没有找到证据”和“找到了但没有正确使用”。把文字反馈暴露给优化器,相当于让它利用评价过程里原本已经存在、却经常在打分后被丢弃的信息。

图 2:本文构造的检索失败例子。右侧规则是对错误的解释性假设,不是论文测得的因果结论。图中说明为何相同的零分可以对应不同的修改方向。

不过,文字说明看起来合理,并不意味着归因正确。摘要里漏了一个实体,可能真是瓶颈,也可能检索器根本没有返回正确资料。GEPA 通过后续运行检验修改是否有用,因此应该把反思理解成“有知识的提案机制”,不要把它当作精确的因果分析器。

2.3 与强化学习的更新信号如何对照

为了建立直觉,可以从一个简化的策略梯度等式看起。设轨迹 τ\tau 按策略 pΘp_\Theta 生成,最终奖励为 R(τ)R(\tau),在相应可微条件下:

J(Θ)=∑τpΘ(τ)R(τ),∇ΘJ=∑τpΘ(τ)R(τ)∇Θlog⁡pΘ(τ)=Eτ[R(τ)∇Θlog⁡pΘ(τ)].\begin{aligned} J(\Theta)&=\sum_\tau p_\Theta(\tau)R(\tau),\\ \nabla_\Theta J &=\sum_\tau p_\Theta(\tau)R(\tau)\nabla_\Theta\log p_\Theta(\tau)\\ &=\mathbb E_\tau\left[R(\tau)\nabla_\Theta\log p_\Theta(\tau)\right]. \end{aligned}

第一步写出奖励期望,第二步使用对数导数恒等式,第三步重新写回期望形式。这只是解释“轨迹奖励怎样参与权重更新”的背景式子,不是论文 GRPO 训练目标的完整展开。GRPO 还包含组内相对估计等机制。

GEPA 则可以抽象为从一个文字提案分布中采样新指令:

πj′∼q(πj′∣πj,τ1:b,f1:b).\pi'_j\sim q\left(\pi'_j\mid\pi_j,\tau_{1:b},f_{1:b}\right).

这里 ff 是文字反馈,qq 由反思模型隐式给出。新的指令能否改善表现,要再运行系统才能知道。反思模型自身已有的语言理解、领域知识和归纳能力,构成这个提案分布的先验。所谓“少量反馈就学到规则”,并不意味着这些能力都是在这几个样本里从零学出来的。

还有一个容易混淆的单位:一次 rollout 是一次系统执行,可能包含多次模型调用和工具操作。它不是固定长度的一条生成,也不天然等于固定数量的 FLOPs、固定延迟或固定价格。

3. 一次提示词演化到底发生了什么

3.1 先分清三组数据的职责

算法层面,开发数据被划成反馈集合与选择集合。实验中,预先给定的训练集和验证集分别承担这两个职责。反思模型从训练样本的执行过程和诊断信息里提出修改;验证集上的得分向量决定父候选的抽样和最后选择哪个程序;测试集用来衡量搜索完成后的泛化表现。

即使反思模型不直接看到验证集文本,验证集也参与了优化。原因很简单:某个候选的分数越有利,它越可能继续产生后代。这条信息通道已经使后续搜索依赖验证结果。因此,验证集应被视为反复使用的开发资源,不能把其最高分当成未经选择偏差影响的最终证据。

3.2 算法 1:核心单模块演化

下面用本文的记号重新整理主论文算法。为了分清接纳规则,暂时不加入可选的合并步骤。

  1. 建立候选档案。 把初始系统 Φ0\Phi_0 放入集合 P\mathcal P,其父节点记为空。
  2. 取得初始分数。 在全部选择样本上运行 Φ0\Phi_0,保存逐样本得分向量。
  3. 选择父候选。 预算尚未耗尽时,使用下一节的逐样本选择规则抽一个父系统。
  4. 选择修改位置。 选定一个模块;论文默认设置按轮转顺序遍历模块。
  5. 收集局部反馈。 从反馈集合抽取 b=3b=3 个样本,运行父系统,保留分数、相关轨迹和文字说明。
  6. 生成子候选。 反思模型读取当前模块指令及反馈,生成新指令。复制父系统,只替换这个模块的提示词。
  7. 同批比较。 在相同的三个样本上运行子系统,比较修改前后的平均分。
  8. 有改善才入档。 若子系统的批次平均分严格增加,再对完整选择集合评估,并保存候选、分数向量和谱系。
  9. 继续搜索。 被拒绝的修改不会覆盖父系统,其他已保存候选仍可按选择规则参与后续搜索。
  10. 返回一个程序。 预算结束后,返回档案中选择集平均分最高的候选。

最后一步尤其值得强调。保存不同专长的提示词版本,是为了改善搜索过程。核心适配流程最终返回的是一个提示词程序,而不是测试时先识别题型、再从档案里为每道题选择最有利的提示词。不要把搜索阶段的逐样本冠军误写成部署阶段的动态路由器。

3.3 三个样本为何够用,又为何不够用

如果每次改动都跑一遍完整验证集,搜索成本会很快上升。三个样本提供了一个便宜的初筛:先淘汰明显不好的修改,再把完整验证预算花在看起来有希望的候选上。同批比较也有好处,至少不会出现父系统抽到容易题、子系统抽到难题所造成的直接混淆。

但这个门槛并不是显著性检验。二元得分下,一个答案翻转就可能决定是否通过;连续得分下,一个样本的小幅波动也可能改变结果。反思模型又刚看过这些样本的反馈,修改后在这三题上变好,既可能是抽象出有效规则,也可能是对局部内容适配得更好。

可以用一条简化预算式帮助理解这个折中。假设一共提出 TT 次修改,其中 AA 次通过门槛;选择集大小为 nvn_v;每次修改都重新运行大小为 bb 的父、子批次。忽略合并、缓存与最后一轮提前终止,得到:

Brollout≈nv+2bT+nvA.B_{\mathrm{rollout}}\approx n_v+2bT+n_vA.

第一项是初始候选的完整评估,第二项是逐次局部比较,第三项是通过初筛后的完整评估。这是本文用于规划预算的近似式,不是声称还原了论文所有计数细节。它说明通过率与验证集大小可能比“反思了多少轮”更影响总 rollout 数。反思模型本身的调用还在这条式子之外。

3.4 为什么一次只改一个模块

只修改一个位置,能够缩小搜索空间,也方便理解变化的来源。其余模块保持原状,新候选不会同时改动所有中间接口。代价是:某些需要跨模块配合的改善,可能通过单次局部修改很难发现。

轮转选择模块避免了额外训练一个定位故障的策略,但也可能把预算分给当前不是瓶颈的模块。一个值得做的后续实验,是固定反思与评估预算,比较轮转、按失败频率选择,以及按预计改进幅度选择模块。这能检验“改哪里”是否还有空间,而不是让更多模型调用掩盖策略差异。

4. 逐样本冠军:最容易被简化错的一部分

4.1 从分数矩阵推到抽样概率

设 SkiS_{ki} 是候选 kk 在验证样本 ii 上的得分。对每一列,先求当前最高分,再保留所有并列达到最高分的候选:

si∗=max⁡kSki,Wi={k:Ski=si∗}.s_i^*=\max_k S_{ki},\qquad W_i=\{k:S_{ki}=s_i^*\}.

把这些冠军集合取并集,随后删去其中被支配的候选。这里“被支配”指存在另一个候选在所有样本上都不差,并且至少一个样本上严格更好。删完后的逐样本集合记为 W^i\widehat W_i。

接下来统计一个候选出现在多少个冠军集合里:

fk=∑i=1nv1[k∈W^i].f_k=\sum_{i=1}^{n_v}\mathbf1[k\in\widehat W_i].

再按这个次数归一化:

P(k)=fk∑ℓfℓ.P(k)=\frac{f_k}{\sum_\ell f_\ell}.

直觉上,每赢下一道题就多拿一张抽签票。平均分不是最高、但擅长某些题的候选,仍可能被选中继续演化。这与始终从平均分第一名出发的贪心策略不同。

4.2 算法 2:父候选的选择

  1. 对每个验证样本找到候选中的最高分。
  2. 将所有并列最高分候选放进该样本的冠军集合。
  3. 对全部冠军集合取并集。
  4. 从并集及相应冠军集合中删除被支配的候选。
  5. 计算每个候选剩余的冠军集合出现次数。
  6. 按出现次数成比例抽样,返回父候选。

图 3:本文构造的分数矩阵。星号表示逐样本最高分。A、B、C 分别获得 1、2、2 次冠军成员资格,因此抽样概率为 20%、40%、40%;D 不参与抽样。

这个例子里,第一题 A 和 B 并列;第二题 B 获胜;第三、四题 C 获胜。所以分母是五个冠军成员资格,而不是四道题。若改为先均匀抽一道题,再从该题并列冠军中均匀抽一个,概率会变成 A 为 12.5%、B 为 37.5%、C 为 50%。两种过程不等价,特别是在不同题的并列冠军数量不同时。

4.3 它没有保留整个数学意义上的 Pareto 前沿

论文详细算法先取“每一列至少赢过一次”的候选,再做支配关系过滤。一般的非支配候选未必赢过某一列。考虑两个验证样本和三个候选:

A=(1,0),B=(0,1),C=(0.6,0.6).A=(1,0),\qquad B=(0,1),\qquad C=(0.6,0.6).

A 与 B 分别擅长一题;C 在两题上比较均衡。三个候选互不支配,C 的平均分还是最高的 0.6。但每一列的冠军都被 A 或 B 占据,因此 C 在论文这条父节点抽样规则下的概率为零。

图 4:本文的反例说明“逐样本冠军的并集”与“所有非支配候选”不同。C 可以在最终平均分选择时胜出,但不能因其均衡表现而自动获得父候选抽样机会。

注意,C 没有抽样机会,不代表它必须从完整候选档案里消失。如果它已经入档,最后按平均分选输出时仍然可以选择 C。搜索时从谁出发,与最后部署谁,是两个不同问题。

这种偏好可以是有意设计:保留专家候选,也许更容易发现互补的规则。但它也可能错过“每一题都接近最优”的稳健起点。一个自然的替代方案,是给完整档案保留少量探索概率,或者混合逐样本冠军与平均分选择。是否更好必须通过固定预算实验判断,不能从这个反例直接推出 GEPA 无效。

分数本身的噪声也会影响选择。某个候选偶然答对一题,就可能长期获得一张抽签票;验证维度很多时,严格支配关系又可能很稀少。重复关键样本评估、按任务类别聚合,或者对不稳定冠军降权,都可能改变搜索行为,也都会消耗额外预算。

5. 模块合并为什么有用,也为什么会失效

5.1 把两条分支上的改进组合起来

假设两个候选来自同一个祖先。一个改好了查询生成,另一个改好了摘要。与其让反思模型再次发现这些修改,不如直接把两个模块组合成一个新系统。这就是附录 D.1 中系统感知合并的动机。论文把它作为可选机制,报告设置里最多进行五次合并。

读这里时,正文的概括与详细伪代码要一起看。文字说明强调互补的修改,但附录算法并没有要求两条分支修改过的模块集合完全不相交。它的判定是在发现至少一个仅被单边修改的模块时返回真;其他模块仍可能存在冲突,随后按另一条规则解决。

5.2 算法 3:按论文附录整理合并提案

  1. 选两个不同父候选 i,ji,j,跳过一方直接位于另一方祖先链上的组合。
  2. 找共同祖先 aa,跳过已经尝试过的 (i,j,a)(i,j,a) 组合。
  3. 若祖先的整体得分高于两个父候选中的较低分,则跳过。也就是说,两条分支至少都不能比该祖先差。
  4. 要求存在至少一个模块,只在一条分支上发生了相对祖先的变化。
  5. 从祖先程序开始构造新候选。
  6. 某模块只被一方修改时,复制该方的新指令。
  7. 两方把同一模块改成不同指令时,采用整体得分更高的父候选版本,平分时随机处理;其他共享变化或默认情况使用相应父版本。
  8. 返回新程序及谱系,供后续评估。拼接成功本身不代表性能提高。

图 5:依据论文附录算法构造的合并示例。查询和摘要可以取各自的单边修改;回答模块出现冲突时,按父系统整体分数选择。这里有冲突,因此不能把此规则简化成只合并完全不重叠的修改。

用父系统整体分数决定某个模块版本,计算上很便宜,但不能等同于估计这个模块的独立贡献。一个父系统更强,可能是因为它的检索模块更强,并不意味着其中所有模块都更强。这也是合并需要重新评价的原因。

5.3 两个正向变化之和未必仍是正向变化

设 F(q,s)F(q,s) 表示使用查询提示词 qq 和摘要提示词 ss 时的期望得分。祖先为 (q0,s0)(q_0,s_0),两项单独修改的收益记为:

Δq=F(q1,s0)−F(q0,s0),Δs=F(q0,s1)−F(q0,s0).\begin{aligned} \Delta_q&=F(q_1,s_0)-F(q_0,s_0),\\ \Delta_s&=F(q_0,s_1)-F(q_0,s_0). \end{aligned}

再定义两项修改的相互作用:

I=F(q1,s1)−F(q1,s0)−F(q0,s1)+F(q0,s0).I=F(q_1,s_1)-F(q_1,s_0)-F(q_0,s_1)+F(q_0,s_0).

把两条单独收益和相互作用相加,中间项抵消,得到:

F(q1,s1)−F(q0,s0)=Δq+Δs+I.F(q_1,s_1)-F(q_0,s_0)=\Delta_q+\Delta_s+I.

即使 Δq\Delta_q 和 Δs\Delta_s 都为正,只要 II 足够负,合并仍然更差。具体来说,一个摘要规则可能要求删掉重复背景,另一个查询规则却依赖摘要重复写出这些背景。字段格式没有变化,字段承载的信息约定却变了。

更保守的做法,是在新诊断批次上先比较合并候选,再决定是否进行完整验证;更昂贵的做法,是跨多个上下文单独替换模块,估计其效果。两者都是用额外测量换取对模块相互作用的理解。论文选择便宜的组合规则,有实际价值,也必须承认它的失败边界。

6. 六项任务的结果应该怎么读

6.1 先保留完整的胜负关系

下表整理自主论文表 1。所有数值使用论文的百分制得分口径;最后一行是六项任务的宏平均,不是把所有测试样本合在一起算的一个准确率。

任务Qwen 基线GRPOGEPAGEPA 加合并
HotpotQA42.3343.3362.3364.33
IFBench36.9035.8838.6128.23
HoVer35.3338.6752.3351.67
PUPA80.8286.6691.8586.26
AIME-202527.3338.0032.0032.00
LiveBench Math48.7051.2651.9551.95
宏平均45.2348.9154.8552.40

不带合并的 GEPA 在五项任务上超过 GRPO,AIME 则低六个百分点。HotpotQA 和 HoVer 的提升最明显,分别高出 19.00 和 13.66 个百分点。这些任务里,保留证据、寻找缺失关系、协调多步检索,本来就很适合通过明确的指令进行改善。

图 6:根据论文表 1 重画的逐任务差值。纵轴是百分点,不是相对百分比。图中没有添加论文未提供的不确定性区间。

平均提高 5.94 个百分点,是 54.85−48.9154.85-48.91。若要报告相对百分比,则需要再除以基线 48.91,两者不能混写。另一个问题是宏平均的意义:它让每项任务有相同权重,却没有证明隐私质量评分的一分,与数学准确率的一分具有相同的应用价值。

6.2 数据划分会改变结论的强度

HotpotQA 与 HoVer 都使用 150 个训练样本、300 个验证样本、300 个测试样本。HoVer 在此处关注完整支持文档集合的检索,不应把这个分数延伸成任意最终回答的真实性保证。HotpotQA 系统在多跳检索后接回答模块,模块反馈可提示还缺哪些证据文档。

IFBench 的训练与验证来自 IF-RLVR,分别为 150 和 300 个样本;测试集为 294 个样本,涉及新的约束类型。系统先生成回答,再由第二阶段进行约束修正。这种划分确实在检验规则迁移,但附录中的提示词也展示了风险:训练阶段有用的具体规则,可能被写成不分条件的要求,导致新任务失败。

AIME 的训练与验证来自 2022—2024 年共 90 道题,划为 45 道训练、45 道验证。2025 测试集有 30 道不同题,每题采样五次,共 150 次生成。150 次生成不是 150 道独立题目。 多次采样有助于估计同一题上的随机成功率,却不会凭空增加题型覆盖。LiveBench Math 则有 368 道收集的问题,以种子零打乱后分成三份。

PUPA 的训练、验证、测试数量分别是 111、111、221。流程包括可信的查询改写器、外部模型和可信的最终回答模块。反馈综合任务质量与隐私泄露情况。总体分高,不意味着每一种敏感信息都得到保护,也不意味着所有任务类别的实用性都保持不变。

6.3 GRPO 和其他基线具体比较了什么

Qwen3-8B 的 GRPO 主实验采用组合系统上的 LoRA 训练:rank 为 16,alpha 为 64,dropout 为 0.05;每组 12 条输出,每步四个实例,共 500 步,因此是 24,000 次 rollout,并按固定间隔进行验证。这是一种明确、可理解的训练配置,不是对所有可能 RL 配置的穷尽比较。

附录还有全参数 GRPO 补充实验,但范围限于两跳 HoVer。它可以加强局部证据,不能悄悄把主表的六任务 LoRA 比较扩张为“六任务上超过一切全参数训练”。优化器、模型规模、奖励设计和计算预算都可能改变排名。

MIPROv2 是相关的提示词搜索基线,GPT-4.1 Mini 还比较了不使用示例的版本。Trace/OptoPrime 与 TextGrad 被适配到相同组合架构和评价接口,但模块专用反馈的支持并不完全相同。因此,整套系统的横向比较适合回答“在这些配置下哪种方案效果好”;想单独判断某个设计的因果贡献,还要看控制其他条件的消融实验。

模型的推理参数同样属于实验条件。Qwen 使用 temperature 0.6、top-p 0.95、top-k 20;GPT-4.1 Mini 使用 2025-04-14 版本,temperature 为 1.0;上下文长度上限为 16,384。它们是论文中的历史设置,不能当成今天任意同名 API 的最新测试结果。

7. “35 倍”到底在比较哪一笔账

7.1 找到最佳提示词,与跑完整个搜索不同

Qwen IFBench 实验中,论文说 GEPA 在第 678 次 rollout 后发现了最后选中的最佳提示词,而 GRPO 的训练预算是 24,000。相除得到:

24,000/678≈35.40.24{,}000/678\approx35.40.

这是 35 倍说法的来源。但是同一张表也列出,GEPA 在该任务上整个优化过程使用 3,593 次 rollout。按完整预算比较则是:

24,000/3,593≈6.68.24{,}000/3{,}593\approx6.68.

两个数字都可以有意义,只是回答的问题不同。前者是回头看整次搜索后,知道最佳提示词出现在哪一刻。真正在线运行时,若没有一个能可靠识别“后面不会更好”的停止规则,不能假设当时就可以放心结束。

图 7:根据论文 IFBench 数字重画的预算对照。678 是最佳提示词出现的位置,3,593 是完整 GEPA 预算,24,000 是 GRPO 预算。三个数量不能在表述中随意互换。

六项任务中,GEPA 报告的平均总预算为 3,936,GRPO 为 24,000,比例约为 6.10。这仍然只是 rollout 口径,而且隐藏了任务间差异。更关键的是,不同方案每次 rollout 的真实成本未必相同。

7.2 反思模型调用也要计入成本

附录 N 给出了反思调用次数。按 HotpotQA、IFBench、HoVer、PUPA、AIME、LiveBench Math 的顺序,Qwen 对应为 64、17、50、38、90、38;GPT-4.1 Mini 为 69、21、92、46、24、34。

这些次数比 rollout 总数小,但一次反思可能读入很长的轨迹和提示词,所以不能直接忽略。比较成本时,至少应拆成:

Csearch=Csystem+Cevaluation+Creflection+Corchestration.C_{\mathrm{search}}= C_{\mathrm{system}}+C_{\mathrm{evaluation}}+ C_{\mathrm{reflection}}+C_{\mathrm{orchestration}}.

系统执行、评价器、反思、调度各自有费用。若比较 RL,还要考虑梯度计算、优化器状态、训练与推理同步,以及硬件利用率。若使用 API,则要分别统计输入输出 token、重试、工具调用和延迟。把这些都压成一个 rollout 倍数,会把不同性质的资源混在一起。

论文附录报告了 GPT-4.1 Mini 实验的历史费用,其中 GEPA 为 86 美元,带合并版本为 67 美元。它们是这些实验的账单,不是当前 API 价格,也不是控制所有条件后证明“加入合并一定更省钱”。不同搜索路径会产生不同的调用和 token 消耗。

7.3 部署以后,还要计算摊销

搜索花的是一次性成本,优化后的提示词可能在每个请求上继续增加或减少输入 token。对两个质量可比的方案 A、B,可以先用线性模型估算:

CA(Q)=CA,0+QcA,CB(Q)=CB,0+QcB.\begin{aligned} C_A(Q)&=C_{A,0}+Qc_A,\\ C_B(Q)&=C_{B,0}+Qc_B. \end{aligned}

这里 QQ 是部署后的请求数量,C⋅,0C_{\cdot,0} 是前期优化成本,c⋅c_\cdot 是每次服务成本。令两者相等并整理,得到:

Q∗=CA,0−CB,0cB−cA.Q^*=\frac{C_{A,0}-C_{B,0}}{c_B-c_A}.

当 A 的前期成本更高、每次服务更便宜时,Q∗Q^* 才具有通常所说的回本请求量含义。若分母为零、符号不同,或两种方案质量不可比,就不能机械套用。实际缓存和批处理也可能让成本偏离线性关系。

举一个纯粹假设的例子:搜索花 120 美元,每个请求节省 0.002 美元,那么需要 60,000 个请求才能抵消前期花费。这不是 GEPA 的实验数字,只是说明为什么“一次性问题”和“每天服务大量请求的固定 Agent”会做出不同的投资判断。

8. 迁移、消融和提示词附录提供了什么额外证据

8.1 跨模型迁移说明有些规则可以复用

GPT-4.1 Mini 的六任务平均分,基线为 53.03,GEPA 为 65.22,GEPA 加合并为 66.36。完全在 Qwen 上优化的提示词,不修改地迁移到 Mini 后达到 62.03,比 Mini 基线高九个百分点。这说明至少在这些任务和架构中,文字规则能跨模型保留一部分价值。

但“跨模型有用”不等于“与模型无关”。任务、输入分布和模块接口仍然相同。跨语言、跨工具协议、跨模型世代,都是更进一步的实验。此外,迁移后的提示词也没有在所有意义上达到为目标模型直接优化的效果。

8.2 合并的效果具有明显条件性

Qwen 的 IFBench 从不带合并的 38.61 降到 28.23,下降 10.38 个百分点;PUPA 也有下降。Mini 上,合并却让 IFBench 从 52.72 提高到 55.95,让 HoVer 从 51.67 提高到 56.67,同时 HotpotQA 从 69.00 降到 65.67。

图 8:根据论文表 1—2 重画的合并效果。纵轴是带合并减去不带合并的百分点差值。两个数学任务的零差值仍保留在图中。

这里还有一处需要认真核对的表述:表 1 的概括性图注声称两个 GEPA 版本除了 AIME 都超过 GRPO,但 IFBench 的合并版本实际低于 GRPO。读结果应该以具体单元格为准。这个差异不会抹掉 GEPA 的主要贡献,却说明合并应被当作需要验证的选项,不能默认是全面升级。

8.3 选择策略消融使用的是四项任务

表 3 固定演化流程,把父节点选择换成贪心或宽度为四的 beam。四个非数学任务上的平均分为:初始系统 48.84,贪心 54.89,beam 53.95,GEPA 61.28。这对“保留局部专家有助于搜索”提供了比跨系统比较更直接的证据。

图 9:左图重画表 3 的四任务选择消融,右图重画表 2 的六任务迁移结果。两个面板的任务集合不同,不能把绝对平均分放在同一排名里解释。

特别不要把这里的 61.28 与主表六任务的 54.85 比较,然后说某种设置提升了六七分。分母里的任务集合已经变了。消融所支持的结论,也仍依赖当前的反思模型、反馈质量和搜索预算;换一种噪声更大的评价器,候选保留策略的优劣可能改变。

8.4 完整提示词里既有抽象,也有过度泛化

HotpotQA 的演化提示词会要求保留桥接实体,第二跳检索要寻找第一跳缺失的关系。这些是容易理解、可迁移的操作规则。但附录也含有具体人物、领域事实和训练反馈里出现的例子,因此不能把全部改进都说成完全脱离内容的通用算法。

Qwen 的 IFBench 提示词里出现了无条件重复用户问题的要求。在某些训练约束下,这可能有利;在另一些限制输出格式或长度的任务里,它可能反而违规。这是“局部观察被写成全局规则”的具体例子。不过,光看这个例子还不能证明它就是合并退化的唯一原因;那需要控制变量的提示词组件实验。

PUPA 的提示词逐步增强匿名化、概括化要求,符合隐私指标改进的方向。另一方面,删掉地点、日期或关键数值,也可能让某些正当任务失去精度。还必须区分可信模块内部看到的信息,与真正发给外部模型的信息。隐私判断应沿着信息跨越信任边界的路径进行,而不是只看提示词写了多少“保护隐私”的要求。

8.5 推理时搜索与泛化实验应分开

论文还有直接针对目标任务集合进行优化的 kernel 生成实验。这时反馈、选择、目标集合可以按设计重合,目的就是为已知任务找到更好的程序。它是合理的推理时搜索,但不等同于主表中训练后在独立测试集上评估的适配结论。

NPUEval 中,GPT-4o 的基线得分为 4.25,一个选出的提示词达到 26.85,该实验所报 Pareto 结果为 30.52。硬件利用率类得分不能直接解释为运行速度提高多少倍。CUDA 实验使用 V100 上 35 个代表性 KernelBench 任务,fast-pp 统计正确且超过某个加速阈值的 kernel 比例;设备与任务选择都限制外推范围。

另一个附录例子研究对抗提示词导致的 AIME 成功率下降,其中很多回答实际输出了字面答案占位符。这意味着格式和解析失败参与了指标变化。更稳妥的解释是,被测回答流程遭到破坏,不能仅凭这个分数断言模型原有的数学推理能力全部消失。

9. 如果要采用这个思路,我会怎样设计评估

下面是本文提出的评估方案,没有声称已经运行这些实验。它关注一个实际决策:搜索得到的新提示词,是否值得替换原来的 Agent 配置?

首先,按照自然样本单位保留一个锁定测试集。数学题的多次采样应归到同一道题,来自同一用户或同一模板的请求也需要考虑相关性。其次,保留分项指标:隐私任务分别看泄露与效用;约束生成分别看语义正确性和各类约束;kernel 任务分别看正确性和延迟。只有一个平均分时,很容易把严重的局部退步藏起来。

9.1 用配对差值比较两个固定候选

对固定父候选和子候选,在 nn 个独立测试问题上分别测量,定义:

di=richild−riparent,Δ^=1n∑idi.d_i=r_i^{\mathrm{child}}-r_i^{\mathrm{parent}},\qquad \widehat\Delta=\frac1n\sum_i d_i.

每一项差值都来自同一道题,因此题目难度的一部分影响能够抵消。先计算配对差值的样本方差,再得到均值标准误:

sd2=1n−1∑i(di−Δ^)2,SE^(Δ^)=sdn.\begin{aligned} s_d^2&=\frac{1}{n-1}\sum_i(d_i-\widehat\Delta)^2,\\ \widehat{\mathrm{SE}}(\widehat\Delta)&=\frac{s_d}{\sqrt n}. \end{aligned}

这要求明确独立单位。如果每题生成五次,不能直接把五次当作五道独立题来缩小误差条。可以按题做分组 bootstrap,再在组内保留重复生成的信息。配对也不会自动消除生成随机性,更不会修复测试集被反复用于选模型的问题。

9.2 为什么“验证集最高分”不能直接当保证

有一个常见的理论直觉值得准确表述。假设 KK 个候选都在独立测试集之外提前固定,得分有界,测试集包含 nn 个独立样本。先对每个固定候选应用集中界,再对 KK 个候选使用并集界,可以得到一种形式:

Pr⁡ ⁣[max⁡k≤K∣J^k−Jk∣>ϵ]≤2Kexp⁡(−2nϵ2).\Pr\!\left[\max_{k\le K}|\widehat J_k-J_k|>\epsilon\right] \le2K\exp(-2n\epsilon^2).

若希望失败概率不超过 δ\delta,整理可得充分条件:

ϵ≥log⁡(2K/δ)2n.\epsilon\ge\sqrt{\frac{\log(2K/\delta)}{2n}}.

它说明候选越多,选择时越需要考虑偶然高分。但这不能直接套到 GEPA 反复使用的选择集上。后续候选依赖之前的验证得分,已经违反候选独立于测试集提前固定的条件。正确用途是提醒我们在搜索后做新评估,而不是拿这条式子给内部最大验证分数盖章。

9.3 算法 4:一个可执行的采用决策流程

  1. 搜索开始前固定任务定义、分组规则、模型版本和资源预算。
  2. 只利用开发反馈和选择分数搜索提示词。
  3. 分别记录 rollout、反思 token、总 token、总耗时与费用。
  4. 在接触最终测试集前冻结选中的提示词程序。
  5. 用按问题配对的方式,对比基线、所选程序和不带合并版本。
  6. 同时报告置信区间、任务子类和失败类型,避免只看宏平均。
  7. 结合质量收益与部署摊销判断是否采用,并保留旧提示词以便回退。

这个流程检验的是已经选定的系统。若看了测试分数后再继续搜索,应当承认它重新变成开发数据,并安排新的最终评估。否则“测试结果越来越好”可能只是搜索越来越适应那一组题。

10. 局限与适用边界

反馈质量决定能学到什么。 详细诊断有时来自标准文档、可信标签或昂贵评价器。只有延迟满意度或稀疏点击信号的产品,拥有的信息条件并不一样。评价器说错了,反思模型还可能把错误解释写成长期规则。

提示词能表达的能力有边界。 模块协调不好、指令模糊,通常比较适合修改文字。缺乏数学能力、不熟悉的知识或不可靠的计算,则未必能靠一句更好的要求解决。AIME 的结果与这个边界相容,但单个任务的胜负不足以证明完整因果机制。

搜索容易放大偶然成功。 三样本接纳、逐样本冠军、反复验证,都会偏好已经观察到的成功。这些机制有助于省预算,同时也带来噪声与适应性过拟合。主表的点估计很有信息量,仍不等于多个优化种子和独立测试不确定性的完整报告。

模块化不代表模块彼此独立。 字段名称、数据格式都不变,中间文字的信息含义也可能变化。合并需要尊重这种语义接口,否则两个好模块可能配成坏系统。Qwen IFBench 的下降是值得保留的实用边界。

迁移证据只覆盖已经测量的范围。 Qwen 到 Mini 的结果很有价值,但没有覆盖所有语言、工具模式和模型世代。提示词依旧携带对系统环境的假设,换环境时应重新评估。

效率结论依赖计量方式。 rollout 长短不一、调用构成不一;最佳发现点依赖回看,未必能在线识别;历史账单不等于当前价格;特定设备上的实验不等于任意硬件上的加速。将这些限制写清楚,才能把论文结论转成可信的工程预期。

11. 独立批判性分析

11.1 最值得保留的是反馈接口,而非一场笼统的提示词与 RL 比赛

对我来说,GEPA 最重要的启发是:很多 Agent 已经产生了可以解释失败的证据,但优化器最终只拿到一个分数。把这些证据组织成下一次程序修改的输入,是一条具体而可检验的路线。

这种理解也暴露了方法的依赖。改进反馈设计,可能在完全不改反思模型和选择策略的情况下改变结果。下一步很有价值的实验,是固定数据、提案模型和预算,依次只给标量、一般性文字解释、模块级诊断、包含参考信息的丰富诊断。这样才能分清多少收益来自优化机制,多少来自它获得的信息更丰富。

对于真实应用,这个问题比“用了哪种优化器名字”更直接。若诊断本身不可靠,自动把它总结成规则可能增加错误;若诊断能定位到稳定的接口问题,少量轨迹就可能产生有价值的修改。改进评价器并不是外围工作,而是方法有效性的一部分。

11.2 选择规则需要比“保留 Pareto 前沿”更精确的解释

逐样本冠军的并集偏好局部专长,这有明确的设计理由,四任务消融也提供支持。但均衡候选反例说明,它还存在可讨论的偏置。一个每道题都接近第一名的候选,未必能获得继续演化的机会。

我更想看到固定预算下的几种混合策略:冠军抽样加平均分抽样、冠军抽样加少量均匀探索,以及经过重复测量后再确认冠军。除了最终测试分,还应报告保留的多样性、提案通过率和每种策略的评估消耗。否则“更多样化”很容易只是多花预算后的表象。

这不是说原算法应该无条件换掉。保持机制简单本身有价值。关键是准确描述它在保护什么、舍弃什么,才能判断这种偏好与目标任务是否匹配。

11.3 合并的失败值得成为下一轮研究对象

文字说明强调互补变化,而详细伪代码允许部分冲突,并用父系统整体分数选择冲突版本。这个选择便宜,但把全局得分当作局部模块质量的代理,假设并不弱。

一个直接的后续实验可以把严格不相交的合并,与含冲突的合并分开统计,分别报告接纳率和最终测试效果。进一步可以比较:冲突时使用父系统整体得分,还是用目标模块替换后的局部测量。前面的相互作用推导说明为什么这些实验有意义,但它们仍是建议,不是论文已经证明的结果。

IFBench 的下降也提醒我们,不应只展示成功合并的故事。特别是面对新约束时,两个在原验证分布上合理的规则,可能共同造成更强的错误偏好。保留失败案例比用一个平均提升掩盖它们,更能帮助后来者选择配置。

11.4 提示词优化与权重训练可以分工

一种合理的工程顺序是:先通过提示词修掉接口和指令错误,再针对剩余能力瓶颈训练权重,最后为变化后的模型重新调整提示词。这个顺序只是一个可研究的方案,没有保证一定最优,但比把两类方法看成永远互斥更符合系统实际。

它也有代价:权重更新后,先前有效的文字规则可能失效;重新搜索又改变了训练输入条件。因此联合使用时,仍需要清晰的数据边界、成本记录和最终测试。GEPA 让提示词程序变成一种可以系统优化的对象,没有替我们回答每一次资源应该投向训练、检索、架构还是人工修复。

12. 结论

GEPA 证明了一件很实用的事:Agent 的失败过程往往包含比最终分数丰富得多的学习信号。反思把信号变成可读指令,逐样本选择保留局部专长,可选合并复用不同分支的改进。在反馈具体、模块协调重要的任务里,这条路线表现出明显价值。

读完全文后,我会同时记住几条边界:最后输出的是一个程序;逐样本冠军不等于完整 Pareto 前沿;合并可能退步;发现最佳提示词的位置不等于完整成本;重复生成不等于独立题目。把这些区别保留下来,才能从论文里提取可靠的设计判断。

如果一个 Agent 会被反复使用,而且评价过程能提供有意义的诊断,GEPA 很值得作为提示词优化思路进行评估。采用与否,最好由锁定测试集、分项失败分析和清楚的资源预算共同决定。

参考资料与图表来源

  1. Agrawal 等,GEPA 论文 arXiv v2。主要依据主算法 1—2、表 1—3,以及附录 D—N。
  2. 96 页完整 PDF。第 6 页为主算法,第 8 页为六任务结果,第 24 页为合并伪代码,第 96 页为反思调用统计;附录 L 展示演化提示词。
  3. ICLR 2026 Oral 日程,用于核实会议状态。
  4. GEPA 官方项目,作为读者资源入口。

图 1—5 为 Zhongzhu Zhou 绘制的解释图或构造例子;图 6—9 根据论文表格数值重新绘图,比较口径在图注中标明。选择概率示例、模块相互作用推导、预算与摊销模型、评估建议均为本文分析。本文没有声称新增实验或复现结果。