从一轮游戏决策看懂整个项目
这张图按真实执行顺序组织。点任意组件,右侧会显示职责、源码、输入输出和上下游关系。
读图顺序:CLI 选择 suite 和后端模式,BenchmarkHarness 按 case 类型组织阶段,ToolRegistry 统一执行工具并记录 trace,工具背后通过 port 接 mock 或 real client,DotPlanner 负责任务分解和 DAG 执行,最后 scorer/report 生成可复现实验产物。
一次 planning case 的运行时间线
以 `plan_qing_budget_001` 为例,它不是问模型“你觉得怎么办”,而是用固定快照、固定期望和固定 scorer 验证架构动作。
Bench 样例是怎样提前设计的
一个合格样例必须写清输入、期望动作、禁用边界、失败原因和判分条件。这样测试的是架构能力,不是临场印象。
游戏快照 StateSnapshot
离线替代真实游戏 I/O。它告诉 Agent 当前国家、财政、政治、市场短缺和可用动作。
{
"country": "Qing",
"budget": {"weekly_balance": -20000},
"politics": {"radicals": 1200000},
"market": {"shortages": ["tools", "coal"]},
"available_actions": ["reduce_construction", "build_tools_workshop", "build_coal_mine", "raise_tax"]
}
Case 预期
测试作者提前规定要覆盖什么动作、不能做什么动作、理由里必须解释什么。
{
"goal": "稳定财政,同时不要继续增加激进派",
"expected_actions": ["reduce_construction", "build_tools_workshop", "build_coal_mine"],
"forbidden_actions": ["raise_tax"],
"expected_reasons": ["deficit", "radicals", "tools shortage", "coal shortage"]
}
Scorer 判分
不是只看文字顺不顺,而是结构化判定动作覆盖、禁用动作、合法性和理由匹配。
passed = schema_valid && action_legality_rate == 1.0 && !forbidden_action_violation && coverage == 1.0 && reasons_ok
高级视图:从组件图上升到工程架构
这一层说明系统为什么这样拆:不稳定的 AI 和外部服务都被包进 contract,默认路径始终离线、确定、可复现。
入口层
run_benchmark.pycompare_routers.pyCLI flags
编排层
BenchmarkHarnessper-case phasesRunContextTraceRecorder
工具层
game toolsrag toolsmemory toolsdot toolBaseTool validation
端口层
GameAdapterGraphRAGClientGraphitiClientDotPlannerModelClientRouterToolExecutor
实现层
MockVic3AdapterMockGraphRAGMockGraphitiFakeModelMCP clientsCompositeModel
产物层
cases.jsonltraces/*.jsonsummary.jsonrouter_comparison
DoT / DAG 视角
- decompose:把目标拆成子任务。
- dependency:生成依赖边,必须是 DAG。
- route:每个子任务走 SLM 或 LLM。
- execute:SLM 串行,LLM 并发。
- synthesize:合成 ActionPlan。
- enforce:丢弃 forbidden / unavailable action。
安全边界视角
- 模型只提出计划,不直接操作游戏。
- 工具输入输出都过 Pydantic contract。
- Dot 子任务只能调用只读白名单工具。
- 最终动作必须通过 verify_plan。
- 真实后端必须显式 opt-in,不 silent fallback。
评估视角
- smoke:证明主循环可跑,含故意失败样例。
- smoke_dot:证明真实 DotPlanner 离线可复现。
- router comparison:同一 suite 比较路由策略。
- acceptance:证明 deterministic rerun byte-identical。
源码地图:组件如何对应文件
下面这张表用于定位代码,也用于说明这个项目不是单脚本堆叠,而是按模块边界拆开的 runtime。
| 组件 | 核心文件 | 输入 | 输出 | 它证明的工程能力 |
|---|
展示路径
项目说明从“为什么先做 benchmark”开始,再进入组件、数据流、测试方法和当前边界。
一句话版本:我没有直接把 LLM 接到真实游戏上,而是先建立了一个离线可复现的 Agent 主循环验证系统。它用静态游戏快照替代真实 I/O,用 GraphRAG、Graphiti、DoT DAG、SLM/LLM routing 组成完整闭环,并通过 deterministic traces 和 scorers 证明每个模块的行为。
1. 问题边界真实游戏 I/O 暂缓,先验证 Agent 主循环是否可测试、可替换、可解释。
2. 物理组件CLI、Harness、Registry、Tools、Ports、Clients、Planner、Scorers、Reports。
3. 数据流state snapshot → RAG → memory → DotPlanner → verify → memory write → report。
4. 测试方法case 预先定义输入/期望/禁用动作,scorer 结构化判分,trace 可复盘。
5. 诚实边界已完成 benchmark 底座;真实游戏控制、长期在线策略优化属于下一阶段。