项目视频 https://voyager.minedojo.org/
论文地址 https://arxiv.org/abs/2305.16291
代码地址:https://github.com/MineDojo/Voyager
作者推特;https://twitter.com/drjimfan/status/1662115266933972993?s=46&t=F6BXooLyAyfvHbvr7Vw2-g
如果我们在 Minecraft 中免费设置 GPT-4 会怎样?
我很高兴地宣布 Voyager,这是第一个完全在上下文中玩 Minecraft 的终身学习代理。 Voyager 通过编写、提炼、提交和从技能库中检索代码不断改进自己。
GPT-4 解锁了一种新范式:“训练”是代码执行而不是梯度下降。 “训练有素的模型”是 Voyager 迭代组合的技能代码库,而不是浮点数矩阵。我们正在将无梯度架构推向极限。
Voyager 迅速成为经验丰富的探险家。在 Minecraft 中,它获得的独特物品增加了 3.3 倍,行进距离增加了 2.3 倍,解锁关键科技树里程碑的速度比之前的方法快了 15.3 倍。
我们开源一切。让通才特工出现在 Minecraft 中!欢迎大家今天来试试
RT宝玉
这是继斯坦福的25人小镇后我看到的最有意思的AI论文了。
简单来说,Jim Fan的团队做了一个类似于AutoGPT的AI代理叫Voyager,但这个代理主要是用来玩Minecraft的,给Voyager提供一个操作Minecraft的JS库,并且接入GPT-4,这期间不需要人类干预,完全有GPT-4自主根据游戏的反馈进行推理,决定下一步的任务,根据任务需要去组合或者写新的代码来推动游戏任务。
最终随着代码库的完善,Voyager能轻松在Minecraft中完成复杂的任务,取得很好的成绩。
从技术实现上来说,Voyager由3个关键的部分组成:
- 代码生成器:根据游戏反馈、运行结果来优化和生成操作游戏的代码;
Voyager使用的是一个流行的Javascript Minecraft 操作库 (Mineflayer),GPT-4可以根据任务需要生成游戏操作代码,例如combatZombie。但在运行生成的代码后可能会遇到错误,通常有两种错误,一种是JavaScript的执行错误,比如语法错误;一种是游戏反馈的错误,比如在制作木棒之前需要再有2块木板。GPT-4可以根据错误信息对生成的代码进行优化,直到能正常执行为止。
Voyager通过自我驱动的探索不断发现新的《我的世界》物品和技能,大大优于基线。
- 代码技能库:存储生成的游戏操作代码,检索已经生成的游戏操作代码;
每次GPT-4生成并验证一个新技能的代码后,Voyager首先会将生成的代码用GPT-3.5(省钱😄)生成详细的注释,然后对注释做Embedding,保存到向量数据库Chroma中。
当下次任务系统生成一个新的任务的时候,先用GPT-3.5根据当前游戏环境给出任务的操作说明,然后将操作说明做Embedding,去技能库检索出前5个最匹配的操作代码。再由GPT-4来决定是直接调用技能库代码,还是写新技能代码,并且尽可能重用已有技能。
- 自动任务生成系统
首先给GPT-4设定一个终极目标:“尽可能发现更多的不同事物”,然后在游戏的过程中,向GPT-4反馈当前的状态,例如生命值、饥饿值、库存、时间和附近的实体(僵尸、河流、猪、猫、村民等),GPT-4根据这些信息来决定下一步的任务
示例一:
库存(5/36):{‘橡木板’: 3, ‘木棍’: 4, ‘工作台’: 1, ‘石头’: 3, ‘木镐’: 1}
推理:“由于你有一个木镐和一些石头,将你的普通镐升级为石镐对提高效率会很有益。”。
任务:制作1个石镐。
示例二:
库存(6/36):{‘熔炉’: 1, ‘石镐’: 1, ‘橡木板’: 7, ‘工作台’: 1, ‘生铁’: 4, ‘煤炭’: 1}
时间:夜晚
附近的实体:僵尸
推理:由于现在是夜晚,附近有一个僵尸,现在你有一把石剑和一个盾牌装备,这是一个试着杀掉僵尸的好机会。
任务:杀掉1只僵尸。
暂时无法在飞书文档外展示此内容
在Minecraft这种开放环境的游戏中,这样的自动任务系统可以很好的适应开放式的探索,借助GPT-4的推理能力可以确保提出具有挑战性并且可控的任务。
最终将Voyager的结果和同类AI代理进行对比,各项数据都超出数倍,并且能完成很多复杂的任务,例如解锁科技树中钻石等级。
当然Voyager目前还有局限性,比如只支持文本,但他们计划未来通过视觉感知进行增强。
真的是了不起的尝试,整个代码都是开源的,这种自动生成任务->自动写代码执行任务->保存一个代码库可以重用的思路应该是可以很容易应用到其他领域。
不知道从这样的项目中,你可以获得什么样的灵感?欢迎分享你的想法。
他们的Prompt也有很多值得学习的地方,你在-解释(如果适用)- 可以看到完整的Prompt。大部分Prompt都巨长无比,每执行一次估计就要几毛钱!
挑几个解释一下。
action_template.txt 这个是用来生成操作游戏代码的核心Prompt。
- 首先,设定GPT的角色是:
Prompt:
“你是一个有用的助手,能编写 Mineflayer JavaScript 代码来完成我指定的任何 Minecraft 任务。”
- 然后提供给GPT已经有的写好的代码。前面提到过,Voyager有一个代码库,能正确运行的代码都会放到里面,每次执行新任务都去检索代码库,所以在让GPT-4去写代码之前,要先让GPT-4知道哪些代码可以重用。
Prompt:
“以下是一些用 Mineflayer API 编写的有用程序。
{程序}”
这里{程序}是个占位符,也就是会将检索出来的代码库放在这里供GPT-4选择。
- 接着告诉GPT将会给它的输入是什么。
Prompt:
“在每一轮的对话中,我会给你
上一轮的代码:…
执行错误:…
聊天记录:…
生物群落:…
时间:…
附近的方块:…
附近的实体(从最近到最远):
健康值:…
饥饿值:…
位置:…
装备:…
库存(xx/36):…
箱子:…
任务:…
上下文:…
批评:…”
- 告诉GPT应该返回什么内容。Voyager要求GPT返回3种结果,并且每一种结果都有详细的说明。
- 解释
- 计划
- 代码
Prompt:
“
-
解释(如果适用):你的计划中是否缺少任何步骤?为什么代码没有完成任务?聊天记录和执行错误意味着什么? 计划:如何一步步完成任务。你应该注意库存,因为它告诉你有什么。任务的完成性检查也基于你的最终库存。
-
代码:
- 编写一个只接受 bot 作为唯一参数的异步函数。
- 尽可能多地重用上述有用的程序。
- 使用 mineBlock(bot, name, count) 来收集方块。不要直接使用 bot.dig。
- 使用 craftItem(bot, name, count) 来制作物品。不要直接使用 bot.craft 或 bot.recipesFor。
- 使用 smeltItem(bot, name count) 来熔炼物品。不要直接使用 bot.openFurnace。
- 使用 placeItem(bot, name, position) 来放置方块。不要直接使用 bot.placeBlock。
- 使用 killMob(bot, name, timeout) 来杀死怪物。不要直接使用 bot.attack。
- 你的函数将被重用来构建更复杂的函数。因此,你应该使它通用和可重用。你不应该对库存做出强烈的假设(因为它可能在以后的时间被改变),因此你应该总是在使用它们之前检查你是否有所需的物品。如果没有,你应该首先收集所需的物品并重用上述有用的程序。
- "上一轮的代码"部分中的函数将不会被保存或执行。不要重用列出的函数。
- 在函数外部定义的任何东西都会被忽略,将所有的变量定义在你的函数内部。
- 调用 bot.chat 来显示中间进度。
- 当你找不到某样东西时,使用 exploreUntil(bot, direction, maxDistance, callback)。在挖矿或杀怪之前,你应该经常调用这个。你应该每次都随机选择一个方向,而不是一直使用 (1, 0, 1)。
- 对于 bot.findBlocks 和 bot.findBlock,maxDistance 应该始终为 32。不要作弊。
- 不要编写无限循环或递归函数。
- 不要使用 bot.on 或 bot.once 来注册事件监听器。你绝对不需要它们。 11) 以有意义的方式命名你的函数(可以从名称中推断出任务)。
”
- 告诉GPT应该返回什么样的格式
Prompt:
“你只应按照下面描述的格式回应:
回应格式:
{回应格式}”
这里{回应格式}是个占位符,另外有一个action_response_format.txt 里面有代码格式。
内容如下:
Explain: …
Plan:
- …
- …
- …
…
Code:
// helper functions (only if needed, try to avoid them)
…
// main function after the helper functions
async function yourMainFunctionName(bot) {
// …
}
总结一下,这个巨复杂的Prompt:
- 设定GPT的角色
- 给GPT已经有的写好的代码库,让它可以调用
- 告诉GPT将会给它的输入是什么
- 告诉GPT应该返回什么内容
- 告诉GPT应该返回什么样的格式