Skip to content

Prompt 自进化

Prompt 自进化是一种通过自动化评估、变异和选择来系统性改进 prompt 文本的技术——灵感来自进化算法。它将 prompt 优化从凭直觉的手动调优转变为可量化的搜索问题。

本文详细介绍 GEPA(遗传-Pareto Prompt 进化)算法的原理,该算法在 hermes-agent-self-evolution 中有参考实现,以及 RingClaw 计划如何应用这些思想来改进自身的 prompt。具体实施计划见 Plan 006

为什么 Prompt 需要进化

Prompt 是 LLM 系统中影响最大但测试最不严格的组件。一个词的改动就可能移动分类边界、增减故障模式、改变输出质量。然而大多数团队的 prompt 迭代方式是:

  1. 手动调优 — 改文本、测几个例子、上线
  2. 被动修复 — 等用户报 bug,补丁式修改 prompt
  3. 无回归测试 — 无法知道一个修复是否破坏了其他场景

Prompt 自进化用数据驱动的循环替代这种方式:

GEPA 算法

GEPA(Genetic-Pareto Prompt Evolution,遗传-Pareto Prompt 进化)结合了遗传算法和 LLM 驱动的变异。发表于 ICLR 2026(Oral),完全通过 API 调用运行——无需 GPU 训练。

核心循环

关键步骤:

  1. 种群初始化 — 基线 prompt 加 N 个随机扰动
  2. 评估 — 在测试数据集上通过真实 agent 运行每个变体
  3. 评分 — LLM 裁判从多个维度为每个输出打分
  4. 轨迹反思 — GEPA 读取失败原因(执行轨迹),而不仅仅是知道失败了
  5. 针对性变异 — 提出专门解决观察到的失败的修改
  6. 约束检查 — 拒绝违反大小、增长或测试套件约束的变体
  7. Pareto 选择 — 保留 Pareto 前沿上的变体(没有单个变体在所有维度上都被另一个支配)

GEPA 的独特之处

传统 prompt 优化(如 DSPy 的 MIPRO)盲目变异——随机插入、删除、改写。GEPA 的核心创新是反思性变异:它读取失败测试用例的执行轨迹,然后提出针对性修复。

方法变异策略每次迭代成本
随机改写替换随机部分
MIPRO生成指令候选
GEPA读取失败轨迹 → 提出针对性修复

例如:如果意图分类器将"总结 John 的代码"错误分类为 summarize 而非 chat,GEPA 会读取执行轨迹,发现 prompt 没有区分"总结代码"和"总结聊天消息",然后提出添加澄清规则的修改。

LLM 裁判评分

每个 agent 输出由一个独立的 LLM 裁判从三个维度评分:

评分维度

维度权重衡量内容
正确性0.5agent 是否为该任务产生了正确的输出?
流程遵循0.3agent 是否遵循了 prompt 的指令和工作流?
简洁性0.2响应是否在不遗漏关键信息的前提下适当简洁?

综合评分公式

raw_score = 0.5 × 正确性 + 0.3 × 流程遵循 + 0.2 × 简洁性
final_score = max(0, raw_score - 长度惩罚)

长度惩罚防止 prompt 无限膨胀:

  • 在 ≤90% 大小限制时无惩罚
  • 在 90%-100% 之间线性增加,最高 30% 惩罚
  • 公式:penalty = min(0.3, (ratio - 0.9) × 3.0),其中 ratio = size / limit

裁判反馈

除了数值评分,裁判还产出文本反馈——具体的、可操作的改进建议。这些反馈被输入 GEPA 的反思性变异步骤,形成一个反馈循环:优化器可以读取为什么分数低,然后提出针对性修复。

执行轨迹反思

GEPA 最重要的洞察:仅有分数是不够的。知道一个测试用例的正确性得分为 0.3,只是告诉你它失败了,但没有告诉你为什么。执行轨迹揭示了失败机制。

轨迹包含什么

轨迹捕获完整的交互过程:

输入: "总结 John 的代码"
使用的 Prompt: [完整 IntentPrompt 文本]
Agent 输出: "summarize"
预期输出: "chat"
裁判反馈: "Prompt 说如果用户想总结聊天历史就分类为 'summarize',
  但这条消息问的是代码,不是聊天消息。Prompt 缺少区分
  '总结代码'和'总结聊天消息'的规则。"

反思如何工作

  1. 收集当前代中所有失败的测试用例及其轨迹
  2. 按类别分组失败(如"边界情况"、"复合意图")
  3. 将分组后的失败发送给变异 LLM:"这是当前 prompt,这是按类型分组的失败。对于每组失败,请提出一个 prompt 文本的具体修改来修复它。"
  4. 变异 LLM 基于真实的失败数据提出修改,而非随机扰动

这与盲目变异根本不同——每个提议的修改都有执行证据支撑的理由

约束检查

每个进化后的变体必须通过硬约束检查。任何一个约束失败 = 立即拒绝。

约束类型

约束限制理由
大小限制≤ 15,000 字符防止无限增长碰到上下文限制
增长限制≤ 基线的 20%防止每次迭代 prompt 失控扩展
非空检查> 0 字符确保优化器没有产出空白结果
测试套件100% 通过确保进化后的 prompt 不破坏现有行为
结构完整性有效格式确保必需的段落/字段被保留

为什么约束重要

没有约束的话,prompt 优化器倾向于:

  • 无限增长 — 不断添加更多示例和规则
  • 过拟合评估数据 — 添加超特定的规则,破坏泛化能力
  • 破坏结构 — 以破坏解析的方式重写段落

约束充当了对抗这些失败模式的进化压力。

评估数据来源

进化的质量直接取决于评估数据的质量。有三种来源,各有不同的权衡:

1. Golden 数据集(手动策划)

手动编写的测试用例,具有已知正确的预期行为。

json
{
  "task_input": "总结 John 的代码",
  "expected_behavior": "chat",
  "difficulty": "hard",
  "category": "boundary"
}
优点缺点
最高质量创建费力
覆盖已知边界情况规模有限(通常 15-30 个)
可追溯到真实 bug(通过 source PR)可能无法覆盖未知的失败模式

2. 合成生成(LLM 生成)

强大的 LLM 读取 prompt 文本,自动生成多样化的测试用例。

优点缺点
可扩展——生成数百个用例可能不反映真实使用模式
覆盖多样化场景可能太容易或太难
便宜且快速质量取决于生成器模型

3. 会话历史挖掘(真实使用)

从会话日志中提取真实用户消息,并评估其相关性。

优点缺点
反映实际使用模式需要存储的对话历史
发现未知的失败模式用户数据隐私问题
最真实的评估新系统的冷启动问题

推荐策略

从历史 bug 修复 PR 衍生的 golden 数据集开始(信噪比最高),然后用合成数据补充覆盖广度。会话挖掘是最强的来源,但需要对话日志基础设施。

在 RingClaw 中的应用

RingClaw 在 messaging/prompts.go 中有 5 个集中管理的 prompt,每个控制 bot 行为的不同方面:

Prompt用途进化优先级
ActionPrompt指导 agent 生成 ACTION 块高——最复杂,失败模式最多
IntentPrompt分类用户意图(summarize/task/note/event/chat)高——summarize 和 chat 的边界情况
NameExtractPrompt从消息中提取人名中——时间词污染、复合句
SummaryPrompt生成聊天消息摘要低——运行良好
HeartbeatPrompt定时健康检查响应低——运行良好

RingClaw 进化流水线

当前 Golden 数据集

RingClaw 有 77 个手动策划的测试用例,源自历史 bug 修复 PR:

数据集用例数主要来源
datasets/prompts/intent/golden.jsonl34PR #34(边界)、PR #62(时间词)、PR #91(绝对日期)
datasets/prompts/name_extract/golden.jsonl23PR #40(复合句)、PR #62(时间词污染)、PR #91(绝对日期)
datasets/prompts/action/golden.jsonl20PR #40(代词)、PR #68(person ID 误用)

每个测试用例标注了 source_pr(可追溯性)和 note(解释为什么这个 case 难)。

基线结果

使用 deepseek-chat(通过 Cloudflare AI Gateway)评估:

Prompt分数评分方式主要失败
IntentPrompt30/34 (88.2%)精确匹配"总结代码/文档/PR" 被误判为 summarize
NameExtractPrompt21/23 (91.3%)精确匹配复合指令("总结 maxwell 并创建任务")
ActionPrompt13/20 (65.0%)LLM 裁判代词处理、多动作、卡片生成

自动变异结果

使用 --evolve,IntentPrompt 在一轮变异后从 88.2% 提升至 91.2%。变异只添加了一句话:"The summarize intent applies ONLY to summarizing chat history or messages"——针对边界 case 的精准修复。

CI 集成

评估流水线通过三种机制集成到 CI:

  1. 变更自动评估 — 当 messaging/prompts.godatasets/prompts/scripts/eval_prompt.go 变更时自动运行
  2. Job Summary + PR 评论 — 评估结果发布到 GitHub Actions Summary 和 PR 评论
  3. 手动进化工作流evolve.ymlworkflow_dispatch)对所有 prompt 运行 --evolve,提升 ≥ 3% 时自动创建 PR

使用方法

bash
# 评估所有 prompt
go run scripts/eval_prompt.go --prompt all

# 生成 markdown 报告
go run scripts/eval_prompt.go --prompt intent --markdown report.md

# 对比替代 prompt
go run scripts/eval_prompt.go --prompt intent --compare path/to/new_prompt.md

# 进化 prompt(5 轮变异)
go run scripts/eval_prompt.go --prompt all --evolve 5

# 设定最低提升阈值
go run scripts/eval_prompt.go --prompt intent --evolve 10 --min-improvement 3

环境变量

变量必填默认值说明
LLM_API_KEY任何 OpenAI 兼容 provider 的 API key
LLM_MODELdeepseek-chat模型名称
LLM_BASE_URLhttps://api.deepseek.comAPI 端点(支持 Cloudflare AI Gateway)

延伸阅读