论文
经验积累
★ 必读
Voyager: An Open-Ended Embodied Agent with Large Language Models
Voyager:用不断增长的代码技能库在 Minecraft 里做终身学习
Guanzhi Wang, Yuqi Xie, Yunfan Jiang, Ajay Mandlekar, et al. (NVIDIA / Caltech) · NVIDIA / Caltech · TMLR 2024 · 2023-05 · 被引 2195
一句话把 GPT-4 生成的可执行 JavaScript 代码当作"技能"存进带 embedding 检索的技能库,配合自动课程和三类反馈的迭代修正,在 Minecraft 里无梯度地持续积累能力:160 轮 prompting 拿到 63 种物品(基线的 3.3 倍),是唯一解锁 diamond 工具的方法,技能库还能零样本迁移到新世界。
这是什么
Voyager(NVIDIA/Caltech,2023-05,TMLR 2024,S2 引用 2195+)要解决的问题是:LLM agent 怎么在开放世界里"终身学习"——不断给自己出题、学新技能、并且不忘掉旧技能。它的答案是完全绕开梯度更新:把每个学会的行为固化成一段可执行、可组合、可读的代码函数,存进外部技能库,以后靠 embedding 检索取用。新技能可以调用旧技能,能力像滚雪球一样复利增长,而且天然没有 catastrophic forgetting——代码写在库里就不会丢。
整个系统只通过 API 黑盒调用 GPT-4(gpt-4-0314),不做任何微调。环境侧建在 MineDojo 之上,用 Mineflayer 的 JavaScript API 做动作控制——也就是说 agent 看到的是结构化文本状态(inventory、附近方块、生物群系、血量等),不是像素;执行的是 mineBlock()、craftItem() 这类高层原语,不是键鼠操作。这是理解这篇论文定位的关键:它验证的是 LLM 的规划 + 代码生成 + 经验组织能力,不碰感知和底层控制。
它是"skill library"这一整条工作线的原型:后来 agent 领域里各种把成功轨迹/工具/代码沉淀为可检索资产的做法(包括不少 memory/experience 论文)基本都引用它作为出发点。
系统总览:左边自动课程根据探索进度出新任务(mine wood log → combat zombie → mine diamond),中间迭代 prompting 生成 JS 代码作为动作,拿环境反馈和执行报错修代码,右边 self-verification 通过后新技能(绿色 Combat Zombie)入库,之后可被检索复用(蓝色为被检索的旧技能)。机制与做法
自动课程:让 GPT-4 自己出题
没有人工任务列表。每轮把 agent 当前状态(inventory、装备、附近方块/实体、时间、血量、位置)、已完成/已失败任务列表,加上"目标是发现尽可能多样的东西、下一个任务别太难"的指令喂给 GPT-4,让它提出下一个任务。另外用 GPT-3.5 做 self-ask/self-answer 补充背景知识(用 3.5 纯粹是省钱)。课程温度设 0.1,其余组件温度全 0。
这一步是消融里最致命的:换成随机课程,发现的物品数掉 93%;人工设计的课程也明显不如自动课程,因为它不看 agent 的实时处境。
技能库的存取机制。上半:GPT-4 生成的程序由 GPT-3.5 写描述,描述的 embedding 作 key、代码作 value 入库。下半:执行新任务时用规划文本 + 环境反馈做 query,检索 top-5 相关技能(如 craft iron pickaxe 检索到 smelt iron ingot、craft stick 等)供新代码调用——组合复用旧技能就是能力复利的来源。技能库:代码即技能,embedding 检索
每个通过验证的程序,先让 GPT-3.5 写一段功能描述,取描述的 embedding(text-embedding-ada-002)作 key、代码本身作 value 存库。要用时,把 GPT-3.5 生成的任务规划文本 + 环境反馈拼起来做 query,取 top-5 相关技能放进代码生成的 prompt,供新代码直接调用。
代码生成的 prompt 里还包括:控制原语 API 文档、"你的函数会被复用,请写得通用"这类 guideline、上一轮的代码/报错/批评,以及 chain-of-thought 引导。去掉技能库的消融版本在后期明显 plateau(63 vs 约 36 个物品),而且论文展示把这个技能库直接插给 AutoGPT 也能提升它的表现——技能库是可移植资产。
主结果:160 轮 prompting 中发现的独特物品数。Voyager(橙)63 种且持续上升,唯一摸到 diamond 工具;去掉技能库(蓝)后期明显 plateau 在约 36 种;AutoGPT 移植版(紫)约 19 种,ReAct/Reflexion 不到 5 种就卡死。注意横轴是 prompting 迭代数,不是游戏时间。迭代 prompting:三类反馈修代码
每轮生成的程序真的拿去执行,把三类信号回灌下一轮:(1) 环境反馈——控制原语内部用 bot.chat() 打印中间进度,比如"造铁胸甲还缺 7 个铁锭";(2) 解释器的执行报错;(3) self-verification——另起一个 GPT-4 实例当 critic,看当前状态判断任务是否完成,失败时给出改进建议。通过验证才入库,连续 4 轮失败就放弃、找课程要新任务。
消融显示 self-verification 是三类反馈里最重要的(去掉后物品数 -73%),因为它决定"何时切任务/何时重试"。另一个重要消融:把代码生成模型从 GPT-4 换成 GPT-3.5,物品数直接差 5.7 倍——整套方法严重依赖当时 GPT-4 独一档的代码能力。
消融:左图看课程和模型——随机课程(红)-93%、GPT-3.5 代码生成(绿)差 5.7 倍、人工课程(紫)也不如自动课程;右图看三类反馈——去掉 self-verification(蓝)伤害最大(-73%),其次是环境反馈和执行报错。给同类系统排组件优先级时可直接引用。评测:全部对比自己重实现的 NLP 基线
因为当时没有开箱即用的 Minecraft LLM agent,基线 ReAct、Reflexion、AutoGPT 都是作者在 MineDojo 里重新实现的移植版。主结果:160 轮 prompting 发现 63 种物品(3.3x)、木/石/铁级科技树分别快 15.3x/8.5x/6.4x、唯一摸到 diamond 级、地图移动距离 2.3x。零样本迁移:清空 inventory 扔进新世界,Voyager 能在 50 轮内解决 diamond pickaxe 等未见任务,基线全军覆没。注意所有倍数都是相对这些移植基线,不是相对像素输入的 RL 方法(VPT、DreamerV3 那条线刻意不比)。
关键结果
- 160 轮 prompting 迭代发现 63 种独特物品,是 AutoGPT 移植版的 3.3 倍;ReAct/Reflexion 基本原地踏步(<5 种)。
- 科技树:木器快 15.3x、石器快 8.5x、铁器快 6.4x,唯一解锁 diamond 工具的方法。
- 消融:随机课程 -93%、去掉 self-verification -73%、去掉技能库后期 plateau(约 36 种)、GPT-3.5 代码生成差 5.7x——课程和自我验证比技能库本身对当期探索影响更大,技能库的价值在后期复利和跨世界迁移。
- 技能库零样本迁移:新世界 + 未见任务,Voyager 全部解决,基线 50 轮内一个都做不出;同一个技能库插给 AutoGPT 也能显著提升它。
- 成本:官方 FAQ 称 160 轮约 50 美元 GPT-4 费用;第三方实测约 40 美元、6 小时(issue #4)。
- 自认的局限:课程会幻觉出游戏里不存在的物品(如 copper sword),代码生成会拿 cobblestone 当燃料;self-verification 偶尔漏判成功。
实证核查
扎实代码、prompt、技能库全部开源且与论文一致,社区多人端到端跑通并公开了自己的 160 轮 checkpoint,方法本身经得起查。但"embodied"的成色要打折扣(高层 API 而非像素/键鼠),倍数战绩都是对作者自己移植的 NLP 基线,且原始实验绑定已退役的 gpt-4-0314,如今无法逐字复现。
论文称 Voyager 是"第一个 LLM 驱动的 embodied 终身学习 agent",在 Minecraft 里持续探索、习得技能。
"embodied"是宽义的:agent 不看像素、不做底层控制,输入是结构化文本状态,动作是 Mineflayer 高层 JS 原语(仓库 voyager/control_primitives/ 下只有 mineBlock、craftItem、killMob、smeltItem 等 13 个文件)。论文 Sec 3.2 自己承认因此不与 VPT 等像素输入方法比较;HN 主帖(news.ycombinator.com/item?id=36085936)下的高票评论(item 36087383)就把这一点称为"the most important caveat"。
"无人干预"地在开放世界生存探索。
运行环境是驯化过的:README 要求建世界时设 Peaceful 难度并 Allow cheats: ON,控制原语里直接用作弊指令——givePlacedItemBack.js 调用 /gamerule doTileDrops false、/give、/setblock(把迭代试错中放置的方块还给 agent,避免资源损耗);每个任务后 bot 退出重进以同步环境(官方 FAQ)。属于合理的实验控制,但和"生存模式硬闯"的直观想象有距离。
3.3x 物品、15.3x 科技树等战绩"超过 prior SOTA"。
对照组 ReAct/Reflexion/AutoGPT 都是作者自己移植到 MineDojo 的重实现(论文 Sec 4.2 明说这些方法本来只做 NLP 任务),不存在独立的第三方基线;abstract 里的"prior SOTA"实指移植版 AutoGPT。倍数本身在论文设定内成立(TMLR 2024 审稿通过,openreview.net/forum?id=ehfRiF0R3a),但不能理解成打败了当时的 Minecraft 专用 agent(VPT、DreamerV3 未比)。
全部代码和 prompt 开源,可复现。
开源属实(MIT,7.1k stars),而且社区真的跑通了:issue #4 中用户 daswer123 报告 160 轮花费约 40 美元、6 小时,并公开了自己的 checkpoint(github.com/daswer123/Voyager_checkpoint);官方 FAQ 给出约 50 美元的成本估计;repo 的 skill_library/ 也收录了多个社区训练的技能库(issues #27/#50/#64)。但硬绑定 gpt-4-0314 + gpt-3.5-turbo-0301,两者已于 2024 年退役,今天只能换模型近似复现;repo 自 2024-04 起不再更新,openai_api_base/Ollama 支持等 PR(#70、#184)一直挂着,依赖的旧版 langchain 也会报错(issue #175),现在上手要自己动手修。
技能库"缓解 catastrophic forgetting",体现终身学习。
机制上成立但别过度解读:技能是外部代码文件,不写进模型参数,"不遗忘"是存储层面的性质而非学习算法的突破;真正学到东西的载体是 GPT-4 的先验(它本来就见过海量 Minecraft 攻略,HN 上也有人以此质疑"learning agent"的说法,见 item?id=42035319 下的讨论)。论文对这点是诚实的——通篇叫 in-context lifelong learning,消融也证明库内技能确实被复用并支撑了后期增长和跨世界迁移。
与我们方向的关系
对本组 continual-learning / 经验积累方向,这是必须精读的原型:它把"经验"具体化为三件事——可执行代码(而非自然语言 memory)、以描述 embedding 为 key 的检索、入库前的验证关卡(self-verification 通过才算技能)。消融给出的量化结论很有引用价值:课程(出题策略)和验证器比库本身更影响当期性能,库的价值体现在后期复利和迁移;这对设计任何 experience/memory 系统时"先投入哪个组件"是直接的指导。
可借鉴的具体做法:技能以函数为单位、要求写得通用可复用(prompt 里明说"会被复用");检索 query 用规划文本+环境反馈而非任务名;失败上限 4 轮就换任务防止死磕;技能库可以作为 plug-and-play 资产喂给别的 agent(论文用 AutoGPT 验证过)。局限同样值得记:技能是环境特定的 JS 代码,换个环境 API 全部作废——通用性问题是后续 skill library 工作(以及本组可做的点)的主要改进空间。
阅读笔记
复现提示:别指望原样跑通——模型 ID 已退役、langchain 版本老化,先看 issues #70/#175/#184 里的社区补丁,或直接找改造过的 fork。想省钱可以直接加载 repo 自带的 skill_library/trial1 等学习好的技能库,只跑 inference(decompose_task + inference 接口)。另外 issue #194 报告了从社区 checkpoint resume 会反序列化不可信 pickle 的安全隐患,加载第三方技能库/checkpoint 时注意。
材料清单
TeX 源码已存档:Raw/voyager/source/
同类条目