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%),通过测试不代表真对。
| 任务 | 基线 SOTA | GPT-4 | Reflexion |
| 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 的假阳性就是一例,垃圾进垃圾出。