Voyager:「我的世界」中的 Agent

项目视频 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个关键的部分组成:

  1. 代码生成器:根据游戏反馈、运行结果来优化和生成操作游戏的代码;

Voyager使用的是一个流行的Javascript Minecraft 操作库 (Mineflayer),GPT-4可以根据任务需要生成游戏操作代码,例如combatZombie。但在运行生成的代码后可能会遇到错误,通常有两种错误,一种是JavaScript的执行错误,比如语法错误;一种是游戏反馈的错误,比如在制作木棒之前需要再有2块木板。GPT-4可以根据错误信息对生成的代码进行优化,直到能正常执行为止。
在这里插入图片描述

Voyager通过自我驱动的探索不断发现新的《我的世界》物品和技能,大大优于基线。

  1. 代码技能库:存储生成的游戏操作代码,检索已经生成的游戏操作代码;

每次GPT-4生成并验证一个新技能的代码后,Voyager首先会将生成的代码用GPT-3.5(省钱😄)生成详细的注释,然后对注释做Embedding,保存到向量数据库Chroma中。

当下次任务系统生成一个新的任务的时候,先用GPT-3.5根据当前游戏环境给出任务的操作说明,然后将操作说明做Embedding,去技能库检索出前5个最匹配的操作代码。再由GPT-4来决定是直接调用技能库代码,还是写新技能代码,并且尽可能重用已有技能。

  1. 自动任务生成系统

首先给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。

  1. 首先,设定GPT的角色是:

Prompt:
“你是一个有用的助手,能编写 Mineflayer JavaScript 代码来完成我指定的任何 Minecraft 任务。”

  1. 然后提供给GPT已经有的写好的代码。前面提到过,Voyager有一个代码库,能正确运行的代码都会放到里面,每次执行新任务都去检索代码库,所以在让GPT-4去写代码之前,要先让GPT-4知道哪些代码可以重用。

Prompt:
“以下是一些用 Mineflayer API 编写的有用程序。
{程序}”

这里{程序}是个占位符,也就是会将检索出来的代码库放在这里供GPT-4选择。

  1. 接着告诉GPT将会给它的输入是什么。

Prompt:
“在每一轮的对话中,我会给你
上一轮的代码:…
执行错误:…
聊天记录:…
生物群落:…
时间:…
附近的方块:…
附近的实体(从最近到最远):
健康值:…
饥饿值:…
位置:…
装备:…
库存(xx/36):…
箱子:…
任务:…
上下文:…
批评:…”

  1. 告诉GPT应该返回什么内容。Voyager要求GPT返回3种结果,并且每一种结果都有详细的说明。
  • 解释
  • 计划
  • 代码

Prompt:

  • 解释(如果适用):你的计划中是否缺少任何步骤?为什么代码没有完成任务?聊天记录和执行错误意味着什么? 计划:如何一步步完成任务。你应该注意库存,因为它告诉你有什么。任务的完成性检查也基于你的最终库存。

  • 代码:

    1. 编写一个只接受 bot 作为唯一参数的异步函数。
    2. 尽可能多地重用上述有用的程序。
    • 使用 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。
    1. 你的函数将被重用来构建更复杂的函数。因此,你应该使它通用和可重用。你不应该对库存做出强烈的假设(因为它可能在以后的时间被改变),因此你应该总是在使用它们之前检查你是否有所需的物品。如果没有,你应该首先收集所需的物品并重用上述有用的程序。
    2. "上一轮的代码"部分中的函数将不会被保存或执行。不要重用列出的函数。
    3. 在函数外部定义的任何东西都会被忽略,将所有的变量定义在你的函数内部。
    4. 调用 bot.chat 来显示中间进度。
    5. 当你找不到某样东西时,使用 exploreUntil(bot, direction, maxDistance, callback)。在挖矿或杀怪之前,你应该经常调用这个。你应该每次都随机选择一个方向,而不是一直使用 (1, 0, 1)。
    6. 对于 bot.findBlocks 和 bot.findBlock,maxDistance 应该始终为 32。不要作弊。
    7. 不要编写无限循环或递归函数。
    8. 不要使用 bot.on 或 bot.once 来注册事件监听器。你绝对不需要它们。 11) 以有意义的方式命名你的函数(可以从名称中推断出任务)。
  1. 告诉GPT应该返回什么样的格式

Prompt:
“你只应按照下面描述的格式回应:
回应格式:
{回应格式}”

这里{回应格式}是个占位符,另外有一个action_response_format.txt 里面有代码格式。
内容如下:

Explain: …
Plan:



  1. Code:
    // helper functions (only if needed, try to avoid them)

    // main function after the helper functions
    async function yourMainFunctionName(bot) {
    // …
    }

总结一下,这个巨复杂的Prompt:

  1. 设定GPT的角色
  2. 给GPT已经有的写好的代码库,让它可以调用
  3. 告诉GPT将会给它的输入是什么
  4. 告诉GPT应该返回什么内容
  5. 告诉GPT应该返回什么样的格式
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值