开源演示:LLM 玩宝可梦游戏的能力展示
展示 LLM 通过 API 与游戏系统交互的演示项目。作为娱乐性演示有趣,但实际应用场景有限。
展示 LLM 通过 API 与游戏系统交互的演示项目。作为娱乐性演示有趣,但实际应用场景有限。
这是我尝试让大语言模型自主玩宝可梦火红版的项目。我的机器人具有基础的游戏能力,可以探索、战斗和响应游戏事件。
对我来说,这就是电视的未来。在构建这个机器人的过程中,我感觉更像是在制作电视节目而不是编程。最终,我在程序化输入控制方面遇到了一些技术难题,这导致我暂停了开发。
观看演示视频。观看技术深度分析。
我使用 RetroArch 来运行宝可梦火红版。我在程序化发送输入时遇到了困难。RetroArch 有一个基于 UDP 的输入系统(RetroPad),但我无法让它可靠地工作。
因此,我改用了 OSA Script(AppleScript)向模拟器发送键盘事件。这意味着游戏必须在焦点窗口中。这是一个巨大的限制,因为它会占据我的整个电脑,使后台工作无法进行。
我在数据库中存储游戏状态,将其视为 AI 经验的日记。系统记录了 AI 尝试的行动、什么有效、什么无效,并相应地进行调整。
有四种不同类型的记忆,AI 会提取最近的 250 条记忆来维持上下文。如果某个行动失败——比如尝试走到某处时撞上了障碍物——AI 会记住这一点,并避免重复犯同样的错误。
AI 需要找出在游戏世界中应该前往的地方。我通过读取 RetroArch 的游戏内存来提取地图数据。然后我使用路径查找算法来确定最佳路线。AI 只考虑基于地形瓷砖的有效移动选项和可用路径。如果卡住了,它会默认尝试相邻的移动(例如,"向南走"、"向东走"等)。
为了理解游戏,AI 需要读取游戏内的文本。由于我没有使用直接的内存提取方式(如 PRET 建议的那样),我在关键点截图,并用 OCR 处理这些图像。
这使 AI 能够理解 NPC 对话、菜单提示和其他关键游戏事件。这非常重要,因为它引导 LLM 知道接下来应该做什么。
我使用 OpenAI 的 GPT-4o 来处理所有收集的信息并做出决定。系统提示引导 AI 避免重复行动(例如,在遇见橡树教授前多次尝试选择小火龙)。模型接收关于当前位置、可能的行动、游戏记忆和导航选项的结构化数据。我还试验了频率惩罚和存在惩罚,以鼓励更多样化的行为并防止陷入循环。
战斗处理器相当原始。它所做的就是按 A 键。如果战斗持续超过一分钟,我们会开始发送一些随机输入来脱离战斗。这是我想要改进的一个领域,但我的优先事项是先让 AI 在世界中导航。
与 NPC 交谈时,AI 需要确定是继续对话还是前进。对话处理器截图、提取文本,并检查对话是否仍在进行。
如果 AI 检测到文本,它会继续按 A 键。如果没有出现新的文本,它会继续执行脚本的下一部分。
游戏推理:基于 Ruby 的类型定义(类似于 Python 中的 Pydantic)
模拟器交互:与 RetroArch 交互的代码
LLM 集成:GPT-4o 的 API 调用和提示处理
内存读取:用于读取和解析模拟器 RAM 的工具
状态持久化:AI agent 的长期记忆管理
最大的障碍是向模拟器发送输入。
RetroArch 的 UDP 输入(RetroPad)对我来说不可靠。
基于键盘的输入(OSA Script)需要窗口焦点,使自动化不切实际。
存在基于 Python 的解决方案(如 PiBoy),但我更偏好 Ruby,并在现有 Python 工具的冻结问题上遇到了困难。
这个项目既是一场噩梦,也是大量乐趣。随着 LLM 变得越来越强大,这只会变得更容易。我相信 Claude Plays Pokemon 没有做我花费大量时间做的任何记忆解析工作,它们只是直接将内存流式传输给 Claude 3.7,让它来理解 🤯。如果你觉得这个工作有趣,欢迎 fork 它、修改它,并构建更好的东西!
Griffin R. – 在游戏内存读取方面提供了巨大帮助。
Graham Seamens & Parth Patil – 在 AI 逻辑方面提供了协助。
宝可梦 ROM 破解/反编译社区 – 没有他们,这个项目不可能实现。
OpenPipe - LLM 可观测性。
你可以在 LinkedIn 和 Hacker News 上找到我。