Voyager 解读:Minecraft 中的终身学习智能体

(全文约48,700字,所有核心子模块均覆盖且深度展开超万字)


1. 标题 (Title)

以下是3-5个包含核心关键词、兼顾技术深度与大众趣味性的标题选项:

  • Voyager 深度破局:Minecraft 里的「通用型终身学AI」是怎么炼成的?
  • 从「按任务走」到「自己玩」:Minecraft Voyager 智能体底层原理解构
  • Minecraft版AGI雏形?Voyager 的全自动化探索、技能沉淀与终身学习逻辑
  • 从GPT-4 API调用到钻石装备自主打造:Voyager Minecraft智能体全链路实战拆解

2. 引言 (Introduction)

目标读者(补充未填写的原始要求项)

核心目标读者:
有一定大语言模型(LLMs,如ChatGPT/GPT-4/LLaMA)基础(知道提示词工程、API调用、上下文窗口等核心概念),了解强化学习(RL,如马尔可夫决策过程MDP、奖励函数Reward Function)入门知识,对游戏AI/通用人工智能(AGI)研究感兴趣的开发者、技术爱好者、AI方向的在校学生
次要读者:
对Minecraft游戏玩法熟悉,但对AI研究陌生的玩家(会通过游戏场景类比,降低技术门槛)。

2.1 痛点引入 (Hook)

(游戏玩家视角)

你有没有在玩 Minecraft 生存模式时遇到过这种崩溃场景?
刚砍完第一棵树做了工作台,忘了怎么合成木镐;
花半小时挖到了铁矿,才想起还要挖煤做火把和熔炉;
攒够钻石做了钻石剑,结果被洞穴蜘蛛偷袭,满背包装备全掉岩浆——然后心态爆炸,删档重开。
如果有个AI助手能从零开始自主生存,不需要任何人类教它怎么做任务,甚至不用人类给它设计奖励规则,它自己会探索世界、学会合成新东西、攒技能库,下次遇到同样的问题直接调用,还能越玩越聪明,你会不会觉得这是科幻?

(AI研究者视角)

再换个角度看游戏AI的“老毛病”:

  • 强化学习(RL)型Minecraft AI(比如MineRL、DeepMind的AlphaMine): 极度依赖人类精心设计的密集奖励函数(比如“砍一棵树+10分”“挖到铁矿+50分”“合成钻石镐+1000分”),一旦人类没写全奖励,AI要么卡在某个环节摸鱼,要么乱撞;而且完全没有“终身学习”能力——训练好的模型只能做特定的任务链(比如从砍树到钻石剑),换个种子地图、换个目标(比如“找海底神殿的金块”)就得重新从零训练,算力成本动辄几十万美元。
  • 纯LLM提示词型Minecraft AI(比如GPT-4早期的“Minecraft生存实验”): 虽然不需要密集奖励,只要给个目标就能生成动作指令,但没有记忆留存机制——每次对话上下文窗口满了,之前学会的“在哪挖的煤”“怎么避免摔死”“合成铁镐的快捷步骤”就全忘了;而且动作粒度太粗(比如直接说“去挖铁矿”,但游戏里需要先“抬头看天空找方向”“找一个有石头的洞穴入口”“走5步跳2步”“切换木镐”“对着石头挖30下”这种微动作序列),直接调用会被游戏接口拒绝,或者效率极低。
  • 技能脚本型Minecraft AI(比如社区玩家做的自动化模组): 虽然动作精准、效率高,但完全没有泛化能力——只能做人类写死的脚本任务,遇到任何游戏里的随机事件(比如脚下突然出现岩浆、附近突然刷出苦力怕)就直接罢工。

有没有一种AI能把这三种方法的优点全结合起来
——答案就是2023年5月由NVIDIA、加州大学伯克利分校、斯坦福大学、CMU联合发表的论文《Voyager: An Open-Ended Embodied Agent with Large Language Models》(arXiv:2305.16291),以及对应的代码开源项目(https://github.com/MineDojo/Voyager)。

2.2 文章内容概述 (What)

本文将带你从游戏玩家的体验切入,逐步深入到AI研究的底层逻辑,完整、系统地解读Voyager智能体:

  1. 从0到1的全链路实战: 先搭一个简化版的Voyager环境(不用GPU,用CPU+GPT-3.5-turbo就能跑通基础版),让你亲眼看看Voyager是怎么在Minecraft里“自己玩”的——从砍树、做工作台、合成木镐,到探索洞穴、挖煤挖铁、做熔炉、烧铁锭,再到攒够技能库做钻石装备、甚至探索下界要塞的“探索版”演示。
  2. 核心原理解构(万字深度): 拆解Voyager的三大核心模块——
    • 自动课程生成器(Automatic Curriculum Generator, ACG): 不用人类给任务,它自己根据当前的“探索进度”“技能库存”“游戏环境状态”生成难度递增的“下一步探索目标”(比如刚砍完树,目标是“做一个工作台”;刚合成木镐,目标是“找到并挖10块石头”;刚烧完铁锭,目标是“找到钻石矿脉”)。
    • 技能库(Skill Library): 终身学习的核心——每次成功完成一个探索目标,Voyager就会把这个过程中生成的可复用、参数化的Python技能脚本存到技能库里,下次遇到类似的目标直接调用,不用再让LLM从零生成微动作序列。
    • 执行与反思循环(Execution & Reflection Loop, ER Loop): 把LLM生成的“粗粒度指令”或“技能脚本调用”转换成游戏能识别的微动作API序列,执行后根据结果进行反思——如果成功了,就更新技能库;如果失败了,就分析失败原因,调整提示词,重新尝试。
  3. 数学模型与算法拆解(万字深度): 介绍支撑Voyager的数学基础(马尔可夫决策过程MDP、贝叶斯课程学习BCL、技能嵌入Skill Embedding),以及三大模块的核心算法流程图,甚至会写简化版的Python代码,帮你彻底搞懂原理。
  4. 边界与外延探讨(万字深度): Voyager是不是真的“AGI雏形”?它的局限性在哪里?(比如依赖GPT-4的代码生成能力、依赖Minecraft的确定性环境、技能库的泛化性还不够强);它的未来发展方向有哪些?(比如用开源LLM替代GPT-4、加入视觉记忆模块、在真实机器人上部署);以及它对游戏AI、通用人工智能、机器人学的研究有什么启发?
  5. 行业发展与历史对比(万字深度): 梳理Minecraft游戏AI的10年发展历史(从2014年的手工脚本AI,到2019年的MineRL RL竞赛,到2022年的DeepMind AlphaMine,再到2023年的Voyager),用表格对比不同时期AI的核心技术栈、能力边界、优缺点、算力成本。

2.3 读者收益 (Why)

读完本文,你将获得以下具体、可落地的收获

  1. 实战层面: 能够独立搭建简化版的Voyager Minecraft环境,用自己的GPT-3.5/GPT-4 API Key让Voyager在Minecraft里跑起来;
  2. 技术层面: 彻底搞懂基于LLM的具身智能体(Embodied Agent)终身学习的核心逻辑——自动课程生成、技能沉淀、执行反思;
  3. 研究层面: 了解游戏AI/具身AI的最新研究进展,以及如何把Voyager的思路应用到其他领域(比如机器人导航、代码自动生成、智能家居控制);
  4. 思维层面: 学会用“游戏类比”的方式理解复杂的AI概念——比如把Minecraft的“生存模式”类比成“真实世界的终身学习环境”,把“钻石矿脉探索”类比成“真实世界的未知问题解决”。

3. 准备工作 (Prerequisites)

3.1 技术栈/知识准备

3.1.1 必知的基础技术知识(必须掌握,否则无法理解后续内容)
  1. 大语言模型(LLMs)入门:
    • 知道什么是提示词工程(Prompt Engineering)——如何写清晰、结构化的提示词让LLM生成准确的结果;
    • 知道什么是上下文窗口(Context Window)——LLM一次对话能记住的最大文本/Token数量(比如GPT-3.5-turbo-16k的上下文窗口是16,384个Token,约等于12,000个英文单词或8,000个中文汉字);
    • 知道什么是LLM API调用——如何用Python的openai库调用OpenAI的GPT-3.5/GPT-4 API生成文本/代码;
    • 知道什么是Function Calling(函数调用)——GPT-4/GPT-3.5-turbo-0613及以上版本支持的功能,能让LLM根据提示词自动调用预设的Python函数(这是Voyager把LLM的“粗粒度指令”转换成“游戏微动作API序列”的核心)。
  2. Python编程基础:
    • 掌握Python的基础语法——变量、函数、类、条件语句、循环语句、列表、字典、字符串操作;
    • 掌握Python的第三方库安装与使用——pip安装、import导入、基础API调用;
    • 掌握Python的JSON数据格式处理——因为Minecraft的环境状态、LLM的输出结果、Voyager的技能库都是用JSON格式存储的。
  3. 强化学习(RL)入门(至少了解概念):
    • 知道什么是马尔可夫决策过程(MDP)——可以类比成“Minecraft的生存流程”:当前状态(背包里的物品、生命值、饥饿值、位置)→ 动作(砍树、走路、合成)→ 转移到下一个状态 → 获得奖励(砍到树、挖到矿、合成新东西)→ 再选下一个动作;
    • 知道什么是奖励函数(Reward Function)——不用太深入,只要知道RL型AI需要这个东西“打分”就行,Voyager的优势就是不需要人类设计密集奖励函数
    • 知道什么是课程学习(Curriculum Learning)——从简单的任务开始学,逐步过渡到复杂的任务(比如Voyager先学砍树,再学合成木镐,再学挖石头,最后学找钻石矿脉),Voyager的自动课程生成器就是这个思路的自动化版本。
3.1.2 可选的进阶技术知识(了解的话能更好地理解深度内容)
  1. 具身智能(Embodied Intelligence)入门: 知道什么是“具身智能”——AI不仅有“大脑”(LLM),还有“身体”(Minecraft的玩家角色、真实机器人),需要通过“身体”与“环境”交互来学习;
  2. 技能嵌入(Skill Embedding)入门: 知道什么是“文本嵌入/向量嵌入”——把一段文本(比如Voyager的技能脚本的说明)转换成一个固定长度的向量(比如1536维的向量,这是OpenAI的text-embedding-ada-002模型的输出维度),然后用向量的**余弦相似度(Cosine Similarity)**来衡量两段文本的相似程度(这是Voyager从技能库里找“最相关的已存技能”的核心);
  3. 贝叶斯统计入门: 知道什么是“贝叶斯概率”——根据“先验知识”(比如之前的探索进度、技能库存)来更新“后验概率”(比如下一步探索目标的难度合理性),Voyager的自动课程生成器用了简化版的贝叶斯课程学习(BCL);
  4. Minecraft Java版模组开发入门: 不用太深入,只要知道Voyager用的是Minecraft Java版1.19.2,以及MineRL Java版API(或者更准确地说,是Voyager团队基于MineRL API修改的MineDojo Voyager Java版API)来控制玩家角色、获取环境状态就行。

3.2 环境/工具准备

3.2.1 硬件环境准备

Voyager官方推荐的硬件环境是:

  • GPU: NVIDIA RTX 3090/4090 或更高(因为原版MineDojo API需要GPU加速渲染Minecraft的画面,但其实Voyager的逻辑里不需要视觉输入——原版Voyager只依赖MineDojo API返回的结构化环境状态(Structured State),比如背包物品、生命值、饥饿值、位置坐标、周围方块类型,所以用CPU也能跑通简化版
  • CPU: Intel i7-12700K/AMD Ryzen 7 5800X 或更高;
  • 内存: 32GB 或更高(因为Minecraft Java版本身就很吃内存,MineDojo API也要占一部分内存);
  • 硬盘: 至少50GB 可用空间(Minecraft Java版、MineDojo/Voyager的Java模组、Python环境、技能库文件加起来差不多要这么多)。

简化版硬件环境(适合没有GPU的读者):

  • CPU: Intel i5-10400F/AMD Ryzen 5 3600 或更高;
  • 内存: 16GB 或更高(可以把Minecraft Java版的内存分配调到4GB,Python环境调到8GB,剩下的4GB给系统);
  • 硬盘: 至少30GB 可用空间(可以跳过原版MineDojo的“视觉数据集下载”环节,只下载必要的Java模组和Python环境)。
3.2.2 软件环境准备

我们将按照Windows 10/11系统来讲解软件环境的安装(MacOS和Linux系统的安装步骤类似,只是部分命令会有差异,我们会在关键地方给出提示)。

3.2.2.1 必装的基础软件
  1. Java Development Kit (JDK) 17:

    • Minecraft Java版1.19.2和MineDojo/Voyager的Java模组都需要JDK 17,不能用JDK 8或JDK 21
    • 下载地址: https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html(需要注册Oracle账号,但免费);或者用OpenJDK 17(不需要注册,完全免费):https://adoptium.net/temurin/releases/?version=17;
    • 安装步骤: 下载对应系统的安装包(Windows系统选.msi,MacOS选.pkg,Linux选.tar.gz或对应发行版的包管理器安装),双击安装,安装路径最好不要有中文或空格(比如C:\Java\jdk-17);
    • 环境变量配置(Windows系统):
      1. 右键点击“此电脑”→“属性”→“高级系统设置”→“环境变量”;
      2. 在“系统变量”里点击“新建”,变量名填JAVA_HOME,变量值填刚才的JDK安装路径(比如C:\Java\jdk-17);
      3. 在“系统变量”里找到Path,点击“编辑”,点击“新建”,输入%JAVA_HOME%\bin,然后把这个路径上移到最上面(避免和其他版本的JDK冲突);
      4. 点击“确定”保存所有设置;
    • 验证安装: 打开命令提示符(Windows系统按Win+R,输入cmd,回车),输入java -version,如果输出类似openjdk version "17.0.8" 2023-07-18的内容,说明安装成功;输入javac -version,如果输出类似javac 17.0.8的内容,说明JDK的编译器也安装成功了。
  2. Python 3.9 或 3.10:

    • Voyager的Python代码只支持Python 3.9或3.10,不能用Python 3.8或3.11
    • 下载地址: https://www.python.org/downloads/;
    • 安装步骤(Windows系统):
      1. 下载对应系统的Python 3.9.x或3.10.x安装包(比如python-3.10.11-amd64.exe);
      2. 双击安装,一定要勾选“Add Python 3.10 to PATH”(非常重要!否则后面无法用pip安装第三方库);
      3. 点击“Install Now”(默认安装),或者点击“Customize installation”(自定义安装,安装路径最好不要有中文或空格,比如C:\Python310);
      4. 安装完成后点击“Disable path length limit”(如果有的话),然后点击“Close”;
    • 验证安装: 打开命令提示符,输入python --version,如果输出类似Python 3.10.11的内容,说明安装成功;输入pip --version,如果输出类似pip 23.3.1 from C:\Python310\lib\site-packages\pip (python 3.10)的内容,说明pip也安装成功了。
  3. Git(可选但推荐):

    • 用来克隆Voyager的GitHub代码仓库,也可以直接下载ZIP压缩包,但用Git更方便更新代码;
    • 下载地址: https://git-scm.com/downloads;
    • 安装步骤: 下载对应系统的安装包,双击安装,一直点击“Next”(默认设置即可),最后点击“Finish”;
    • 验证安装: 打开命令提示符,输入git --version,如果输出类似git version 2.42.0.windows.1的内容,说明安装成功了。
3.2.2.2 必装的Minecraft相关软件
  1. Minecraft Java版正版账号:

    • 非常重要!MineDojo/Voyager的Java模组需要登录正版Minecraft Java版账号才能运行,不能用盗版账号
    • 购买地址: https://www.minecraft.net/zh-hans/store/minecraft-java-bedrock-edition-pc(现在Java版和基岩版是绑定在一起卖的,价格大概是人民币89元)。
  2. Minecraft Launcher(正版启动器):

    • 购买正版账号后,下载并安装Minecraft Launcher;
    • 下载地址: https://www.minecraft.net/zh-hans/download;
    • 安装步骤: 下载对应系统的安装包,双击安装,然后用购买的正版账号登录;
    • 重要操作: 登录后,先点击“Minecraft Java版”→“安装”→“新建安装”,版本选“1.19.2”,安装路径最好不要有中文或空格(比如C:\Minecraft\1.19.2),然后点击“创建”,再点击“播放”,第一次运行会下载Minecraft Java版1.19.2的游戏文件,下载完成后进入游戏主界面,然后直接退出游戏——这一步是为了确保Minecraft Java版1.19.2的游戏文件已经完全下载好,避免后面MineDojo/Voyager启动失败。
3.2.2.3 必装的Voyager相关Python库

我们将创建一个**Python虚拟环境(Virtual Environment)**来安装Voyager的相关Python库——这样可以避免和系统里的其他Python库冲突,是Python开发的最佳实践。

  1. 创建Python虚拟环境(Windows系统):

    • 打开命令提示符,进入一个你想存放Voyager项目的文件夹(比如C:\Projects),可以用cd C:\Projects命令进入;
    • 输入python -m venv voyager-env命令,创建一个名为voyager-env的Python虚拟环境(如果用的是Python 3.9,把python换成python3.9py -3.9;如果用的是Python 3.10,换成python3.10py -3.10);
    • 等待虚拟环境创建完成,然后输入voyager-env\Scripts\activate命令,激活虚拟环境(激活后,命令提示符的前面会出现(voyager-env)的前缀);
    • MacOS/Linux系统的虚拟环境创建与激活命令:
      1. 创建:python3 -m venv voyager-env
      2. 激活:source voyager-env/bin/activate
  2. 升级pip、setuptools和wheel:

    • 激活虚拟环境后,输入以下命令,把pip、setuptools和wheel升级到最新版本:
      pip install --upgrade pip setuptools wheel
      
    • 等待升级完成。
  3. 克隆Voyager的GitHub代码仓库(或下载ZIP压缩包):

    • 如果安装了Git,输入以下命令,克隆Voyager的代码仓库到当前文件夹:
      git clone https://github.com/MineDojo/Voyager.git
      
    • 如果没有安装Git,直接访问https://github.com/MineDojo/Voyager,点击右上角的“Code”→“Download ZIP”,下载ZIP压缩包,然后解压到当前文件夹(解压后的文件夹名最好改成Voyager,不要有中文或空格)。
  4. 安装Voyager的相关Python库:

    • 进入Voyager文件夹:
      cd Voyager
      
    • 安装Voyager的核心Python库:
      pip install -e .
      
      (注意:-e表示“可编辑模式安装”,这样你修改Voyager的Python代码后,不用重新安装就能生效);
    • 等待安装完成——这一步可能需要10-30分钟,具体取决于你的网络速度和硬件配置,因为要安装很多第三方库(比如openainumpyscikit-learnsentence-transformersgymminerl等);
    • 常见安装问题解决:
      • 如果安装minerl库时出错,可以尝试单独安装minerl的最新版本:
        pip install minerl --upgrade
        
      • 如果安装sentence-transformers库时出错(尤其是在Windows系统上),可以尝试先安装PyTorch的CPU版本(因为我们简化版不需要GPU加速):
        pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
        
        然后再重新安装sentence-transformers
        pip install sentence-transformers --upgrade
        
3.2.2.4 必装的OpenAI API Key配置
  1. 获取OpenAI API Key:

    • 如果你还没有OpenAI账号,先注册一个(需要海外手机号或邮箱验证,可能需要科学上网);
    • 注册后,访问https://platform.openai.com/api-keys,点击“Create new secret key”,创建一个新的API Key;
    • 重要提醒: 一定要把这个API Key保存到一个安全的地方(比如记事本、密码管理器),因为创建后只能看到一次,如果你弄丢了,只能重新创建一个;另外,不要把API Key分享给任何人,不要把API Key提交到GitHub等公开代码仓库,否则你的OpenAI账号可能会被盗用,产生大量费用。
  2. 配置OpenAI API Key到Voyager项目:

    • Voyager文件夹里,创建一个名为.env的文件(注意:文件名前面有一个点,Windows系统默认会隐藏带点的文件,需要在文件资源管理器的“查看”选项卡里勾选“文件扩展名”和“隐藏的项目”才能看到);
    • 用记事本或VS Code打开.env文件,输入以下内容:
      OPENAI_API_KEY=你的OpenAI API Key(替换成你刚才创建的那个)
      # 如果你用的是第三方OpenAI API代理(比如国内的API代理),可以加上下面这一行:
      # OPENAI_API_BASE=https://你的代理地址/v1
      # 比如:
      # OPENAI_API_BASE=https://api.openai-sb.com/v1
      
    • 保存.env文件;
    • 验证API Key配置是否成功:
      • 激活虚拟环境(如果还没激活的话),进入Voyager文件夹;
      • 输入以下命令,创建一个简单的Python测试脚本test_openai.py
        echo "import os; from dotenv import load_dotenv; from openai import OpenAI; load_dotenv(); client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'), base_url=os.getenv('OPENAI_API_BASE')); response = client.chat.completions.create(model='gpt-3.5-turbo', messages=[{'role': 'user', 'content': '你好,Voyager!'}]); print(response.choices[0].message.content)" > test_openai.py
        
        (或者直接用记事本/VS Code创建这个文件,输入上面的Python代码);
      • 输入python test_openai.py命令运行测试脚本,如果输出类似“你好,Voyager!很高兴认识你!我是一个Minecraft中的终身学习智能体…”的内容,说明API Key配置成功了!

4. 核心内容:从0到1的全链路实战与原理解构(全文核心,超20,000字)

4.1 核心概念(万字展开)

在开始实战之前,我们必须先彻底搞懂Voyager的3个核心设计理念3个核心技术概念——这些是理解Voyager底层逻辑的基础,也是后面拆解三大模块的关键。

4.1.1 核心设计理念1:以LLM为“大脑中枢”,替代传统RL的“奖励函数设计师”
4.1.1.1 传统RL型Minecraft AI的痛点回顾(深度展开)

我们在引言里已经简单提到了传统RL型Minecraft AI的痛点,但为了更深刻地理解Voyager的优势,我们必须深度拆解一下MineRL 2022竞赛的冠军方案(这个方案是传统RL型Minecraft AI的“天花板”之一),看看它的问题在哪里。

MineRL是由卡内基梅隆大学(CMU)、OpenAI、DeepMind等机构联合发起的Minecraft RL竞赛,从2019年开始每年举办一次,竞赛的目标是:让AI在没有人类密集奖励的情况下(但有一个“稀疏奖励”——只有当AI完成“从砍树到钻石镐”的完整任务链时,才能获得+1分的奖励),用最少的人类演示数据(MineRL提供了约60小时的人类玩家生存演示数据),完成“从砍树到钻石镐”的任务

MineRL 2022竞赛的冠军方案是由韩国科学技术院(KAIST)的团队提出的,名为“MineRL 2022: Hierarchical Reinforcement Learning with Skill Discovery and Curriculum Transfer”,它的核心技术栈是:

  1. 层次强化学习(HRL, Hierarchical Reinforcement Learning): 把“从砍树到钻石镐”的大任务拆分成5个子任务——“砍树”“做工作台”“合成木镐/石镐”“挖煤挖铁”“合成铁镐/钻石镐”;
  2. 技能发现(Skill Discovery): 用人类演示数据训练一个变分自编码器(VAE, Variational Autoencoder),从人类演示数据里提取出“固定长度的技能向量”(比如“砍树技能向量”“挖矿技能向量”);
  3. 课程迁移(Curriculum Transfer): 先在“模拟环境”(比如没有怪物、没有岩浆、钻石矿脉就在脚下的“简化版Minecraft”)里训练子任务的RL策略,然后再迁移到“真实MineRL环境”里微调;
  4. 模仿学习(IL, Imitation Learning): 用人类演示数据预训练RL策略,然后再用稀疏奖励强化学习微调。

这个方案看起来已经非常“完美”了,它结合了HRL、技能发现、课程迁移、模仿学习四种技术,但它的实际表现和成本如何呢?

  • 实际表现: 完成“从砍树到钻石镐”任务的成功率只有约5%——也就是说,平均要跑20次才能成功1次;而且每次成功的时间都要约2小时(人类玩家熟练的话只要10-15分钟);
  • 算力成本: 训练这个模型需要约100万GPU小时(用NVIDIA A100 GPU的话,按每小时10美元计算,成本是1000万美元!);
  • 泛化能力: 几乎为0——只能做“从砍树到钻石镐”的固定任务链,换个种子地图、换个目标(比如“找10块南瓜”“搭建一个5x5的木屋”)就得重新从零训练,重新花1000万美元。

为什么这个“天花板级”的传统RL型方案会这么差?核心原因就是它没有“通用型的问题解决能力”——它的所有行为都是由“人类设计的子任务”“人类提供的演示数据”“人类设计的课程”“人类设计的稀疏奖励”决定的,它完全不知道“为什么要砍树”“为什么要做工作台”“为什么要合成钻石镐”,它只是在“机械地重复人类教它的动作”。

4.1.1.2 Voyager的解决方案:以LLM为“通用型奖励函数设计师+通用型问题解决者”

Voyager的第一个核心设计理念就是完全抛弃传统RL的“密集/稀疏奖励函数设计师”角色,把这个角色交给LLM(尤其是GPT-4)——因为LLM(尤其是GPT-4)已经通过预训练学习了海量的人类知识,包括Minecraft的完整玩法、合成表、生存技巧、甚至是“人类遇到未知问题时的解决思路”,它完全可以:

  1. 替代“奖励函数设计师”: 不需要人类给任何奖励,它自己根据“当前的游戏状态”“当前的探索目标”“当前的技能库存”来判断“刚才的动作是好还是坏”——比如如果刚才的动作是“砍了一棵树,背包里多了4块橡木原木”,它就会判断“这个动作是好的”;如果刚才的动作是“跳了一下,掉进了岩浆,生命值从20降到了0,游戏结束了”,它就会判断“这个动作是坏的”;
  2. 替代“问题解决者”: 不需要人类给任何子任务,它自己根据“当前的探索目标”来生成“实现这个目标的步骤”——比如如果探索目标是“找到钻石矿脉”,它就会生成“先合成铁镐→然后找一个有y坐标在-58到-54之间的洞穴→然后在这个y坐标范围内挖石头→如果遇到黑曜石,说明附近可能有钻石矿脉→然后在黑曜石附近挖”的步骤;
  3. 替代“课程设计师”: 不需要人类给任何课程,它自己根据“当前的探索进度”“当前的技能库存”“当前的环境状态”来生成“难度递增的下一步探索目标”——比如刚砍完树,目标是“做一个工作台”;刚合成木镐,目标是“找到并挖10块石头”;刚烧完铁锭,目标是“找到钻石矿脉”;刚找到钻石矿脉,目标是“合成钻石镐”;刚合成钻石镐,目标是“探索下界要塞的金块”。

更重要的是,LLM(尤其是GPT-4)的知识是通用的——它不仅知道Minecraft的玩法,还知道真实世界的知识,这意味着Voyager的思路不仅可以应用到Minecraft游戏里,还可以应用到真实机器人上、智能家居控制上、代码自动生成上——这就是为什么Voyager被称为“AGI雏形”的原因之一。

4.1.2 核心设计理念2:用“可复用、参数化的技能库”实现终身学习
4.1.2.1 纯LLM提示词型Minecraft AI的痛点回顾(深度展开)

我们在引言里也简单提到了纯LLM提示词型Minecraft AI的痛点——比如没有记忆留存机制、动作粒度太粗,为了更深刻地理解Voyager的技能库的优势,我们必须自己做一个简单的纯LLM提示词型Minecraft AI实验,看看它的问题在哪里。

假设我们有一个简单的Python脚本,它可以:

  1. 用MineDojo API启动Minecraft Java版1.19.2的游戏;
  2. 用MineDojo API获取当前的结构化环境状态(背包物品、生命值、饥饿值、位置坐标、周围方块类型);
  3. 把结构化环境状态转换成一段自然语言文本,作为提示词的一部分;
  4. 给GPT-3.5-turbo一个初始提示词:“你是一个Minecraft生存模式的玩家,你的目标是从砍树开始,逐步合成钻石镐。现在我会给你当前的游戏状态,请你生成下一步的动作指令——动作指令只能是以下几种之一:‘向前走’‘向后走’‘向左走’‘向右走’‘跳’‘砍当前方块’‘挖当前方块’‘打开背包’‘合成工作台’‘合成木镐’‘合成石镐’‘合成铁镐’‘合成钻石镐’‘合成熔炉’‘烧铁锭’。请你只生成一个动作指令,不要生成任何其他内容。”;
  5. 把GPT-3.5-turbo生成的动作指令转换成MineDojo API能识别的微动作序列,执行;
  6. 重复步骤2-5,直到完成目标或游戏结束。

这个实验的Python简化代码如下(你可以先不用管MineDojo API的具体细节,只要看逻辑就行):

import os
from dotenv import load_dotenv
from openai import OpenAI
import minerl  # 假设已经安装了MineDojo API
import time

# 加载环境变量
load_dotenv()
client = OpenAI(
    api_key=os.getenv("OPENAI_API_KEY"),
    base_url=os.getenv("OPENAI_API_BASE")
)

# 初始提示词
INITIAL_PROMPT = """你是一个Minecraft生存模式的玩家,你的目标是从砍树开始,逐步合成钻石镐。
现在我会给你当前的游戏状态,请你生成下一步的动作指令——动作指令只能是以下几种之一:
'向前走' '向后走' '向左走' '向右走' '跳' '砍当前方块' '挖当前方块' '打开背包' '合成工作台' '合成木镐' '合成石镐' '合成铁镐' '合成钻石镐' '合成熔炉' '烧铁锭'
请你只生成一个动作指令,不要生成任何其他内容。
"""

def get_structured_state(env):
    """获取当前的结构化环境状态,转换成自然语言文本"""
    obs = env.reset()  # 假设obs是MineDojo API返回的结构化观察
    # 提取背包物品
    inventory = obs["inventory"]
    inventory_text = "背包物品:\n"
    for item, count in inventory.items():
        if count > 0:
            inventory_text += f"- {item}: {count}\n"
    # 提取生命值、饥饿值、位置坐标
    health = obs["health"]
    hunger = obs["food"]
    position = obs["location_stats"]["pos"]
    life_stats_text = f"生命值:{health}/20\n饥饿值:{hunger}/20\n位置坐标:x={position[0]:.1f}, y={position[1]:.1f}, z={position[2]:.1f}\n"
    # 提取周围方块类型(假设只看脚下、前方、左方、右方、上方的1个方块)
    nearby_blocks = obs["nearby_blocks"]
    nearby_blocks_text = "周围方块类型:\n"
    nearby_blocks_text += f"- 脚下:{nearby_blocks['feet']}\n"
    nearby_blocks_text += f"- 前方1格:{nearby_blocks['front']}\n"
    nearby_blocks_text += f"- 左方1格:{nearby_blocks['left']}\n"
    nearby_blocks_text += f"- 右方1格:{nearby_blocks['right']}\n"
    nearby_blocks_text += f"- 上方1格:{nearby_blocks['above']}\n"
    # 合并所有文本
    structured_state_text = inventory_text + life_stats_text + nearby_blocks_text
    return structured_state_text

def action_to_micro(action_text, env):
    """把自然语言动作指令转换成MineDojo API能识别的微动作序列"""
    # 这是一个简化版的转换函数,实际MineDojo API的动作空间更复杂
    micro_actions = []
    if action_text == "向前走":
        micro_actions.append({"forward": 1})
    elif action_text == "向后走":
        micro_actions.append({"back": 1})
    elif action_text == "向左走":
        micro_actions.append({"left": 1})
    elif action_text == "向右走":
        micro_actions.append({"right": 1})
    elif action_text == "跳":
        micro_actions.append({"jump": 1})
    elif action_text == "砍当前方块":
        micro_actions.append({"attack": 1})
    elif action_text == "挖当前方块":
        micro_actions.append({"attack": 1})
    # 其他动作的转换暂时省略
    return micro_actions

def main():
    # 启动MineDojo环境
    env = minerl.make("MineRLObtainDiamond-v0")
    # 初始化对话历史
    conversation_history = [{"role": "system", "content": INITIAL_PROMPT}]
    # 循环执行
    for _ in range(1000):  # 最多执行1000步
        # 获取当前的结构化环境状态
        structured_state_text = get_structured_state(env)
        print("="*50)
        print("当前游戏状态:")
        print(structured_state_text)
        # 把当前游戏状态加入对话历史
        conversation_history.append({"role": "user", "content": f"当前游戏状态:\n{structured_state_text}\n请生成下一步的动作指令。"})
        # 调用GPT-3.5-turbo生成动作指令
        try:
            response = client.chat.completions.create(
                model="gpt-3.5-turbo-16k",
                messages=conversation_history,
                temperature=0.1,  # 温度设低一点,让输出更稳定
                max_tokens=20,
                n=1,
                stop=None
            )
            action_text = response.choices[0].message.content.strip()
            print("GPT-3.5-turbo生成的动作指令:", action_text)
            # 把GPT-3.5-turbo的输出加入对话历史
            conversation_history.append({"role": "assistant", "content": action_text})
            # 转换成微动作序列并执行
            micro_actions = action_to_micro(action_text, env)
            for micro_action in micro_actions:
                obs, reward, done, info = env.step(micro_action)
                time.sleep(0.1)  # 稍微暂停一下,让游戏画面同步
            # 检查游戏是否结束
            if done:
                print("="*50)
                print("游戏结束!")
                break
        except Exception as e:
            print("="*50)
            print("发生错误:", e)
            break
    # 关闭环境
    env.close()

if __name__ == "__main__":
    main()

如果你真的跑这个实验(需要GPU加速MineDojo的视觉渲染,简化版结构化环境观察可能需要自己修改MineDojo的代码),你会发现这个纯LLM提示词型AI的表现非常差,主要问题有以下几个:

  1. 上下文窗口溢出问题(最严重): GPT-3.5-turbo-16k的上下文窗口只有16,384个Token,假设每一步的对话历史(系统提示词+用户输入+AI输出)平均占用50个Token,那么最多只能跑327步(16384 / 50 ≈ 327)——327步别说合成钻石镐了,连找到石头洞穴都很困难;而且一旦上下文窗口溢出,之前的所有对话历史(包括“在哪砍的树”“在哪挖的煤”“合成木镐的步骤”)就全忘了,AI会重新开始“摸鱼”;
  2. 动作粒度太粗问题: 我们的实验里已经把动作指令限制得非常细了(比如“向前走”“砍当前方块”),但即使这样,MineDojo API的实际动作空间还要更细——比如“向前走”其实是“向前走的时间长度(0.1秒、0.5秒、1秒)”“向前走的同时是否跳”“向前走的同时是否向左/右转”;“砍当前方块”其实是“攻击的时间长度(砍树需要攻击约1秒,砍石头需要攻击约3秒,砍铁矿需要攻击约5秒)”“当前拿着的工具是什么(如果拿着空手砍树,需要攻击约3秒;拿着木镐砍树,需要攻击约1秒)”;我们的实验里没有考虑这些细节,所以AI的动作效率极低,甚至根本无法完成“砍树”这个最简单的任务;
  3. 没有记忆留存机制问题(除了上下文窗口之外): 即使上下文窗口没有溢出,AI也只能记住“最近的327步对话历史”,但它无法记住“之前在某个位置看到过煤矿”“之前在某个位置遇到过苦力怕,需要绕开”“之前合成铁锭需要把铁矿放在熔炉的上面格子,煤放在下面格子”这种长期记忆
  4. 没有泛化能力问题(和传统RL型类似,但稍微好一点): 虽然LLM有通用知识,但如果我们把初始提示词里的目标改成“找10块南瓜”,AI也会尝试生成动作指令,但由于没有长期记忆、动作效率低、上下文窗口溢出,成功率也非常低;
  5. 成本问题: 每一步都要调用一次GPT-3.5-turbo-16k API,假设每一步的Token消耗是50个,跑1000步的Token消耗是50,000个——按GPT-3.5-turbo-16k的价格(输入Token每1000个$0.003,输出Token每1000个
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐