这次我们来看一个叫 Pigame 的开源项目。一句话概括:它把 LLM agent 接到了真实浏览器里,利用pi这套工具链配合大模型,通过observe(观察)和move(移动/操作)两类工具去玩黑盒浏览器游戏。所谓“黑盒”,就是不读游戏源码、不碰内存数据、不做任何注入,agent 只把浏览器当成一个黑盒子:自己看屏幕状态,自己决定下一步动作,然后模拟真实的鼠标键盘操作,像真人玩家一样把网页游戏一局一局打下去。
这个项目最值得关注的地方在于,它把“观察-决策-执行”的 agent 闭环直接放进了真实网页环境。如果你关心 LLM 的多步推理能力、工具调用能力、GUI agent 或浏览器自动化方向,Pigame 是一个很合适的实验台:只需要一个 LLM API key,或者本地模型,就能让 agent 自己玩 2048、Chrome 小恐龙、网页扫雷这类规则清晰、反馈即时的游戏。
本文会讲清楚 Pigame 的核心设计、本地部署步骤、observe/move 工具怎么验证、接口怎么调用、批量任务怎么组织,以及最容易踩的坑。如果你正想尝试“LLM 操作浏览器”这条路,这篇建议收藏备用。
1. Pigame 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目定位 | LLM agent 玩黑盒浏览器游戏的实验框架与示例集合 |
| 核心机制 | observe 工具获取游戏状态,move 工具执行鼠标/键盘动作 |
| 黑盒边界 | 不读取游戏内部状态,只依赖浏览器中可感知的信息做决策 |
| LLM 接入 | 通过 API 或本地模型服务,具体取决于项目配置 |
| 浏览器载体 | 需要 Chrome / Edge 等真实浏览器及自动化驱动 |
| 显存需求 | 取决于所选 LLM;云端 API 时本机基本无 GPU 压力 |
| 启动方式 | CLI 为主,部分版本可能提供 Web 界面 |
| API 能力 | 可暴露 agent 运行接口,路径以 README 为准 |
| 批量任务 | 可设计多局 / 多游戏批量运行,需自行组织调度 |
| 适合读者 | LLM agent 研究者、浏览器自动化工程师、游戏 AI 爱好者 |
说明:上表中部分能力会随仓库版本变化,部署前先看项目 README 的 Features 小节,以实际实现为准。下面按通用部署流程展开。
2. 核心原理:observe/move 工具与 LLM 决策循环
Pigame 的设计重点不是“某个游戏攻略”,而是给 LLM 提供一套可用的浏览器工具抽象。它的核心思想可以拆成三个部分:黑盒接口、观察工具、移动工具。理解这三个部分,基本就理解了整个项目的运行逻辑。
2.1 黑盒游戏的输入输出边界
在 Pigame 语境里,“黑盒游戏”指的是 agent 不访问游戏内部数据,不读取内存,不读取页面隐藏变量,只使用一个正常玩家能获得的信息:
- 视觉信息:页面截图、游戏区域的像素画面。
- 结构化信息:页面 DOM 文本、元素位置、分数、当前状态。
- 操作信息:鼠标点击位置、键盘按键、移动轨迹。
游戏对 agent 来说就是一个函数:输入是鼠标键盘事件,输出是新的页面状态。这个设定非常接近真实用户的使用方式,也让它天然适用于不能改源码的第三方网页。
好处是通用性强:同一个 observe/move 工具抽象,可以套用到大量网页游戏上;坏处是信息获取效率低,LLM 需要从截图或 DOM 摘要里自己推断游戏状态,这对模型的视觉理解和推理能力要求更高。
2.2 observe 工具:观察
observe 工具负责把浏览器当前状态翻译成 LLM 能理解的文本或图像。典型的 observe 输出包括:
- 页面截图(传给多模态模型)。
- 游戏区域元素列表,例如“格子坐标、数字、分数”。
- 当前回合状态描述,例如“游戏未结束,得分 512”。
- 错误或异常状态,例如“页面加载失败”“游戏结束”。
在实际项目中,observe 通常是可配置的。如果模型支持视觉,可以传截图;如果模型只支持文本,则优先传 DOM 摘要。这个工具的质量决定了 agent 能不能做出正确决策,因此建议先单独验证 observe 的输出是否符合预期。
2.3 move 工具:移动与操作
move 工具负责把 LLM 的决策转换成真实浏览器操作。常见动作包括:
| 动作类型 | 说明 | 示例 |
|---|---|---|
| 鼠标移动 | 把指针移动到指定坐标 | move mouse to (x, y) |
| 鼠标点击 | 在指定位置点击 | click at (x, y) |
| 键盘输入 | 输入文本或按键 | press key “ArrowUp” |
| 组合动作 | 拖拽、双击、长按 | drag from A to B |
move 工具的设计重点是动作空间要尽量小而有意义。动作太多,LLM 决策容易出错;动作太少,游戏操作不够灵活。理想情况下,动作集合应该覆盖这个游戏需要的全部操作,同时避免暴露无意义的底层步骤。
2.4 一次完整的 agent 回合
如果把 Pigame 的运行时抽象成伪代码,一次完整回合大概是这样的:
state = observe() # 获取当前游戏状态 while not game_over(state): action = llm.decide(state) # LLM 根据状态选择动作 move(action) # 执行鼠标 / 键盘操作 state = observe() # 再次观察,进入下一回合这个循环看起来简单,但真正的难度在工程细节:状态表示是否稳定、动作执行是否可靠、页面是否有加载延迟、LLM 是否会产生非法动作、失败后是否需要重试。Pigame 的 observe/move 工具设计,本质上就是在解决这套 agent 循环的工程化问题。
3. 适用场景与使用边界
3.1 适合谁
- LLM agent 研究人员:想验证多模态模型在真实环境下的决策能力、记忆能力、纠错能力。
- 浏览器自动化工程师:把 Pigame 当作一个小型 GUI agent 示例,研究 DOM 摘要、截图输入、坐标动作的设计。
- 游戏 AI 爱好者:不想碰强化学习训练环境,想直接看大模型怎么“手动”玩游戏。
- AI 产品经理:想快速理解“LLM 操作浏览器”到底能做到什么程度,有哪些限制。
3.2 能解决什么问题
- 提供一套可复用的浏览器 observe/move 工具抽象。
- 降低 LLM 接入真实网页游戏的实验成本。
- 帮助观察 LLM 在多轮交互中的稳定性与失败模式。
- 作为 GUI agent / 网页自动化的最小验证环境。
3.3 不适合什么
- 不适合追求最高游戏分数:LLM 决策速度慢、token 成本高,真要比分数,传统算法和强化学习更高效。
- 不适合做高并发生产级自动化:浏览器自动化本身不稳定,agent 循环失败率偏高,需要有重试机制。
- 不适合绕过验证码或反作弊机制:任何自动化操作都必须遵守游戏平台的服务条款,只应在自己可控制、允许自动化的测试环境里运行。
3.4 合规与安全边界
使用 Pigame 时有三条红线必须守住:
第一,游戏服务条款。很多网页游戏明确禁止自动化脚本和外挂。只选择你拥有控制权、或者明确允许自动化的测试环境。
第二,隐私与账号安全。如果游戏需要登录,不要让 agent 自动输入真实账号密码;在隔离环境、临时账号或离线游戏页面中测试更稳妥。
第三,版权与数据合规。不要用这个框架去抓取受版权保护的素材,也不要将游戏界面截图用于商用发布,除非已经获得授权。
4. 环境准备与前置条件
Pigame 依赖的核心组件有三个:Python / Node 运行环境、真实浏览器、LLM 模型服务。下面是通用检查清单,具体版本号以仓库 README 为准。
4.1 软件依赖清单
| 依赖 | 作用 | 检查方式 |
|---|---|---|
| Python 3.10+ 或 Node.js 18+ | 运行 agent 主程序 | python --version或node -v |
| Chrome / Edge 浏览器 | 承载黑盒游戏页面 | 安装稳定版即可 |
| 浏览器自动化驱动 | 控制浏览器操作 | 根据项目安装 Playwright / Selenium / Puppeteer |
| LLM API Key | 驱动决策模型 | 检查环境变量是否可读取 |
| Git | 拉取仓库代码 | git --version |
4.2 LLM 接入方式
Pigame 的决策部分只需要能调用一个 LLM。按模型部署位置分为两种:
- 云端 API:OpenAI、Anthropic、国内大模型厂商的 API 等。本机不需要 GPU,只需要网络连通和 API Key。这种方式最适合快速跑通流程。
- 本地模型:通过 Ollama、vLLM、LM Studio 等本地推理服务暴露一个 OpenAI 兼容接口。此时显存取决于模型参数。7B 量化模型常见需要 6G 左右显存,14B 模型需要 12G 或更多,实际占用以推理框架日志为准。
如果材料中没有给出明确的显存数字,最稳妥的做法是先小规模测试:用一个 7B 量化模型跑一局游戏,观察显存占用和响应延迟,再决定是否升级模型。
4.3 浏览器自动化驱动
Pigame 大概率依赖 Playwright 或 Selenium 这类工具控制浏览器。这里需要提前确认:
- 浏览器驱动版本是否和本机浏览器匹配。
- 无头模式能否正常工作。黑盒游戏如果需要完整渲染,建议先使用有头模式调试,稳定后再切换无头模式。
- 浏览器沙箱权限。在 Linux 服务器上运行 Chrome 时,经常需要额外配置
--no-sandbox,但这句话在实际项目中要有取舍:这只是本地容器的调试选项,生产环境不要随意关闭沙箱。
5. 安装部署与启动方式
下面给出一套通用安装流程。由于我拿不到仓库的确切安装命令,这里以常见 Python 项目结构为例,实际命令需要按项目 README 调整。
5.1 拉取代码与创建虚拟环境
git clone <项目仓库地址> cd pigame # Python 项目建议使用虚拟环境 python -m venv .venv source .venv/bin/activate # Windows 下使用 .venv\Scripts\activate pip install -r requirements.txt如果项目是 Node.js 结构,则对应使用:
git clone <项目仓库地址> cd pigame npm install安装完成后,务必先运行项目自带的 smoke test 或--help命令,确认依赖没有安装错误。
5.2 配置环境变量
大部分 LLM agent 项目要求通过环境变量配置模型服务。通用的.env文件大致如下:
OPENAI_API_KEY=sk-xxx OPENAI_BASE_URL=https://api.openai.com/v1 LLM_MODEL=gpt-4o-mini BROWSER_TYPE=chromium HEADLESS=false PORT=7860如果你的项目使用本地模型,通常只需要改两行:
OPENAI_API_KEY=ollama # 占位即可 OPENAI_BASE_URL=http://127.0.0.1:11434/v1 LLM_MODEL=qwen2.5:7b注意:不同项目的环境变量名可能不同。先复制项目提供的.env.example为.env,再按注释逐项修改,而不是直接套用上面的字段。
5.3 命令行启动
如果项目提供 CLI,启动方式通常类似:
python -m pigame run --game 2048 --max-steps 50建议先用--help看看支持哪些参数。重点确认这几个参数:
--game:选择具体游戏。--model:指定 LLM 模型。--max-steps:限制最大回合数,避免 agent 卡死在循环里。--output:指定日志和截图输出目录。--headless:是否使用无头浏览器。
5.4 Web 模式启动
有些版本会提供 Web 界面,用于查看游戏画面和 agent 的实时决策日志。启动方式类似:
python -m pigame web --port 7860启动后,浏览器访问http://127.0.0.1:7860。如果没有提供 Web 模式,跳过这一节即可,不要纠结。
6. 功能测试与效果验证
部署成功后,不要直接上高难度游戏。先验证 observe 和 move 是否正常,再跑端到端测试。下面按“由小到大”的顺序给出测试步骤。
6.1 测试目标选择
第一次测试尽量选择规则简单、反馈明显的游戏:
- 2048:键盘方向键操作,状态是 4x4 格子数字,反馈即时。
- Chrome 小恐龙:空格跳跃,状态是障碍物距离和速度。
- 网页扫雷:鼠标点击,状态是格子元素。
- 井字棋 / 五子棋:动作空间小,方便判断 LLM 策略是否合理。
6.2 观察工具验证
测试目的:确认 observe 能正确返回游戏状态,而不是返回空白或乱码。
操作步骤:
- 启动一个游戏页面,手动操作到中间状态。
- 运行 observe 工具,输出当前状态。
- 检查输出中是否包含游戏区域的关键信息。
# 示意代码:实际接口名以项目为准 state = agent.observe() print(state.screenshot_path) print(state.text_summary) print(state.score) print(state.game_over)判断成功的标准:text_summary能描述出当前游戏局面,score与页面显示一致,game_over状态正确。
如果失败,优先检查浏览器是否加载完成、页面是否有弹窗遮挡、DOM 选择器是否匹配。浏览器页面结构变化会导致 observe 拿不到正确信息,这是最常见的问题。
6.3 移动工具验证
测试目的:确认 move 能执行真实操作。
操作步骤:
- 选中一个按钮或可点击区域。
- 调用 move 工具执行点击。
- 观察页面是否产生预期变化。
# 示意代码:点击坐标 (100, 200) result = agent.move("click", x=100, y=200) print(result.success)判断成功的标准:页面出现点击效果,例如按钮状态改变、页面跳转、游戏格子变化。如果点击无效,检查坐标是否超出视口、页面是否有延迟加载、浏览器驱动是否使用正确。
6.4 端到端游戏测试
在 observe 和 move 都通过后,执行一次完整的 agent 对局:
python -m pigame run --game 2048 --max-steps 100 --log-dir ./logs预期过程:
- agent 首次 observe,获得初始状态。
- LLM 输出动作,move 执行。
- 再次 observe,获得新状态。
- 循环直到游戏结束或达到 max-steps。
观察重点有三个:动作是否合法、是否连续产生相同动作、是否能在游戏结束后停止循环。
判断成功的标准:agent 至少完成了 10 步以上有效操作,并且日志中能看到“观察 -> 决策 -> 执行 -> 再观察”的完整记录。
6.5 失败模式
端到端测试中最容易出现三类问题:
第一,LLM 输出非法动作。例如 2048 游戏只能按方向键,但模型输出一个鼠标点击。解决办法是在 move 工具里做参数校验,非法动作直接返回错误,并让模型重新决策。
第二,页面状态不刷新。observe 拿到的是缓存状态,不是最新页面。解决办法是每次 observe 前强制等待页面加载完成。
第三,动作重复。模型反复输出同一个方向键,导致游戏卡死。解决办法是记录最近几步动作,如果连续重复超过阈值,就中断这局并输出错误日志。
7. 接口 API 与批量任务
Pigame 不只是一个命令行玩具。只要 agent 循环被封装成服务,就能对外提供 API,也可以接入自己的批量任务系统。下面给出通用接口调用示例。
7.1 API 服务启动
如果项目提供了 API 模式,通常只需要启动一个本地服务:
python -m pigame api --host 127.0.0.1 --port 8000启动后可以先访问http://127.0.0.1:8000/docs或/openapi.json,查看项目的实际接口定义。不要凭空猜测路径,以下示例必须按实际接口调整。
7.2 Python 调用示例
import requests url = "http://127.0.0.1:8000/api/run_game" payload = { "game": "2048", "max_steps": 30, "model": "gpt-4o-mini", "headless": False } response = requests.post(url, json=payload, timeout=300) print(response.json())如果接口是流式输出,可以改用requests的 stream 模式:
with requests.post(url, json=payload, stream=True, timeout=300) as resp: for line in resp.iter_lines(): if line: print(line.decode("utf-8"))7.3 批量任务设计
批量任务适合用来做横向对比,例如“同一个游戏跑 20 局,统计平均得分”。建议按以下结构组织输入:
[ { "task_id": "2048-run-001", "game": "2048", "max_steps": 100, "model": "gpt-4o-mini", "seed": 1 }, { "task_id": "2048-run-002", "game": "2048", "max_steps": 100, "model": "gpt-4o-mini", "seed": 2 } ]批量执行时要注意三点:
- 每个任务输出独立日志目录,避免互相覆盖。
- 增加超时机制,单局超过指定秒数就强制终止。
- 任务失败后保留错误现场,包括截图和最后一步的 observe 输出。
7.4 失败重试建议
LLM agent 任务失败率不低,批量调度时必须有重试策略。这里给出一个保守的幂等设计:
def run_with_retry(task, max_retries=3): for attempt in range(max_retries): try: result = run_single_task(task) return result except RetryableError as e: log.warning(f"task {task['task_id']} failed: {e}, retry {attempt + 1}") time.sleep(2 ** attempt) raise RetryableError(f"task {task['task_id']} failed after {max_retries} retries")重试时最好换一次随机种子,避免同一局游戏重试后走向完全相同的错误路径。
8. 资源占用与性能观察
8.1 本地模型 vs 云端 API
资源占用的最大变量是 LLM 部署方式:
- 云端 API:本机只跑浏览器和 agent 逻辑,CPU 占用集中在页面渲染和截图处理,显存基本为 0,只有浏览器资源占用。
- 本地模型:显存占用完全取决于模型大小。7B 量化模型常见约 6G 显存,14B 模型约 12G 起步。这个数字只是估算,实际以推理框架日志为准。
建议先用小模型跑通流程,再切换到更大模型。如果显存不足,优先降低上下文长度,而不是直接换更大的模型。
8.2 Token 成本与延迟
每局游戏都会产生大量往返调用。以 2048 为例,一次决策可能消耗几百到几千 token。影响 token 消耗的主要因素:
- 截图是否传给多模态模型,图片 token 远高于文本。
- 历史回合是否全部保留,保留太多会快速拉高成本。
- observe 输出是否精简,DOM 摘要过长会让输入翻倍。
降低 token 的策略:
- 优先让 observe 输出结构化摘要,而不是完整 DOM。
- 只保留最近几轮历史,不要无限追加。
- 使用上下文缓存类接口,减少重复前缀计费。
8.3 浏览器与进程占用
运行 Pigame 时,浏览器进程会占用一定 CPU 和内存。如果做批量任务,不要一次性启动 20 个浏览器实例,建议控制并发在 2 到 4 个。观察指标:
- 每个浏览器实例的 CPU 占用。
- 页面加载后内存占用。
- 长时间运行时是否有内存泄漏。
8.4 降低资源占用的实用方法
- 无头模式可以减少渲染资源,但调试时不要用。
- 禁用页面图片和动画,部分游戏可以明显降 CPU。
- 截图前压缩尺寸,控制输入 token。
- 批量任务里加
sleep或队列间隔,避免网络和浏览器崩溃。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动后页面打不开 | 端口被占用或服务未启动 | 检查启动日志和端口占用 | 更换端口或重启服务 |
模型一直报错:provider rejected the request schema or tool payload | 工具调用 schema 与模型不兼容 | 查看具体报错字段 | 调整工具参数定义,简化 JSON Schema |
模型报错:the response stream was malformed and no response was produced. try again | LLM 流式响应被中断或网络异常 | 检查网络和模型服务日志 | 增加重试机制,或换成非流式调用 |
| observe 返回空白 | 页面加载未完成 / DOM 选择器失效 | 手动打开页面检查 | 延长等待时间,更新选择器 |
| move 点击无效 | 坐标超出视口 | 打印页面尺寸和坐标 | 使用页面相对坐标,先滚动到目标区域 |
| 游戏一直重复同一个动作 | LLM 陷入局部决策循环 | 查看最近日志 | 记录最近动作,超过阈值强制重启 |
| 显存不足 | 模型过大或上下文过长 | 查看推理框架日志 | 换小模型或降低上下文长度 |
| 批量任务卡住 | 单个任务未设置超时 | 查看各任务日志时间戳 | 给每个任务加超时和强制终止 |
其中热词中出现的那两条 LLM 报错在实际使用里很典型。第一条说明工具 schema 太复杂或格式不被模型支持,优先检查有没有使用模型不支持的类型定义;第二条说明网络层不稳定,建议在调用层加上指数退避重试。
10. 最佳实践与使用建议
如果你准备把 Pigame 用在真实项目中,下面几条建议可以直接照搬。
10.1 先小参数测试
第一次运行永远先限制步数。--max-steps 50足够观察 agent 行为,又不会因为死循环浪费太多 token。测试通过后再逐步放宽。
10.2 保留一套最小可运行配置
把可以成功运行的.env文件和启动命令保存下来,标注日期和模型版本。这样后续更新依赖或调整代码后出现问题,可以快速回滚对比。
10.3 日志与输出分目录管理
推荐目录结构:
logs/ run-20250101/ observe/ actions/ screenshots/ outputs/ game-results.json每个任务一个独立目录,后续排查会非常方便。
10.4 接口服务限制访问范围
如果对外开放 API,不要默认监听0.0.0.0,先绑定127.0.0.1。如果需要远程访问,加上简单的 token 校验,避免局域网内被随意调用消耗你的模型额度。
10.5 明确边界
Pigame 适合做实验和验证,但不适合作为生产级自动化系统的核心。浏览器自动化本质上是脆弱的:页面一改版,观察和移动逻辑就可能失效。如果要复用这部分能力,建议把 observe 的 DOM 解析、move 的动作执行抽象成独立模块,而不是和具体游戏绑定。
11. 总结与下一步
Pigame 最值得尝试的点,是它把一个完整的“LLM 操作浏览器”闭环压缩到了最小可运行状态。你不需要写复杂的游戏策略,只需要配置好 LLM,它自己会观察、自己会操作、自己会试错。这个项目尤其适合用来感受多模态 LLM 在真实环境中的决策表现。
建议你第一个验证的功能,是 observe 工具是否能稳定输出游戏状态。这一步决定了后面所有环节是否可行。最容易踩的坑,是 LLM 工具调用 schema 不兼容和页面状态刷新不及时,遇到这类问题优先检查模型服务日志和浏览器等待逻辑。
后续可以继续扩展的方向包括:把 Pigame 的 observe/move 抽象复用到更多网页自动化场景、接入本地模型降低推理成本、增加多局统计与策略对比、甚至让它同时操作多个游戏页面。先把第一局跑通,后面的事情就顺了。