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_infotick / 时间 / 游戏速度
score当前得分
flows产线吞吐统计
task_verification任务完成判定
map_imageBase64 编码的 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-play8 个结构化任务,资源固定(受约束环境)
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 + 重登
Python3.14.7(FLE 要求 3.10+,但 3.14 太新,依赖易崩)⚠️ 建议 uv 锁 3.12
uv0.12.15✅
磁盘根分区可用 171 G✅
图形渲染(可选)本地客户端 + 2.1.18✅

版本要求:只使用容器服务端时可保留本地客户端版本;需要连接客户端观看或录制时,必须与该服务端版本和模组匹配。


六、未来落地时怎么做(两条路,本报告不执行)

路线 A:FLE 完整框架(重,但正统)

  1. 启用 Docker:sudo systemctl enable --now docker
  2. 把自己加进 docker 组:sudo usermod -aG docker $USER → 重新登录生效
  3. 用 uv 建环境并锁 Python 3.12:uv venv --python 3.12 && uv add factorio-learning-environment[eval,mcp]
  4. fle cluster start(拉镜像 + 起容器,数 GB)
  5. 想挂到我们这边当工具用 → 配 MCP:python -m fle.env.protocols.mcp.server
  6. 跑评测:fle eval --config configs/gym_run_config.json,或自己写 agent 循环调 env.step()

收益:现成工具集、标准 Gym 接口、可复现评测、leaderboard 可比。 代价:系统改动(sudo)、镜像体积、Python 版本坑。

路线 B:轻量 DIY(轻,能立刻看到效果)

  1. 准备 server-settings.json,并在服务端启动命令中指定 --rcon-port / --rcon-password;白名单按实际访问需求配置
  2. 无头起服务:factorio --start-server 存档.zip --server-settings …
  3. Python 侧装个 RCON 客户端(或自己写,RCON 协议很简单:长度+ID+类型+载荷)
  4. 封装三个能力给 agent:
    • 看:/c 查实体/库存/研究 → 结构化 JSON
    • 做:把”造机器/连传送带/设配方”包成函数
    • 听(可选):mod 用 helpers.send_udp() 推事件
  5. 接进 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 · MCP advanced/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 容器自带服务端,是否更换本地客户端,取决于是否连接该服务端以及版本、模组是否匹配。