Agent 如何玩 Factorio · 研究报告
Codex 核验(2026-10-09):官方 FLE README 当前列 Docker、Python 3.10+,可选渲染客户端为 Factorio 2.0.73+。但 多人模式 要求连接客户端与服务端版本、模组完全一致;“高于最低版本”不能证明能连任意容器。34197 是游戏默认 UDP 端口,不能直接当 RCON 的 TCP 端口;以所用 FLE/容器端口映射为准。RCON 参数 是启动选项。文中机器状态及模型能力表为历史记录,本次未运行游戏、启服务或评测最新模型。
2026-09-17 · 为 dlc 整理 · 本报告只做调研,未在本机安装任何东西
〇、结论速览
| 问题 | 结论 |
|---|---|
| 主流玩法 | 让 LLM 写 Python 代码,由环境在游戏里执行,再把结果回传(REPL 模式),而不是让模型直接”点鼠标” |
| 最成熟的框架 | FLE(Factorio Learning Environment) —— 有论文、有 leaderboard、有 MCP 支持 |
| 你的 Factorio 要换版本吗 | FLE 容器提供服务端;不连接图形客户端时可保留本地版本,连接时必须匹配服务端版本和模组 |
| 你现在差什么 | Docker 服务未启动 + 你不在 docker 组(要 sudo);Python 3.14 偏新(建议锁 3.12) |
| 最省事的验证路径 | 本机 2.1.18 无头 + RCON + Python 桥(零系统改动,几分钟见效) |
| 模型现在什么水平 | 能做短程自动化(电钻挖矿、连接传送带);做不出成规模产线(如电子电路),空间推理是最大短板 |
一、问题的本质:什么叫”agent 玩 Factorio”
按自动化程度分三代:
| 代际 | 做法 | 代表 | 局限 |
|---|---|---|---|
| 1. 脚本自动化 | 写 Lua 脚本/mod 直接操纵游戏 | 各种”工厂蓝图机器人” mod | 规则是人写死的,不会应变 |
| 2. 强化学习 | 把游戏包成 Gym 环境,训练策略网络 | 早期 factorio-gym 类尝试 | 状态空间太大,样本效率极低 |
| 3. LLM Agent(当前主流) | 模型写代码 → 环境执行 → 观察结果 → 再写代码 | FLE | 长时序规划、空间推理仍是瓶颈 |
第 3 代的关键设计是 REPL 循环(Read-Eval-Print-Loop):
┌──────────────┐ ① 生成 Python 程序 ┌─────────────────┐
│ LLM Agent │ ────────────────────► │ 执行解释器 │
│ (Claude/… ) │ │ (持久 namespace) │
└──────────────┘ ◄──────────────────── └────────┬────────┘
③ 输出流/观察 ② 工具调用
▼
┌─────────────────┐
│ Factorio 服务端 │
└─────────────────┘
为什么是”写代码”而不是”直接操作”?
- 代码是自然的动作压缩:一句
place_entity(Prototype.MiningDrill, pos)顶几百次低级操作 - 可复用:agent 可以在 namespace 里定义函数/类,把成功经验沉淀下来(FLE 明确支持)
- 可自省:报错会带完整上下文回传,agent 能自我调试(FLE 的 typed exceptions)
- 可评测:产出物(代码)和执行结果都可审计
二、技术通道:agent 和游戏之间的四种连接方式
| 通道 | 原理 | 能力 | 代价 |
|---|---|---|---|
| 游戏内 Lua Mod API | 游戏官方开放完整模组 API,mod 可读写实体/库存/物流/研究 | 最强,能拿到一切游戏状态 | 只能在游戏进程内跑;能力受 API 边界约束 |
| RCON | 服务端启动时指定 --rcon-port/--rcon-password,外部用 TCP 发 Lua 命令 | 启停/查询/执行任意 Lua,无头模式下可用 | 需要自己序列化状态;一次一命令 |
UDP helper(游戏自带 --enable-lua-udp) | mod 侧 helpers.send_udp() 主动把事件推给外部 | 事件主动推送(不用轮询) | 只有单向出、要自己写接收端 |
| 图形渲染(可选) | 接本地客户端渲染画面,agent 看截图(多模态) | 直观、可录像给人看 | 慢、贵、精度差(像素→语义损失大) |
FLE 走的是”自带 Factorio 场景 + 与 Python 侧的 RCON 通道(TCP 端口须查实际配置,不能与游戏默认 UDP 34197 混用)“,把上面第 1、2 类能力封装成工具函数给 agent 用。
三、FLE 深度剖析(当前最完整的方案)
3.1 基本盘
- 论文:arXiv 2503.09617《Factorio Learning Environment》
- 定制 Factorio 场景/模组,跑在 Docker 集群里(
fle cluster start) - 有公开 leaderboard 和评测配置(
fle eval --config ...) - 依赖:Docker + Python 3.10+(本地 Factorio 仅”可选渲染”需要)
3.2 环境接口(标准 Gym 风格)
obs = env.reset(options, seed) # 重开
obs, reward, terminated, truncated, info = env.step(action)
env.close()动作空间(本质就是”写代码”):
{
'agent_idx': int, # 多智能体时指定谁动手
'game_state': str, # 可选:把游戏状态重置到某个快照
'code': str # 要执行的 Python 代码(≤10000 字符)
}观察空间(喂给模型的东西):
| 字段 | 内容 |
|---|---|
raw_text | 上一次动作的 stdout/stderr |
entities | 地图上的实体列表 |
inventory | 当前库存 |
research | 科研进度与已解锁科技 |
game_info | tick / 时间 / 游戏速度 |
score | 当前得分 |
flows | 产线吞吐统计 |
task_verification | 任务完成判定 |
map_image | Base64 编码的 PNG 地图(多模态用) |
task_info / serialized_functions / messages | 任务信息、可用函数、多智能体消息 |
3.3 内置工具集(agent 的”手”)
| 类别 | 工具 |
|---|---|
| 实体/查询 | get_entities、nearest、nearest_buildable、get_entity、place_entity |
| 资源 | get_resource_patch、harvest_resource |
| 连接 | connect_entities、get_connection_amount |
| 制造/科研 | craft_item、get_prototype_recipe、set_entity_recipe、set_research、get_research_progress |
| 移动/杂项 | move_to、sleep、launch_rocket、print |
工具返回带类型的对象(Entity / Inventory / Recipe / Position / ResourcePatch),可以 .status 这样取属性、可以存进变量复用。出错抛带上下文的类型化异常,例如:
InvalidEntityPlacementException: Cannot place burner-mining-drill at
Position(x=10, y=20) - location is occupied by iron-chest
3.4 MCP 模式(对接现有 agent 的最短路径)
FLE 自带 MCP server,任何 MCP 客户端(Claude Desktop、opencode…)都能直接接:
{
"mcpServers": {
"factorio": {
"command": "python",
"args": ["-m", "fle.env.protocols.mcp.server"],
"env": { "FLE_CLUSTER_HOST": "${LOCALIP}", "FLE_CLUSTER_PORT": "<实际 RCON TCP 映射端口>" }
}
}
}工具会自动从 FLE 的工具定义生成 MCP schema(名称/描述/参数/返回类型),也就是说:接上之后,agent 就”长出了”一双手去造工厂。
3.5 两种评测设定与实测结论(论文)
| 设定 | 内容 |
|---|---|
| lab-play | 8 个结构化任务,资源固定(受约束环境) |
| open-play | 无边界任务:在随机地图上造出尽可能大的工厂 |
论文结论(值得记住的”能力现状”):
- 模型空间推理弱是核心短板
- lab-play:短程技能(short-horizon)表现尚可,但在资源受限环境里做不好,反映出错误分析能力不足
- open-play:能自己发现有效策略(例如电钻挖矿这类”升级”),但做不出复杂自动化(如电子电路产线)
四、难点在哪里(为什么不是”接上就能玩”)
| 难点 | 具体表现 |
|---|---|
| 状态空间爆炸 | 实体 + 物流网络 + 电力 + 流体 + 地形;一个中等工厂几十万实体 |
| 长时序规划 | 科技树 → 产线扩张 → 电力扩容,跨越数千次决策,误差会累积 |
| 空间推理 | ”传送带怎么拐弯不打架""机器朝向/接口对齐”——论文点名的短板 |
| 观察表示 | 全量状态塞不进上下文;截断/摘要又会丢关键信息(FLE 用结构化字段缓解) |
| 错误恢复 | 造错了要能发现并修(FLE 靠类型化异常 + agent 自省) |
| 成本 | 每步一次 LLM 调用;一次完整工厂实验可能上千步 |
| 延迟 | 游戏 tick 与 LLM 推理时间不在一个量级,必须异步/受控步进 |
五、本机可行性评估(当前状态)
| 能力 | 本机情况 | 判定 |
|---|---|---|
| Factorio 本体 | ~/Game/factorio-space-age/ 2.1.18(便携),Steam 版在 experimental 2.1.19 | ✅ 满足”2.0.73+“ |
| 无头模式 | 已实测 --start-server 可加载存档 | ✅ |
| RCON | 服务端模板 data/server-settings.example.json 就在游戏目录 | ✅ 现成 |
| 事件推送 | 游戏带 --enable-lua-udp | ✅ |
| 存档 | ~/.factorio/saves(40 个,含 taikong.zip),本地版/Steam 版共用 | ✅ |
| Docker | 装了 29.8.0,但服务未启用、用户不在 docker 组 | ⚠️ 要 sudo + 重登 |
| Python | 3.14.7(FLE 要求 3.10+,但 3.14 太新,依赖易崩) | ⚠️ 建议 uv 锁 3.12 |
| uv | 0.12.15 | ✅ |
| 磁盘 | 根分区可用 171 G | ✅ |
| 图形渲染(可选) | 本地客户端 + 2.1.18 | ✅ |
版本要求:只使用容器服务端时可保留本地客户端版本;需要连接客户端观看或录制时,必须与该服务端版本和模组匹配。
六、未来落地时怎么做(两条路,本报告不执行)
路线 A:FLE 完整框架(重,但正统)
- 启用 Docker:
sudo systemctl enable --now docker - 把自己加进 docker 组:
sudo usermod -aG docker $USER→ 重新登录生效 - 用 uv 建环境并锁 Python 3.12:
uv venv --python 3.12 && uv add factorio-learning-environment[eval,mcp] fle cluster start(拉镜像 + 起容器,数 GB)- 想挂到我们这边当工具用 → 配 MCP:
python -m fle.env.protocols.mcp.server - 跑评测:
fle eval --config configs/gym_run_config.json,或自己写 agent 循环调env.step()
收益:现成工具集、标准 Gym 接口、可复现评测、leaderboard 可比。 代价:系统改动(sudo)、镜像体积、Python 版本坑。
路线 B:轻量 DIY(轻,能立刻看到效果)
- 准备
server-settings.json,并在服务端启动命令中指定--rcon-port/--rcon-password;白名单按实际访问需求配置 - 无头起服务:
factorio --start-server 存档.zip --server-settings … - Python 侧装个 RCON 客户端(或自己写,RCON 协议很简单:长度+ID+类型+载荷)
- 封装三个能力给 agent:
- 看:
/c查实体/库存/研究 → 结构化 JSON - 做:把”造机器/连传送带/设配方”包成函数
- 听(可选):mod 用
helpers.send_udp()推事件
- 看:
- 接进 agent(opencode 直接跑 Python;或包成 MCP server)
收益:零 sudo、零系统改动、几百 MB 内存,能直观看到”agent 真的在动游戏”。 代价:工具要自己写;没有现成评测。
七、任务梯度:agent 能玩到什么程度(可当实验清单)
| 难度 | 任务 | 预估可行性 |
|---|---|---|
| ★ | 读状态:报告库存、最近铁矿位置、当前科研 | 稳 |
| ★★ | 手搓链路:手动挖矿 → 手搓熔炉 → 手动喂料出铁板 | 稳 |
| ★★★ | 一条完整自动线:电钻 + 熔炉 + 传送带 + 电(蒸汽) | 模型能做,需纠错 |
| ★★★★ | 科研进阶:自动化红瓶(红色科技瓶)产线 | 论文里”能做出来”的上限附近 |
| ★★★★★ | 绿瓶/蓝瓶、总线设计、物流机器人、火车 | 原研究未验证可靠完成(不能推定最新模型都不行) |
| ★★★★★★ | 发射火箭 / 大规模 meta-base | 原研究未验证完成 |
评测口径可参考 FLE:产线得分(production score) + 科技得分(tech score),以及 open-play 的”工厂规模增长曲线”。
八、参考资料
- FLE 仓库:
github.com/JackHopkins/factorio-learning-environment - 论文:arXiv 2503.09617《Factorio Learning Environment》
- 文档:
jackhopkins.github.io/factorio-learning-environment/sphinx/build/html/- 环境总览
environment/overview.html· 工具tools/overview.html· MCPadvanced/mcp.html
- 环境总览
- Leaderboard:
jackhopkins.github.io/factorio-learning-environment/leaderboard - Factorio 官方模组 API(mod 路线的根本依凭):
lua-api.factorio.com - 本机相关:
~/Game/factorio-space-age/(2.1.18)、~/.factorio/saves(共用存档)
九、一句话建议
想快速看到效果 → 走 B(本机无头 + RCON,零系统改动); 想认真做评测/对比模型 → 走 A(FLE + Docker,需接受 sudo 与数 GB 镜像); 原记录中的 Factorio 2.1.18 满足 README 的最低版本数字;其余依赖、场景和服务端版本匹配仍需验证。
附:一定要装 Docker 吗?(2026-09-17 补充)
结论:不必须。 Docker 在 FLE 里只承担一个角色 —— 看项目结构就清楚了:
fle/cluster/ # Docker orchestration and scenarios ← Docker 只管"起服务端 + 部署场景"
fle/server.py # RCON server ← 与游戏之间的真实通道是 RCON
fle/env/protocols/_mcp/ # MCP 支持
FLE 与游戏之间是 RCON + 可配置的 FLE_CLUSTER_HOST / FLE_CLUSTER_PORT(必须填写实际 RCON TCP 端口,未核实其默认值),
所以 Docker 并非架构上的硬需求,它只是官方替你自动化部署场景、对齐版本的方式。
三种选择的代价对比
| 方案 | 要不要 Docker | 代价 | 适合 |
|---|---|---|---|
官方集群 fle cluster start | ✅ 需要(但你机器上已装 Docker 29.8.0,缺的只是”启动服务 + 加 docker 组”,一条 sudo + 重新登录) | 数 GB 镜像;动系统 | 想省事、要评测/leaderboard |
| 客户端模式:自己起 Factorio 服务端 + 自己部署 FLE 场景,FLE 只当客户端连过去 | ❌ 不需要 | 要手工对齐场景与游戏版本,属偏门;FLE 的 Python 包仍声明 docker>=7.1.0 依赖(SDK 装上即可,不调就不需要守护进程) | 不想装 Docker 但又想用 FLE 工具集 |
| 路线 B:完全自研桥(本机无头 + 自己写 RCON 桥 + 自定义工具) | ❌ 不需要 | 工具/评测都要自己写 | 只想先看效果、零系统改动 |
两个补充事实
- 严格说不是”安装 Docker”:本机 已有 Docker 29.8.0,只是
docker.service未启用、且你不在docker组。 - ⚠️ 官方文档新旧不一致:0.3.0 版文档提到要用 1.1.x 客户端(“有 Space Age DLC 就别勾,它会强制走 2.x 分支”),而最新 README 写的是 2.0.73+。→ 以你实际安装的 FLE 版本为准;好在 Docker 容器自带服务端,是否更换本地客户端,取决于是否连接该服务端以及版本、模组是否匹配。