Self-Refine
Self-Refine(Madaan et al., 2023)是什么
Self-Refine(自我精炼/自我迭代改进)是一种迭代式提示框架:模型先给出初稿,然后由同一个模型对初稿提出“反馈”(找问题、提改进点),再根据这些反馈生成“改进稿”。如此循环,直到满足停止条件(例如迭代次数到上限、质量达标、改动变小等)。
它通常包含三个角色/步骤(不一定要分角色实现,但逻辑上分三步):
- Draft(初稿):对任务给出第一版答案
- Feedback(反馈):对初稿进行批判性评审(缺点、错误、遗漏、结构、可读性、边界条件等)
- Refine(精炼):根据反馈产出改进版,并可附“改了什么”
与 Self-Calibration 的差异:
- Self-Calibration 重点是“这答案对不对/我有多确定”(用于接受/复核路由)
- Self-Refine 重点是“在同等信息下把答案变得更好”(用于提升质量:正确性、清晰度、完整性、可执行性等)
适合的应用场景
- 生成类任务(提升结构、表达、覆盖面)
- 写邮件、方案、文案、摘要、报告、PRD、周报、面试回答等
- 推理/解题类任务(减少遗漏、纠正粗心)
- 需要多步分析的问题、案例分析、决策对比(但不保证绝对正确)
- 代码与工程输出
- 代码改进、补充边界处理、添加注释、生成单元测试、重构可读性
- 需要遵循复杂约束的输出
- 指定格式、风格、字数、包含/不包含项、合规要求等(迭代更容易“贴齐”约束)
不适合的应用场景(或需要配合其他方法)
- 强事实正确性要求且不能容错
- Self-Refine 可能“越改越像真的”,但事实仍错。事实题建议结合 RAG/引用来源/外部校验。
- 成本敏感、延迟敏感的场景
- 多轮迭代会增加 token 与时间。需要设定“迭代上限/停止条件”。
- 输入信息不足的问题
- 迭代可能只是在“编得更圆”。这类任务应先触发“澄清问题”或检索补信息。
- 模型会沿错误前提滚雪球
- 初稿若核心假设错,后续反馈可能没抓到,导致错误被“精炼强化”。可引入:多样化评审角度/外部评审/工具验证。
提示词怎么写(可直接套用)
基本迭代模板(单模型循环)
你可以每轮固定两段提示:
(1) 反馈 Prompt(Critique)
- 输入:任务 + 当前答案
- 输出:按清单指出问题与可执行改进建议(不要重写全文)
(2) 精炼 Prompt(Refine)
- 输入:任务 + 当前答案 + 反馈
- 输出:改进后的答案(可要求“保留优点”“对照修改点”“严格满足约束”)
停止条件建议(工程上很重要)
- 达到 max_steps(如2~5轮)
- 反馈中“严重问题数”≤阈值
- 新旧版本差异很小(改动率低)
- 满足硬性验收清单(格式/字段齐全/长度/测试通过)
至少3个中文实战例子(完整写法)
例子1:写一封中文商务邮件(生成任务)
任务:给客户解释延期并给出新交付计划,语气专业克制。
第1步 Draft Prompt:
你是项目经理。请给客户写一封中文邮件,说明项目交付将延期一周,原因是关键依赖组件测试未通过。
要求:语气专业、承担责任、给出新时间表、提出补救措施、最后邀请对方确认。字数200-300。
第2步 Feedback Prompt:
请对下面这封邮件进行“可执行反馈”,从以下维度指出问题并给出改进建议:
- 是否清晰说明延期原因且不过度技术化
- 是否提供明确新时间表与里程碑
- 是否有补救措施与风险控制
- 语气是否得体(不甩锅)
- 是否有明确的下一步与对方需要确认的事项
只输出条目化反馈(最多10条),不要重写邮件。
邮件正文:
{粘贴Draft输出}
第3步 Refine Prompt:
请根据以下反馈改写邮件,保留原邮件中有效信息,但必须逐条落实反馈里的关键建议。
输出为最终邮件正文(含称呼与落款占位符)。原邮件:{粘贴Draft}
反馈:{粘贴Feedback}
(可再循环1-2轮)
例子2:把一段说明改成“结构化操作指南”(生成+约束)
任务:把散文式描述变成可执行的SOP。
Draft Prompt:
请把下面这段描述改写为“新人可执行的SOP操作指南”。
输出格式固定:
- 目的
- 适用范围
- 前置条件
- 步骤(编号1..n,每步不超过2句)
- 常见错误与排查(至少5条)
原始描述:
{粘贴原文}
Feedback Prompt:
你是SOP审稿人。请检查该SOP是否:
- 步骤可操作、无跳步
- 术语定义清楚
- 前置条件完整
- 排查项具体
输出:
- 严重问题(必须改)
- 一般问题(建议改)
- 缺失信息清单(需要向作者追问的问题)
Refine Prompt:
根据审稿反馈,输出修订后的SOP。
额外要求:
- 若存在“缺失信息”,请在SOP中用【待确认】标注,并在末尾列出“需要确认的问题”。
原SOP:{当前版本}
审稿反馈:{反馈}
例子3:代码生成与改进(coding)
任务:写一个函数并在迭代中补齐边界与测试。
Draft Prompt:
用Python实现:给定一个字符串s,返回最长不含重复字符的子串长度。
要求:
- 时间复杂度O(n)
- 给出函数与简要解释
- 给出3个示例输入输出
Feedback Prompt:
请作为代码审查员,对下面代码做反馈:
- 正确性:是否覆盖空串、全重复、含空格/特殊字符等
- 复杂度:是否O(n)
- 可读性:变量命名、注释
- 测试:是否足够、是否覆盖边界
输出:
- 可能的bug/逻辑风险点(条目化)
- 需要补充的最小单元测试用例(至少8个,给出输入与期望输出)
- 重构建议(若有)
代码:
{粘贴Draft代码}
Refine Prompt:
请根据审查反馈改进代码:
- 修复潜在问题
- 补充必要注释
- 给出完整的单元测试(pytest风格或简单assert均可)
原代码:{Draft代码}
审查反馈:{Feedback}
例子4:推理/分析题(让“反馈”更像检查清单)
Draft Prompt:
请分析:一家SaaS公司过去3个月流失率上升,可能原因有哪些?给出排查优先级与建议动作。
要求:分“假设-证据-动作”,最多500字。
Feedback Prompt:
请对上述分析做“反例驱动”的反馈:
- 哪些结论缺乏证据支撑?
- 哪些关键变量被遗漏(如渠道、定价、产品故障、竞品等)?
- 排查优先级是否合理?
输出不超过12条,每条包含“问题+改进建议”。
Refine Prompt:
根据反馈,输出改进版分析,并新增一段:
- “一周内可执行的最小排查计划”(按天列出要拉的报表/要访谈的人/要验证的假设)
小结:Self-Refine 的关键成功要素
- 反馈要可执行:用检查清单/评分维度,不要泛泛“写得更好”。
- 精炼要绑定反馈:要求“逐条落实”,必要时输出“改动对照表”。
- 要有停止条件:2-4轮往往就有明显提升,继续迭代收益递减。
- 事实/代码要配外部验证:Self-Refine 提升质量,但不能替代检索与测试。
如果你告诉我你最想落地的任务类型(写作/代码/客服/数据分析/知识问答),我可以给你做一套“可直接放进产品”的 Self-Refine 提示词链(含停止条件与字段化输出)。