SELF-REFINE: Iterative Refinement with Self-Feedback
问题 (Problem)
大型语言模型(LLMs)虽然功能强大,但其初次生成的输出往往不是最优的,尤其是在处理具有复杂约束或多方面目标(如对话生成、代码优化)的任务时。传统的优化方法通常需要大量的监督训练数据、额外的模型训练或强化学习,这些都成本高昂且不易获取。因此,研究的核心问题是:能否让大型语言模型在不进行额外训练或使用外部监督数据的情况下,仅通过自我反思和修正来迭代式地提升其输出质量?
方法 (Method)
为了解决上述问题,该研究提出了 SELF-REFINE 框架,其核心思想是利用同一个大型语言模型,让它扮演三个角色:生成者 (Generator)、反馈提供者 (Feedback Provider) 和 精炼者 (Refiner)。整个过程是一个迭代循环,直到满足停止条件为止。
方法流程详解:
该方法主要包含三个核心步骤:生成 (Generate)、反馈 (Feedback) 和 精炼 (Refine)。
第一步:初始生成 (Initial Generation)
给定一个输入 和一个用于初始生成的提示 ,模型 首先会生成一个初始输出 。
这里的 通常是一个任务相关的 few-shot 提示,包含了若干输入-输出的示例。
第二步:反馈 (Feedback)
接下来,将初始输出 连同原始输入 一起,再次输入给同一个模型 ,但这次使用一个用于生成反馈的提示 。模型会针对自己的输出 (在第 次迭代中) 给出反馈 。
研究强调,高质量的反馈应该是具体的 (specific) 和可操作的 (actionable)。例如,在代码优化任务中,一个好的反馈不会是“提高代码效率”,而应该是“这段代码使用了暴力循环,速度很慢,可以尝试使用数学公式 来优化”。
第三步:精炼 (Refine)
模型接收到自己给出的反馈 后,结合原始输入 和历史的输出与反馈,使用精炼提示 来生成一个改进后的输出 。为了让模型能从历史错误中学习,之前所有的输出-反馈对都会被保留在上下文中。
迭代与停止:
上述的“反馈”和“精炼”步骤会循环进行。停止条件可以是固定的迭代次数(例如,最多4次),或者是模型在反馈中生成了一个特定的停止信号(例如,反馈内容为“输出质量已经很高,无需修改”)。
图例解读:

- 图1 (Figure 1) 直观地展示了SELF-REFINE的循环流程。输入 首先通过模型 得到初始输出,然后进入一个循环:
- 反馈 (Feedback): 模型 评估自己的输出并给出反馈。
- 精炼 (Refine): 模型 根据收到的反馈来修正上一步的输出。
这个循环不断重复,直到满足停止条件。

- 图2 (Figure 2) 给出了两个具体的例子:
- 对话生成: 初始回答“我相信这是社交和保持活力的好方法”比较平淡。模型给出的反馈是“缺乏互动性,未能理解用户需求”。精炼后的回答则更具互动性,并提出了引导性问题:“你以前玩过吗,还是想学?”
- 代码优化: 初始代码使用
for循环计算从1到N的和,效率较低。模型反馈指出这是“暴力方法”,并建议使用数学公式。精炼后的代码直接使用了公式(n*(n+1))//2,效率大大提升。

- 算法1 (Algorithm 1) 提供了该方法的伪代码,清晰地描述了从初始生成到迭代反馈和精炼,直至最终返回结果的完整逻辑。
Baseline
该研究的核心对比方法是直接生成 (Direct Generation),即使用同一个基础大型语言模型(Base LLM),在不经过SELF-REFINE的迭代反馈和精炼过程的情况下,一次性生成最终输出。这种对比方式能够最直接地证明 SELF-REFINE 框架自身的有效性。
在具体的任务评估中,研究还与其他特定领域的SOTA(State-of-the-art)方法进行了比较,例如:
- 数学推理任务 (GSM8K): 与
PaL(Program-aided Language Models) 和Self-Correct等方法进行了比较。 - 代码优化任务 (PIE): 与
CODEX,CODEGEN,SCALENE, 以及专门为该任务微调的PIE模型进行了比较。
数据集 (Datasets)
该研究在7个多样化的任务上对 SELF-REFINE 进行了评估,涵盖了自然语言和代码两大领域:
- 对话响应生成 (Dialogue Response Generation): 使用
FED数据集,旨在生成更丰富、更具互动性的对话。 - 代码优化 (Code Optimization): 使用
PIE数据集,目标是提升Python代码的运行效率。 - 代码可读性改进 (Code Readability Improvement): 使用
CodeNet数据集,旨在通过重构使代码更易于理解。 - 数学推理 (Math Reasoning): 使用
GSM8K数据集,解决小学数学应用题。 - 情感反转 (Sentiment Reversal): 使用
Yelp评论数据集,将评论的正面或负面情感进行反转。 - 首字母缩写词生成 (Acronym Generation): 研究团队为此自建了一个包含250个缩写词的数据集。
- 约束生成 (Constrained Generation): 基于
CommonGen数据集,但增加了约束难度,要求生成的句子包含20-30个给定的关键词。
可复现性 (Reproducibility)
- 代码: 论文明确表示,所有代码、数据和使用的提示都已匿名公开在网站
https://selfrefine.info/上,这为复现研究提供了极大的便利。 - 算力/模型: 实验主要使用了 OpenAI 的闭源 API 模型,包括 GPT-3.5 (text-davinci-003), ChatGPT (gpt-3.5-turbo), 和 GPT-4。对于代码任务,还使用了 CODEX (code-davinci-002)。这意味着复现研究需要调用这些商业API,会产生一定的费用。论文也坦诚地指出了这一限制。此外,研究还尝试了开源模型 Vicuna-13B,但发现其遵循复杂指令(尤其是在反馈和精炼环节)的能力较弱,效果不佳,这表明该方法对模型的基础能力有较高要求。
可改进的几个点
- 对弱模型的适应性: 当前方法在像 Vicuna-13B 这样的较弱模型上表现不佳。未来的工作可以探索如何调整提示工程或引入更轻量级的微调,使该框架能够更好地适用于能力稍弱或更专业化的开源模型。
- 反馈质量的稳定性: 实验分析表明,错误的反馈是导致精炼失败的主要原因。可以研究如何让模型生成更稳定、更准确的反馈,例如通过引入多轮反馈审查机制,或者让模型对自己的反馈进行可信度评分。
- 迭代效率问题: 多轮迭代会增加时间和计算成本。可以研究更智能的停止策略,例如,当连续两轮的改进幅度低于某个阈值时提前终止,或者设计一种机制让模型在单轮内进行更深度的“反思”,从而减少迭代次数。
- 处理复杂长任务的能力: 对于需要长链条推理或多步骤规划的任务(如长篇故事写作、复杂软件开发),当前的反馈机制可能过于局部。可以探索层次化的 SELF-REFINE 结构,即先对整体大纲进行反馈和精炼,再逐步细化到段落或模块级别。
- 对错误反馈的鲁棒性: 论文提到,精炼器有时能够修正部分错误的反馈。可以系统性地研究和提升模型对噪声或错误反馈的鲁棒性,使其在反馈不完美时也能做出合理的改进。
可以被引用的一些结论
- 核心贡献: “大型语言模型可以通过一种名为SELF-REFINE的迭代自反思框架,在无需额外训练数据或强化学习的情况下,显著提升其在多种任务上的输出质量。”
- 性能提升: “在横跨对话生成、代码优化和数学推理等7个不同任务的评估中,使用SELF-REFINE后的GPT-3.5和GPT-4模型,其性能平均绝对提升了约20%。”
- 反馈的重要性: “实验表明,反馈的质量至关重要。与通用的或无反馈的迭代相比,生成具体且可操作的反馈能带来最显著的性能提升。例如,在情感反转任务中,移除有效反馈会导致任务完全失败。”
- 迭代的价值: “多轮迭代是有效的。分析显示,随着迭代次数的增加,输出质量通常会持续提升,尽管大部分改进发生在最初的几轮迭代中,之后收益递减。”
- 模型能力要求: “SELF-REFINE框架的成功应用依赖于基础模型强大的指令遵循和上下文学习能力。在能力较弱的模型(如Vicuna-13B)上,该框架难以有效执行反馈和精炼步骤。”
- 超越简单采样: “SELF-REFINE的效果优于简单地生成多个候选输出并择优的策略。实验证明,经过迭代精炼后的单个输出,其质量通常优于一次性生成的多个初始输出中的任何一个。”
- 对SOTA模型的提升: “即使是像GPT-4这样顶尖的模型,其初始输出也并非完美。SELF-REFINE证明了在测试阶段(test-time)通过自我迭代,依然可以进一步解锁这些强大模型的潜力。”