什么是 Prompt Optimization Loop?
生活类比
你教孩子写作文,写完你看一眼,说"这里改改,那里改改",孩子改完你再看,再改,直到满意。
Prompt Optimization Loop 就是把这个过程自动化——
写一个初版 prompt,测试效果,分析问题,自动改进,再测试,再改进...循环直到效果达标。
就像有个"AI 老师",自己教自己,不断进步。
正式定义:Prompt Optimization Loop 是一种自动化迭代优化提示词的方法,通过执行-评估-改进的循环过程,逐步提升 prompt 的效果。它借鉴了机器学习的训练流程,但应用于 prompt engineering。
优化循环架构
┌─────────────────────────────────────────┐
│ Initial Prompt (初版提示词) │
└─────────────────────┬───────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Execute (执行测试) │
│ 用当前 prompt 处理测试数据集 │
└─────────────────────┬───────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Evaluate (评估效果) │
│ 对比输出与预期,计算评分 │
└─────────────────────┬───────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Analyze (分析问题) │
│ 找出哪里做得好,哪里做得差 │
└─────────────────────┬───────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Improve (改进 Prompt) │
│ 基于分析结果调整 prompt │
└─────────────────────┬───────────────────┘
│
┌───────────┴───────────┐
│ │
│ Score 达标? │ 迭代次数上限?
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Done ✓ │ │ Loop Back ▲ │
│ 输出最优 │ │ 继续优化 │
└─────────────────┘ └─────────────────┘
核心方法对比
| 方法 | 原理 | 优点 | 适用场景 |
|---|---|---|---|
| Manual Iteration | 人手动调整 | 直观可控 | 简单任务 |
| DSPy | 声明式定义,自动优化 | 自动化程度高 | 复杂推理任务 |
| LLM-as-Judge | 用 LLM 评估 LLM | 无需人工标注 | 主观质量评估 |
| Genetic Prompting | 进化算法生成变体 | 探索性优化 | 创新性任务 |
| Gradient-based | 梯度下降优化连续 prompt | 数学最优 | 软 prompt 调优 |
DSPy 深度解析
DSPy 是斯坦福提出的 Prompt Optimization 框架,把 prompt engineering 变成了"编程":
1. 声明式定义签名
// DSPy Signature - 定义"做什么"而不是"怎么说" class QASignature(dspy.Signature): """Given a question, retrieve relevant documents and answer.""" question: str = dspy.InputField(desc="用户的问题") context: str = dspy.InputField(desc="检索到的文档") answer: str = dspy.OutputField(desc="简洁的回答") // 不需要写 "请根据以下文档回答问题..." // DSPy 会自动生成和优化 prompt
2. 定义模块(相当于函数)
class RAGModule(dspy.Module): def __init__(self): self.retrieve = dspy.Retrieve(k=3) self.generate = dspy.ChainOfThought(QASignature) def forward(self, question): context = self.retrieve(question).passages answer = self.generate(question=question, context=context) return answer
3. 自动优化(相当于训练)
// 定义评估指标 def evaluate_accuracy(example, pred, trace=None): return example.answer == pred.answer // 准备训练数据 trainset = [ dspy.Example(question="什么是RAG?", answer="检索增强生成"), dspy.Example(question="OpenClaw是什么?", answer="AI Agent平台"), ... ] // 自动优化(相当于机器学习的 fit) optimizer = dspy.BootstrapFewShot(metric=evaluate_accuracy, max_bootstrapped_demos=4) optimized_rag = optimizer.compile(RAGModule(), trainset=trainset) // 现在 optimized_rag 拥有自动优化的 prompt // 包含:最优的指令 + 最佳示例 + 合理的 CoT 结构
LLM-as-Judge 方法
用另一个 LLM 来评估当前 LLM 的输出质量:
// LLM-as-Judge 评估流程 async function llmAsJudgeLoop(prompt, testCases) { let bestPrompt = prompt; let bestScore = 0; for (let i = 0; i < 10; i++) { // 1. 执行当前 prompt const outputs = await executePrompt(bestPrompt, testCases); // 2. 用评估 LLM 打分 const scores = await Promise.all( outputs.map(o => judgeLLM(o, criteria)) ); // 3. 分析问题 const analysis = await analyzeFailures(outputs, scores); // 4. 改进 prompt bestPrompt = await improvePrompt(bestPrompt, analysis); bestScore = average(scores); if (bestScore >= 0.95) break; } return bestPrompt; }
OpenClaw 实战应用
配置 Prompt 优化任务
// OpenClaw Skill: prompt-optimizer skill: name: prompt-optimizer description: 自动优化提示词 optimize: method: dspy // 或 llm-judge, genetic metric: accuracy // 评估指标 max_iterations: 10 target_score: 0.90 test_data: path: /data/test_cases.json format: jsonl
使用优化后的 Prompt
// 加载优化后的 prompt const optimizedPrompt = await loadPrompt('optimized_qa_prompt'); // 使用 const result = await askLLM({ prompt: optimizedPrompt, question: "什么是Agent Runtime?" });
持续优化流程
// 定时任务:每周优化一次 cron: schedule: "0 0 * * 0" // 每周日 0 点 task: prompt_optimization workflow: 1. 收集上周的用户反馈 2. 分析低评分案例 3. 运行优化循环 4. 部署新 prompt 5. A/B 测试验证
优化效果追踪
优化前 vs 优化后
初版 prompt:"请根据以下文档回答问题"
准确率:65%
经过 5 次迭代优化后:
优化后 prompt:"你是一个专业问答助手。请仔细阅读以下文档,找出与问题直接相关的信息,用简洁的语言回答。如果文档中没有相关信息,请说明。"
准确率:92%
提升 27 个百分点!
优化前 vs 优化后
初版 prompt:"请根据以下文档回答问题"
准确率:65%
经过 5 次迭代优化后:
优化后 prompt:"你是一个专业问答助手。请仔细阅读以下文档,找出与问题直接相关的信息,用简洁的语言回答。如果文档中没有相关信息,请说明。"
准确率:92%
提升 27 个百分点!
常见坑点
踩坑实录
坑1:测试数据太少
只有 5 个测试案例,优化出来的 prompt 过拟合了。需要至少 50-100 个代表性案例。
坑2:评估指标不合理
用"输出长度"作为指标?模型会写废话凑字数。指标必须反映真实目标。
坑3:优化过度
迭代 100 次,prompt 变成了一堆奇怪的规则组合。设置上限(如 10 次),防止过度优化。
坑4:忘记版本控制
优化后的 prompt 没保存,下次又从头优化。每次迭代都记录版本,方便回溯。
最佳实践
- 数据先行:准备充足的测试数据,覆盖各种场景
- 指标对齐:评估指标必须与实际目标一致
- 迭代控制:设置最大迭代次数,防止过度优化
- 版本记录:每次迭代保存 prompt 版本和评分
- AB 验证:优化后必须 AB 测试,验证真实效果
- 持续迭代:定期收集反馈,重新优化