harness_evolve/notes/ref19_gepa.md

GEPA: Reflective Prompt Evolution Can Outperform Reinforcement Learning

一句话总结:与其用 GRPO 那种"把整条 rollout 压成一个标量奖励、再估策略梯度"的强化学习去适配下游任务,不如把 rollout 序列化成自然语言轨迹、让一个反思式 LLM 读懂它、诊断哪一步出错、有针对性地改写 prompt——再用一个遗传-Pareto 搜索维护"每道题各自最优"的候选前沿来避免陷入局部最优;结果在 6 个任务上平均超过 GRPO 6 分(最高 20 分)却少用最多 35× 的 rollout,并稳超此前最强 prompt 优化器 MIPROv2 逾 10 分。


TL;DR 速览

tags: #prompt优化 #自我改进 #reflective-evolution #genetic-pareto #compound-ai-system #样本效率 #RL对照 #DSPy

related: [[ref09_meta-harness]](把 GEPA 当"反馈最丰富的文本优化器"对照,并进一步无损化)· [[ref07_ace-agentic-context-engineering]](ACE 拿 GEPA 当基线)· [[ref14_self-refine]](单候选自反思,GEPA 的反思算子的前身)· [[ref15_aflow]](在 workflow 图空间搜索,vs GEPA 在 prompt 空间)· [[ref18_promptbreeder]](自指涉 prompt 进化,GEPA 引为进化式前作)· [[ref17_self-harness]](同属"固定模型 + 累积反馈"谱系)· [[ref20_alphaevolve]](进化式代码搜索,GEPA 显式对比)


摘要

LLM 越来越多地通过 RL 方法(如 GRPO)适配下游任务,而这些方法往往需要上千条 rollout 才能学会新任务。我们论证:语言的可解释性质通常为 LLM 提供了比"从稀疏标量奖励导出的策略梯度"丰富得多的学习介质。为验证这一点,我们提出 GEPA(Genetic-Pareto),一个充分融入自然语言反思、从试错中学习高层规则的 prompt 优化器。

给定任何含一个或多个 LLM prompt 的 AI 系统,GEPA 采样轨迹(推理、工具调用、工具输出)→ 用自然语言反思这些轨迹以诊断问题、提出并测试 prompt 更新 → 从它自己尝试的 Pareto 前沿上组合互补的经验。因此它常能把区区几条 rollout 变成一次巨大的质量提升。跨 6 个任务,GEPA 平均超 GRPO 6%、最高 20%,同时用最多 35× 更少的 rollout;也超过领先的 prompt 优化器 MIPROv2 逾 10%(AIME-2025 上 +12%),并作为代码优化的推理时搜索展现出有前景的结果。


1 介绍:为什么"用语言学"比"用标量奖励学"更省样本

论文开篇立起一个明确的对立面:RLVR / GRPO。它把成败当作回合末的标量奖励去估计策略梯度,虽然有效,但实践中动辄要几万到几十万条 rollout。在很多真实场景里,rollout 意味着调用昂贵工具、消耗有限的推理预算、或者根本无法微调最强模型——样本低效很快变成瓶颈

[!TIP] 什么是 GRPO / RLVR?(本文的主要对照) RLVR(Reinforcement Learning with Verifiable Rewards)指用"可自动验证的奖励"(如答案是否正确、代码是否通过测试)来做 RL,绕开人类打分。GRPO(Group Relative Policy Optimization)是 DeepSeek 提出的一种策略梯度算法:对同一道题采样一组 rollout,用组内相对优势(该 rollout 分数减去组均值)替代 critic 来估计梯度,省掉了单独的价值网络。它的软肋是:奖励只在回合末给出一个标量,整条推理链里"哪一步对、哪一步错"的信息全被压成一个数字,因此需要海量 rollout 才能把梯度信号从噪声里拉出来。GEPA 的全部动机就是——这个压缩是没必要的

作者的关键观察:即便是最复杂的 LLM 系统,其 rollout 也能被无损序列化成一段自然语言轨迹——里面除了各模块的指令、LLM 的推理链、工具调用,还包括 reward 函数塌缩成标量之前的内部产物(如编译器报错)。既然现代 LLM 读得懂这些文本,那么"刻意用语言反思这些轨迹来学习"就能更好地利用 LLM 的强语言先验。

于是本文提出 GEPA——一个面向 compound AI system 的反思式 prompt 优化器,它把文本反思多目标进化搜索融合起来。每次变异,新候选都从一个"祖先"派生,累积从观测和 LLM 反馈中提炼的高层规则;为避开贪心 prompt 优化的局部最优,GEPA 维护一个 Pareto 前沿——不是只进化全局最好那一个,而是随机探索"在各道题上表现最好"的那批 prompt,从而鲁棒泛化、不陷死角。

评测覆盖多跳推理(HotpotQA)、数学(AIME、LiveBench-Math)、指令遵循(IFBench)、隐私感知委托(PUPA)、检索增强验证(HoVer),模型用开源 Qwen3-8B 和闭源 GPT-4.1-Mini。头条结果:Qwen3-8B 上超 GRPO 最高 20%、少用 35× rollout、平均 +6%;聚合上超 MIPROv2 +13%(是其 +5.6% 的两倍多)。

Figure 1: GEPA vs MIPROv2 vs GRPO 的学习曲线

Figure 1 逐元素解读(全文的招牌"样本效率"图):两个面板分别是 HotpotQA 和 IFBench(都用 Qwen3-8B)。横轴 = rollout 数(一路到 24000),纵轴 = 分数;圆点是验证集表现的进程曲线、★ 是测试集最终表现。 - 橙线(GRPO):用满 24000 rollout,曲线爬升缓慢且低——HotpotQA 上到 24k 才 ~52,IFBench 上 ~64。★ 落在最右下(花光预算、成绩最差)。 - 绿线(MIPROv2):作为 prompt 优化器学得快,但很快到顶。 - 蓝线(GEPA)极左侧(几千 rollout 内)就冲到最高,HotpotQA ~62、IFBench ~80,远超 GRPO 与 MIPROv2;★ 高踞左上——又快又好。 - 信息:两个 prompt 优化器(蓝、绿)都比 GRPO(橙)学得快,而 GEPA(蓝)在最终分数上又明显压过 MIPROv2(绿)。这张图一眼说清全文两大主张:反思式进化既比 RL 省样本、又比现有 prompt 优化器强


2 相关工作:把 GEPA 放进"prompt 优化 / 语言学习 / compound 系统优化"的坐标

作者从四条线索定位 GEPA。下面把每条里的关键前作讲透。

[!TIP] ① 自动 prompt 优化(LLM 当优化器) - APE / OPRO / PromptWizard [Zhou'22; Yang'24; Agarwal'24]:用 LLM 自动改写 prompt,把"历史 (prompt, 分数)"喂回去让它提新 prompt。 - ProTeGi / APO [Pryzant'23]:把"文字版梯度下降 + beam search"用于 prompt 优化——本文把它的 BeamSearch(N=4) 当候选选择的对照(见 Table 3)。

GEPA 的差异:也用 LLM,但额外引入环境的文字反馈、对候选做 Pareto 感知搜索、并按 AI 系统的子模块分别进化(而非只优化一条整 prompt)。

[!TIP] ② 进化式算法 / 进化式代码搜索(GEPA 名字里"Genetic"的来源) - EvoPrompt [Guo'24]:进化一个 prompt 种群。 - Promptbreeder [Fernando'24]自指涉的自我改进——连"变异 prompt 的 prompt"本身也一起进化。见 [[ref18_promptbreeder]]。 - Rainbow Teaming [Samvelyan'24]:用质量-多样性(quality-diversity)进化生成多样的对抗 prompt。 - AlphaEvolve [Novikov'25] / OpenEvolve:把进化搜索直接用于代码改写,当解可被代码化时极强。见 [[ref20_alphaevolve]]。

GEPA 的差异:AlphaEvolve 针对单个难题做代码进化;GEPA 把进化带到跨领域的 prompt 上,用领域专用反馈做有针对性的变异、并结合 Pareto 前沿把"相关问题上学到的战术"迁移过来,样本效率更高。

[!TIP] ③ 语言空间的反馈驱动学习(vs RL)(GEPA 的思想母体) - Self-Refine [Madaan'23]:让模型自我反馈、迭代改写自己的答案——GEPA "反思算子"最直接的前身。见 [[ref14_self-refine]]。 - Reflexion [Shinn'23]:把口头反馈存进记忆供后续尝试用("言语强化学习")。 - In-context bandit / NLRL [Monea'25; Feng'25]:把在线学习/RL 搬进上下文,用语言而非梯度。 - Dynamic Cheatsheet [Suzgun'25] / Trace(OptoPrime) [Cheng'24]:测试时合成策略 / 用执行轨迹做"生成式 autodiff"。Trace 也是本文 GPT-4.1-Mini 上的对照基线。

GEPA 的差异:它用样例去提出新的指令(而不是把样例本身塞进上下文当记忆/few-shot),产出的是任务专用的显式规则

[!TIP] ④ compound AI system / agent 的优化(GEPA 的直接同类,也是它的基线) - DSPy [Khattab'22/'24]:把"声明式 LLM 调用"编译成流水线,主要搜索/自举 few-shot 示例。见下方"什么是 compound AI system / DSPy"。 - MIPROv2 [Opsahl-Ong'24]:用贝叶斯优化联合对齐指令与 few-shot 示例——本文最主要的 prompt 优化对照。 - TextGrad [Yuksekgonul'25]:把"文字反馈"当作可反向传播的梯度,串起多组件优化;它的候选选择是"总取最好那个"(本文 Table 3 的 SelectBestCandidate 对照)。 - Optimas [Wu'25a]:给每个模块引入全局对齐的局部奖励

它们的共性缺陷(本文论点):这些方法大多依赖全局奖励。GEPA 的独到之处是——把全局奖励与"每模块的环境文字反馈"结合,并在单个数据实例层面维护 Pareto 前沿,把 prompt/agent 设计匹配到具体样例上;Pareto 引导的进化让它在收敛到鲁棒、可泛化的解之前,先充分探索多样的 prompt/code/agent 设计策略

方法 学习信号 候选选择 粒度 与 GEPA 的关系
GRPO [Shao'24] 回合末标量奖励 → 策略梯度 权重(全系统) 主对照:样本低效
MIPROv2 [Opsahl-Ong'24] 全局标量分 + 贝叶斯优化 全局最优 指令 + few-shot 主 prompt 对照;GEPA 聚合 gain 是其 2×
TextGrad [Yuksekgonul'25] 文字反馈"反传" 总取最好(易局部最优) 多组件 Table 3 的 SelectBest 对照
APO/ProTeGi [Pryzant'23] 文字梯度 + beam BeamSearch(N) 单 prompt Table 3 的 BeamSearch 对照
Self-Refine [Madaan'23] 自我反馈 单候选 单答案 反思算子前身
AlphaEvolve [Novikov'25] 标量分 + 程序库 进化 单函数代码 进化式对照,面向单难题
GEPA 标量 + 每模块文字反馈 + 轨迹反思 Pareto 前沿随机采样 每模块 prompt 本文

[!TIP] 什么是 compound AI system / DSPy?(理解 GEPA 优化对象的关键) compound AI system(复合 AI 系统)指"由一个或多个 LLM 调用组成、可能穿插外部工具调用、由任意控制流编排"的模块化系统——它涵盖了 agent、多 agent、以及 ReAct、Archon 这类通用脚手架。DSPy 是 Khattab 等人提出的框架,把这种系统写成声明式的"模块 + 签名(输入/输出 schema)",再由优化器(如 MIPROv2、现在的 GEPA)自动"编译"出每个模块的最佳 prompt/few-shot,而不用手工调 prompt。本文正是把系统形式化为 \(\Phi=(M,C,X,Y)\)(模块集、控制流、全局输入/输出 schema),GEPA 优化的就是这堆模块 prompt \(\Pi_\Phi\),模型权重 \(\Theta_\Phi\) 冻结。一句话:DSPy 提供"可优化的模块化 LLM 程序"这个抽象,GEPA 是运行在这个抽象之上的、反馈最丰富的优化器。


3 方法:Genetic-Pareto 反思式 prompt 进化

3.1 优化目标与"样本高效"约束

把系统形式化为 \(\Phi=(M,C,X,Y)\)\(M=\langle M_1,\dots,M_{|M|}\rangle\) 是语言模块集,\(C\) 是控制流,\(X,Y\) 是全局输入/输出 schema。每个模块 \(M_i=(\pi_i,\theta_i,X_i,Y_i)\),其中 \(\pi_i\) 是它的(系统)prompt(含指令与 few-shot),\(\theta_i\) 是模型权重。可学习参数是 \(\langle\Pi,\Theta\rangle_\Phi\)。对任务实例 \((x,m)\)\(x\) 是输入,\(m\) 是评测元数据如标准答案/评分 rubric/单测),系统产出 \(y=\Phi(x;\langle\Pi,\Theta\rangle_\Phi)\),度量 \(\mu:Y\times M\to[0,1]\) 打分。优化问题:

\[ \langle\Pi^{*},\Theta^{*}\rangle_\Phi = \arg\max_{\langle\Pi,\Theta\rangle_\Phi}\ \mathbb{E}_{(x,m)\sim T}\big[\,\mu(\Phi(x;\langle\Pi,\Theta\rangle_\Phi),\,m)\,\big] \tag{1} \]

但真实场景里 rollout(= 调用 \(\Phi\) + 用 \(\mu\) 评测)很贵,于是加上预算约束 \(B\)

\[ \langle\Pi^{*},\Theta^{*}\rangle_\Phi = \arg\max_{\langle\Pi,\Theta\rangle_\Phi}\ \mathbb{E}_{(x,m)\sim T}\big[\,\mu(\Phi(x),m)\,\big],\quad \text{s.t. } \#\text{rollouts}\le B \tag{2} \]
符号 含义
\(\Phi\) compound AI system(模块 + 控制流 + I/O schema)
\(\Pi_\Phi=\langle\pi_1,\dots\rangle\) 所有模块的 prompt——GEPA 唯一优化的对象
\(\Theta_\Phi=\langle\theta_1,\dots\rangle\) 所有模块的权重——GEPA 全程冻结(GRPO 优化的是这个)
\(\mu\) 标准评测度量(EM、F1、pass rate…),值域 \([0,1]\)
\(\mu_f\) 反馈函数(GEPA 的关键扩展):在 \(\mu\) 基础上额外返回文字反馈
\(B\) 总 rollout 预算
\(T\) 任务分布

[!TIP] 把式 (2) 讲透——核心挑战是什么? 论文把整个问题凝成一句:"如何从每一条昂贵的 rollout 里榨取最大的学习信号,以便在低数据/预算受限下有效适配复杂模块化 AI 系统?" 注意两个刻意的设计: 1. 式 (1)/(2) 同时允许改 prompt 和权重——这不是因为 GEPA 要改权重(它不改),而是为了让"在不同参数空间操作的算法"(GEPA 改 \(\Pi\) vs GRPO 改 \(\Theta\)能在同一个框架里公平对比。 2. rollout 是稀缺资源:优化器最多花 \(B\) 条 rollout,但能全权访问 \(\mu\)。GEPA 的赌注就是——同样的 \(B\) 条 rollout,读它的自然语言轨迹比读它的标量分数能学到多得多

3.2 遗传优化主循环(核心图)

Figure 3: GEPA 方法总览

Figure 3 逐元素解读(全文方法的心脏,请对照下面 4 步看): - 左下「Scores Matrix」+「Candidate Pool P」:候选池是一棵遗传树\(P_0\) 根,派生 \(P_1..P_4\))。左下的分数矩阵行是任务(Task 1/2/3…)、列是候选,✓/✗ 表示每个候选在每道题上是否最好。 - 中下「Pareto-based Candidate Filtering」:先对每道题取"得分最高的候选"("Best candidate per task",如 Task1→\(P_3\)、Task2→\(P_1/P_2\))→ 汇成候选集 → 剔除被支配者 → 得到「Filtered Pool (Pareto Frontier)」→ 从中按领跑题目数加权随机抽 1 个(图中抽到 \(P_2\))。 - 右侧橙框「Propose New Candidate」:抽到候选后二选一策略造新候选—— - Reflective Prompt Mutation(左半):Sample 1 candidate → 从 \(D_{train}\) 抽 minibatch \(M\)Execute P2 on M(拿轨迹)→ Obtain text feedbacks using μfReflect and Propose New Prompt。 - System Aware Merge(右半):Sample 2 candidates\(P_2,P_3\))→ 逐模块挑最优版本拼接("若某模块在 \(P_2\) 进化了、\(P_3\) 没有,就取 \(P_2\) 的,反之亦然")。 - 顶部闭环:新候选 \(P_{new}\)Perform Minibatch Eval →「Performance improved?」→ YesEval on all tasks + Add P_new to PoolNoDiscard P_newWhile Budget > 0 回到起点。 - 一句话先在小 minibatch 上便宜地筛掉没提升的变异,只有提升了才花预算在完整 \(D_{pareto}\) 上评估并入池——这是它省样本的关键工程手筋。

主循环文字版(对应 Figure 4 左的 Algorithm 1):GEPA 从只含 base 系统的候选池 \(P\) 出发,重复"选候选 → 变异/合并 → minibatch 评估 → 若提升则全量评估入池",直到预算耗尽,最后返回在 \(D_{pareto}\)聚合分最高的候选。每个新候选都带祖先记录,沿遗传树累积知识。

Figure 4: GEPA 核心算法 + Pareto 候选选择算法

Figure 4 逐行解读: - 左(Algorithm 1):line 1 把 \(D_{train}\) 切成 \(D_{feedback}\)(给反思用)和 \(D_{pareto}\)(选择用的验证集);line 6-20 主循环——SELECTCANDIDATE(Pareto 采样,line 7)→ SELECTMODULEround-robin 选要改哪个模块,line 8)→ 在 minibatch \(M\)Gather feedback, scores, traces(line 10)→ UPDATEPROMPT(反思改写,line 11)→ 造出 \(\Phi'\)(line 12)→ 比较改前改后在 \(M\) 上的均分 \(\sigma,\sigma'\)(line 13)→ 若提升(line 14)才把 \(\Phi'\) 入池、并在整个 \(D_{pareto}\) 上评分(line 16-18)。 - 右(Algorithm 2 SELECTCANDIDATE:line 3-6 对每道题 \(i\) 找最高分 \(s^*[i]\)、收集达到它的候选集 \(P^*[i]\);line 9-11 剔除被支配的候选 \(D\);line 13 令 \(f[\Phi]\) = 该候选在多少道题上仍属 Pareto 最优;line 14 \(f\) 加权随机抽一个。这就是"按领跑题目数加权"的形式化。

3.3 反思式 prompt 变异(Reflective Mutation)——把成败归因到模块

这是 GEPA 三支柱里最核心的一支。动机:执行轨迹(模型产生的文本)+ 最终结果(成/败)配在一起,就有了巨大的诊断价值——LLM 能借反思做隐式信用分配(implicit credit assignment),把整体成败归到具体模块,再对该模块做有针对性、但对全系统影响很大的更新。

流程(对应 Algorithm 1 line 8-14): 1. 从 Pareto 前沿随机抽一个候选,在 trainset 的一个随机 minibatch 上执行、记录轨迹; 2. 从轨迹里抽出模块的输入、输出、推理,调反馈函数 \(\mu_f\)——它返回数值分 + 文字反馈(含评测细节,如编译器报错、失败的 rubric 等); 3. 用 round-robin 策略选一个要改的模块 \(j\); 4. 把 (当前 prompt, 语言程序轨迹, 分数, 反馈) 喂给反思 LM,让它反思式地把成败归因到 prompt 的具体元素、并提出修订后的指令; 5. 带上新指令的系统在 minibatch 上再评一次,提升了才入池

[!NOTE] GEPA 的反思元 prompt(Appendix C,逐字复述) I provided an assistant with the following instructions to perform a task for me: The following are examples of different task inputs provided to the assistant along with the assistant's response for each of them, and some feedback on how the assistant's response could be better: Your task is to write a new instruction for the assistant. Read the inputs carefully and identify the input format and infer detailed task description ... Identify all niche and domain specific factual information about the task and include it in the instruction, as a lot of it may not be available to the assistant in the future. The assistant may have utilized a generalizable strategy ... if so, include that in the instruction as well. Provide the new instructions within blocks. ``` 讲透:注意它明确要求反思 LM 干两件事——(a) 把领域专有事实"固化"进指令(因为将来推理时这些信息不一定还在上下文里);(b) 把观察到的可泛化策略也写进指令。这正是 GEPA 产出的 prompt "又长又富含声明式规则"的原因(见 Figure 2)。

[!IMPORTANT] 把"评测轨迹(evaluation trace)"也当诊断信号——GEPA 的第二个反馈源 除了执行轨迹(LLM 产生的文本),作者指出还有评测轨迹:环境为了算奖励而产生的文本(如给 reward 0 之前的编译器报错)。很多评测度量会跑丰富的流程(编译、执行、profiling)后才塌缩成一个标量。GEPA 把 \(\mu\) 扩展成 \(\mu_f\)——在评测时抽出这些文字轨迹、连同分数一起返回当反馈。当可用时,这种反馈甚至能逐模块(如多跳系统里每一跳后都给反馈);有人类打分+解释时,也能把解释当作辅助 feedback_text 喂给反思。这一步就是"别把编译器报错压成 0/1"的操作化。

举例(HotpotQA 二跳查询模块,见 Figure 2):种子 prompt 只有一句"Given the fields question, summary_1, produce the fields query.";经反思式变异后,GEPA 把它长成一整套显式规则——"你的目标是检索第一跳没找到、但回答问题所必需的文档""别只是复述原问题或已知事实""若 summary_1 提到某个更宽泛的实体(如某小教区人口),而问题问的是更大区域,就把查询指向那个更大区域(如'2011 年马德拉群岛人口')"。这就是反思把"该模块的失败模式(二跳只会复述一跳)"转成"一条可复用的检索战术"。

3.4 基于 Pareto 的候选选择(Pareto-based Candidate Selection)——避免局部最优

这是 GEPA 的第二根支柱,掌控探索-利用权衡。朴素做法是"每轮都选当前最好的候选去变异",但这极易陷局部最优:一旦找到某个主导策略,就很难再超越,优化器会把剩余预算全耗在"反复微调这一个候选却改不动"上。

GEPA 改用一种 Pareto"照明(illumination)"策略(借自 MAP-Elites / Mouret & Clune 2015): - 对每道训练题,记录所有候选里的最高分,组成 Pareto 前沿; - 只要一个候选在至少一道题上拿到最高分,就保留它;被严格支配的候选剪掉; - 从这个剪枝后的集合里,按"该候选领跑多少道题"加权随机抽一个去变异。

Figure 6: 贪心选择 vs Pareto 选择的搜索树对比

Figure 6 逐元素解读(这张图把 Pareto 的价值可视化得淋漓尽致):括号里是各候选在验证集上的聚合分。 - (a) SelectBestCandidate(贪心):根 0(81.56)→ 找到一个好孩子后,就从它身上扇出 17 个扁平的兄弟节点(1~18),几乎全是灰的(没进一步提升)——典型的"找到局部最优后原地打转、把预算全浪费在一个候选上"。 - (b) Pareto-based(GEPA):同样的预算下长出一棵平衡、多分支、有纵深的树——根 0(82.26)派生出多条谱系(1/2/3/6/13…),下面继续分叉出 5/7/9/12/14…,出现多个改进节点(青色 12→96.3、橙色 14→94.59、16→93.54 等)。因为它不断从"不同题上领跑的候选"里抽,多条互补的"获胜策略"被同时探索,最终找到更优解。 - 信息:两图预算相同,唯一差别是候选选择策略;结果一个原地卡死、一个层层递进。这是 GEPA 三支柱里最被"消融坐实"的一支(见 Table 3:Pareto 的 +12.44% vs 贪心 +6.05% / beam +5.11%)。

[!TIP] 什么是 Pareto 前沿 / MAP-Elites 式"照明"? Pareto 前沿:多目标下,"没有任何其他解在所有目标上都不差于它、且在某个目标上更好"的那批解,就是 Pareto 最优(非被支配)解的集合。这里 GEPA 巧妙地把每道训练题当成一个独立目标——一个候选哪怕平均分不是最高,只要它在某一道刁钻题上是全场最好,就有资格留在前沿。MAP-Elites / 质量-多样性照明是进化计算里的思路:不只追一个全局最优,而是在"行为空间"的每个格子里保留一个"精英",从而系统性地保持多样性、避免早熟收敛。GEPA 把"每道题的最佳候选"当作这些精英格子,用它们的多样性喂养搜索。直觉:与其反复打磨一个偏科的尖子生,不如让一群'各有一门满分'的学生互相启发。

3.5 系统感知合并(System-Aware Merge / Crossover)——第三支柱

这是"遗传"里的交叉(crossover)算子,构成 GEPA+Merge。直觉:当池里有两个候选学到了互补策略(各自优化了不相交的模块),就该把它们拼起来。

合并的准入条件(Algorithm 3 DESIRABLE + Algorithm 4 MERGE,对应 Figure 9)非常严格,因此 merge 很稀疏: 1. 两候选 \(i,j\) 共享一个共同祖先 \(a\),但不是彼此的直接祖先; 2. 对每个模块 \(m\):若"祖先 = \(i\) 的版本但 \(j\) 改过"或反之(即两者分别改了不同模块),则可取那个"改过的"版本——形式上 if (πa=πi and πj≠πi) or (πa=πj and πi≠πj); 3. 两候选都要在聚合表现上超过祖先 \(a\)\(S[a] > \min(S[i],S[j])\) 时跳过)。

合并时逐模块拼:模块只在 \(i\) 改过 → 取 \(i\) 的;只在 \(j\) 改过 → 取 \(j\) 的;两者都改过 → 取分数高的那个(随机破平)。

[!NOTE] 为什么 Merge 收益不稳定?(Observation 5 的坦诚讨论) GEPA+Merge 在 GPT-4.1-Mini 上能再超 GEPA 最多 5%、聚合 +2%;但在 Qwen3-8B 上反而掉分(4 个任务里只有 1 个受益,IFBench 甚至从 38.61 崩到 28.23)。作者归因为:变异 vs 交叉的预算分配、以及何时触发 merge 没调好——两个模型用了同一套超参。直觉上 merge 只在"已经进化出足够不同的独立谱系时"才该触发;自适应地决定 merge 时机被列为未来工作。这是全文少见的"负面/不稳定"结果,值得记一笔。


4 实验:6 任务 × 2 模型,全面胜出

评测:AIME-2025、LiveBench-Math、HotpotQA、IFBench、HoVer、PUPA;模型 Qwen3-8B(开源)+ GPT-4.1-Mini(闭源);对照 MIPROv2、Trace(OptoPrime)、TextGrad、GRPO。标准 train/val/test 划分,优化器全权访问 train、可监控 val 分数(做 early stopping)但不能直接看 val 内容

4.1 主结果一:反思式进化比权重空间 RL 更省样本(Observation 1)

Table 1(Qwen3-8B,vs GRPO)

Optimizer HotpotQA IFBench HoVer PUPA AIME-2025 LiveBench-Math 聚合 提升
Baseline 42.33 36.90 35.33 80.82 27.33 48.70 45.23
GRPO (24k rollouts) 43.33 35.88 38.67 86.66 38.00 51.26 48.91 +3.68
MIPROv2 55.33 36.22 47.33 81.55 20.00 46.60 47.84 +2.61
GEPA 62.33 38.61 52.33 91.85 32.00 51.95 54.85 +9.62
GEPA+Merge 64.33 28.23 51.67 86.26 32.00 51.95 52.40 +7.17
GEPA rollouts 6871 3593 7051 2426 1839 1839 3936
GRPO rollouts 24000 24000 24000 24000 24000 24000 24000

[!IMPORTANT] GEPA 在 5/6 任务上超 GRPO(最高 +19%),却用最多 35× 更少的 rollout(如 IFBench 只用 678 条 train rollout 就到 38.61%,超 GRPO 用 24000 条得到的 35.88%)。更狠的是匹配 GRPO 最佳验证分只需 243/402/330/1143/1179/306 条 rollout——最高 78× 样本效率。而且 GEPA 大部分预算其实花在验证上(只用于候选选择、不产生学习信号);若只算 train rollout,达到最优只需 79~737 条。作者顺势指出:换更小的验证集或动态验证子集能进一步省样本。唯一 GRPO 赢的是 AIME——纯数学推理这种"答案对错=干净可验证标量"的任务,恰是 RL 的主场。

4.2 主结果二:仅优化指令就能超过"指令+few-shot 联合优化"(Observation 2/4)

Table 2(GPT-4.1-Mini,vs 各 prompt 优化器)

Optimizer HotpotQA IFBench HoVer PUPA AIME LiveBench 聚合 提升
Baseline 38.00 47.79 46.33 78.57 49.33 58.20 53.03
Trace (OptoPrime) 60.33 51.19 46.00 74.18 45.33 60.74 56.30 +3.27
MIPROv2-No-Demos 38.00 52.04 51.33 91.85 48.67 60.97 57.14 +4.11
MIPROv2 58.00 49.15 48.33 83.37 51.33 61.84 58.67 +5.64
TextGrad 62.33 48.64 47.67 85.68 46.67 63.84 59.14 +6.11
GEPA 69.00 52.72 51.67 94.47 59.33 64.13 65.22 +12.19
GEPA+Merge 65.67 55.95 56.67 96.46 59.33 64.13 66.36 +13.33
GEPA-Qwen-Opt(用 Qwen 优化、搬到 GPT) 65.67 49.83 54.67 90.05 52.67 59.31 62.03 +9.00

4.3 主结果三:Pareto 候选选择是关键(Observation 3)

Table 3(Qwen3-8B,固定进化 harness,只换候选选择策略)

策略 HotpotQA IFBench HoVer PUPA 聚合 提升
Baseline 42.33 36.90 35.33 80.82 48.84
SelectBestCandidate(贪心,TextGrad 用) 58.33 30.44 45.33 85.45 54.89 +6.05
BeamSearch(N=4)(APO 用) 57.33 36.39 41.00 81.08 53.95 +5.11
GEPA(Pareto) 62.33 38.61 52.33 91.85 61.28 +12.44

Pareto 选择带来 +12.44%,是贪心(+6.05%)/beam(+5.11%)的两倍——如 Figure 6 所示,贪心一轮就卡进局部最优、beam 也易早熟,而 Pareto 平衡了探索利用、在同预算下收敛到更优解。

4.4 跨模型泛化(Observation 6)

"GEPA-Qwen-Opt"——完全用弱模型 Qwen3-8B 优化出的 prompt,不加修改直接评在 GPT-4.1-Mini 上,聚合 +9.00%(HotpotQA 高达 +27.67%),反超那些直接在 GPT-4.1-Mini 上优化的 MIPROv2(+5.64%)、TextGrad(+6.11%)、Trace(+3.27%)。说明 GEPA 学到的是任务层面的可迁移规则,不是绑死某个模型。

4.5 反思如何累积(定性证据)

Figure 5: PUPA 上反思式变异的优化轨迹

Figure 5 逐元素解读(隐私感知委托任务 PUPA 的标注子树):括号内是各候选分数,红箭头是"从 base 到最优"的路径 0(82.26)→2(90.99)→4(94.44)→5(94.67)→11(97.6),每步旁边标注了 prompt 的关键变化: - candidate 0(Base):"给定私密用户查询,构造一个隐私保护的请求发给强外部 LLM"——只有一句话。 - → Expanded Privacy Strategies:加入"识别并泛化 PII"的详细指引、强调分析查询意图、引入改写的推理解释。 - → Structured Output & Best-Practices:把输出正式拆成 Reasoning + Request、显式禁止姓名/代号、描述抽象与示例用法、要求详细隐私论证并与任务质量平衡。 - → Transparent Transformation Rationale:强制透明的隐私推理与谨慎抽象,细化地点/姓名/一般信息的移除、专业场景、虚构角色处理——每步都配解释性 rationale。 - → candidate 11 Rigorous, Exhaustive Protocol(97.6):严格分步的 PII/专有信息抽象、禁止部分脱敏、"零泄漏容忍"。

信息每次反思式变异都在"上一版指令"的基础上追加由本轮 rollout 反馈提示的、针对性的细化——GEPA 的过程是沿谱系累积经验,把一句种子指令逐步长成一套详尽的领域协议,最终大幅提分。这就是"单次反思更新也常带来大 gain"的直观来源。

4.6 扩展应用:GEPA 作为推理时搜索(§5)

把"待解任务集"当训练集喂给 GEPA(\(D_{train}=D_{pareto}=\) 全部任务),让它"过拟合"这批任务、迭代提出更好的解,并把某题 rollout 学到的洞见迁移到其他题。关键是用 \(\mu_f\) 按失败动态注入领域知识(如按编译器报错去检索手册相关章节)。 - NPU kernel(AMD XDNA2,NPUEval):GPT-4o + Sequential10 只有 4.25% 平均向量利用率;加 RAG→16.33%,再加 MIPROv2→19.03%;而 GEPA(不用 RAG)→ 30.52%(多个核达 70%),单个 GEPA prompt 就让同 agent 达 26.85%(Figure 7)。 - CUDA kernel(KernelBench,V100):GEPA 随预算增长把 GPT-4o 近 0% 的 fast1 提到 20%+(Figure 8)。

4.7 扩展应用:对抗 prompt 搜索(§5.2)

反转奖励:让 GEPA 提出"加入干扰信息(如 trivia)来最小化任务表现"的 prompt 编辑,同时要求 prompt 不与任务矛盾、仍含解题所需信息。在 AIME 上,学到的对抗指令把 pass@1 从 76% 打到 10%——它往指令里塞进"蜂蜜永不变质、尼罗河最长""海豚睁一只眼睡觉"之类 trivia,导致 GPT-5-Mini 系统性误解格式规则、把答案写成字面占位符 ### <final answer>。这揭示了"无关细节 × 严格字面格式约束"的脆弱交互,可自动化地探测最坏情况鲁棒性、生成回归压测集。


5 结论 / 讨论


个人思考

⭐ 在本项目坐标系里的位置:GEPA 是"反馈丰富度谱系"的中间锚点

GEPA 被本项目多篇引用(ref09/ref14/ref15/ref17),值得把它放进"用历史反馈迭代改进文本/代码产物"的谱系里精确定位:

维度 GEPA (ref19) Meta-Harness ([[ref09_meta-harness]]) Self-Harness ([[ref17_self-harness]])
优化对象 模块 prompt\(\Pi_\Phi\) 生成上下文的整段可执行代码(harness) Agent 运行 harness 的可编辑面
反思看到什么 当前候选的轨迹 + 评测反馈\(\mu_f\))+ 祖先经验 全部历史候选的源码/分数/轨迹(可 grep 文件系统) 当前轮的失败聚类证据包 + 可编辑面
反馈丰富度 中:摘要式/反思式(每 iter ~8K token,见 ref09 Table 1) 最高:无损全历史(每 iter ~10M token) 中:确定性聚类后的结构化失败模式
候选选择 Pareto 前沿随机采样 无 parent-selection,Agent 自主检视 无(三阶段闭环)
准入 minibatch 提升 → 全量评估 Pareto 前沿 保守非回退门(两 split 都不降)
提议者 反思 LM(改一条指令) 编程 Agent(Claude Code + Opus) 被评估模型自己

方法论启示(可迁移的通用思路)

  1. "别把反馈压成标量"是贯穿本项目的核心原则,GEPA 是它在 prompt 优化上的干净证明。\(\mu\to\mu_f\) 的扩展(保留编译器报错、失败 rubric、逐模块反馈)几乎可以搬到任何"有丰富评测中间产物"的优化场景——凡是评测过程会产生自然语言,就别让它塌缩成一个数字再喂优化器
  2. "每道题当一个目标"的 Pareto 照明 是一个极通用的防局部最优技巧。当优化目标是"在一批异质样例上都要好"时,与其追平均分最优,不如保留一群"各有一门满分"的偏科候选来维持多样性。这对任何进化/搜索式自动设计都成立。
  3. minibatch 便宜筛 → 全量贵评 的两级评估,是"样本受限下搜索"的关键工程手筋——先花很少 rollout 判断"这个变异值不值得认真评",避免把预算浪费在没提升的候选上。
  4. 反思要显式要求"固化领域事实 + 抽取可泛化策略"(见元 prompt)——这解释了为什么 GEPA 的 prompt 又长又管用。做任何"让 LLM 从经验里提炼指令"的工作,都该在元 prompt 里明确这两个动作。

在我的工作中能怎么用

开放问题 / 疑问

局限性