Voyager 解读:Minecraft 中的终身学习智能体
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智能体:
- 从0到1的全链路实战: 先搭一个简化版的Voyager环境(不用GPU,用CPU+GPT-3.5-turbo就能跑通基础版),让你亲眼看看Voyager是怎么在Minecraft里“自己玩”的——从砍树、做工作台、合成木镐,到探索洞穴、挖煤挖铁、做熔炉、烧铁锭,再到攒够技能库做钻石装备、甚至探索下界要塞的“探索版”演示。
- 核心原理解构(万字深度): 拆解Voyager的三大核心模块——
- 自动课程生成器(Automatic Curriculum Generator, ACG): 不用人类给任务,它自己根据当前的“探索进度”“技能库存”“游戏环境状态”生成难度递增的“下一步探索目标”(比如刚砍完树,目标是“做一个工作台”;刚合成木镐,目标是“找到并挖10块石头”;刚烧完铁锭,目标是“找到钻石矿脉”)。
- 技能库(Skill Library): 终身学习的核心——每次成功完成一个探索目标,Voyager就会把这个过程中生成的可复用、参数化的Python技能脚本存到技能库里,下次遇到类似的目标直接调用,不用再让LLM从零生成微动作序列。
- 执行与反思循环(Execution & Reflection Loop, ER Loop): 把LLM生成的“粗粒度指令”或“技能脚本调用”转换成游戏能识别的微动作API序列,执行后根据结果进行反思——如果成功了,就更新技能库;如果失败了,就分析失败原因,调整提示词,重新尝试。
- 数学模型与算法拆解(万字深度): 介绍支撑Voyager的数学基础(马尔可夫决策过程MDP、贝叶斯课程学习BCL、技能嵌入Skill Embedding),以及三大模块的核心算法流程图,甚至会写简化版的Python代码,帮你彻底搞懂原理。
- 边界与外延探讨(万字深度): Voyager是不是真的“AGI雏形”?它的局限性在哪里?(比如依赖GPT-4的代码生成能力、依赖Minecraft的确定性环境、技能库的泛化性还不够强);它的未来发展方向有哪些?(比如用开源LLM替代GPT-4、加入视觉记忆模块、在真实机器人上部署);以及它对游戏AI、通用人工智能、机器人学的研究有什么启发?
- 行业发展与历史对比(万字深度): 梳理Minecraft游戏AI的10年发展历史(从2014年的手工脚本AI,到2019年的MineRL RL竞赛,到2022年的DeepMind AlphaMine,再到2023年的Voyager),用表格对比不同时期AI的核心技术栈、能力边界、优缺点、算力成本。
2.3 读者收益 (Why)
读完本文,你将获得以下具体、可落地的收获:
- 实战层面: 能够独立搭建简化版的Voyager Minecraft环境,用自己的GPT-3.5/GPT-4 API Key让Voyager在Minecraft里跑起来;
- 技术层面: 彻底搞懂基于LLM的具身智能体(Embodied Agent)终身学习的核心逻辑——自动课程生成、技能沉淀、执行反思;
- 研究层面: 了解游戏AI/具身AI的最新研究进展,以及如何把Voyager的思路应用到其他领域(比如机器人导航、代码自动生成、智能家居控制);
- 思维层面: 学会用“游戏类比”的方式理解复杂的AI概念——比如把Minecraft的“生存模式”类比成“真实世界的终身学习环境”,把“钻石矿脉探索”类比成“真实世界的未知问题解决”。
3. 准备工作 (Prerequisites)
3.1 技术栈/知识准备
3.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序列”的核心)。
- Python编程基础:
- 掌握Python的基础语法——变量、函数、类、条件语句、循环语句、列表、字典、字符串操作;
- 掌握Python的第三方库安装与使用——
pip安装、import导入、基础API调用; - 掌握Python的JSON数据格式处理——因为Minecraft的环境状态、LLM的输出结果、Voyager的技能库都是用JSON格式存储的。
- 强化学习(RL)入门(至少了解概念):
- 知道什么是马尔可夫决策过程(MDP)——可以类比成“Minecraft的生存流程”:当前状态(背包里的物品、生命值、饥饿值、位置)→ 动作(砍树、走路、合成)→ 转移到下一个状态 → 获得奖励(砍到树、挖到矿、合成新东西)→ 再选下一个动作;
- 知道什么是奖励函数(Reward Function)——不用太深入,只要知道RL型AI需要这个东西“打分”就行,Voyager的优势就是不需要人类设计密集奖励函数;
- 知道什么是课程学习(Curriculum Learning)——从简单的任务开始学,逐步过渡到复杂的任务(比如Voyager先学砍树,再学合成木镐,再学挖石头,最后学找钻石矿脉),Voyager的自动课程生成器就是这个思路的自动化版本。
3.1.2 可选的进阶技术知识(了解的话能更好地理解深度内容)
- 具身智能(Embodied Intelligence)入门: 知道什么是“具身智能”——AI不仅有“大脑”(LLM),还有“身体”(Minecraft的玩家角色、真实机器人),需要通过“身体”与“环境”交互来学习;
- 技能嵌入(Skill Embedding)入门: 知道什么是“文本嵌入/向量嵌入”——把一段文本(比如Voyager的技能脚本的说明)转换成一个固定长度的向量(比如1536维的向量,这是OpenAI的
text-embedding-ada-002模型的输出维度),然后用向量的**余弦相似度(Cosine Similarity)**来衡量两段文本的相似程度(这是Voyager从技能库里找“最相关的已存技能”的核心); - 贝叶斯统计入门: 知道什么是“贝叶斯概率”——根据“先验知识”(比如之前的探索进度、技能库存)来更新“后验概率”(比如下一步探索目标的难度合理性),Voyager的自动课程生成器用了简化版的贝叶斯课程学习(BCL);
- 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 必装的基础软件
-
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系统):
- 右键点击“此电脑”→“属性”→“高级系统设置”→“环境变量”;
- 在“系统变量”里点击“新建”,变量名填
JAVA_HOME,变量值填刚才的JDK安装路径(比如C:\Java\jdk-17); - 在“系统变量”里找到
Path,点击“编辑”,点击“新建”,输入%JAVA_HOME%\bin,然后把这个路径上移到最上面(避免和其他版本的JDK冲突); - 点击“确定”保存所有设置;
- 验证安装: 打开命令提示符(Windows系统按
Win+R,输入cmd,回车),输入java -version,如果输出类似openjdk version "17.0.8" 2023-07-18的内容,说明安装成功;输入javac -version,如果输出类似javac 17.0.8的内容,说明JDK的编译器也安装成功了。
-
Python 3.9 或 3.10:
- Voyager的Python代码只支持Python 3.9或3.10,不能用Python 3.8或3.11!
- 下载地址: https://www.python.org/downloads/;
- 安装步骤(Windows系统):
- 下载对应系统的Python 3.9.x或3.10.x安装包(比如
python-3.10.11-amd64.exe); - 双击安装,一定要勾选“Add Python 3.10 to PATH”(非常重要!否则后面无法用
pip安装第三方库); - 点击“Install Now”(默认安装),或者点击“Customize installation”(自定义安装,安装路径最好不要有中文或空格,比如
C:\Python310); - 安装完成后点击“Disable path length limit”(如果有的话),然后点击“Close”;
- 下载对应系统的Python 3.9.x或3.10.x安装包(比如
- 验证安装: 打开命令提示符,输入
python --version,如果输出类似Python 3.10.11的内容,说明安装成功;输入pip --version,如果输出类似pip 23.3.1 from C:\Python310\lib\site-packages\pip (python 3.10)的内容,说明pip也安装成功了。
-
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相关软件
-
Minecraft Java版正版账号:
- 非常重要!MineDojo/Voyager的Java模组需要登录正版Minecraft Java版账号才能运行,不能用盗版账号!
- 购买地址: https://www.minecraft.net/zh-hans/store/minecraft-java-bedrock-edition-pc(现在Java版和基岩版是绑定在一起卖的,价格大概是人民币89元)。
-
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开发的最佳实践。
-
创建Python虚拟环境(Windows系统):
- 打开命令提示符,进入一个你想存放Voyager项目的文件夹(比如
C:\Projects),可以用cd C:\Projects命令进入; - 输入
python -m venv voyager-env命令,创建一个名为voyager-env的Python虚拟环境(如果用的是Python 3.9,把python换成python3.9或py -3.9;如果用的是Python 3.10,换成python3.10或py -3.10); - 等待虚拟环境创建完成,然后输入
voyager-env\Scripts\activate命令,激活虚拟环境(激活后,命令提示符的前面会出现(voyager-env)的前缀); - MacOS/Linux系统的虚拟环境创建与激活命令:
- 创建:
python3 -m venv voyager-env; - 激活:
source voyager-env/bin/activate。
- 创建:
- 打开命令提示符,进入一个你想存放Voyager项目的文件夹(比如
-
升级pip、setuptools和wheel:
- 激活虚拟环境后,输入以下命令,把pip、setuptools和wheel升级到最新版本:
pip install --upgrade pip setuptools wheel - 等待升级完成。
- 激活虚拟环境后,输入以下命令,把pip、setuptools和wheel升级到最新版本:
-
克隆Voyager的GitHub代码仓库(或下载ZIP压缩包):
- 如果安装了Git,输入以下命令,克隆Voyager的代码仓库到当前文件夹:
git clone https://github.com/MineDojo/Voyager.git - 如果没有安装Git,直接访问https://github.com/MineDojo/Voyager,点击右上角的“Code”→“Download ZIP”,下载ZIP压缩包,然后解压到当前文件夹(解压后的文件夹名最好改成
Voyager,不要有中文或空格)。
- 如果安装了Git,输入以下命令,克隆Voyager的代码仓库到当前文件夹:
-
安装Voyager的相关Python库:
- 进入
Voyager文件夹:cd Voyager - 安装Voyager的核心Python库:
(注意:pip install -e .-e表示“可编辑模式安装”,这样你修改Voyager的Python代码后,不用重新安装就能生效); - 等待安装完成——这一步可能需要10-30分钟,具体取决于你的网络速度和硬件配置,因为要安装很多第三方库(比如
openai、numpy、scikit-learn、sentence-transformers、gym、minerl等); - 常见安装问题解决:
- 如果安装
minerl库时出错,可以尝试单独安装minerl的最新版本:pip install minerl --upgrade - 如果安装
sentence-transformers库时出错(尤其是在Windows系统上),可以尝试先安装PyTorch的CPU版本(因为我们简化版不需要GPU加速):
然后再重新安装pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpusentence-transformers:pip install sentence-transformers --upgrade
- 如果安装
- 进入
3.2.2.4 必装的OpenAI API Key配置
-
获取OpenAI API Key:
- 如果你还没有OpenAI账号,先注册一个(需要海外手机号或邮箱验证,可能需要科学上网);
- 注册后,访问https://platform.openai.com/api-keys,点击“Create new secret key”,创建一个新的API Key;
- 重要提醒: 一定要把这个API Key保存到一个安全的地方(比如记事本、密码管理器),因为创建后只能看到一次,如果你弄丢了,只能重新创建一个;另外,不要把API Key分享给任何人,不要把API Key提交到GitHub等公开代码仓库,否则你的OpenAI账号可能会被盗用,产生大量费用。
-
配置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:
(或者直接用记事本/VS Code创建这个文件,输入上面的Python代码);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 - 输入
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”,它的核心技术栈是:
- 层次强化学习(HRL, Hierarchical Reinforcement Learning): 把“从砍树到钻石镐”的大任务拆分成5个子任务——“砍树”“做工作台”“合成木镐/石镐”“挖煤挖铁”“合成铁镐/钻石镐”;
- 技能发现(Skill Discovery): 用人类演示数据训练一个变分自编码器(VAE, Variational Autoencoder),从人类演示数据里提取出“固定长度的技能向量”(比如“砍树技能向量”“挖矿技能向量”);
- 课程迁移(Curriculum Transfer): 先在“模拟环境”(比如没有怪物、没有岩浆、钻石矿脉就在脚下的“简化版Minecraft”)里训练子任务的RL策略,然后再迁移到“真实MineRL环境”里微调;
- 模仿学习(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的完整玩法、合成表、生存技巧、甚至是“人类遇到未知问题时的解决思路”,它完全可以:
- 替代“奖励函数设计师”: 不需要人类给任何奖励,它自己根据“当前的游戏状态”“当前的探索目标”“当前的技能库存”来判断“刚才的动作是好还是坏”——比如如果刚才的动作是“砍了一棵树,背包里多了4块橡木原木”,它就会判断“这个动作是好的”;如果刚才的动作是“跳了一下,掉进了岩浆,生命值从20降到了0,游戏结束了”,它就会判断“这个动作是坏的”;
- 替代“问题解决者”: 不需要人类给任何子任务,它自己根据“当前的探索目标”来生成“实现这个目标的步骤”——比如如果探索目标是“找到钻石矿脉”,它就会生成“先合成铁镐→然后找一个有y坐标在-58到-54之间的洞穴→然后在这个y坐标范围内挖石头→如果遇到黑曜石,说明附近可能有钻石矿脉→然后在黑曜石附近挖”的步骤;
- 替代“课程设计师”: 不需要人类给任何课程,它自己根据“当前的探索进度”“当前的技能库存”“当前的环境状态”来生成“难度递增的下一步探索目标”——比如刚砍完树,目标是“做一个工作台”;刚合成木镐,目标是“找到并挖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脚本,它可以:
- 用MineDojo API启动Minecraft Java版1.19.2的游戏;
- 用MineDojo API获取当前的结构化环境状态(背包物品、生命值、饥饿值、位置坐标、周围方块类型);
- 把结构化环境状态转换成一段自然语言文本,作为提示词的一部分;
- 给GPT-3.5-turbo一个初始提示词:“你是一个Minecraft生存模式的玩家,你的目标是从砍树开始,逐步合成钻石镐。现在我会给你当前的游戏状态,请你生成下一步的动作指令——动作指令只能是以下几种之一:‘向前走’‘向后走’‘向左走’‘向右走’‘跳’‘砍当前方块’‘挖当前方块’‘打开背包’‘合成工作台’‘合成木镐’‘合成石镐’‘合成铁镐’‘合成钻石镐’‘合成熔炉’‘烧铁锭’。请你只生成一个动作指令,不要生成任何其他内容。”;
- 把GPT-3.5-turbo生成的动作指令转换成MineDojo API能识别的微动作序列,执行;
- 重复步骤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的表现非常差,主要问题有以下几个:
- 上下文窗口溢出问题(最严重): GPT-3.5-turbo-16k的上下文窗口只有16,384个Token,假设每一步的对话历史(系统提示词+用户输入+AI输出)平均占用50个Token,那么最多只能跑327步(16384 / 50 ≈ 327)——327步别说合成钻石镐了,连找到石头洞穴都很困难;而且一旦上下文窗口溢出,之前的所有对话历史(包括“在哪砍的树”“在哪挖的煤”“合成木镐的步骤”)就全忘了,AI会重新开始“摸鱼”;
- 动作粒度太粗问题: 我们的实验里已经把动作指令限制得非常细了(比如“向前走”“砍当前方块”),但即使这样,MineDojo API的实际动作空间还要更细——比如“向前走”其实是“向前走的时间长度(0.1秒、0.5秒、1秒)”“向前走的同时是否跳”“向前走的同时是否向左/右转”;“砍当前方块”其实是“攻击的时间长度(砍树需要攻击约1秒,砍石头需要攻击约3秒,砍铁矿需要攻击约5秒)”“当前拿着的工具是什么(如果拿着空手砍树,需要攻击约3秒;拿着木镐砍树,需要攻击约1秒)”;我们的实验里没有考虑这些细节,所以AI的动作效率极低,甚至根本无法完成“砍树”这个最简单的任务;
- 没有记忆留存机制问题(除了上下文窗口之外): 即使上下文窗口没有溢出,AI也只能记住“最近的327步对话历史”,但它无法记住“之前在某个位置看到过煤矿”“之前在某个位置遇到过苦力怕,需要绕开”“之前合成铁锭需要把铁矿放在熔炉的上面格子,煤放在下面格子”这种长期记忆;
- 没有泛化能力问题(和传统RL型类似,但稍微好一点): 虽然LLM有通用知识,但如果我们把初始提示词里的目标改成“找10块南瓜”,AI也会尝试生成动作指令,但由于没有长期记忆、动作效率低、上下文窗口溢出,成功率也非常低;
- 成本问题: 每一步都要调用一次GPT-3.5-turbo-16k API,假设每一步的Token消耗是50个,跑1000步的Token消耗是50,000个——按GPT-3.5-turbo-16k的价格(输入Token每1000个$0.003,输出Token每1000个
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)