Anthropic Cookbook项目:评估-优化工作流模式详解
工作流概述
评估-优化工作流是一种创新的LLM应用模式,通过两个LLM调用的协同工作实现持续改进。该模式的核心思想是:一个LLM负责生成内容(优化器),另一个LLM负责评估并提供反馈(评估器),两者形成闭环迭代。
适用场景
这种工作流特别适合以下情况:
- 有明确评估标准:当任务有清晰的评价维度时(如代码正确性、时间复杂度、风格规范等)
- 迭代改进有价值:当初始结果通常需要多次调整才能达到理想状态
- LLM能提供有效反馈:当LLM自身能够识别改进空间并提供建设性意见
典型应用场景包括:
- 代码生成与优化
- 技术文档撰写
- 算法设计
- 内容创作与润色
核心实现解析
1. 生成阶段
def generate(prompt: str, task: str, context: str = "") -> tuple[str, str]:
"""生成并基于反馈改进解决方案"""
full_prompt = f"{prompt}\n{context}\nTask: {task}" if context else f"{prompt}\nTask: {task}"
response = llm_call(full_prompt)
thoughts = extract_xml(response, "thoughts")
result = extract_xml(response, "response")
return thoughts, result
关键点:
- 接收任务描述和可选上下文(包含历史尝试和反馈)
- 使用结构化输出(XML格式)分离"思考过程"和"实际响应"
- 保留完整的思维链(Chain-of-Thought)便于调试和优化
2. 评估阶段
def evaluate(prompt: str, content: str, task: str) -> tuple[str, str]:
"""评估解决方案是否满足要求"""
full_prompt = f"{prompt}\nOriginal task: {task}\nContent to evaluate: {content}"
response = llm_call(full_prompt)
evaluation = extract_xml(response, "evaluation")
feedback = extract_xml(response, "feedback")
return evaluation, feedback
评估器设计要点:
- 明确评估标准(如代码正确性、时间复杂度、风格规范)
- 提供二元评估结果(PASS/NEEDS_IMPROVEMENT)
- 反馈需具体、可操作,指明改进方向
3. 循环机制
def loop(task: str, evaluator_prompt: str, generator_prompt: str) -> tuple[str, list[dict]]:
"""持续生成和评估直到满足要求"""
memory = []
chain_of_thought = []
while True:
# 生成阶段
thoughts, result = generate(generator_prompt, task, context)
memory.append(result)
chain_of_thought.append({"thoughts": thoughts, "result": result})
# 评估阶段
evaluation, feedback = evaluate(evaluator_prompt, result, task)
if evaluation == "PASS":
return result, chain_of_thought
# 构建下一轮上下文
context = "\n".join([
"Previous attempts:",
*[f"- {m}" for m in memory],
f"\nFeedback: {feedback}"
])
循环控制逻辑:
- 记录所有历史尝试和思维过程
- 将失败尝试和反馈作为上下文传递给下一轮
- 直到评估结果为PASS才终止循环
- 返回最终结果和完整的决策过程
实战案例:最小栈实现
我们以"实现O(1)时间复杂度操作的最小栈"为例,展示工作流的实际效果。
初始实现问题
第一版代码虽然算法正确,但存在:
- 缺乏错误处理(空栈时静默返回)
- 缺少类型提示和文档字符串
- 没有输入验证
改进过程
-
第一轮反馈:
- 建议添加异常处理
- 补充类型提示和文档
- 增加输入验证
-
优化后实现:
from typing import List class MinStack: """A stack that supports push, pop, and getting minimum element in O(1) time.""" def __init__(self): """Initialize empty stack with two internal lists.""" self.stack: List[int] = [] self.minStack: List[int] = [] def push(self, x: int) -> None: """ Push element onto stack and update minimum stack. Args: x: Integer to push onto stack Raises: TypeError: If x is not an integer """ if not isinstance(x, int): raise TypeError("Input must be an integer") self.stack.append(x) if not self.minStack or x <= self.minStack[-1]: self.minStack.append(x)
关键改进:
- 完整的类型注解
- 详细的文档字符串
- 严格的输入验证
- 明确的异常处理
模式优势与局限
优势
- 自动化质量保证:通过严格评估确保输出质量
- 持续改进:每次迭代都基于具体反馈进行优化
- 透明决策:保留完整的思维链便于理解LLM决策过程
局限
- 计算成本:需要多次LLM调用
- 评估标准依赖:需要精心设计评估提示词
- 可能陷入局部最优:需要设计合理的终止条件
最佳实践建议
-
评估提示设计:
- 明确列出所有评估维度
- 提供具体的评价标准
- 要求结构化输出
-
生成提示优化:
- 鼓励自我反思
- 要求解释改进策略
- 保留思维过程
-
循环控制:
- 设置最大迭代次数防止无限循环
- 记录完整历史便于分析
- 可引入人工审核环节
这种评估-优化工作流代表了LLM应用的高级模式,通过将生成与评估分离,实现了类似人类"写作-审阅-修改"的创作过程,能够显著提升复杂任务的输出质量。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



