Learning from Feedback with Tools/Code
让模型碰到真实环境:工具、代码执行、以及用章程做自我批判。三篇论文的差别不在「要不要反馈」,而在反馈从哪来。
这是什么
CS329A Self-Improving AI Agents 第四讲(约 71 分钟,duration_s: 4273)。前两讲是 test-time compute 与 robust verification;本讲把「验证信号」从模型内部换成环境交互。三篇:
- ReAct:用 prompting 把 verbal reasoning 和 tool action 交错起来。
- RLEF(grounding code LLMs in execution feedback):用跑测试的执行反馈做代码 RL。
- Constitutional AI(Anthropic):人只写原则(Constitution),模型自评、修订,再 SFT + RL。
主线:三种都是自改进,但监督分别来自环境观察、编译器/测试、原则文本。没有环境信号时只能 LLM-as-judge,又滑回 verifier 问题。见 raw/collections/cs329a/04-learning-from-feedback-with-toolscode.md。
核心要点
- 纯聊天不够。真实任务要 act:调 API、跑代码、点浏览器,并从交互里学。0:17
- ReAct 的 Thought 是中间抽象(不改环境),Action 碰环境,Observation 回来再想。只行动不如有推理;但它并不总赢过纯 CoT——FEVER 上赢,HotpotQA 上不总赢;和 CoT self-consistency 互相 fallback 才稳定超过。11:33 18:46
- 多步决策会 error cascade。WebShop 上 ReAct 66.6 vs 人类专家 82.1;中间步对了也不等于任务成功。21:51
- 合法动作要当成 分类:给出 valid action subset,而不是让模型自由发明字符串。Google 机器人合作里也是这套。8:01
- RLEF:写代码 → 跑公开测试 → 把失败栈喂回去再试,直到过或耗尽回合;私有测试才给 PPO 奖励。这就是 coding agent 的内环。29:43
- 只把「错误解 + 执行反馈」塞给 base model 不够;要在 CodeContests 上按回合训练看反馈,才会修错、并泛化到其他代码基准。Llama 3.1 上,solve rate 随采样预算(log 横轴)上升。36:20
- SFT 吃域内轨迹;RL 对稍新的题更有泛化。课上明确说这点仍有争论。41:32
- Constitutional AI:16 条人写原则 → critique → revision → SFT,再拿 AI 反馈训 preference model 做 RL。单独加修订轮次:无害性升、有用性降;Constitutional RL + CoT 才走到 helpfulness–harmlessness 的最佳 Pareto。51:10 59:02
- 自我纠正不只是安全对齐。Self-Refine、RLAIF vs RLHF、用 RL 教 self-correct 都在同一条线上;模型自评常过自信,多模型共识有时更稳。59:52
- 把 ReAct 推广成 agent,等于手写 workflow。会计 / 金融 / 法律这类任务的步骤空间仍高度 domain-specific,跨域泛化很难。搜索空间定义得清(游戏)才能全自动搜;开放环境必须先收集观察。1:07:12 1:08:15
机制 / 论证
为什么纯推理不够
CoT 给中间步骤,但步骤来自模型内部状态,没有外部反馈。4:11
另一路是 WebGPT 一类:在浏览器轨迹上微调,学的是怎么点工具,奖励是人类偏好;有行动、缺推理。4:22
ReAct 要拼的就是这两路:既要 think step by step,又要把 action 接到真实观察上。否则问「今天气温多少」,Gemini / ChatGPT / Claude 都只能靠过期内部知识胡编,除非真的发出 search call。3:20
ReAct:语言空间里的 agent 环
实现极简,frozen PaLM + few-shot(thought / action / observation 范例),不训策略网络。9:11
- 左环:在语言里生成 Thought,不改变环境。
- 右环:基于 Thought 选 Action,拿 Observation。
- 交错顺序是 thought₁ → act₁ → thought₂ → act₂,不是先想完再连着 act。像口渴走进厨房发现没水,再决定去超市;并行采样可以做,但必须显式设计。14:07
知识密集任务的动作空间很窄,在模拟「人查 Wikipedia」:search 页面、lookup 字符串、finish。评测用 HotpotQA(Wikipedia 多跳问答)和 FEVER(事实核查)。决策任务用 WebShop(按用户指令买东西,例如带抽屉的床头柜)。5:32 17:19 20:27
可解释性是附带收益:逐步 thought+action 让人能追责、敢信。5:58
例子:Apple Remote(HotpotQA)
题:除了 Apple Remote,还有什么设备能控制它原先设计去控制的那个程序?9:33
| 方法 | 发生了什么 |
|---|---|
| 标准 prompting | 直接错 |
| CoT | 有中间步,答案仍不完全对 |
| 只行动 | 搜 Apple Remote → 观察里出现 Front Row → 再搜,落到「已停产」,给不出好答案 |
| ReAct | 先想「要搜 Apple Remote、找它原先控制的程序」→ 得到 2005 年发布、控制 Front Row media center → 搜 Front Row 失败 → 改搜 Front Row software → 确认是已停产的媒体中心软件 → 再推理出答案 |
课上的结论:推理是一层抽象,让下一次检索比「盲搜」准;交错 thought / action / observation 比两者孤立更好。11:33
今天 Qwen 一类打开 thinking mode,这套已经内化:模型在这些轨迹上蒸馏过,tool call 不再是外挂 prompting。11:48
模型知不知道自己不知道
学生问:1+1 不该搜,Front Row 的 Wikipedia 可能已经在预训练里,模型怎么决定搜不搜?12:19
讲者:这事有两派。一派说模型很清楚自己会什么;另一派(讲者偏向)说让模型给输出打自信分,它们通常 overconfident、校准差。做应用时不要赌元认知,而要迫使它调用能落地的工具。13:13
搜索结果互相打架时,用第二讲的 majority vote / 先校验再交给用户;有检索的幻觉,比纯靠内部状态好控。15:15
Thought 不算进 action space。语言模型吃的是语言,推理 token 是为了把 action 选对的抽象;若有中间向量表示,这层也许不必要。16:47
KV-cache 里 thought(模型自己生成)和 observation(环境写入)是否有交错模式:课上丢给学生当课题。15:47
知识密集任务:ReAct 不总赢 CoT
基线:标准 prompting、CoT、CoT-SC(self-consistency = majority vote,课上说这两个词是同一件事)、Act(不思考只行动)。还有两种杂交:18:11
- ReAct 走若干步仍失败 → fallback 到 CoT-SC
- CoT-SC 的多数答案不到一半票 → backoff 到 ReAct
结果(课上没念表里的精确分,只给方向):
- ReAct 普遍好于 action-only
- 并不总好于 CoT:FEVER 上赢,HotpotQA 上不总赢
- 和 CoT-SC 按上面两种方式结合,才超过标准技术
论证:要把模型内部知识与外部检索拼好,推理用来决定「该检索哪条准确信息」。18:46
失败模式对照:CoT 的主因是幻觉;ReAct 有外部知识库,检索成功时更可信。能微调时 ReAct 优势更明确;再加 outer loop 更好——指向后续规划/RL 讲。19:50
决策任务:分高了,成功率仍被级联拖死
WebShop 对照 imitation learning(纯微调)和 IL+RL(SFT+RL)。有推理抽象的 ReAct,中间步分数和最终成功率都更高。20:56
但离人类还远:ReAct 66.6 vs 人类专家 82.1。成功率更痛:多步里任一步错,后面全塌(error cascade)。21:51
代价:动作空间很大时,演示塞不进上下文;多步推理推高 inference cost。换来的是问答 / 事实验证 / 决策更好、幻觉更少、轨迹更好读。22:10
课堂讨论:噪声环境和别的认知机制
环境反馈又吵又错时:加 reflection 审观察、backtrack(否则进重复环)、多次检索、多样本置信。23:27
ReAct 不是唯一认知机制:任务分解、并行多思路、memory / 过往经验、按任务学 reasoning:action 比例(今日模型常 overthink,简单题也拉很长 thinking trace)、compound system(按子任务 benchmark 不同模型再委派)。24:54
RLEF:执行反馈做成 RL 内环
对象是 coding agent。课上问有多少人用 Claude Code(字幕作 Cloud Code),几乎过半。28:02
框架:动作 = 生成的代码;观察 = 测试执行结果;奖励 = 测试过/不过的 binary reward;算法 PPO。两处设计:28:37
- two-tier test:公开测试给推理时迭代,私有测试给训练奖励
- hybrid token-turn policy:策略按 token 吐代码,value 按 turn 估整段回复
循环(训练时 + 推理时都跑执行):自然语言题面 → 生成代码 → 公开测试。失败就把 execution feedback 追加回去再试,直到通过或到达回合上限。通过的候选再送私有测试打奖励,进入 PPO。左相是当前策略的推理时 exploitation,右相按执行结果更新策略。29:43 30:22
回文子串例子:第一回合基本实现,公开测试 execution timeout(课上说这很常见)→ 反馈后写出优化版,公开测试过 → 再交私有测试。30:48
公开测试是小子集,快迭代、给过程指导;私有测试在生成中完全隐藏,避免背测试输出。以 CodeContests 为例,外环自己切:一部分给推理时反馈,一部分当训练信号。失败不是模型自评,是真跑 Python 测试,把 stdout/失败信息拼回 prompt。作业会在数学上练「找出生成解的错误」,不是跑代码。31:43 33:25 34:50
Hybrid 的细节:策略逐 token 吐代码;value 在 turn 级、用 prompt 最后一个 token,整段共享一个 advantage。课上拿它去对 GSPO(序列级奖励,不是每 token 一份)。32:24
为什么执行反馈有用(以及 base 为什么不够)
图:纵轴 solve rate,横轴采样预算(log scale),验证集和测试集都画。结果偏旧,底座 Llama 3.1,CodeContests 上 RLEF 后 solve rate 明显升。「solve rate 10 at k」课上解释为生成 10 个解再看过多少——表述不完整,数字表未口述。35:22
关键因果不是「看见错误解」本身。base 模型通常 不会 只靠错误解 + 执行反馈变强;真正有用的是在 CodeContests 上每个 turn 都训练「看见这类反馈之后怎么改」,修错能力才泛化到其他代码基准。按 turn 1/2/3 的错误数、改动数、错误类型拆:有 RLEF 时后续回合 wrong output 变少、开始 targeted repair;没有迭代环,编辑就不准。同时吃到多样本 diversity 和对着错误位置改。36:20 37:06
执行反馈只标「哪一段报错」,不含修复建议。这些竞赛题仍简单,课上估不超过约 100 行。学生认为难题上 binary reward 不够,需要 error trace / 元数据才能高效 debug——讲者同意,可当课题。37:44
另一个担心:最终奖励是对/错,会不会怂恿「修修补补凑过」而不是一次写对?简单题也许一轮就过;复杂题确实可能多回合。推理时已先让公开测试过再进 PPO,等于给过几次自纠机会,回合数可以加。更底层是 PRM vs ORM(逐步反馈 vs 只要最终对)——第三讲开过,按域/基准还没有统一答案。38:45 40:28
SFT 吃推理轨迹也能涨;RL 更能解 稍新 的题。课上说仍在争论,SFT 仍是同一套似然。41:10 Two-tier 的 ablation 课上没展开。学生问:测试都不是训练题,为何不全部公开?讲者的理由是外环若在「自己当反馈用的测试」上训会泄漏;具体数字留给论文。41:48 另一条 ablation:RLEF wrong output 更少,timeout 更多——错误被修掉了,但没修对的解会把测试跑到超时。竞赛编程是已验证的坑,且对其他代码基准有泛化。43:12 43:30
代码库塞不进上下文窗口
讨论题:整库放不进 context 怎么办?学生方案:像 ReAct 一样先搜再决定信息够不够;对模块做摘要;图正则化代码库 + 相似度检索,不够再迭代。44:15
讲者:这就是 Claude Code 在跑的事——先搜相关再打补丁。对口基准是 SWE-bench。搜 / 摘要 / 表示是第一步,然后才是「补丁过不过测试」。Azalia 组的 Code Monks 论文也打类似问题(字幕名,见「不确定」)。45:42
Constitutional AI:人写原则,模型自己骂自己
目标从「代码对错」换成 chatbot 的 helpful 且 harmless。46:37
经典路:人看两个输出,按正确 / 有用 / 够不够具体排序 → 训 reward model → hillclimb。模型变大时,RLHF 比纯 SFT 更明显。瓶颈是规模:成千上万条人类标注又慢又贵。46:50
Anthropic 的替换:人只写 Constitution(本讲说 16 条原则),描述想要的行为。之后人不必再进环。前提是模型已经会听指令:能按格式写、能较诚实地回答「这段有没有某种行为」。47:53
- SFT:红队 prompt → 模型输出 → critique request → revision request → 用修订轨迹微调
- RL:用第一阶段回复 + Constitution 训 preference model,再让 LLM 最大化它(课上形容目标:thoughtful / respectful / cordial)
Critique / revision 例子:有害或不伦理 → 删掉;性别偏见 → 去掉痕迹;不适合儿童 → 重写成合适的。要的能力有两块:先识别行为,再服从「按这种方式重写」。49:50
有用 vs 无害:此消彼长,Pareto 才是成果
SFT 只加修订轮次:harmlessness 升,helpfulness 降;两者加总仍单调升。把模型按死一套原则就会变得不那么有用——论文的 claim 是合在一起仍更好。RL 阶段用这份 AI 反馈的 preference model 替换人类 RLHF。51:10 51:38
图:横轴训练序列数;Helpfulness Elo / Harmlessness Elo 都是「人更喜欢」。对照 helpful-only RLHF、helpful+harmless 人类 RLHF、CAI、CAI+CoT。方向:按原则自评后有用性大致持平或略降,无害性高很多——Claude 一类当时极强的点,后来扩散到各家。53:39
学生指出 CAI + CoT 的 helpfulness Elo 更低。讲者把它连回上一张图:无害性上去时,有用性往往被伤,要找平衡,而不是「CoT 本身有害」。55:06
Pareto 图(harmlessness Elo vs helpfulness Elo):58:26
| 方法 | 位置 |
|---|---|
| pretrained base | 两轴都不高 |
| helpful-only RLHF | 把前沿推向有用 |
| 再压无害(图中橙色) | 有用继续、无害下来 |
| Constitutional SL | 仍差于 RLHF |
| Constitutional RL + CoT | helpfulness–harmlessness 最佳 Pareto 前沿 |
SFT 阶段没有逐步标量反馈:模型自评自改,人把修订轨迹的似然调高。只要这轮微调远小于预训练,原能力不会掉光,输出分布会偏向这套回复。56:03
Preference model 仍要少量人类一致性检查(验证集),不是 10,000 条那种规模,而是看组合原则打的分是否跟人一致。57:28
章程要改怎么办?Post-training 通常是最后一阶段、大约 5% 算力、更新较勤,所以可以周期性重跑。真正的 continual learning / 让模型忘掉旧规则,仍是开放问题;可解释性「消去某知识」没有被证明。52:26
推广:任何「要跟一组可能互相冲突的指令」的场景都可以用原则表。后续工作包括 RLAIF vs RLHF、Self-Refine(自反馈迭代修订)、用 RL 教 self-correct。自评往往难,因为模型过自信;让别的模型来 critique、再取共识,有时更稳。这条线已经超出 harmlessness,进入一般能力。59:38
收束:语言空间的工作流,还不是自动搜索
三篇合在一起:ReAct 是 reasoning+acting 的积木(今日许多模型的 tool calling 已 innate);代码域最好的执行反馈是单元测试;CAI 用规则是否被遵守来转自改进环。反馈环有足够信号,模型就能超出原训练数据。1:00:23 1:02:24
闭课问答把边界划清:1:03:30
- 现在借用人类解题的说法(分解、回退、并行),是因为任务的搜索空间常常 没有形式化。游戏这类动作有限的域可以自动探索;开放环境必须先收集观察。闭源推理模型已经不完全把 reasoning space 说成可读文字。
- LLM 技巧能不能搬到 agent:后续讲会展开。本讲的循环还没有 session、没有 memory;agent 的一块地基仍是「LLM 如何按某种方式响应」。
- RL post-training 会不会让手写 ReAct 过时?又会又不会。搜索空间定义得清,就可以不再手写;会计 / 金融 / 法律 agent 的步骤仍是领域知识。ReAct 的贡献是规定「想→做→想→做」这条 workflow;推广成 agent 就是给用户任务写 workflow,跨域难。1:07:12
- 形式化:上下文 (C_t) 就是 RL 的 state(prompt 里有什么)。策略每步二选一:输出一段 reasoning trace,或输出一个环境 action。1:08:34
- 无害性不能只靠解码限制 / 数据过滤。会过滤,但模型在互联网上训,过滤不完。1:10:01
可操作
- 先固定动作空间:合法动作做成分类,不要开放文本发明 action。8:01
- 需要当前世界知识时接 search / 执行环,不要只加 CoT,也不要赌模型知道自己不知道。13:13
- 有测试的代码:公开测试做推理时迭代,私有测试做奖励;失败栈追加回 prompt。29:43
- 简单题 binary pass/fail 转得动;难题留下 error trace。回合上限和「一次写对 vs 多轮修」要显式选,不要默认 ORM。38:45
- 整库超上下文:先搜/摘要到信息够了,再打补丁跑测试(SWE-bench),不要一上来生成全文件。45:42
- 噪声环境用 reflection / backtrack / 多次检索 / 多样本,单次观察不当真理。23:27
- 对齐或跟一组原则:人写短 Constitution,critique→revision→SFT→RL;preference model 留一小块人类一致性集,盯 Pareto 而不是只看无害性。49:10 57:52
- 领域 agent 仍要手写 workflow;通用 ReAct 提示词跨不了会计和代码。1:08:15
术语
| 词 | 意思 |
|---|---|
| ReAct | Reason + Act:Thought / Action / Observation 交错 |
| WebGPT | 在浏览器轨迹上训、偏行动、缺推理的对照路线 |
| self-consistency (SC) | 课上等同 majority vote |
| error cascade | 多步里一步错,后面全塌 |
| RLEF | 用执行反馈做 RL 的代码模型 |
| two-tier test | 公开测试给迭代,私有测试给奖励 |
| hybrid token-turn | token 级策略 + turn 级 value / 单一 advantage |
| Constitutional AI | 人写原则,模型自评自改,再 SFT+RL |
| Constitution | 本讲中 16 条人写原则 |
| RLAIF | 用 AI 反馈替代(部分)人类偏好 |
| Self-Refine | 自反馈迭代修订 |
| SWE-bench | 真实仓库补丁能否过测试的基准 |
不确定 / 待验证
- HotpotQA / FEVER / WebShop 除 66.6 vs 82.1 外的表内分数,课上只给方向,未口述精确数字。
- RLEF 的 solve rate 曲线是 Llama 3.1 + CodeContests 的论文图,具体百分比未读出;「solve rate 10 at k」口头定义不完整。
- two-tier 的 ablation、公开/私有如何切分的最优比例,课上没讲。
- 字幕「Cloud Code」按语境和 SWE-bench 讨论当作 Claude Code;「Code Monks」(Azalia 组)论文名未经本 raw 以外核对 [需要验证]。
- Post-training「大约 5% 算力」是讲者量级,不是某次训练的计量。
- Constitutional AI 的 16 条原文、Elo 轴刻度未在课上逐条念。
- 作业里「数学找错」的具体设定不在本讲展开。
相关
来源 raw/collections/cs329a/04-learning-from-feedback-with-toolscode.md · 更新 2026-09-04 · confidence: high