Self-Critique / Self-Refine

自我批评与修正

让模型先答,再以"挑刺者"身份审一遍自己的回答。

详解

Self-Critique(自我批评)是一种让模型对自己输出进行批判性审查并迭代改进的技术,核心循环是:生成初稿 → 批评初稿 → 根据批评修订 → 再批评 → 再修订……直到满足质量要求或达到迭代上限。它不需要外部评判者,用同一个模型完成生成和审查两个角色——关键在于切换 System Prompt:生成阶段让模型「尽力作答」,批评阶段让模型「扮演严格的挑剔审查者,找出上面回答的所有问题」,修订阶段基于批评意见改进。Self-Refine 论文报告显示,该方法在对话、代码生成、数学推理等多类任务上平均性能提升约 20%。实践注意三点:①迭代次数要设上限(通常 2–3 轮即可,收益递减明显)②批评的 Prompt 要明确说明从哪些维度挑问题(准确性、完整性、格式)③批评和修订用不同的消息独立发出,不要混在同一轮,否则模型容易「自我辩护」而非真正批评。

一个类比
就像写完一份报告后换一顶「挑剔的编辑」帽子重新读一遍:不是改错别字,而是问「这段论点有没有漏洞?举的例子贴切吗?读者会不会看不懂?」——发现问题就改,再戴回「作者」帽子修订。两种帽子交替切换,比一直处于作者视角更容易发现盲区。
举个例子
# Self-Critique:两轮调用实现「生成 → 批评 → 修订」
import anthropic

client = anthropic.Anthropic()

question = "用 Python 写一个判断质数的函数"

# 第一轮:生成初稿
draft_resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=256,
    messages=[{"role": "user", "content": question}]
)
draft = draft_resp.content[0].text
print("初稿:\n", draft)

# 第二轮:切换到「挑剔审查者」角色,批评初稿
critique_resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=256,
    system="你是一个严格的代码审查者。找出下面代码的所有问题(边界情况、性能、正确性),不要给出修复代码,只列出问题。",
    messages=[{"role": "user", "content": f"请审查这段代码:\n{draft}"}]
)
critique = critique_resp.content[0].text
print("批评意见:\n", critique)

# 第三轮:基于批评修订
refined_resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=256,
    messages=[{
        "role": "user",
        "content": f"原始代码:\n{draft}\n\n审查意见:\n{critique}\n\n请根据以上意见修订代码。"
    }]
)
print("修订版:\n", refined_resp.content[0].text)
PYTHON 示例
相关概念