全图 design->generate->validate->[repair环]->scaffold->build->play(九门)->player->emit;build/play 复用既有 harness 子进程。 SAA 完整框架集接入 aigc-server(graph-core/agent-framework/builtin-nodes/observation/openai,3 BOM;Boot3.5.14/Redisson4.4.0 保住)。 双评审(Opus+Codex)9 项对比前必修:LLM超时重试/ProcessBuilder超时修复/采样面对齐/playerFeedback清串味/gatespec强解析/problems归一/recursionLimit兜底/cost/端口参数化。 首轮对比 breakout/whack/flappy:SAA 通过率 2/3 >= Python 1/3。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.7 KiB
7.7 KiB
P4 · Python 生成 vs SAA 生成 对比测试(首轮 3 款)
日期 2026-06-15(执行 2026-06-16 凌晨,mini-desktop) · 框架对比 spike(HJ-AGI-002 后续) 一句话裁定见文末 §5。本页结论先行,证据路径见 §6。
1. 目标与公平性铁律
同 brief 集、同 stage1 模型、同 maxRepairs、同九门 harness 下,只换编排框架——Python L2 studio(AgentScope 手写编排循环)vs SAA 裸 StateGraph 图——各跑一遍,公平对比「生成的游戏 + 生成过程」。
公平性铁律(两侧严格相等):
| 维度 | 取值(两侧一致) |
|---|---|
| brief 集 | breakout(paddle-intercept)/ whack(tap-targets via inputs)/ flappy(flap-to-gap),取自 wg1/gen-worker/briefs/<name>.json |
| 模型路由 | models.yaml stage1:design/code/fix/player_text=deepseek-v4-flash、player_vision=MiniMax-M3 |
| maxRepairs | 5 |
| playerRounds | 1(player 为软门顾问;九门是硬地板) |
| 九门 harness | 同一 serve-and-play.sh + play.cdp.cjs(A_boot/B_uncaught/C_frame/D_render/E_live/F_wiring/G_input/H_progress/I_control) |
| prompt/角色 | SAA 侧 SaaPrompts 逐字移植 Python prompt.py/roles.py/studio.py 抽取逻辑 |
| play_spec 基线 | 两侧均取 brief 自带 play_spec(含 inputs/driver/controlCheck/assertAfterPlay/expectedEngineCallPrefixes),design 自产 gatespec 再 merge 覆盖 exportState/driver/controlCheck/assertAfterPlay/expectLatch |
| 端口/cwd/key | 共用 4320/9222(串行,每 brief 净场);cwd=主仓 game-runtime;NEWAPI_KEY 经 env(baseUrl 含 /v1,SAA 侧剥 /v1) |
只换编排框架:Python =
worker/agent_loop/studio.py的 AgentScope 进程内多 agent 手写循环;SAA =SaaStudioGraphTest组装的 Spring-AI-Alibaba Graph 裸 StateGraph(render→design→generate→validate→[scaffold→build→play]→player→[repair 回环]→emit/giveup)。其余(模型/prompt/门/brief)全等。
2. 执行方式
- 串行:两侧共用 4320/9222 不可并发;每 brief 先 Python 后 SAA,跑前净场(杀残留 Chrome/serve);每 run 唯一 gameId+目录避撞。Python gameId=
p4-py-<brief>、SAA gameId=saa-<brief>-<runId>。 - 单实例锁:驱动脚本加
flock单实例锁(首轮曾因外部编排并发双跑撞端口,数据作废重跑;v2 锁后杜绝)。 - Python 侧:
python -m worker.agent_loop.studio <gid> --stage stage1 --max-repairs 5 --player-rounds 1 --brief briefs/<brief>.json --port 4320 --cdp-port 9222→results/<gid>.stage1.json(schema:seven_gate_verdict/attempts/tokens_by_model/cost/player)。 - SAA 侧:
mvn -o -pl ...aigc-server -am -Dtest=SaaStudioGraphTest -Dsaa.harness=1 -Dsaa.brief=<brief> -DGAME_RUNTIME_DIR=... -Dsaa.port=4320 -Dsaa.cdpPort=9222 test→results/saa-<brief>-<runId>.saa.json(schema 已对齐 Python:含 ¥/per-model/attempts/player)。 - 本次为对比做的最小改动(仅 SAA 测试脚手架,不动图/节点/prompt 等忠实部分):①
SaaStudioGraphTest参数化-Dsaa.brief(原硬编码 breakout)+ 读 brief 自带play_spec作基线(公平对齐 Python_load_brief,原传{}会致 whack 无 inputs/各 brief 无 F 门期望前缀=比 Python 宽松);② diag JSON 落player字段(原仅打印 console)。
3. 对比表(每 brief × {Python, SAA})
| brief | side | 九门pass | 过门数 | 挂门 | repair | wall(s) | ¥ | player vision(c/f·v) | player text(c/f·v) | tokens(in/out) | 备注 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| breakout | Python | 待填 | |||||||||
| breakout | SAA | 待填 | |||||||||
| whack | Python | 待填 | |||||||||
| whack | SAA | 待填 | |||||||||
| flappy | Python | 待填 | |||||||||
| flappy | SAA | 待填 |
列说明:
player vision/text格式 = 完整度/好玩·verdict(c=completeness 1-5、f=fun 1-5、v=pass/fix)。vision=MiniMax-M3(看首帧+玩后截图)、text=deepseek-v4-flash(只读运行数据)。
4. 分析
5. 一句话裁定
6. 证据路径
- 结果 JSON:
wg1/gen-worker/results/p4-py-{breakout,whack,flappy}.stage1.json(Python)、wg1/gen-worker/results/saa-{breakout,whack,flappy}-<runId>.saa.json(SAA) - 运行日志:
mini-desktop:/root/p4-logs/{py,saa}-<brief>.log、驱动mini-desktop:/root/p4-logs/_driver.log - 九门证据四件套(每 run):
game-runtime/games/_wg1-gen/<gameId>/evidence/{verdict.json,first-paint.png,after-play.png} - SAA 图/节点/prompt(忠实部分):
saa-int/game-cloud/game-module-aigc/game-module-aigc-server/src/test/java/.../saa/{SaaStudioGraphTest,SaaStudioNodes,SaaGenNodes,SaaPrompts}.java - Python L2 studio:
wg1/gen-worker/worker/agent_loop/studio.py+worker/{run,prompt,validate,_client,cost}.py+worker/models.yaml
7. 已知公平性脚注(便宜模型噪声 + 微差异)
- 单样本噪声:design/code/fix=deepseek-v4-flash(便宜档,温度高/输出抖),首轮每 brief×side 各仅 1 样本,九门通过率/player 分/修复轮数受随机性影响大。首轮 3 款是信号、非定论;定量结论需多样本(≥3-5/格)。
- code/fix 温度微差:Python L2 的 design/code/fix 经 AgentScope
build_model(不下发 temperature → 网关服务端默认);SAA code/fix 显式 temperature=0.0(更确定)。player 两位两侧均 0.3。此为已知微差异(SAA 作者 A-3 标注的对齐选择),不改两侧忠实部分,记此脚注。 - player 软门不计入 pass:九门(尤其 H_progress+latch)是硬地板;player 仅在九门过后作顾问轮,verdict=fix 且轮未尽才回修。两侧同口径。
结果(首轮 3 款 · 单样本 · 2026-06-16 03:49–04:45)
| brief | 侧 | 九门pass | 门(过/总) | 修复轮 | wall(s) | ¥ | tokens(in/out) | player(文 c/f, 视 c/f) | 失败门 |
|---|---|---|---|---|---|---|---|---|---|
| breakout | PY | ✅ | 9/9 | 0 | 186 | 0.049 | 12131/11029 | 4/4 · 4/3 | - |
| breakout | SAA | ✅ | 9/9 | 1 | 332 | 0.070 | 16847/21895 | 4/3 · 5/3 | - |
| whack | PY | ❌ | 8/9 | 5(giveup) | 652 | 0.083 | 27632/38238 | — | G_input |
| whack | SAA | ✅ | 9/9 | 3 | 415 | 0.088 | 24821/30900 | 4/4 · 4/3 | - |
| flappy | PY | ❌ | 8/9 | 5(giveup) | 837 | 0.104 | 29602/50636 | — | G_input |
| flappy | SAA | ❌ | 8/9 | 5(giveup) | 938 | 0.127 | 28441/66411 | — | H_progress |
裁定
- SAA 与 Python 平手或更优:breakout 两侧均过;whack SAA 过、PY 未过(SAA 胜);flappy 两侧均未过(flap-to-gap 难,便宜模型都吃力)。SAA 通过率 2/3 ≥ Python 1/3。
- SAA 迁移功能性等价、不残废:同 prompt/模型/九门 harness 下,质量(player 分)相当、通过率不低于 Python。「换编排框架不换效果」成立。
- 成本/wall:SAA 略贵(多 design 步 + repair,out tokens 偏高),wall 互有胜负(whack SAA 更快、breakout/flappy PY 更快)。
- ⚠️ 单样本噪声大:便宜模型随机性高,whack 的 PY 败/SAA 胜、修复轮差异都可能在噪声内——这是信号,非统计定论。
- 观察:两次 Python 失败都卡 G_input(输入有效门),SAA 未卡——多样本下值得看是否真模式。
建议
- 统计置信:扩到 N≥3–5 样本 × 全 17 款 briefs 再下定论(当前各 1 样本)。
- SAA 侧已就绪:双评审 + 9 项必修后完整/公平/正确;可进生产收口(form① 进程内 dispatcher + MysqlSaver checkpoint + streaming,发挥 SAA 强项)。
- 并发铁律:批跑独占 4320/9222,同一时刻只许一个驱动(本轮踩过并发污染坑,已纠正)。