VOYAGER: An Open-Ended Embodied Agent with Large Language Models

Paper: arXiv:2305.16291 Code: MineDojo/Voyager Code reference: main @ 55e45a88 (2023-07-27)

1. Motivation (研究动机)

这篇论文针对的是 open-ended embodied agent 的一个核心缺口:现有 Minecraft / embodied AI 方法要么依赖 primitive action 上的 RL / imitation learning,要么把 LLM 当成一次性 planner,但都不具备“持续探索、累积技能、跨任务迁移”的 lifelong learning 机制。对 Minecraft 这类没有固定主线、需要逐步解锁 tech tree 的环境而言,只会输出单步动作或一次性计划的 agent 很难稳定推进到更复杂的目标。

作者想解决的不是“如何把 GPT-4 接进 Minecraft”这么宽泛的问题,而是一个更具体的问题:如何让一个 black-box LLM agent 在不做参数微调的情况下,基于环境反馈不断提出下一步任务、把成功程序保存成可复用技能,并在失败后借助执行报错与 self-verification 迭代修正代码。换句话说,VOYAGER 关注的是开放世界中的自驱式 skill acquisition,而不是传统 benchmark 上的单任务成功率。这个问题值得研究,因为 Minecraft 本身具有长时程、组合式和资源依赖的结构。

一个 agent 如果能像人类玩家一样先学会“挖木头、做工作台、做石镐”,再逐步转向 combat、smelting、ore mining 与跨地形探索,就意味着 LLM agent 有可能在其他 embodied domain 里复用同样的 pattern:自动课程负责选下一步可达目标,技能库负责压缩过去经验,程序级动作负责把 reasoning 转成可执行的 temporally extended behavior。

作者实际上是在挑战两种常见但都不够用的设定。第一种是把 embodied task 当成单回合 instruction following,只问“给你一个目标,你能不能做完”;这种设定忽略了开放世界里大量价值来自 agent 自己发现新目标。第二种是把长期能力积累寄托在模型参数更新上,但对 black-box API LLM 来说,在线微调既昂贵也不现实。VOYAGER 试图证明:即使不能改参数,也可以通过外部记忆与任务调度把“持续变强”这件事做出来。 从论文 framing 看,作者还隐含回应了 embodied agent 研究里的 evaluation gap。若只看某个静态 benchmark 的 success rate,很难区分一个 agent 是真正学会了可迁移技能,还是只在特定任务模板上碰巧奏效。因此他们把“发现多少 unique items”“是否能沿 tech tree 持续推进”“换世界后能否 zero-shot 完成未见任务”并列成核心指标,本质上是在把开放式能力增长本身当成研究对象。

2. Idea (核心思想)

核心洞察是:对 open-ended embodied exploration,LLM 不应该直接在 primitive action 上逐 token 控制环境,而应该把“程序”作为 action space,把“任务选择”与“技能积累”显式拆成三个互相耦合的模块。程序天然是 temporally extended、可解释、可组合的,因此比逐步输出低层控制更适合作为 lifelong agent 的记忆单元。VOYAGER 的关键创新可以压缩成三句话。第一,automatic curriculum 不再依赖人工写死的 task graph,而是让 GPT-4 基于当前 inventory、biome、附近实体、历史已完成/失败任务主动提出“下一步但不过难”的任务。

第二,skill library 把成功程序写成可执行代码并做 embedding 检索,使 agent 能把过去掌握的能力组合到新任务里。第三,iterative prompting 把 environment feedback、execution errors 和 self-verification critique 一起送回 LLM,让程序通过多轮修正而不是一轮生成。

ReAct / Reflexion / AutoGPT 的根本差异在于:这些 baseline 虽然也使用 LLM 做 reasoning 或 task decomposition,但没有一个“越用越大”的技能库,也没有一个围绕 Minecraft exploration 量身定制的 bottom-up curriculum。

与传统 Minecraft RL 或 imitation learning 方法相比,VOYAGER 不训练新的 policy 参数,而是把 GPT-4 的 world knowledge 通过 prompting、程序复用和反馈闭环转成 embodied competence。更细一点说,VOYAGER 的 idea 不是简单把 memory、planning、reflection 三个流行关键词拼在一起,而是重新定义它们之间的依赖关系。memory 在这里不是保存聊天摘要,而是保存“已经在环境里跑通过的程序”;planning 不是一次生成长链子目标,而是在每轮只提出一个当前最合适、可验证、可积累的 next milestone;

reflection 也不是抽象复盘,而是围绕报错、状态变化和任务完成条件做 program repair。这个定义方式让三者形成了闭环,而不是三个彼此松散的外挂模块。

这也是为什么作者坚持 code-as-action。若 action 只是自然语言 plan,那么 skill library 检索回来的内容仍要再次翻译成可执行行为,误差会在每一轮重生;而程序一旦被验证成功,就能直接作为下一个任务的 building block。换句话说,VOYAGER 把 LLM 最擅长的“根据上下文写出一段结构化程序”能力,转成了 embodied domain 中最稀缺的“可累积、可组合、可复用”的执行单元。

Figure 1 解读:这张主结果图展示 unique items 随 prompting iterations 持续增长。VOYAGER 的曲线比 ReAct、Reflexion、AutoGPT 明显更陡,说明它不是偶然在某个任务上成功,而是在 160 次 prompting budget 内持续发现新物品、推进新能力。图的意义在于把“lifelong exploration”具体化成可累计的 discovery process,而不是单次任务成功率。

3. Method (方法)

3.1 整体框架:任务生成、程序执行、技能沉淀组成闭环

Figure 2 解读:Figure 2 把系统拆成三个主模块。左侧 automatic curriculum 根据 exploration progress 产生新任务;中间 iterative prompting mechanism 把 code as actions 扔进环境执行,并把环境反馈、执行报错、自验证结果回流给 GPT-4;右侧 skill library 在任务成功后把程序存成可检索技能。箭头方向体现的不是单步 inference,而是一个“提任务 写代码 执行修正 成功沉淀 继续探索”的循环。

论文附录把整体算法写成很短的 loop:对每个任务最多尝试 4 轮代码修正;如果成功,则把程序加入 skill library 并把任务记入 completed tasks,否则把任务记入 failed tasks。released code 的 voyager/voyager.py 与此对应:Voyager.learn()max_iterations=160 的外循环里不断调用 curriculum_agent.propose_next_task(...),再通过 rollout() 执行单任务闭环;

内部停止条件是 self.action_agent_rollout_num_iter >= self.action_agent_task_max_retriessuccess。从实现直觉上看,这个设计真正重要的地方不是“用 GPT-4 写 JS 代码”,而是把 exploration state、错误信号和长期记忆拆成了可独立演化的模块。automatic curriculum 决定学什么,action agent 决定怎么做,critic 决定是否算成功,skill manager 决定哪些程序值得记忆。这样即便底层 LLM 是 black-box API,agent 仍然能在 system level 上形成长期累积。

这里有一个容易被忽视的点:VOYAGER 的主循环刻意把“任务完成”设成 skill 写入的唯一入口,而不是只要程序运行了就存档。这相当于给长期记忆加了一层 outcome-based filter,避免 skill library 被大量半成品脚本污染。对一个依赖检索的系统来说,这种记忆洁净度和记忆规模同样重要,否则 retrieval 很快会把未来 prompt 挤满低质量示例。

3.2 Automatic Curriculum:让任务难度跟着探索进度走

Figure 3 解读:Figure 3 展示 GPT-4 在不同 agent state 下给出的下一任务示例,例如从已有 wooden pickaxe 和 stone 推出“Craft 1 stone pickaxe”,或在 river biome 且手里有 fishing rod 时提出“Catch 1 fish”。这张图想说明 curriculum 不是泛泛地说“继续探索”,而是把 inventory、biome、实体、时间等状态压成一个具体、单短语、可验证的 next task。

论文在 §2.1 和 Appendix A.3 中说明 curriculum prompt 由五类信息组成:鼓励多样探索且不要过难的 directive、当前 agent state、已完成/失败任务列表、额外 QA context,以及 chain-of-thought。附录 Table A.1 还给出 warm-up schedule:inventory / completed tasks / failed tasks / nearby blocks / nearby entities 从第 0 个完成任务起就能进入 prompt;equipment 在进度 5 后出现;chests 与 position 在进度 7 后出现;

biome / health / hunger / time 在进度 10 后出现;额外 context 在进度 15 后出现。released code 的 voyager/agents/curriculum.py 把这一设计落成了显式逻辑。curriculum_observations 包含 context, biome, time, nearby_blocks, other_blocks, nearby_entities, health, hunger, position, equipment, inventory, chests, completed_tasks, failed_tasks

default_warmup 为不同 observation 设定启用阈值,并在 render_human_message() 中按当前 progress 和随机 0.8 采样决定是否展示。propose_next_task() 还包含两个重要 hard-coded 分支:第一步任务固定为 Mine 1 wood log;当 inventory 快满时优先要求 craft chest 或把无用物品存进 chest。这说明论文里的“automatic”并非完全无先验,released code 仍加入了少量工程性 guardrail 来避免 agent 因背包满而停滞。QA context 的实现也值得注意。

论文说 GPT-4 会在 curriculum 里利用附加上下文,而代码中 run_qa() 先让 GPT-3.5 生成 5 到 10 个与当前状态相关的问题,再调用 answer agent 自答,把最多 5 组非 Unknown 的问答插回 prompt。这相当于在任务选择前先做一次 lightweight retrieval / reasoning,把“当前 sparse state”扩展成“关于当前 state 的可操作知识”。

这一模块背后的直觉是,开放世界里的原始 observation 对任务选择来说常常过于局部。比如 agent 看到的是当前 inventory 和 biome,但真正需要的是“基于这些条件,现在最值得做且大概率可达的事是什么”。QA context 先把状态翻译成若干显式问题,相当于强迫模型把隐含知识调用出来,再用于课程生成;这比直接把原始状态一股脑喂给 task proposer 更接近“先理解局面,再决定下一步”。

3.3 Skill Library:把成功程序沉淀为可复用的长期记忆

Figure 4 解读:Figure 4 上半部分展示“新技能写入”,下半部分展示“给定新任务时检索相关技能”。作者把 skill 的 key 定义为由 GPT-3.5 生成的 program description embedding,把 value 定义为程序本身;对新任务先让 GPT-3.5 给 general suggestion,再与 environment feedback 合成 query context,用它检索 top-5 技能。图中强调的是 skill 作为“代码记忆单元”,而不是文本摘要。

论文的 skill prompt 由 12 个部分组成,核心包括:代码生成规范、Mineflayer control primitives、检索到的旧技能、上一轮代码、环境反馈、执行错误、critic critique、当前状态、当前任务以及 task context。作者为什么坚持把 skill 存成程序而不是存成自然语言经验?因为 Minecraft 的许多长时程行为本质上是组合式过程,例如“找矿 挖矿 回炉 合成工具”,自然语言提示可以建议方向,但真正可复用的能力载体是一个能直接执行的函数。released code 里的 SkillManager 明确采用 Chroma 向量库和 OpenAIEmbeddings()

add_new_skill() 会把程序保存到 ckpt/skill/code/,再让 GPT-3.5 基于 program code 和 main function 生成一句 skill description,并把 description 作为 document 写入 ckpt/skill/vectordbretrieve_skills() 则取 k = min(count, retrieval_top_k),默认 retrieval_top_k=5,按相似度取回对应程序源代码,再作为 render_system_message(skills=...) 的额外上下文。

作者这里做了一个非常 pragmatic 的 trade-off:检索键不是原始代码 embedding,而是 LLM 生成的 skill description。好处是不同实现细节但功能相近的程序更容易被拉近,例如“挖某类矿石”“制作某类工具”可以在语义上相互召回;代价是 description 质量会影响检索精度。论文没有把这一点展开成单独实验,但从系统设计角度看,这是让 skill library 更像“能力索引”而不是“脚本仓库”的关键一步。

论文公式与 released code 实现差异:Figure 4 的文字描述强调“先用 GPT-3.5 生成 general suggestion,并与 environment feedback 合成 query context,再检索 top-5 技能”;但 released code 中 SkillManager.retrieve_skills() 只是接受一个单字符串 query。具体的拼接在调用侧完成,而且初始轮与后续轮并不完全一致:voyager/voyager.py:184 在任务开始前仅以 self.context 检索技能,而 voyager/voyager.py:245-247 在失败后的下一轮才把 self.context + "\\n\\n" + self.action_agent.summarize_chatlog(events) 作为 query。也就是说,论文描述的是统一的“建议 + 环境反馈”查询语义,而 released code 的第一轮 retrieval 实际只基于 task context,环境反馈要到后续迭代才进入检索。

3.4 Iterative Prompting:把环境反馈、执行报错和 critique 变成代码修正信号

Figure 5 解读:左图展示环境反馈如何帮助模型发现“还差 2 个 planks 才能 craft sticks”;右图展示 execution error 如何暴露“acacia_axe 在 Minecraft 中不存在,所以应该改为 wooden axe”。这张图的重点是,VOYAGER 的纠错不是抽象的 self-reflection,而是把真实 runtime 反馈直接变成下一轮代码生成条件。

Figure 6 解读:Figure 6 展示 self-verification prompt 如何根据 agent state 判断任务是否完成,并在失败时给出 critique。它的功能不是重新规划全局目标,而是给 action agent 一个任务级 verdict:这次 rollout 到底算完成,还是只是部分完成、方向对但执行还不够。

论文把这种迭代过程概括为:执行生成程序得到 observation 与 error trace;把它们连同上一轮代码一起送回 GPT-4;反复直到 self-verification 判定任务成功。附录 Algorithm 伪代码直接写成: 如果成功则 add_skill(code)add_completed_task(task),否则 add_failed_task(task)。这里没有 gradient-based optimization,只有 program repair loop。代码实现与论文叙述基本一致。

ActionAgent.render_human_message() 明确把上一轮代码、execution error、chat log、biome、time、nearby blocks、entities、health、hunger、position、equipment、inventory、chests、task、context、critique 拼成下一轮 user prompt;process_ai_message() 只接受带有 JavaScript code fence 的响应,并通过 Babel 解析出函数定义,确保输出可以进入 Mineflayer 环境执行。

CriticAgent.ai_check_task_success() 则要求 LLM 产出 JSON,至少包含 success 布尔值,可选 critique 字段。这个设计的工程含义很强:作者不是让 GPT-4 “自由发挥”,而是用结构化 parser、固定 response format 与 verifier 把 LLM 约束在一个可恢复的程序生成循环里。这部分方法最重要的经验价值在于:VOYAGER 没把 error 当成负面副产物,而是当成下一轮 prompt 里最高价值的监督信号。对于代码生成式 agent,执行报错往往比自然语言自我反思更具体,因为它直接指出 API 不存在、前置资源缺失、控制流没有走通,或者任务完成条件还未满足。

论文中的 iterative prompting 之所以有效,很大程度上正是因为这些错误是 environment-grounded 的,而不是模型自说自话。

3.5 关键控制原语、伪代码与代码映射

论文没有复杂的可学习损失函数,关键“算法”体现在 system loop 与 prompt-grounded API 组合上。因此这里的伪代码重点是复现 released code 的控制流,而不是虚构不存在的训练公式。

3.5.1 自动课程任务选择

def propose_next_task(curriculum_agent, events, chest_observation):
    if curriculum_agent.progress == 0 and curriculum_agent.mode == "auto":
        return "Mine 1 wood log", (
            "You can mine one of oak, birch, spruce, jungle, "
            "acacia, dark oak, or mangrove logs."
        )
 
    inventory_used = events[-1][1]["status"]["inventoryUsed"]
    if inventory_used >= 33:
        if chest_observation != "Chests: None\n\n":
            return curriculum_agent.find_deposit_task(chest_observation)
        return "Craft 1 chest", "Craft 1 chest with 8 planks of any kind of wood."
 
    messages = [
        curriculum_agent.render_system_message(),
        curriculum_agent.render_human_message(
            events=events,
            chest_observation=chest_observation,
        ),
    ]
    return curriculum_agent.propose_next_ai_task(messages=messages, max_retries=5)

这段伪代码对应 voyager/agents/curriculum.pypropose_next_task()render_human_message():先处理首任务和背包满的特殊情况,再走 GPT-4 curriculum prompt。

3.5.2 单任务 rollout 与代码修正

def rollout_task(voyager, task, context, reset_env=True):
    voyager.reset(task=task, context=context, reset_env=reset_env)
    while True:
        skills = voyager.skill_manager.retrieve_skills(query=voyager.context)
        system_message = voyager.action_agent.render_system_message(skills=skills)
        human_message = voyager.action_agent.render_human_message(
            events=voyager.last_events,
            code="",
            task=task,
            context=context,
            critique="",
        )
        ai_message = voyager.action_agent.llm([system_message, human_message])
        parsed = voyager.action_agent.process_ai_message(ai_message)
        events = voyager.env.step(
            code=parsed["program_code"],
            programs=voyager.skill_manager.programs,
        )
        success, critique = voyager.critic_agent.check_task_success(
            events=events,
            task=task,
            context=context,
            chest_observation=voyager.action_agent.render_chest_observation(),
            max_retries=5,
        )
        voyager.action_agent_rollout_num_iter += 1
        if success or voyager.action_agent_rollout_num_iter >= voyager.action_agent_task_max_retries:
            return parsed, success, critique, events
 
        new_skills = voyager.skill_manager.retrieve_skills(
            query=context + "\n\n" + voyager.action_agent.summarize_chatlog(events)
        )
        voyager.messages = [
            voyager.action_agent.render_system_message(skills=new_skills),
            voyager.action_agent.render_human_message(
                events=events,
                code=parsed["program_code"],
                task=task,
                context=context,
                critique=critique,
            ),
        ]

这段伪代码综合了 voyager/voyager.pyreset(), step(), rollout(),以及 ActionAgent / CriticAgent 的接口,体现“初始检索 生成代码 执行 验证 失败后带反馈重检索”的闭环。

3.5.3 新技能写入与向量检索

def add_and_retrieve_skills(skill_manager, info, query):
    if info["task"].startswith("Deposit useless items into the chest at"):
        return []
 
    program_name = info["program_name"]
    program_code = info["program_code"]
    description = skill_manager.generate_skill_description(program_name, program_code)
    skill_manager.vectordb.add_texts(
        texts=[description],
        ids=[program_name],
        metadatas=[{"name": program_name}],
    )
    skill_manager.skills[program_name] = {
        "code": program_code,
        "description": description,
    }
    k = min(skill_manager.vectordb._collection.count(), skill_manager.retrieval_top_k)
    docs_and_scores = skill_manager.vectordb.similarity_search_with_score(query, k=k)
    return [skill_manager.skills[doc.metadata["name"]]["code"] for doc, _ in docs_and_scores]

这段伪代码对应 voyager/agents/skill.pyadd_new_skill(), generate_skill_description()retrieve_skills()。它说明 skill library 的“记忆”不是参数更新,而是对程序代码做 description embedding 和向量检索。

3.5.4 关键公式与目标

虽然论文主体没有传统意义上的损失函数,但它隐含了一个任务级优化目标:给定当前状态 ,curriculum 选择一个可达且新颖的任务 ,action agent 生成程序 ,critic 判定程序执行后的状态 是否满足任务。可以把单轮闭环写成: 其中 表示已完成/失败任务与额外上下文, 表示 skill library。若 ,则把 以新 skill 的形式写回 。VOYAGER 的关键不是优化一个 differentiable loss,而是通过这个离散闭环使 skill inventory 单调扩张。

Code reference: main @ 55e45a88 (2023-07-27) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class / Function作用
Overall lifelong loopvoyager/voyager.pyVoyager.learn, Voyager.rollout, Voyager.step任务级主循环、最多 160 iteration、每任务最多 4 轮尝试
Automatic curriculumvoyager/agents/curriculum.pyCurriculumAgent.propose_next_task, render_human_message, run_qa基于探索进度和状态生成下一任务
Iterative promptingvoyager/agents/action.pyActionAgent.render_system_message, render_human_message, process_ai_message把反馈转成下一轮代码生成输入
Self-verificationvoyager/agents/critic.pyCriticAgent.check_task_success, ai_check_task_success判断任务是否完成并给 critique
Skill libraryvoyager/agents/skill.pySkillManager.add_new_skill, retrieve_skills把程序写入向量库并检索 top-k 旧技能
Prompt templatesvoyager/prompts/*.txtcurriculum.txt, critic.txt, action_template.txt, skill.txt论文附录中的 prompt 结构落地
Executable action spacevoyager/control_primitives/*.jsexploreUntil, mineBlock, craftItem, smeltItem, killMob给 GPT-4 提供 Mineflayer 层的高层 API

4. Experimental Setup (实验设置)

4.1 Datasets / 环境与任务规模

这篇论文没有传统 supervised dataset,而是在 MineDojo 提供的 open-ended Minecraft 环境中评测 agent。环境状态来自 inventory、equipment、biome、time、health、hunger、position、附近 blocks / entities 与 chest 内容;外部知识部分可选使用 MineDojo wiki knowledge base,但作者明确说 GPT-3.5 本身已经对 Minecraft mechanics 有较好理解,因此 wiki 不是必需组件。

评测包含三类核心任务集合:

  • Open-ended exploration:在最多 160 次 prompting iterations 内持续探索,统计 unique items 数量。
  • Tech tree mastery:按 wooden tool → stone tool → iron tool → diamond tool 的层级推进,每个 setting 运行 3 次。
  • Zero-shot generalization:在新世界里清空 inventory 后测试 4 个未见任务,分别是 Diamond Pickaxe、Golden Sword、Lava Bucket、Compass;每个任务运行 3 次,单任务预算 50 次 prompting iterations。

4.2 Baselines

作者主要比较三类 LLM-based agent baseline,并做了一个去模块的 ablation:

  • ReAct:提供环境反馈和 agent state,让它在 MineDojo 中做 reasoning + acting。
  • Reflexion:在 ReAct 基础上加入 self-reflection,并接入 VOYAGER 的 execution errors 与 self-verification。
  • AutoGPT:用 GPT-4 做 task decomposition,并为 subgoal execution 提供环境反馈和执行错误。
  • VOYAGER w/o Skill Library:去掉技能库,只保留 curriculum 与 iterative prompting,用于验证 skill accumulation 的作用。

作者强调没有直接和 pixel-input、low-level control 的 Minecraft methods 做 apple-to-apple 比较,因为 VOYAGER 依赖 Mineflayer API,关注点是高层 lifelong planning,而不是视觉感知或低层 controller 学习。

4.3 Evaluation Metrics

  • Unique items discovered:在固定 prompting budget 内获得的不同物品数量,用来衡量开放探索能力。
  • Tech tree prompting iterations:到达 wooden / stone / iron / diamond tool milestone 所需的平均 prompting iterations;若在预算内失败,则记为 N/A (0/3)
  • Map coverage / traversal distance:通过俯视地图观察跨地形探索范围,论文总结为 VOYAGER 能走得比 baselines 更远。
  • Zero-shot task success:在未见任务上的成功率(3 次试验中的成功次数)以及平均 prompting iterations。

4.4 Runtime / Training Config

这篇论文没有 gradient-based training,也没有 GPU 数量、learning rate、batch size 之类的训练超参数;作者明确把 VOYAGER 定义为对 GPT-4 / GPT-3.5 的 black-box prompting system,而不是 fine-tuned policy。因此这里的“配置”应来自实际运行脚本与 released constructor,而不是虚构训练设置。

released code voyager/voyager.py 给出的关键默认配置如下:

  • 环境交互env_wait_ticks=20env_request_timeout=600
  • 全局探索预算max_iterations=160
  • 单任务修正预算action_agent_task_max_retries=4
  • LLM 角色分工
    • action agent:gpt-4
    • curriculum agent:gpt-4
    • curriculum QA agent:gpt-3.5-turbo
    • critic agent:gpt-4
    • skill manager description model:gpt-3.5-turbo
  • skill retrievalskill_manager_retrieval_top_k=5
  • curriculum warm-up:来自 voyager/agents/curriculum.pydefault_warmup,与 Appendix Table A.1 对齐。

如果按 skill 的 Mandatory Skeleton 来看,这篇论文的“training config”最佳表述就是:论文未进行模型参数训练;released code 提供的是 runtime / prompting 配置,而非优化器配置。因此不应捏造 GPU、step、LR 等信息。

5. Experimental Results (实验结果)

5.1 主结果:开放探索、tech tree、跨世界泛化都明显领先

Figure 7 解读:Figure 7 用鸟瞰地图显示不同 agent 的探索轨迹。VOYAGER 不是在一个局部区域来回打转,而是跨越多种 terrain 持续扩张可达区域;作者据此总结其 traversal distance 比 baselines 长 。图像证据说明 automatic curriculum 的价值不仅是“多做任务”,也是持续把 agent 推离已有舒适区。

Figure 8 解读:Figure 8 可视化 zero-shot unseen tasks 的中间进度。VOYAGER 在 Diamond Pickaxe 与 Compass 等任务上能沿着合理子目标逐步推进,而 baseline 往往停留在前几步或完全没有 meaningful progress。图像层面说明 skill library 的迁移不是只提高最终成功率,还改变了任务推进曲线。

Figure 9 解读:这张图展示 VOYAGER 在 human feedback 下逐步建造 3D 结构的过程。它不是论文主 benchmark,但说明作者希望系统具备比 resource-collection 更广的 embodied programmability:一旦有可执行 API 和 verifier,程序级 skill accumulation 也能扩展到 building 类任务。

5.2 具体数值

Exploration

  • VOYAGER 在 160 次 prompting iterations 内发现 63 个 unique items
  • 论文摘要与正文都报告:相较 baseline,VOYAGER 获得 3.3× 更多 unique items。

Tech tree mastery(Table 1)

MethodWooden ToolStone ToolIron ToolDiamond Tool
ReActN/A (0/3)N/A (0/3)N/A (0/3)N/A (0/3)
Reflexion92 ± 72 (3/3)94 ± 72 (3/3)135 ± 103 (3/3)N/A (0/3)
AutoGPT7 ± 2 (3/3)9 ± 4 (3/3)29 ± 11 (3/3)N/A (0/3)
VOYAGER w/o Skill Library6 ± 2 (3/3)11 ± 2 (3/3)21 ± 7 (3/3)N/A (0/3)
VOYAGER (Ours)N/A (0/3)N/A (0/3)N/A (0/3)102 (1/3)

这张表在 PDF 文本抽取里有换行错位,但结合正文解释可以明确读出结论:VOYAGER 是唯一在预算内解锁 diamond tool 的方法;相较 baselines,作者总结 wooden / stone / iron milestone 分别快 15.3× / 8.5× / 6.4×。同时,去掉 skill library 后虽然前期 wooden / stone / iron 仍能推进,但无法到达 diamond tool,说明长期知识积累对高层 tech tree 目标是必要的。

Zero-shot generalization(Table 2)

MethodDiamond PickaxeGolden SwordLava BucketCompass
ReActN/A (0/3)N/A (0/3)N/A (0/3)N/A (0/3)
ReflexionN/A (0/3)N/A (0/3)N/A (0/3)N/A (0/3)
AutoGPTN/A (0/3)N/A (0/3)N/A (0/3)N/A (0/3)
AutoGPT w/ Our Skill Library39 (1/3)30 (1/3)N/A (0/3)30 (2/3)
VOYAGER w/o Skill Library36 (2/3)30 ± 9 (3/3)27 ± 9 (3/3)26 ± 3 (3/3)
VOYAGER (Ours)19 ± 3 (3/3)18 ± 7 (3/3)21 ± 5 (3/3)18 ± 2 (3/3)

这里最值得注意的不是“VOYAGER 也能成功”,而是它在新世界、清空 inventory、面对未见任务时仍能稳定成功 3/3。AutoGPT 即便拿到 VOYAGER 的 skill library 也只能部分提升,说明性能收益不只是来自 task decomposition,更来自 VOYAGER 自己的程序生成、反馈修正与 skill retrieval 协同机制。

5.3 Ablation 与附加发现

  • 去掉 skill library 会明显伤害长期上限:VOYAGER w/o Skill Library 在较浅层 tech tree 和部分 unseen tasks 上还能运行,但高难 milestone 与跨任务复用显著变差。
  • retrieval 本身具有迁移价值:AutoGPT + VOYAGER skill library 比原版 AutoGPT 好,说明 skill library 不只是 VOYAGER 自己可用的内部缓存,而是包含真正有用的可执行知识。
  • warm-up curriculum 不是可有可无的 prompt trick:正文多次强调 baseline 难以处理“discover as many diverse things as possible”这类抽象目标,而 curriculum 把它收缩为局部可验证任务,才使探索曲线持续向上。

5.4 局限性

作者明确或隐含承认了几类限制:

  • 依赖 black-box frontier LLM:系统的 planner、coder、critic 都重度依赖 GPT-4 / GPT-3.5,成本与可复现性受 API 质量影响。
  • 不处理低层感知与控制:论文依赖 Mineflayer 高层 API,因此无法直接说明 VOYAGER 在 raw pixels、连续控制或真实机器人上的效果。
  • 工程启发式仍然不少:例如第一个任务固定为 Mine 1 wood log、背包满时强制引入 chest 任务、warm-up schedule 手工设定,说明“完全自动 lifelong learning”仍带有较强 system engineering 痕迹。
  • diamond milestone 仍非完全稳健:虽然 VOYAGER 是唯一到达 diamond tool 的方法,但表中也只有 1/3 成功,说明高难长时程组合任务仍未彻底解决。

5.5 总结

总体上,这篇论文证明了一个很强的 system-level 命题:即便完全不微调参数,只要把任务生成、程序执行、环境反馈、自验证和技能记忆组织成闭环,black-box LLM 也可以在 open-ended embodied world 里表现出近似 lifelong learning 的能力。VOYAGER 的真正贡献不是某个新 loss,而是给出了一个后来很多 agentic RL / embodied LLM work 都在复用的架构母板。