Prompt Optimization Loop

提示词优化循环 - 让 AI 自己学会写更好的 Prompt

什么是 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 个百分点!

常见坑点

踩坑实录

坑1:测试数据太少

只有 5 个测试案例,优化出来的 prompt 过拟合了。需要至少 50-100 个代表性案例。

坑2:评估指标不合理

用"输出长度"作为指标?模型会写废话凑字数。指标必须反映真实目标。

坑3:优化过度

迭代 100 次,prompt 变成了一堆奇怪的规则组合。设置上限(如 10 次),防止过度优化。

坑4:忘记版本控制

优化后的 prompt 没保存,下次又从头优化。每次迭代都记录版本,方便回溯。

最佳实践

相关链接