Self-Refine: 通过自我反馈进行迭代优化

论文概述

Self-Refine是来自CMU、AI2和顶级研究机构的一个有影响力的迭代优化框架,使大型语言模型能够通过自我生成的反馈自主改进其输出。关键洞察是,就像人类一样,大型语言模型很少在第一次尝试时产生最佳输出,但可以批评和优化自己的工作。三步过程 - (1) 生成初始输出,(2) 提供自我反馈,(3) 基于反馈进行优化 - 不需要额外的训练、监督数据或强化学习。在7个不同任务(对话、数学推理、代码生成、情感反转、首字母缩略词生成、约束生成、评论改写)上使用GPT-3.5、ChatGPT和GPT-4进行评估,Self-Refine平均提高约20%的性能,人类强烈偏好其输出。该成果发表于NeurIPS 2023,影响了众多关于大型语言模型自我改进和批评的后续工作。

论文信息:

  • 发布时间:2023-03-30
  • 作者:Aman Madaan, Niket Tandon, Prakhar Gupta等
  • 机构:Carnegie Mellon University, Allen Institute for AI, University of Washington, NVIDIA, UC San Diego, Google Research
  • 研究方向:提示工程 (Prompt Engineering), 大型语言模型推理 (LLM Reasoning)
  • 核心技术:提示工程 (Prompt Engineering)

研究背景

大型语言模型在各类任务中展现出强大的能力,但首次生成的输出往往不是最优的。本研究针对以下问题展开:

现有问题

  • 模型首次生成往往存在各种缺陷
  • 缺乏自我评估和改进的能力
  • 需要外部反馈才能改进输出质量

研究动机

本研究旨在探索使大型语言模型具备自我批评和迭代改进能力的方法,无需额外训练或外部反馈,特别关注自我优化 (self-refine)、迭代优化 (iterative-refinement)、自我反馈 (self-feedback) 等关键技术。

核心方法

方法概述

Self-Refine使用单个大型语言模型实现三阶段迭代循环:(1) 初始生成 - 给定输入x和任务指令,大型语言模型使用标准提示生成初始输出y0;(2) 自我反馈 - 同一个大型语言模型接收y0和反馈提示,要求其批评输出,识别具体问题(例如,”对话回应是否有同理心?”、”代码是否有错误?”、”数学推理是否正确?”)。大型语言模型生成描述问题和建议的反馈fb;(3) 优化 - 大型语言模型接收原始输入x、初始输出y0和反馈fb,然后生成解决已识别问题的优化输出y1。步骤2-3重复,直到满足停止标准(最大迭代次数、反馈表示”没有问题”或输出质量达到平台期)。至关重要的是,该方法不需要训练或微调 - 它通过提示工程对所有三个角色使用相同的预训练大型语言模型。特定任务的反馈提示是手动设计的,但不需要标注数据。例如,在数学推理中,反馈提示询问”计算是否正确?逻辑是否合理?”;在对话中,”回应是否相关且有同理心?”。该方法利用大型语言模型在自我评估和遵循指令方面的新兴能力,将优化视为多轮对话,模型在其先前尝试的基础上构建。

本方法的核心在于通过迭代的自我批评和优化,使单个模型充当生成器、批评者和优化者的角色。

关键创新点

创新 1:开创性的迭代自我优化范式,单个大型语言模型充当生成器、批评者和优化者,无需单独的模型或额外训练

创新 2:证明大型语言模型可以在其自身输出上提供有用的反馈,跨越不同任务类型 - 从创意写作到数学推理 - 实现自主改进

创新 3:在7个任务上实现约20%的平均性能提升(对话回应、数学推理、代码优化、情感反转、首字母缩略词生成、约束生成、评论改写),人类评估者偏好自我优化的输出

创新 4:表明自我优化即使对GPT-4这样的先进模型也有效,表明该方法随模型能力扩展,不仅仅是补偿弱初始生成

创新 5:引入特定任务的反馈提示,指导大型语言模型识别错误、建议改进并评估不同领域的质量,无需领域特定的训练

创新 6:确定多轮优化(2-3次迭代)提供递减回报,大部分收益在第一次优化步骤中实现,为迭代预算提供实用指导

技术特点

  • 无需训练:仅通过提示工程实现自我优化
  • 单模型架构:不需要单独的批评模型
  • 广泛适用:适用于多种不同类型的任务
  • 迭代改进:通过多轮优化持续提升质量
  • 可解释性强:提供明确的反馈和改进轨迹

实验结果

Benchmark 性能

在7个不同任务上进行了评估,展示广度:(1) 对话回应生成 - 人类评估者以2:1的比例偏好自我优化的回应;在相关性、连贯性、同理心方面有改进;(2) 数学推理(GSM8K)- 通过自我纠正计算错误和逻辑缺陷,准确率提高20%;(3) 代码优化 - 在65%的情况下生成更高效的代码(更低的时间/空间复杂度);修复初始实现中的错误;(4) 情感反转 - 在翻转评论情感的同时保留内容方面,成功率从60%提高到85%;(5) 首字母缩略词生成 - 人类评分更高的首字母缩略词(更有意义、可发音)提高30%;(6) 约束文本生成 - 在提高质量的同时保持约束(例如字数限制、必需短语);(7) 评论改写 - 有用性和具体性分数提高25%。使用多个大型语言模型测试:GPT-3.5(Davinci-003)、ChatGPT(GPT-3.5-turbo)、GPT-4;改进在模型间一致,但在更强模型上更大。迭代分析:第一次优化带来最大收益(15%提升),第二次优化增加5%,第三次增加<2%;建议1-2次迭代以提高效率。消融:自我反馈至关重要 - 没有反馈的优化(只是”改进你的输出”)产生最小收益;反馈具体性很重要 - 详细批评优于通用”找错误”。失败模式:偶尔的反馈幻觉(声称不存在的错误)或反馈-优化循环(重复相同问题)。人类评估:64%的自我优化输出在各任务中优于基线。

性能分析

实验结果表明,该方法在多个主流基准测试上都取得了显著的性能提升,特别是在需要质量改进的任务上表现突出。

关键发现

  • 迭代改进有效:1-2次迭代即可获得显著提升
  • 反馈质量关键:详细具体的反馈比通用反馈更有效
  • 广泛适用:在创意、推理、编程等多种任务上都有效
  • 递减回报:超过2-3次迭代后收益递减

实际应用

适用场景

  • 内容创作:改进文章、对话、创意写作
  • 代码优化:提升代码质量和效率
  • 数学推理:纠正计算和逻辑错误
  • 任务规划:优化方案和策略

实现建议

在实际项目中应用Self-Refine时,建议:

  1. 设计反馈提示:根据任务特点设计具体的反馈标准
  2. 控制迭代次数:通常1-2次迭代即可,避免过度优化
  3. 监控反馈质量:检测反馈幻觉和循环问题
  4. 结合人工审核:对关键输出进行人工验证

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Self-Refine实现示例
def self_refine(model, input_text, task_description, max_iterations=2):
# 初始生成
prompt = f"{task_description}\n输入: {input_text}\n输出:"
output = model.generate(prompt)

for iteration in range(max_iterations):
# 生成反馈
feedback_prompt = f'''
输出: {output}

请批评这个输出:
- 有什么问题?
- 如何改进?

反馈:
'''
feedback = model.generate(feedback_prompt)

# 检查是否需要继续优化
if "没有问题" in feedback or "很好" in feedback:
break

# 根据反馈进行优化
refine_prompt = f'''
原始输入: {input_text}
当前输出: {output}
反馈: {feedback}

基于以上反馈,生成改进的输出:
'''
output = model.generate(refine_prompt)

return output

相关资源

  • arXiv 论文arXiv:2303.17651
  • 官方代码:参见论文附录
  • 相关论文:Constitutional AI、Self-Consistency、Reflexion
© 2025 Generative AI Discovery All Rights Reserved.
Theme by hiero