GEPA(Genetic-Pareto)的架构设计体现了"反思式演化"的核心思想,它将传统的优化过程转化为一个可解释的、基于自然语言反思的进化系统。
┌─────────────────────────────────────────────────────────────┐
│ GEPA 优化引擎 │
├─────────────────────────────────────────────────────────────┤
│ DspyGEPAResult │ GEPA 类 │ DspyAdapter │ LoggerAdapter │
│ (结果封装) │ (主控制器) │ (系统适配器) │ (日志适配器) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ GEPA 核心库 (gepa) │
├─────────────────────────────────────────────────────────────┤
│ 优化算法 │ 反射机制 │ 帕累托前沿 │ 合并策略 │ 评估引擎 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ DSPy 执行引擎 │
├─────────────────────────────────────────────────────────────┤
│ 预测器 │ 轨迹捕获 │ 评估器 │ 适配器 │ 多模态支持 │
└─────────────────────────────────────────────────────────────┘
GEPA类是整个优化过程的核心控制器,负责协调所有组件的协作:
class GEPA(Teleprompter):
"""
GEPA优化器的主要职责:
- 配置管理:预算、反射、合并、评估等参数
- 流程控制:优化过程的整体调度
- 结果封装:将GEPA结果转换为DSPy程序
"""
def compile(self, student: Module, *, trainset: list[Example],
teacher: Module | None = None, valset: list[Example] | None = None) -> Module:
"""
优化的核心流程:
1. 参数验证和预算计算
2. 创建DspyAdapter适配器
3. 调用GEPA核心优化算法
4. 结果转换和封装
"""
关键设计决策:
DspyAdapter将DSPy系统与GEPA核心库解耦GEPAFeedbackMetric协议定义反馈接口DspyAdapter是GEPA与DSPy系统集成的关键组件,实现了GEPAAdapter协议:
class DspyAdapter(GEPAAdapter[Example, TraceData, Prediction]):
"""
适配器的主要职责:
- 程序构建:根据候选指令构建DSPy程序
- 评估执行:运行程序并捕获轨迹
- 反思数据集生成:从轨迹中提取学习样本
- 自定义指令提案:支持多模态等高级功能
"""
def evaluate(self, batch, candidate, capture_traces=False):
"""
评估流程:
- 构建候选程序
- 执行并捕获完整轨迹
- 计算分数和生成反馈
"""
def make_reflective_dataset(self, candidate, eval_batch, components_to_update):
"""
反思数据集生成:
- 从评估批次中提取轨迹
- 识别失败的预测和格式错误
- 生成结构化的反思样本
"""
技术亮点:
bootstrap_trace_data捕获完整的执行上下文FailedPrediction和格式错误Type对象处理图像等复杂输入GEPA的反馈机制是其核心创新,实现了从标量奖励到语义反馈的转变:
class GEPAFeedbackMetric(Protocol):
def __call__(gold: Example, pred: Prediction, trace: Optional["DSPyTrace"],
pred_name: str | None, pred_trace: Optional["DSPyTrace"]) -> Union[float, "ScoreWithFeedback"]:
"""
反馈函数的五个维度:
- gold: 标准答案
- pred: 预测结果
- trace: 完整执行轨迹
- pred_name: 当前优化的预测器名称
- pred_trace: 预测器级别的子轨迹
"""
class ScoreWithFeedback(Prediction):
"""结构化反馈数据"""
score: float # 量化评分
feedback: str # 语义反馈
设计哲学:
GEPA采用智能的预算分配策略,确保在有限资源下获得最大收益:
def auto_budget(self, num_preds, num_candidates, valset_size: int,
minibatch_size: int = 35, full_eval_steps: int = 5) -> int:
"""
预算计算的核心逻辑:
- 初始评估:对默认程序进行完整评估
- 候选引导:每个候选进行少量试验
- 小批量评估:N次小批量评估
- 周期性完整评估:定期进行完整验证
"""
# 数学公式:total = V + num_candidates * 5 + N * M + (periodic_fulls + extra_final) * V
# 其中:V=验证集大小,N=试验次数,M=小批量大小
优化策略:
反思数据集是GEPA学习的关键,它从失败案例中提取学习信号:
def make_reflective_dataset(self, candidate, eval_batch, components_to_update):
"""
数据集生成流程:
1. 遍历所有轨迹,找到目标预测器的执行记录
2. 处理失败案例和成功案例
3. 格式化输入输出,保留多模态信息
4. 生成结构化的反馈信息
"""
# 关键处理逻辑:
# - 处理历史上下文信息
# - 处理多模态输入(图像等)
# - 生成格式化的反馈文本
# - 处理解析失败的特殊情况
数据格式:
class ReflectiveExample(TypedDict):
Inputs: dict[str, Any] # 预测器输入(可能包含dspy.Image等)
Generated_Outputs: dict[str, Any] | str # 成功:输出字典,失败:错误信息
Feedback: str # 结构化反馈文本
GEPA支持多模态输入的优化,这是通过自定义指令提案器实现的:
class MultiModalInstructionProposer(ProposalFn):
"""
多模态指令提案器的核心功能:
- 处理包含图像的输入
- 生成针对视觉内容的改进指令
- 保持文本和视觉信息的协调
"""
def __call__(self, candidate, reflective_dataset, components_to_update):
"""
提案流程:
1. 对每个需要更新的组件
2. 使用SingleComponentMultiModalProposer生成新指令
3. 返回更新后的指令映射
"""
多模态处理策略:
[IMAGE-{idx}]标记图像位置GEPA提供了丰富的配置选项,支持从简单到复杂的各种使用场景:
# 三种预算配置方式
gepa = dspy.GEPA(
# 方式1:自动预算
auto="medium", # light/medium/heavy
# 方式2:最大完整评估次数
max_full_evals=100,
# 方式3:最大指标调用次数
max_metric_calls=5000
)
gepa = dspy.GEPA(
# 反射语言模型(关键配置)
reflection_lm=dspy.LM(model='gpt-4.1', temperature=1.0, max_tokens=32000),
# 反思小批量大小
reflection_minibatch_size=3,
# 候选选择策略
candidate_selection_strategy="pareto", # pareto/current_best
# 跳过完美分数
skip_perfect_score=True
)
gepa = dspy.GEPA(
# 启用合并优化
use_merge=True,
# 最大合并调用次数
max_merge_invocations=5
)
gepa = dspy.GEPA(
# 自定义指令提案器
instruction_proposer=MultiModalInstructionProposer(),
# 组件选择策略
component_selector="round_robin", # round_robin/all/自定义
# 跟踪最佳输出
track_best_outputs=True,
# 实验跟踪
use_wandb=True,
use_mlflow=False
)
# 使用多线程加速评估
gepa = dspy.GEPA(num_threads=4)
log_dir支持优化过程恢复# 处理解析失败
if isinstance(outputs, FailedPrediction):
# 生成结构化的失败反馈
feedback = "Your output failed to parse. Follow this structure:\n" + structure_instruction
# 检测预测器级和系统级分数不一致
if fb["score"] != module_score:
logger.warning("Score mismatch detected - using module level score")
# 严格的参数验证
assert (
(max_metric_calls is not None) +
(max_full_evals is not None) +
(auto is not None)
== 1
), "Exactly one budget parameter must be set"
class CustomProposer(ProposalFn):
def __call__(self, candidate, reflective_dataset, components_to_update):
# 实现自定义的指令生成逻辑
return updated_instructions
class SmartComponentSelector(ReflectionComponentSelector):
def select_components(self, optimization_state):
# 基于优化状态智能选择组件
return components_to_update
def custom_feedback_metric(gold, pred, trace, pred_name, pred_trace):
# 实现领域特定的反馈逻辑
return ScoreWithFeedback(score=calculated_score, feedback=detailed_feedback)
GEPA的架构设计体现了以下几个核心智慧: