不改权重靠自我反思:这篇把 GPT-4 的 HumanEval 从 80% 拉到 91%

Reflexion: Language Agents with Verbal Reinforcement Learning

Noah Shinn, Federico Cassano, Edward Berman, Ashwin Gopinath, Karthik Narasimhan, Shunyu Yao

cs.AI, cs.CL, cs.LG

2023-03-21

Reflexion 让 agent 在失败后写一段自我反思存进记忆,下一轮带着教训重来,不改权重就把 GPT-4 的 HumanEval 从 80% 提到 91%。

这篇在解决什么

让大模型 agent 从试错里学东西,传统做法是强化学习:给奖励信号、更新参数。但强化学习要大量样本、要微调,成本高,而且一个具体任务训出来的策略很难搬走。这篇想回答一个更省事的问题:既然模型已经会写自然语言了,能不能让它把「这轮哪里做错了、下轮该怎么改」写成一段话,存下来,下一轮直接读,当成经验用?

方法

Reflexion 把 agent 拆成三个角色,跑一个最多十几轮的循环。

这段反思存进一个有界记忆区(通常只留最近 1 到 3 条),下一轮 Actor 生成动作时把它一起读进去。关键设计是把标量奖励「放大」成可读、可复用的语言经验。记忆只留几条,是因为上下文窗口有限;反思写得具体而不是泛泛而谈,效果才出得来。

反馈来源也很能凑合:外部环境给个 0/1 成败、编译器吐报错、人类写的规则、甚至模型自己出测试用例自己判,都能喂进去。

结果

编程任务上提升最显眼。HumanEval 上 GPT-4 裸跑 80%,加上 Reflexion 到 91%,超过此前靠 CodeT + GPT-3.5 的 65.8%。LeetcodeHardGym 这组 GPT-4 知识截止后的难题,GPT-4 只有 7.5%,Reflexion 翻到 15%。MBPP(Python)反而是少数没赢 GPT-4 的:77.1% 对 80.1%。论文自己分析,这是因为自动生成的测试用例假阳性率太高(MBPP 上 16.3%,HumanEval 上只有 1.4%),通过测试不代表真对。

任务基线 SOTAGPT-4Reflexion
HumanEval(Python)65.8%80.1%91.0%
HumanEval(Rust)60.0%68.0%
MBPP(Python)67.7%80.1%77.1%
Leetcode Hard(Python)7.5%15.0%

决策任务 ALFWorld 上,134 个任务做完 130 个,12 轮内绝对提升约 22 个百分点,基线的幻觉率卡在 22% 不再下降。推理任务 HotPotQA 上,带标准上下文的 CoT 从 60% 提到 74%。消融实验证明两个部件缺一不可:不生成测试用例,agent 不知道自己对没对;不写反思,即使看懂了错在哪也改不出来。

为什么重要

这篇是「agent 怎么从失败里学」这条线绕不开的引用。它把学习从「改参数」挪到「改 prompt 上下文」,代价低、可解释、不用冻结模型权重,任何能调 API 的人都能照搬。今天几乎所有「让模型多想几轮、把上轮教训写下来」的工作流,根都在这。对从业者,它给了一个现成的失败重试模板:评估、反思、带记忆重试。

局限与存疑

论文自己承认几条。第一,效果强依赖底层模型够强:在较弱的 StarChat-beta 上,Reflexion 跟裸跑几乎没差,说明「能自我纠错」是大模型才有的涌现能力,小模型给了反思也用不上。第二,记忆有界、上下文有限,任务一长、反思一多就会撞窗口。第三,反思质量没有保证,模型可能把错的原因写进记忆,越反思越跑偏,论文对这种「自我强化错误」没做系统检验。第四,评估者本身可能不准,上面 MBPP 的假阳性就是一例,垃圾进垃圾出。

术语

原文与代码

社区讨论

相关论文

全部论文解读