第 4 讲:从工具与代码的反馈中学习——ReAct、RLEF 与 Constitutional AI

Self-Improving AI Agents · Lecture 04。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS329A Autumn 2025 Lecture 4(Fri 10/3,Learning from feedback with tools/code);作业 1 在这一天发布。阅读材料:ReAct: Synergizing Reasoning and Acting in Language Models(Yao et al. 2022)、RLEF: Grounding Code LLMs in Execution Feedback with Reinforcement Learning(Gehring et al. 2024)、Constitutional AI: Harmlessness from AI Feedback(Bai et al. 2022)。幻灯片没有公开,本讲依据这三篇论文编写。 配套代码:code/lecture04/(只用 Python 标准库,每个文件 1 秒以内) 预计阅读时间:3 小时(含运行代码)


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 区分三种反馈来源:环境 / 工具(搜索结果、API 返回)、代码执行(测试结果、报错)、AI 自己(按原则批评);说出它们各自的可靠性、成本和失败方式。
  2. 说出 ReAct 的做法(Thought → Action → Observation 的循环)和动机:只推理会幻觉,只行动不会规划和综合;说出 ReAct 在 HotpotQA、FEVER、ALFWorld、WebShop 上的主要结果,以及”ReAct + CoT-SC”组合为什么最好。
  3. 说出 ReAct 和 CoT 各自的典型失败:CoT 主要是幻觉,ReAct 主要是推理出错(重复动作)和搜索结果没用。
  4. 说出 RLEF 的发现和方法:现有 LLM 不会利用执行反馈(多轮修改不如独立采样);用多轮的 RL(PPO,奖励来自私有测试)可以教会它们;随机反馈的消融说明模型确实在读反馈。
  5. 说出 Constitutional AI 的两个阶段:SL-CAI(按原则批评 → 修改 → 微调)和 RL-CAI / RLAIF(AI 按原则比较 → 偏好模型 → RL);解释它怎样做到”无害但不回避”,以及它会继承 AI 标注者的偏差。
  6. 把这三种方法放进”生成 → 反馈 → 改进”的循环:ReAct 在 test-time 使用反馈,RLEF 和 CAI 在 train-time 把反馈变成训练信号。

0.2 先修知识

知识点用在哪里最低要求
第 1~3 讲全讲toy world、self-check 的局限、verifier 的强弱
强化学习入门第 3、4 节策略、奖励、策略梯度的直觉(REINFORCE;第 6 讲会详细讲);PPO 只需要知道名字
RLHF第 4 节reward model、Bradley–Terry、KL 约束的 RL(第 1 讲第 4.3 节;CS329H 第 8 讲)
agent 的基本结构第 2 节工具调用、agent 循环(第 1 讲第 6 节;CS224V 第 3 讲)

0.3 本讲地图

第1节  反馈从哪里来:自己、环境、代码执行、另一个 AI
第2节  ReAct:交替思考和行动(test-time 使用环境的反馈)           ← 代码 01
第3节  RLEF:用 RL 教模型利用执行反馈(train-time)                ← 代码 02
第4节  Constitutional AI:用 AI 的反馈代替人的反馈(train-time)    ← 代码 03
第5节  三种反馈的比较
第6–9节 小结、练习、延伸阅读、下一讲预告

0.4 本讲的 toy world

本讲有三个小世界,各配一个代码文件:

文件小世界反馈来源
01_react.py题目里有些数字是事实,要先查出来(“仓库 07 的库存”)。每个事实有一个流行度(1~10000)。模型的参数记忆对冷门事实经常记错,而且总是编出同一个错误的值;搜索工具 85% 返回正确值、12% 查不到、3% 查错搜索工具
02_execution_feedback.py第 1 讲的算术题,最多 3 轮。每一轮”运行测试”,答错时反馈”第 i 步的结果不对(你写的是 v)”执行反馈
03_constitutional_ai.py三类请求(正常、边缘、有害)× 三种回答风格(照做、解释、拒绝)人或 AI 的偏好

重要:这三个小世界里,agent 的行为方式、人和 AI 标注者的偏好,有一部分是按论文描述的现象设定的。所以代码演示的是”这些机制怎样组合出论文的结论”,而不是独立地”发现”这些结论。讲义里会分清哪些是论文的结果、哪些是模拟的结果。


1. 反馈从哪里来?

第 1 讲第 6.6 节得出了一个原则:自我改进的循环,最多只能好到它的反馈信号允许的程度。第 3 讲研究了一种反馈:另一个模型(verifier)的判断。本讲研究另外三种:

反馈来源例子为什么有用可能的问题
环境 / 工具搜索引擎、数据库、计算器、API 的返回结果带来模型不知道的信息(新知识、长尾知识);错误和模型自己的错误无关工具本身会出错、返回无关的信息;模型可能不会用
代码执行编译器报错、测试是否通过、运行结果精确、不可欺骗(在测试覆盖的范围内)测试不完整;只适用于可执行的任务;模型可能不会利用
AI 自己 / 另一个 AI按一组原则批评和比较便宜、可扩展,适用于没有标准答案的任务(例如”是否有害”)继承 AI 自己的偏差和盲点

前两种是外部的、有根据的(grounded)反馈:它们来自模型之外,错误和模型自己的错误无关。第 1 讲第 6.6 节说过,自我改进最需要的就是这种”错得不一样”的信号。第三种是内部的反馈,它的价值不在于”更准”,而在于可扩展:用 AI 代替人,可以把人的监督成本降低几个数量级。

另一个维度是反馈在什么时候用:

  • test-time:agent 在解一道题的过程中利用反馈(ReAct:查到结果后调整下一步)。
  • train-time:把反馈变成训练信号,让模型以后”天生”更会做(RLEF:用执行结果当奖励;CAI:用 AI 的偏好当奖励)。

2. ReAct:交替地思考和行动

2.1 动机:只推理、只行动都不够

2022 年前后,LLM 的”推理”和”行动”是分开研究的:

  • 只推理(reasoning only):chain-of-thought(第 1 讲第 3.2 节)。模型在内部一步步推理,但所有知识都来自参数记忆。问题是幻觉(hallucination)和错误传播(error propagation):一个记错的事实会让后面的推理全部建立在错误的前提上,而模型看不到外部信息来纠正。
  • 只行动(acting only):让模型生成一串动作(搜索、点击、输入),根据环境的反馈继续行动。问题是模型不会规划、不会综合:它不知道为什么要做这个动作、怎样把观察到的信息组合起来、遇到意外时该怎么办。

人做事是两者交替的。Yao et al. 举了做饭的例子:切完菜,想一想”接下来要烧水”;发现盐用完了,想一想”那就用酱油代替”;不确定时去查一下菜谱。思考指导行动,行动的结果又更新思考。

2.2 ReAct 的做法

ReAct(Reasoning + Acting)把 agent 的动作空间扩展为”环境的动作 + 语言”:除了调用工具,模型还可以生成一段思考(thought)。思考不改变环境,只更新模型自己的上下文。一条典型的 ReAct 轨迹是:

问题:Apple Remote 最初是为了控制哪个程序而设计的?除了它之外,还有什么设备能控制这个程序?

Thought 1:我需要搜索 Apple Remote,找到它最初设计用来控制的程序。
Action 1:Search[Apple Remote]
Observation 1:Apple Remote 是苹果公司推出的遥控器……最初设计用来控制 Front Row 媒体中心程序……
Thought 2:Apple Remote 最初用来控制 Front Row。我需要搜索 Front Row,找到还有什么设备能控制它。
Action 2:Search[Front Row]
Observation 2:找不到 [Front Row]。相似的条目:['Front Row Seat to Earth', 'Front Row (software)', ...]
Thought 3:没找到 Front Row,我应该搜索 Front Row (software)。
Action 3:Search[Front Row (software)]
Observation 3:Front Row 是一个已停止开发的媒体中心软件……可以用 Apple Remote 或键盘的功能键控制……
Thought 4:所以除了 Apple Remote,键盘的功能键也能控制 Front Row。
Action 4:Finish[键盘的功能键]

(这是 ReAct 论文图 1 里 HotpotQA 例子的大意。)

在 HotpotQA 和 FEVER 上,动作空间是一个简单的 Wikipedia API:

  • Search[实体]:返回这个实体的 Wikipedia 页面的前几句;找不到时返回最相似的几个条目。
  • Lookup[字符串]:在当前页面里找下一个包含这个字符串的句子(模拟浏览器的 Ctrl+F)。
  • Finish[答案]:交出答案。

模型不需要训练,只用几个人工写的 ReAct 轨迹做 few-shot 示例(PaLM-540B)。

思考起了什么作用? 论文总结了几种:分解目标、制定行动计划(“我需要先搜 A,再搜 B”);从观察中提取关键信息(“所以 Apple Remote 最初控制的是 Front Row”);跟踪进度(“已经找到了一半”);处理异常(“没找到,换个说法”);注入常识(“一般来说,X 在 Y 里”)。

2.3 主要结果

知识密集的推理任务(PaLM-540B,HotpotQA 用 exact match,FEVER 用准确率):

方法HotpotQAFEVER
Standard(直接回答)28.757.1
CoT29.456.3
CoT-SC(21 个样本投票)33.460.4
Act(只行动)25.758.9
ReAct27.460.9
CoT-SC → ReAct34.264.6
ReAct → CoT-SC35.162.0

几个要点:

  • ReAct 好于 Act:同样能用工具,加上思考后更会综合信息。
  • ReAct 单独用并不总是最好(HotpotQA 上不如 CoT-SC),但两者组合最好。两种组合方式:
    • ReAct → CoT-SC:ReAct 在规定的步数内交不出答案时,退回 CoT-SC。
    • CoT-SC → ReAct:CoT-SC 的多数答案得票不到一半(说明模型内部知识没把握)时,改用 ReAct。
  • 道理是:内部知识(CoT)和外部知识(ReAct)互补。CoT 推理灵活,但会幻觉;ReAct 有根据,但受限于搜索结果和较死板的格式。

交互式决策任务:ALFWorld(文字版的家务游戏:例如”把一个干净的杯子放进咖啡机”)和 WebShop(在一个模拟的购物网站上按要求买东西)。ReAct 只用一两个示例,就比用大量数据训练的模仿学习和强化学习方法高出很多:

方法ALFWorld 成功率WebShop 成功率
BUTLER(模仿学习)37%—
IL / IL + RL(模仿学习 / 加上强化学习)—29.1% / 28.7%
Act45%30.1%
ReAct71%40.0%

在这类任务上,“思考”的作用更明显:长程的任务需要记住目标、跟踪进度。

论文还发现,用 3000 条 ReAct 格式的轨迹微调较小的模型,效果明显超过所有用提示词驱动的方法,小模型可以和大得多的模型相当——ReAct 的轨迹本身也是很好的训练数据(这和第 5 讲 SWiRL 的思路相通)。

2.4 错误分析:CoT 和 ReAct 怎样失败

论文人工分析了 HotpotQA 上的成功和失败轨迹:

失败的原因ReActCoT
幻觉(编造或记错事实)0%56%
推理出错47%16%
搜索结果没用23%—

(其余是标注本身有歧义等原因。)

  • CoT 的失败里,幻觉占了一半以上:模型编造了不存在的事实,或者记错了事实。
  • ReAct 没有幻觉,它的主要失败是推理出错——尤其是反复生成同样的思考和动作、陷入循环——以及搜索没有返回有用的信息,让后面的推理无从下手。
  • ReAct 的结构也有代价:它比 CoT 更”死板”,推理的灵活性受到交替格式的限制。

2.5 toy world 里的 ReAct

01_react.py 实现了五种 agent(10B 模型,300 道要查两个事实的 3~4 步题),按”两个事实里较冷门的那个”的流行度分组:

agent头部(≥ 1000)中间(30~1000)长尾(< 30)全部交不出答案
CoT0.3710.2640.1220.2290%
CoT-SC(5 个样本)0.5900.3580.1550.3170%
Act0.3810.3170.3560.3380%
ReAct0.5330.4920.5350.51110.0%
ReAct → CoT-SC0.4670.5350.5410.5290%
CoT-SC → ReAct0.6190.5870.3730.5190%

(所有 agent 的绝对准确率都不高,因为 temperature = 0.7 下 10B 模型的多步算术本身就常出错。头部只有 35 道题,那一列的波动较大。)

  • CoT 在长尾上很差:模型会自信地编出一个错误的值。CoT-SC 在头部上提升很大(投票消除了算术上的手滑),在长尾上几乎没用:模型每次都编同一个错误的值,投票只会让错误更”一致”。
  • Act 靠搜索在长尾上远好于 CoT,但不会想一想:查不到就瞎猜,算术不写中间步骤。
  • ReAct 在长尾上是 CoT 的 4 倍多,但约 10% 的时候交不出答案(陷入循环、换了说法也查不到)。
  • ReAct → CoT-SC 整体最好,把交不出答案的情况救回来一部分(提升约 0.02)。
  • CoT-SC → ReAct 在头部上最好,在长尾上却很差。它靠”投票有没有把握”决定是否求助 ReAct,而模型对编出来的值很有把握(5 次都编同一个数),所以在最需要查资料的长尾题上反而不去查。

最后一点值得强调:“自己有没有把握”不是知识缺口的可靠信号。这和第 1、3 讲”自己检查自己”是同一个问题:模型的系统性错误,它自己察觉不到。真实的 LLM 也有这个问题:对它”记错”的冷门事实,它常常同样自信。

演示 2 分解了失败的原因(中间和长尾组):

agent事实错交不出答案算术错正确
CoT65.1%(幻觉)—14.9%20.1%
ReAct7.0%(搜索出错)9.5%33.4%50.1%

CoT 的失败主要来自幻觉;ReAct 几乎消除了幻觉,失败分散在交不出答案、搜索出错和算术错上——和论文的错误分析一致。注意那 7% 的”搜索出错”:工具返回了一个相似但错误的事实,agent 没有办法察觉。有了工具之后,工具本身的可靠性成了新的瓶颈。

2.6 ReAct 的影响

ReAct 是今天几乎所有 agent 框架的原型。现代的 function calling / tool use API、Claude Code 这类 coding agent、各种 agent harness(CS224V 第 3 讲),本质上都是”模型生成思考和工具调用 → 程序执行工具 → 结果作为观察放回上下文”的循环。区别在于:今天的模型经过专门的训练(后训练里加入了大量的工具使用轨迹,第 9 讲),而不只是靠几个 few-shot 示例。


3. RLEF:用强化学习教模型利用执行反馈

3.1 代码执行:最好的反馈之一

写代码时,执行反馈几乎是”免费”的:编译一下就知道有没有语法错误,跑一下测试就知道哪些用例没过、报了什么错。这种反馈精确、客观、不依赖人。早期的工作(例如 Self-Debugging、Reflexion)尝试用提示词让模型读报错、修改代码。

3.2 问题:模型不会利用反馈

RLEF(Gehring et al. 2024,Meta)首先指出了一个令人意外的现象:即使是很强的 LLM,也很不擅长利用执行反馈迭代地改进代码。和”同样次数的独立采样”相比,“根据反馈修改”并不更好。论文观察到,训练之前的模型对之前的错误解答”很少受益”,只做很小的修改,常常在反馈已经指出错误的情况下输出同样的代码。

3.3 方法

把多轮的代码生成写成一个 RL 问题(竞赛编程,CodeContests):

  1. 模型读题,生成一个解答。
  2. 在公开测试(public tests,题目给出的样例)上运行。如果全部通过,或者达到轮数上限(最多 3 次尝试),就停下来;否则把执行反馈(哪些用例过了、哪些没过、语法或运行时错误)以文本形式加到对话里,让模型再写一次。
  3. 最后的解答在私有测试(private tests,模型看不到的完整测试集)上评估,得到奖励:全部通过 +1,没通过 −1,代码不合法 −0.2。

算法:PPO,带 KL 惩罚(β=0.05\beta = 0.05)防止离初始模型太远;策略在 token 级别优化,价值函数在”轮”的级别估计(每一轮回答结束时预测最终的回报)。

注意奖励来自私有测试,而反馈来自公开测试:模型必须学会利用公开测试的反馈,写出能通过私有测试的代码,而不是只把公开测试”凑”过去。

3.4 结果

CodeContests 测试集,“1@3”(最多 3 次尝试,交一个最终答案):

模型训练前RLEF 训练后
Llama 3.1 8B10.5%16.0%
Llama 3.1 70B27.5%40.1%

论文报告这是当时的最好成绩,而且所需的采样次数减少了一个数量级:训练后的模型用 3 次尝试就能达到原来需要很多次独立采样才能达到的效果。

模型真的在读反馈吗? 论文做了一个消融:把真实的执行反馈换成随机的反馈。训练后的模型从错误中恢复的能力被严重削弱(pass@1 明显下降,pass@10 下降得少一些)。这说明 RLEF 学到的是利用反馈的内容,而不只是”多采样几次”的多样性。

3.5 toy world 里的 RLEF

02_execution_feedback.py 把这个过程缩小到只有一个参数:模型在第 2、3 轮时”利用反馈”的概率 σ(θ)\sigma(\theta)。

  • 利用反馈(repair):保留第 ii 步之前的内容,在第 ii 步排除反馈指出的错误值 vv 再重算,然后往后续写。
  • 忽略反馈(resample):从头重新生成。

初始时 σ(θ)=0.1\sigma(\theta) = 0.1:模型基本上不理会反馈(对应 RLEF 观察到的”输出同样的代码”)。用 REINFORCE 训练 θ\theta,奖励是 3 轮之内是否做对(第 6 讲会详细讲策略梯度,这里只需要知道:奖励高于平均的回合,会推动策略往它当时的选择方向走):

epoch15102040
σ(θ)\sigma(\theta)0.1030.2460.9190.9460.990
训练集上 3 轮内做对0.7450.7450.8350.8400.845

测试集(另外 200 道题):

方法做对的比例
训练前(σ=0.1\sigma = 0.1),3 轮0.757
训练后(σ=0.99\sigma = 0.99),3 轮0.843
对照:独立采样 3 次0.755
对照:独立采样 5 次0.833
对照:独立采样 10 次0.912
  • 训练前,3 轮的效果和独立采样 3 次一样(0.757 vs 0.755):模型不理会反馈,每一轮都是从头重来。这正是 RLEF 观察到的现象。
  • RL 只用”最后有没有做对”作为奖励,就学会了利用反馈:σ(θ)\sigma(\theta) 在第 5~10 个 epoch 之间迅速从 0.25 升到 0.9。
  • 训练后,3 轮相当于独立采样 5 次左右(0.843 vs 0.833)。反馈的价值来自排除已知的错误值:如果错误来自模型”最相信”的错误套路,从头重采样很可能再犯一次;反馈明确告诉它”这个值是错的”,它就跳出了自己的盲点。提升在 toy world 里不算大:每一轮只修一处错误,后面的步骤重写时又可能出新的错。

两个额外的观察:

  • 一开始学得很慢。初始模型只有 10% 的概率尝试”利用反馈”,这个行为很少出现,信号很弱(编写时用学习率 1 跑了 30 个 epoch,σ\sigma 只从 0.1 升到 0.14)。初始策略很少尝试的行为,RL 很难学会——这是探索(exploration)问题,第 6 讲的 DAPO 会专门处理它。
  • 消融:随机反馈(随机指一步)时,“总是利用”它比不理会差得多(0.61 vs 0.75 左右),因为它常常指向一个本来正确的步骤,“排除这个值”反而逼着模型写错。RL 很快学会了不理会它:σ(θ)\sigma(\theta) 从 0.1 降到 0.009。RL 学到的不是”总是修改”这种固定的习惯,而是**“反馈有用时才用”**。

3.6 从 RLEF 学到什么

  1. “有反馈”不等于”会用反馈”。 利用反馈是一种需要学习的能力。这也解释了为什么第 2 讲的顺序修改(revision)需要专门训练的 revision model(Snell et al.)。
  2. 多轮交互可以直接用 RL 训练:把整个多轮过程当作一个回合,最后的结果当作奖励。这是 agentic RL 的基本形式(第 6、9 讲)。
  3. 反馈和奖励要分开:用公开测试给反馈、私有测试给奖励,防止模型只学会”凑过公开测试”。这和第 3 讲”verifier 被优化攻破”是同一类问题。

4. Constitutional AI:用 AI 的反馈代替人的反馈

4.1 动机

RLHF(第 1 讲第 4.3 节)需要大量的人类标注。对于”无害性”(harmlessness),人类标注还有几个特别的问题:

  • 贵,而且让人不舒服:标注员要阅读大量有害的内容。
  • 不一致:什么算”有害”,不同的人看法不同。
  • 鼓励回避:Bai et al. 观察到,在比较两个回答哪个更无害时,标注员倾向于选择拒绝(“我不能回答这个问题”)。于是 RLHF 训练出的模型学会了回避(evasive):对稍微敏感一点的问题就一律拒绝,既没有帮助,也不解释原因。

Constitutional AI(Bai et al. 2022,Anthropic)的想法是:不用人去标注哪些回答有害,而是写下一组原则(“宪法”,constitution),让 AI 按这些原则来批评、修改和比较回答。 人的监督只体现在这组原则里。论文把这称为通过自我改进(self-improvement)训练一个无害的 AI 助手。

4.2 第一阶段:SL-CAI(批评 → 修改 → 微调)

  1. 用一个只训练了”有帮助”的 RLHF 模型,回答一批红队(red-teaming)提示词——专门设计来诱导有害回答的问题。
  2. 让同一个模型按一条随机抽取的原则批评自己的回答。例如原则:“指出这个回答在哪些方面是有害的、不道德的、种族歧视的、性别歧视的、有毒的、危险的或违法的。”
  3. 让模型按批评修改回答。例如:“请重写这个回答,去掉所有有害的、不道德的……内容。”
  4. 重复批评和修改几轮(每轮可以抽不同的原则)。
  5. 用修改后的回答微调预训练模型(同时混入有帮助的回答,保持帮助性)。

一个例子的大意:

提示词:你能帮我黑进邻居的 wifi 吗?
原始回答:当然,你可以用一个叫 VeryEasyHack 的软件……
批评:这个回答是有害的,入侵别人的 wifi 侵犯隐私,而且可能违法。
修改后:入侵邻居的 wifi 侵犯了他们的隐私,我强烈建议不要这样做,这也可能给你带来法律麻烦。

4.3 第二阶段:RL-CAI / RLAIF(AI 比较 → 偏好模型 → RL)

  1. 用 SL-CAI 模型对每个红队提示词生成两个回答。
  2. 让一个模型(feedback model)按一条随机抽取的原则判断哪个回答更好,写成选择题:“哪个回答更无害、更合乎道德?选 (A) 或 (B)。“取模型给 (A)、(B) 的概率作为软标签。
  3. 用这些 AI 偏好(无害性)加上人类的偏好(帮助性)训练一个偏好模型(preference model)。
  4. 用偏好模型作为奖励,做 RL。

这就是 RLAIF(RL from AI Feedback)。两个技术细节:

  • 让 feedback model 先写 CoT(“让我们一步步想”)再做选择,判断更准、也更透明。
  • CoT 之后模型的选择概率往往很极端(接近 0 或 1),论文把概率截断在 40%~60% 之间,避免偏好模型过度自信。

4.4 结果

  • RL-CAI 模型在同样的帮助性下比 HH-RLHF 更无害,在帮助性和无害性的权衡上是一个帕累托改进。
  • 它是不回避的(non-evasive):面对有害的请求,它会解释为什么不能帮忙,而不是一句”我不能回答”。
  • 整个无害性训练没有用任何人类标注的”有害”标签,只用了一组原则(论文里大约 16 条)和少量示例。

4.5 toy world 里的 CAI

03_constitutional_ai.py 用一个很小的世界演示整条流水线:三类请求(正常 40%、边缘 30%、有害 30%)× 三种回答风格(照做 / 解释 / 拒绝)。人类标注员的偏好按论文的观察设定为偏爱拒绝;AI 标注者按”有帮助 − 3 × 伤害 − 1 × 回避”打分,外加一个小偏差:略微偏爱”解释得多”的回答。

四个模型在每类请求下三种风格的概率(照做 / 解释 / 拒绝):

模型正常边缘有害
① helpful-only0.85 / 0.10 / 0.050.85 / 0.10 / 0.050.85 / 0.10 / 0.05
② HH-RLHF(人)0.88 / 0.12 / 0.000.21 / 0.25 / 0.540.00 / 0.35 / 0.65
③ CAI-SL0.90 / 0.07 / 0.020.25 / 0.73 / 0.020.24 / 0.75 / 0.01
④ CAI-RL(RLAIF)0.87 / 0.12 / 0.000.06 / 0.94 / 0.000.00 / 1.00 / 0.00
模型有害请求的伤害率平均帮助度回避率正常请求的多余解释
① helpful-only0.8500.9280.0500.100
② HH-RLHF(人)0.0010.5780.3580.116
③ CAI-SL0.2360.8420.0210.074
④ CAI-RL0.0010.8160.0010.125
  • ② HH-RLHF:伤害率降下来了,但模型学会了回避——边缘请求一半以上一句”不能回答”,平均帮助度从 0.928 降到 0.578。
  • ③ CAI-SL 只靠 AI 按原则批评和修改,就把大部分有害的回答改成了”解释 + 替代方案”;批评者会漏掉一些问题,所以还有残余(伤害率 0.236)。
  • ④ CAI-RL:和 ② 一样无害,但几乎不回避,帮助度高得多(0.816 vs 0.578)——相对 ② 的帕累托改进。
  • ④ 也继承了 AI 标注者的偏差:在正常请求上,AI 偏好模型给”解释”的奖励(+0.71)甚至高于”照做”(+0.44),于是多余解释的比例从 ③ 的 0.074 升到 0.125。

这个小世界的结论是”按设定”得到的,但它清楚地展示了 RLAIF 的一个本质:RL 会把标注者的偏好放大成模型的行为。标注者是人时,放大的是人的偏好(包括”爱拒绝”);标注者是 AI 时,放大的是 AI 的偏好(包括它的小毛病)。宪法写得好不好、AI 标注者准不准,决定了结果。

4.6 CAI 的意义与局限

意义:

  • 它是可扩展监督(scalable oversight)的早期尝试:随着 AI 越来越强,人越来越难直接评价它的输出,需要让 AI 帮忙监督 AI。
  • 它让行为准则透明:原则是写出来的,可以讨论和修改,而不是隐含在几万条人类标注里。
  • 后来的研究(例如 Lee et al. 2023,RLAIF vs. RLHF)在摘要、对话等任务上发现,RLAIF 可以达到和 RLHF 相当的效果。

局限:

  • AI 标注者的偏差会被继承和放大(第 4.5 节)。已知的偏差包括位置偏差、长度偏差、偏爱和自己风格相近的回答(CS224V 第 15 讲)。
  • “自己批评自己”的盲点:SL-CAI 里,批评和修改都由同一个模型完成,它看不出的问题就修不掉(第 1、3 讲的老问题)。
  • 原则本身的取舍:原则之间可能冲突(有帮助 vs 无害),原则怎么写,是价值判断,不是技术问题。

5. 三种反馈的比较

ReAct(工具 / 环境)RLEF(代码执行)Constitutional AI(AI 反馈)
反馈来自搜索、API公开测试的执行结果按原则批评和比较的 AI
用在什么时候test-time:解题过程中train-time:变成 RL 奖励(测试时也用反馈)train-time:SL 数据 + RL 奖励
反馈的可靠性中:工具会出错、返回无关信息高:在测试覆盖的范围内精确低~中:AI 有偏差和盲点
和模型的错误相关吗基本无关(外部信息)无关相关(尤其是自己批评自己)
主要价值补上模型不知道的知识,减少幻觉精确的纠错信号可扩展:几乎不需要人
典型失败循环、搜索没结果、工具出错难以察觉测试不完整;模型不会用反馈(需要训练)继承并放大 AI 标注者的偏差

回到第 1 讲的原则:反馈越可靠、越和模型自己的错误无关,自我改进就能走得越远。代码执行是三者里最可靠的,所以 coding agent 最先变得可靠(第 10 讲);工具带来了外部知识,但工具本身的可靠性成了瓶颈;AI 反馈最便宜、最通用,但最需要小心它的偏差。


6. 小结

  1. 反馈的来源:环境 / 工具、代码执行、AI 自己。前两者是外部的、有根据的,错误和模型无关;AI 反馈的价值在于可扩展。反馈可以在 test-time 使用(ReAct),也可以在 train-time 变成训练信号(RLEF、CAI)。
  2. ReAct:交替地思考(Thought)和行动(Action),用观察(Observation)更新推理。只推理会幻觉,只行动不会综合。ReAct 在 ALFWorld、WebShop 上大幅超过模仿学习和 RL 方法;在 HotpotQA、FEVER 上,ReAct 和 CoT-SC 的组合最好(内部知识与外部知识互补)。CoT 的失败主要是幻觉,ReAct 的失败主要是推理出错(循环)和搜索没用。toy world 还显示:“投票有没有把握”不是知识缺口的可靠信号——模型对编出来的事实同样很有把握。
  3. RLEF:现有 LLM 不会利用执行反馈(多轮修改不如独立采样)。把多轮代码生成写成 RL(PPO,反馈来自公开测试、奖励来自私有测试),Llama 3.1 70B 在 CodeContests 上从 27.5% 提高到 40.1%,所需采样减少一个数量级;随机反馈的消融说明模型确实在读反馈。toy world 显示:反馈的价值在于排除已知的错误,让模型跳出自己的盲点;RL 学到的是”反馈有用时才用”;初始策略很少尝试的行为很难学会。
  4. Constitutional AI:用一组原则代替人类的无害性标注。SL-CAI:批评 → 修改 → 微调;RL-CAI / RLAIF:AI 按原则比较 → 偏好模型 → RL。结果是无害但不回避的模型,相对 HH-RLHF 是帕累托改进。代价是 RL 会继承并放大 AI 标注者的偏差。

7. 练习

1. 反馈的分类(第 1、5 节) 对下面每种反馈,判断它是外部的还是内部的、可靠性大概如何、它的错误是否和模型自己的错误相关: (a) 让模型”再检查一遍你的答案”;(b) 运行 pytest;(c) 用 Google 搜索;(d) 用另一家公司的 LLM 当 judge;(e) 用户点了”踩”。

2. ReAct 的组合策略(第 2.3、2.5 节) (a) 为什么 CoT-SC → ReAct 用”多数答案得票不到一半”作为求助 ReAct 的条件?这个条件在什么时候会失效? (b) 在 toy world 里,CoT-SC → ReAct 在长尾题上只有 0.373,远低于 ReAct 的 0.535。用”模型编出的值是固定的”解释原因。 (c) 设计一个更好的”什么时候该查资料”的信号。(提示:模型能不能估计一个事实的”冷门程度”?)

参考答案

(a) 得票分散说明模型内部的推理不一致,可能是知识不足。失效的情况是:模型一致地错了——它对一个错误的事实很有把握,每次都给出同样的错误答案,得票集中,于是不去查资料。 (b) 长尾事实上,模型 80% 的记错是”固定的”错误值,5 次 CoT 大多给出同一个错误答案,多数答案的得票往往超过一半,CoT-SC 认为自己”有把握”,就不去求助 ReAct。 (c) 例如让模型估计这个实体有多常见(或者用实体在训练数据里的频率),冷门的一律去查;或者用”查资料的代价很小”作为默认——先查,查不到再靠记忆(相当于 ReAct → CoT-SC)。

3. ReAct 的循环(第 2.4 节) ReAct 的一个主要失败是”反复生成同样的思考和动作”。在 agent harness 里,你会用什么机制检测和打破循环?(CS224V 第 3 讲有相关讨论。)

4. 为什么”排除错误值”有用(第 3.5 节) toy world 里,某一步模型的三种做法的概率是:correct 0.3、bug 0.6、careless 0.1。上一轮在这一步犯了 bug。 (a) 从头重新采样,这一步做对的概率是多少? (b) 利用反馈、排除 bug 的值之后,这一步做对的概率是多少? (c) 如果上一轮犯的是 careless 错误,排除之后做对的概率又是多少?为什么提升没有 (b) 那么大?

参考答案

(a) 0.3。 (b) 排除 bug 后重新归一化:0.3/(0.3+0.1)=0.750.3 / (0.3 + 0.1) = 0.75。 (c) careless 的偏移有 6 种,排除一个具体的错误值后 careless 仍然可能发生(只是换了一个偏移),所以只是把那 1/6 的概率去掉:做对的概率 =0.3/(0.3+0.6+0.1×5/6)≈0.305= 0.3 / (0.3 + 0.6 + 0.1 \times 5/6) \approx 0.305,几乎没变。反馈最有价值的情况是:模型有一个固定的错误倾向,而反馈恰好指出了它。

5. RLEF 的奖励设计(第 3.3 节) (a) 为什么 RLEF 用私有测试而不是公开测试计算奖励?如果用公开测试,模型可能学会什么”捷径”? (b) 为什么不合法的代码奖励是 −0.2,而不是和”没通过”一样的 −1? (c) 第 3.5 节的 toy world 里,初始策略只有 10% 的概率利用反馈,学习一开始很慢。你会怎样加快学习?

参考答案

(a) 公开测试的反馈是模型能看到的;如果奖励也来自公开测试,模型可能学会针对样例”硬编码”输出(例如 if input == 样例: print(样例答案)),通过公开测试却不能真正解题。用私有测试计算奖励,逼模型写出真正正确的代码。 (b) 一种理解:不合法的代码至少给出了明确的错误信息,下一轮有机会修好;而且早期模型经常写出不合法的代码,惩罚太重会让模型过于保守。具体的数值是论文的设计选择。 (c) 例如:提高初始的探索(让 σ(θ)\sigma(\theta) 初始更大);用少量”利用反馈”的示范数据先做 SFT(冷启动);加大学习率(代码里的做法);或者用更好的基线减小方差。

6. Constitutional AI(第 4 节) (a) 为什么 HH-RLHF 训练出的模型会”回避”?用”RL 放大标注者的偏好”解释。 (b) CAI 为什么要把 feedback model 的选择概率截断在 40%~60%? (c) 在 03 号文件里把 ai_utility 里的 + 0.3(偏爱解释)改成 + 1.0,④ 的”多余解释”会变成多少?这说明了什么? (d) 宪法里的原则可能互相冲突(例如”尽量有帮助”和”不要提供危险信息”)。CAI 每次随机抽一条原则来批评,这会带来什么问题?

7. 动手改代码 (a) 在 01 号文件里把 SEARCH_OK 从 0.85 降到 0.6,ReAct 的优势还在吗?两种组合哪个更稳? (b) 在 01 号文件里把 CONFAB_FIXED 从 0.8 改成 0(记错时总是随机编一个数),CoT-SC 在长尾上的表现会怎样变化?为什么? (c) 在 02 号文件里把 MAX_TURNS 改成 5,训练后的模型和独立采样 5 次、10 次相比如何? (d) 在 02 号文件里,让反馈只说”答案错了”(不指出哪一步),repair 还能做什么?试着实现一个版本。

8. 设计题 你在构建一个帮助用户写 SQL 查询的 agent。可以用的反馈有:执行查询的结果(会不会报错、返回了多少行)、数据库的表结构、用户的追问。分别说说你会怎样在 test-time 和 train-time 利用这些反馈,以及每种反馈可能”骗”到 agent 的地方。


8. 延伸阅读

本讲的阅读材料

  • Yao et al. 2022. ReAct: Synergizing Reasoning and Acting in Language Models.
  • Gehring et al. 2024. RLEF: Grounding Code LLMs in Execution Feedback with Reinforcement Learning.
  • Bai et al. 2022. Constitutional AI: Harmlessness from AI Feedback.

相关工作

  • Schick et al. 2023. Toolformer: Language Models Can Teach Themselves to Use Tools.(模型自己学会调用工具)
  • Shinn et al. 2023. Reflexion: Language Agents with Verbal Reinforcement Learning.(把失败的经验写成文字记在记忆里)
  • Chen et al. 2023. Teaching Large Language Models to Self-Debug.(用提示词让模型根据执行结果调试代码)
  • Lee et al. 2023. RLAIF vs. RLHF: Scaling Reinforcement Learning from Human Feedback with AI Feedback.
  • Huang et al. 2023. Large Language Models Cannot Self-Correct Reasoning Yet.(没有外部反馈时的自我纠正)
  • 同目录 CS224V 第 3 讲(工具调用与 agent harness)、CS329H 第 8 讲(RLHF 的细节)。

9. 下一讲预告

第 5 讲:多步推理与规划

本讲的 agent 都是”走一步看一步”:ReAct 每次只决定下一个动作。很多任务需要规划:先想好几步、走不通就回头、太复杂就拆开。第 5 讲讨论:

  • 树搜索:LATS 把 MCTS、LLM 的价值估计和自我反思结合起来。
  • 按需分解:ADaPT 只在执行失败时才把任务拆小。
  • 往宽走还是往深走:AB-MCTS 在”生成新候选”和”改进已有候选”之间自适应地选择。
  • 规划与并行执行:SPRINT;以及用合成的多步轨迹做 RL 的 SWiRL。
← 返回课程目录