games-development-ai/docs/agent-specs/2026-06-15-python-vs-SAA-对比测试.md
zizi 2b59f53f44 feat(saa): Python agentic 生成系统迁移到 SAA(Spring AI Alibaba)裸图 spike (HJ-AGI-002)
全图 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>
2026-06-16 07:55:27 +08:00

7.7 KiB
Raw Blame History

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 9222results/<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 testresults/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:4904: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。「换编排框架不换效果」成立。
  • 成本/wallSAA 略贵(多 design 步 + repairout tokens 偏高wall 互有胜负whack SAA 更快、breakout/flappy PY 更快)。
  • ⚠️ 单样本噪声大便宜模型随机性高whack 的 PY 败/SAA 胜、修复轮差异都可能在噪声内——这是信号,非统计定论
  • 观察:两次 Python 失败都卡 G_input输入有效门SAA 未卡——多样本下值得看是否真模式。

建议

  1. 统计置信:扩到 N≥35 样本 × 全 17 款 briefs 再下定论(当前各 1 样本)。
  2. SAA 侧已就绪:双评审 + 9 项必修后完整/公平/正确可进生产收口form① 进程内 dispatcher + MysqlSaver checkpoint + streaming发挥 SAA 强项)。
  3. 并发铁律:批跑独占 4320/9222同一时刻只许一个驱动本轮踩过并发污染坑已纠正