GEPA (Genetic-Pareto) 是一个用于优化AI系统中各类文本组件的框架。这些文本组件可以AI模型的提示词、代码片段或配置文件。它采用了一种名为“反思性文本进化”的方法,通过大型语言模型(LLM)来分析和反思AI系统的行为。具体来说,GEPA会检视系统运行过程中产生的执行和评估记录,并利用这些信息来进行针对性的改进。该框架结合了迭代变异、反思和帕累托最优选择等策略,能够在评估次数有限的情况下,演化出性能更强的系统版本。GEPA不仅可以优化单个组件,还能协同演化模块化系统中的多个组件,从而在特定领域获得显著的性能提升。根据其研究论文《GEPA: Reflective Prompt Evolution Can Outperform Reinforcement Learning》的阐述,相较于传统的强化学习方法,GEPA在提升性能的同时,所需样本数量也大幅减少,展现了更高的效率。
功能列表
- 反思性文本进化: 利用大语言模型(LLM)分析系统执行轨迹(如推理过程、工具调用和输出),以自然语言形式诊断问题并提出改进方案。
- 多目标优化: 采用帕累托最优选择机制,可以同时优化多个目标(例如,在保证准确性的同时缩短提示词长度),并保留多样化的优良候选方案。
- 高样本效率: 与需要数千次尝试的传统强化学习方法相比,GEPA能用极少的样本(“rollouts”)实现显著的性能提升,最多可将所需样本量减少35倍。
- 广泛的适用性: 不仅能优化AI提示词,还能优化代码、指令和完整的AI程序,例如
DSPy程序中的签名、模块和控制流。 - 灵活的适配器接口: 通过实现
GEPAAdapter接口,用户可以将GEPA集成到任何包含文本组件的系统中。系统集成的核心是定义Evaluate(评估)和Extract Traces for Reflection(提取反思轨迹)两个方法。 - 与DSPy框架集成: GEPA已直接集成到
DSPy框架中,用户可以通过dspy.GEPAAPI轻松调用,这是使用GEPA最简单且功能最强大的方式。 - 支持复杂系统优化: GEPA能够优化复杂的AI系统,例如检索增强生成(RAG)系统、多轮对话智能体以及在外部环境中运行的智能体(如
terminal-bench)。
使用帮助
GEPA是一个功能强大的框架,旨在通过模拟人类“反思-改进”的学习模式来自动优化AI系统中的文本组件,如提示词或代码。以下是详细的使用说明。
安装
GEPA可以通过Python的包管理器pip轻松安装。
稳定版安装:
打开终端或命令行工具,输入以下命令:
pip install gepa
最新开发版安装:
如果你希望体验最新的功能,可以直接从GitHub仓库安装:
pip install git+https://github.com/gepa-ai/gepa.git
核心概念
要有效使用GEPA,需要理解其两个核心概念:
- 反思 (Reflection): GEPA的核心机制。它不只是看一个任务最终是否成功(即一个简单的分数),而是让一个强大的语言模型(称为“反思模型”)去阅读整个任务的执行记录(trace)。这个记录包含了AI的所有“思考”步骤、中间输出、遇到的错误等。通过阅读这些详细的记录,反思模型能以自然语言的形式提出具体的、有针对性的改进建议。
- 进化 (Evolution): GEPA借鉴了遗传算法的思想。它从一个初始的提示词(“种子”)开始,通过反思生成一些新的、可能更好的提示词版本(“变异”)。然后,它会测试这些新版本,并保留表现最好的那批(“选择”)。这个过程会不断重复,每一代都会在前一代的基础上进行优化,最终演化出高性能的提示词。
最简单的使用方式:通过DSPy框架
对于大多数用户来说,将GEPA与DSPy框架结合使用是最推荐的方式。DSPy可以帮助你构建模块化的语言模型程序,而GEPA则作为优化器来提升这些程序的性能。
以下是一个优化数学解题提示词的简单示例:
步骤1:准备环境和数据
确保你已经安装了gepa和dspy-ai,并设置了你的OpenAI API密钥。
import gepa
import dspy
# 设置大语言模型
task_lm = dspy.OpenAI(model='gpt-4.1-mini', max_tokens=1000)
# 设置一个更强大的模型用于反思
reflection_lm = dspy.OpenAI(model='gpt-5', max_tokens=3500)
dspy.settings.configure(lm=task_lm)
# 加载数据集(这里使用内置的AIME数学竞赛题示例)
trainset, valset, _ = gepa.examples.aime.init_dataset()
步骤2:定义初始的程序(或提示词)
在DSPy中,你可以定义一个简单的Signature来描述任务的输入和输出,然后用一个Module来实现它。
class CoT(dspy.Module):
def __init__(self):
super().__init__()
self.prog = dspy.ChainOfThought("problem -> reasoning, answer")
def forward(self, problem):
return self.prog(problem=problem)
步骤3:定义评估指标
你需要告诉GEPA如何判断一个输出的好坏。这里我们定义一个简单的指标,检查模型输出的答案是否正确。
def aime_metric(gold, pred, trace=None):
# gold是标准答案,pred是模型的预测输出
return gold.answer == pred.answer
步骤4:运行GEPA优化器
现在,你可以配置并运行dspy.GEPA优化器了。
from dspy.teleprompt import GEPA
# 配置优化器
# dspy_program是你要优化的DSPy程序
# trainset是训练数据
# valset是验证数据
# metric是评估函数
# reflection_lm是用于反思的模型
optimizer = GEPA(dspy_program=CoT(),
trainset=trainset,
valset=valset,
metric=aime_metric,
reflection_lm=reflection_lm)
# 运行优化,设置优化预算(例如,最多调用评估指标150次)
optimized_program = optimizer.compile(max_metric_calls=150)
执行完毕后,optimized_program内部的提示词就已经被GEPA优化过了。你会发现,优化后的提示词包含了非常具体和详细的解题策略和注意事项,这些都是GEPA通过反思历史错误自动学习到的。
独立使用GEPA(高级用法)
如果你没有使用DSPy框架,也可以独立使用GEPA。这时,你需要自己实现一个GEPAAdapter,作为GEPA与你的系统之间的桥梁。
GEPAAdapter需要实现两个关键方法:
Evaluate(self, candidate, trainset_sample):- 这个方法接收GEPA生成的一个候选文本组件(
candidate)和一部分训练数据(trainset_sample)。 - 你需要用这个候选组件来运行你的系统,并返回系统的执行得分和详细的执行轨迹(traces)。轨迹可以是任何有助于反思的文本信息。
- 这个方法接收GEPA生成的一个候选文本组件(
ExtractTracesforReflection(self, traces, component_name):- 这个方法接收
Evaluate方法返回的轨迹,并从中提取与特定组件(component_name)相关的部分。 - 提取出的文本将交给反思模型进行分析。
- 这个方法接收
这是一个概念性的示例结构:
from gepa.core import GEPAAdapter
class MyCustomAdapter(GEPAAdapter):
def Evaluate(self, candidate, trainset_sample):
# 你的系统逻辑:使用candidate中的提示词处理trainset_sample中的数据
# ...
scores = [...] # 计算得分
traces = [...] # 收集详细的日志或中间步骤
return scores, traces
def ExtractTracesforReflection(self, traces, component_name):
# 从traces中提取和component_name相关的文本信息
# ...
return relevant_textual_traces
# 然后调用gepa.optimize
gepa_result = gepa.optimize(
seed_candidate={"my_prompt": "Initial prompt here..."},
adapter=MyCustomAdapter(),
trainset=my_train_data,
valset=my_val_data,
# ... 其他参数
)
这种方式虽然更复杂,但它提供了极大的灵活性,让GEPA可以用于优化任何基于文本的系统。
应用场景
- 复杂推理任务提示词优化
对于需要多步推理的复杂任务(如数学、逻辑和策略规划),一个微小的提示词改动就可能导致结果的巨大差异。GEPA能够通过分析模型的推理链条,自动发现并纠正其中的逻辑缺陷,生成高度优化的指令,引导模型采用更有效的解题策略。 - 代码生成与优化
GEPA不仅可以生成代码,还能根据编译错误、性能分析报告或代码审查注释等文本反馈来优化代码。例如,它可以将一个通用的代码片段,根据特定硬件(如GPU)的文档和错误信息,迭代修改成一个高度优化的版本。 - 检索增强生成(RAG)系统调优
RAG系统包含多个环节(查询重构、文档检索、答案合成等),每个环节都由提示词驱动。GEPA可以同时优化所有这些提示词,通过分析整个RAG系统的执行轨迹,提升检索的精准度和答案的质量。 - 智能体(Agent)行为指令微调
对于需要与外部工具或环境交互的智能体,GEPA可以通过分析智能体的行为日志(包括API调用、工具返回结果和环境反馈),优化其核心指令(即系统提示词),让智能体更高效、更可靠地完成任务。 - 特定领域知识的指令学习
在专业领域(如医疗、法律、金融),AI系统需要严格遵循特定的指南和规范。GEPA可以将这些指南文档作为反思的依据,当系统输出不符合规范时,GEPA能自动将相关规则融入到提示词中,使系统输出更合规。
QA
- GEPA与传统的强化学习(RL)优化方法有何不同?
主要区别在于学习信号的丰富程度。传统的RL方法通常依赖一个单一的、稀疏的奖励分数(比如任务成功得1分,失败得0分),模型需要大量尝试才能学到有效的策略。而GEPA利用的是丰富的自然语言反馈,通过LLM“阅读”详细的执行过程记录来理解失败的具体原因,从而能用更少的样本做出更精确的改进。 - 使用GEPA是否需要非常强大的语言模型?
GEPA的设计中包含两种模型:一个是被优化的“任务模型”,另一个是进行分析的“反思模型”。通常建议使用一个能力尽可能强的模型作为“反思模型”(如GPT-4或更高级的模型),因为它需要深刻理解复杂的执行轨迹和上下文。而被优化的“任务模型”则可以是任何你需要提升性能的模型,包括一些更小、更经济的模型。 - GEPA中的“Pareto”(帕累托)是什么意思?
“帕累托”来源于帕累托最优的概念,用于多目标优化。在GEPA中,这意味着优化过程不仅仅追求单一指标的最高分(如准确率),它还可以同时考虑其他目标,比如提示词的长度、API调用成本或响应延迟。GEPA会保留一个“帕累托前沿”,即一组在不同目标上取得良好平衡的候选方案,而不是仅仅保留一个单一的“最佳”方案。 - GEPA是否只能优化英文提示词?
不是。GEPA的底层机制是基于语言模型对文本的理解和生成能力,因此它天然支持多语言。只要你提供的训练数据、评估指标和反思模型支持相应的语言(例如中文),GEPA就可以用来优化该语言的文本组件。






























