用 35 倍少的样本打败 GRPO,GEPA 让大模型在「语言空间」里学会自我进化


很多人认为,让大模型适配新任务,强化学习是标准答案。

OpenAI、DeepSeek、Qwen 一路走来,GRPO 几乎成了训练推理模型的默认配方(之前写过的用强化学习打造狼人杀策略智能体也是同一条路子)。效果确实好,但代价也很明显——动辄几万、几十万次 rollout 才能学会一个新任务。对那些调一次 API 就要花钱、跑一次评测就要等几小时的真实场景,这个成本大部分团队扛不住。

来自 UC Berkeley、Stanford、Databricks、MIT 的团队(DSPy 的作者 Omar Khattab、Matei Zaharia 等都在列)不这么认为。他们提出 GEPA(Genetic-Pareto),一个提示词优化器,核心论点很简单:大模型的原生学习介质是自然语言,不是标量奖励。

结果有些出人意料。在 6 个基准上,GEPA 平均比 GRPO 高 6 个百分点,最高高出 20%,而使用的 rollout 数量只有 GRPO 的三十五分之一。它还超过了此前最强的提示词优化器 MIPROv2 13 个百分点。

  • 论文:GEPA: Reflective Prompt Evolution Can Outperform Reinforcement Learning(arXiv 2507.19457)
  • 代码:github.com/gepa-ai/gepa,已集成进 DSPy,一行 dspy.GEPA 就能调用

GEPA、MIPROv2 与 GRPO 在 HotpotQA 上的学习曲线对比,横轴是 rollout 数量,GEPA 用远少于 GRPO 的样本达到了更高的分数

为什么 RL 不是优化 LLM 的唯一答案

要理解 GEPA 的立场,得先看清 RL 在 LLM 上到底卡在哪。

GRPO 这类方法把一次完整的系统运行(rollout)的结果压成一个标量奖励——答对给 1,答错给 0,然后据此估算策略梯度、更新权重。信号是稀疏的。模型只知道”这次错了”,但不知道错在哪一步、错在哪个模块、是推理走偏了还是工具调错了。为了从这么稀的信号里学到东西,只能靠量——几万次 rollout 撑起统计意义上的梯度方向。

这在实验室里还能跑,放到真实业务里就很难成立。很多下游系统每次 rollout 都要调昂贵的工具(搜索引擎、代码执行器、数据库),有些干脆不能微调最强模型的权重(GPT-4.1、Claude 的权重谁也改不动)。样本效率不解决,RL 的适用面就很窄。

GEPA 的作者抓住了一个被忽视的事实:任何 LLM 系统的 rollout,序列化之后全是自然语言。

推理链是文本,工具调用是文本(让模型自己学会调工具的Toolformer就是把这层文本信号用到了极致),工具返回的结果也是文本。更有意思的是,评测过程本身在被压成 0/1 奖励之前也产生文本——编译器报错、未满足的约束列表、单元测试失败的原因。这些在 RL 里统统被丢弃了,只留下最后的那个数字。

但 LLM 本来就是读自然语言的。让它读自己的错误轨迹,比让它消化一个孤零零的奖励值,更顺。

这就是 GEPA 的出发点:与其把丰富的文本信号压成标量再去算梯度,不如直接让模型在语言空间里反思、归纳、改进。

把「试错—反思—改写」交给模型自己做

GEPA 的工作方式像一个会自我进化的提示词工程师。它优化的对象是”复合 AI 系统”——由一个或多个 LLM 调用串起来、中间可能插入工具调用的整体(LLM 多智能体系统综述里梳理的正是这类系统的架构图谱)。

它维护一个候选池,每个候选是一份完整的提示词配置。迭代地,它会从池子里挑一个候选,跑一小批训练样本,把执行轨迹和评测反馈抽出来,交给一个独立的”反思 LLM”读。反思 LLM 看到的是四样东西:当前提示词、这次跑的轨迹、得分、文本反馈(比如编译器报错)。它的任务是判断——成功或失败该归因到提示词的哪一部分,然后提出一份改写。改完之后再跑一次,分数涨了才入池,没涨就丢掉。

子代会继承父代的教训,沿着一棵遗传树不断累积经验。这是”遗传”的部分。

GEPA 的优化流程:每次迭代从候选池里采样、反思变异、小批量验证、改进后入池

但光有变异不够。如果每次都从当前最强的那个候选出发去改,很快就会陷在局部最优里——找到一个能用的策略就反复打磨它,别的新路子再也没机会试。论文里给了一张对比图:贪心策略在第一次改进之后就基本卡死,预算全浪费在同一个候选的无效微调上。

GEPA 的解法是 Pareto 选择。它不为每道题只留一个全局最优,而是为每道训练题各自维护一个最优候选集合,形成一个 Pareto 前沿。有的候选在 A 类题上最强,有的在 B 类题上最强,它们代表不同的”解题策略”,都该保留。下一步从哪个候选出发变异,按”它在多少道题上拿了最高分”来加权采样。

这个设计直接拉开了差距。在消融实验里,把 Pareto 换成贪心(每次选最强),聚合提升从 12.44 个百分点掉到 6.05;换成 beam search(维护 top-N),掉到 5.11。换句话说,GEPA 的优势有将近一半来自这个选择策略,而不是反思本身。

这其实符合直觉。提示词优化真正的难点不是”怎么改”,而是”该改哪个方向才不会走死”。Pareto 让多种策略并存,本质上是在管理探索的多样性。

一句话提示词,怎么进化成工程文档

光说机制还是抽象。看一个具体例子最有说服力。

PUPA 是一个隐私保护委托任务:用户有个含个人信息的查询,系统要把它改写成一份不泄露隐私的请求,发给一个不可信的外部大模型,再把回答整合回来。优化的对象是”改写”这个模块的提示词。

GEPA 拿到的起点只有一句话:

给定一个含隐私的用户查询,生成一份保护隐私的请求,让外部 LLM 在不获取用户隐私的情况下提供帮助。

跑出来 82.26 分。

第一轮反思之后,GEPA 自己把这句话展开成五个要点:隐私保护(泛化而非删除)、查询理解与改写、质量最大化、常见策略、推理解释。它自己悟出了”不要直接删掉敏感信息,要泛化成中性表述”这个原则。分数跳到 90.99。

又过了几轮,它开始往里加具体的反面案例——不要保留真实姓名、课程代码、教职人员引用;处理虚构角色时要明确声明是虚构的;地理位置要抽象成”以生态旅游闻名的地区”而不是直接写国家名。分数涨到 94.44。

到最后,它甚至开始写”常见陷阱清单”:不要只是轻微遮蔽敏感细节,必须完全抽象;不要逐字复述用户提供的任何内容;具体到把”Jonah Van Beijnen”替换成”a notable individual”这种例子都写进了提示词。最终分数 97.6。

PUPA 任务上提示词的进化树,从 Node 0 的 82.26 分到 Node 11 的 97.6 分,每个节点的关键改动被标注在旁边

这已经不是”优化提示词”了。这是一个模型在自动总结工程经验。一个人类 prompt 工程师可能要花几天踩坑才能悟出的避坑指南,GEPA 几轮反思就写出来了。

而且它学到的提示词反而更短。MIPROv2 靠往提示词里塞 few-shot 示例来提分,示例一多,提示词就膨胀。GEPA 只优化指令本身,产出的提示词最短只有 MIPROv2 的九分之一,推理成本相应也低。短还能赢,说明它学到的是结构性原则,不是靠堆示例硬凑。

6 个基准,5 个打败 GRPO

主实验在 6 个基准上做,覆盖多跳问答(HotpotQA)、多跳事实验证(HoVer)、数学竞赛(AIME-2025)、数学综合(LiveBench-Math)、指令遵循(IFBench)、隐私委托(PUPA),分别用开源的 Qwen3-8B 和闭源的 GPT-4.1 Mini。

最直观的对比在 IFBench 上。GEPA 只用了 678 次 rollout 就达到了 38.61%,而 GRPO 跑满 24000 次 rollout 才 35.88%。样本效率差了一个数量级,分数还更高。

HotpotQA 上更悬殊。Qwen3-8B 的基线是 42.33,GRPO 花完预算只把它推到 43.33,几乎没动。GEPA 推到了 62.33,涨了 20 个百分点。多跳问答这种任务,检索质量是命门——LightRAG用图结构把多跳检索压到一次调用,GEPA 则从提示词侧把查询生成的质量顶上去,两条路解决的是同一个问题。

PUPA 上 GEPA 拿到 91.85,GRPO 是 86.66。HoVer 上 52.33 对 38.67。

唯一没赢的是 AIME-2025。Qwen3-8B 上 GEPA 是 32.00,GRPO 是 38.00。这是个值得诚实指出的例外——在单步纯数学推理这种任务上,微调权重确实能学到一些提示词改写够不到的东西。不过换到 GPT-4.1 Mini 上,GEPA 又反超了(59.33),说明这个差距和模型本身的能力有关,不是方法本身的硬伤。

更有说服力的是跨模型迁移。用弱模型 Qwen3-8B 优化出的提示词,原封不动地装到 GPT-4.1 Mini 上,聚合还能涨 9 个百分点,HotpotQA 上甚至涨 27.67 个百分点。那些用 GPT-4.1 Mini 直接优化、直接评测的基线方法(MIPROv2、TextGrad、Trace),反而都被这份”在弱模型上练出来的提示词”超过了。

换句话说,GEPA 学到的是模型无关的通用策略,不是针对某个模型特定癖好的 hack。

成本也低得惊人。全部 GPT-4.1 Mini 实验加起来不到 500 美元,GEPA 本体只花了 86 美元。对动辄烧几千美元做一次 RL 训练的同行来说,这个数字值得停下来看一眼。

不止优化提示词——写 kernel、找对抗漏洞

GEPA 的框架本身是中性的:给一套有反馈信号的系统,它就能优化。作者顺手验证了两个出乎意料的应用。

第一个是推理时搜索。把一批待解决的任务(比如一批要转成 CUDA kernel 的 PyTorch 算子)当作”训练集”喂给 GEPA,让它过拟合这批任务。GEPA 通过 feedback function 动态注入领域知识——编译器报错触发检索硬件手册的相应章节,把工程最佳实践沉淀进提示词。

在 AMD NPU 的 kernel 生成上,GPT-4o 配合十轮顺序修正只能拿到 4.25% 的平均向量利用率。加上 RAG 涨到 16.33%,再加上 MIPROv2 涨到 19.03%。而 GEPA 产出的单条提示词,让同一个 GPT-4o 直接跳到 30.52%,部分 kernel 甚至到 70%。关键是,运行时不需要任何 RAG——知识已经被烤进提示词了。

第二个是对抗提示搜索。把奖励信号翻转一下:原本是让模型答对,现在是让模型答错,同时约束提示词不能删除任务信息。GEPA 对 AIME 2022–2024 的题目做进化,找到了一条通用的对抗指令。

这条指令很朴素——在正常的数学题描述里塞几句无关冷知识(蜂蜜永不变质、尼罗河最长、海豚睁一只眼睡觉),再配上严格的输出格式要求。结果 GPT-5 Mini 在 AIME-2025 上的 pass@1 从 76% 直接跌到 10%。原因不是题目变难了,而是这些无关信息和格式要求叠加之后,模型系统性地把格式占位符 ### <final answer> 当成了答案本身输出。

同一个框架,正用是优化器,反用是红队工具。

GEPA 没解的问题

GEPA 不是银弹,作者也坦率承认了几点局限。

最大的开销不在学习,而在选择。GEPA 每生成一个新候选,都要在验证集上完整评测一遍来决定它够不够格留下、该不该进入下一轮采样。这部分 rollout 只用于候选排序,不产生学习信号,却占了总预算的大头。作者自己也指出,用一个更小的验证集或者动态选子集来评测,能进一步省预算——这是明确的改进方向。

Merge 这个交叉策略对模型敏感。它在 GPT-4.1 Mini 上能再叠加 2 个百分点的聚合提升,但在 Qwen3-8B 上反而掉点。原因是触发 Merge 的时机和预算分配没有按模型分别调,同一套超参两边跑,对 Qwen 不合适。作者把自适应的 Merge 调度留作未来工作。

推理时搜索和对抗搜索都还是初步验证,没有做系统性的对照实验。GEPA 一次只改一个模块的提示词,跨模块的协同优化也还在早期。

但这些不影响核心结论。GEPA 真正的贡献不是”又一个优化器”,而是把一个问题重新摆到了桌面上:大模型应该在什么空间里学习。

强化学习的默认假设是,所有可学的参数都该用梯度下降在权重空间里更新。但权重空间是稠密的浮点数,离语言本身很远,信号传过去要走很长的路。GEPA 证明了一件事——至少对于”让模型更好地用工具、更准地遵循指令、更稳地完成任务”这一类目标,在语言空间里直接反思、归纳、改写,成本更低、信号更密、效果甚至更好。

答案也许不在更大的模型里,也不在更多的 rollout 里,而在更接近语言本身的学习方式里。