Skip to content

Latest commit

 

History

History
277 lines (206 loc) · 13.7 KB

项目评分报告.md

File metadata and controls

277 lines (206 loc) · 13.7 KB

MultiAgent-Werewolf 项目评分报告

生成日期: 2026-06-05 项目路径: /Users/baimo/Desktop/werewolf/MultiAgent-Werewolf


总体评分: 82/100 (B+)


一、各模块评分与问题

1. 项目配置与工程化 — 90/100

优点:

  • pyproject.toml 配置完善,包含 pytest/ruff/coverage/ty 等完整工具链
  • Ruff lint 检查通过(0 错误),代码风格一致
  • 依赖管理使用 uv,现代且高效
  • CLI 入口清晰,多命令支持(werewolf/werewolf-eval/werewolf-watch 等)
  • CI/CD workflow 齐全(auto-labeler、code-quality、test、docker)

问题:

  • unsafe-fixes = true 在生产项目中风险较高,建议 CI 中关闭
  • pyproject.toml 中 [[tool.uv.index]] 有注释掉的 pytorch 配置,属于残留代码

2. Game Engine 模块 — 85/100

文件:

  • game_engine.py
  • base.py
  • night_phase.py
  • day_phase.py
  • voting_phase.py

优点:

  • Mixin 架构清晰,职责分离好(Night/Day/Voting/Death/Action 各自独立)
  • 事件系统完善,支持可见性过滤(wolf_team/public/witch 等 channel)
  • 信念矩阵(Belief Matrix)系统实现完整
  • 投票意向追踪(VoteIntentionTracker)设计合理
  • 超时控制机制完善

问题:

  • [base.py:219] setup_game 中 random.shuffle(shuffled_roles) 没有使用种子,对局不可复现。评测场景需要确定性
  • [base.py:263] check_victory 中 memory_manager.on_game_end 调用时没有 await,但 on_game_end 可能是 async 方法(需确认)
  • [voting_phase.py] _handle_vote_tie 方法递归调用自身,第二次平票时逻辑正确但可读性差,建议改为迭代
  • [night_phase.py:289] _break_werewolf_vote_tie 中 fallback 使用 sorted(candidate_ids)[0] 确定性破平,但座位号排序不一定是最优策略

3. Agent Team 模块 — 80/100

文件:

  • base.py
  • agentscope_agent.py

优点:

  • DemoAgent 设计合理,支持 deterministic/random 模式,方便离线评测
  • AgentScope 适配器完善,支持结构化输出、重试、降级
  • 记忆系统分层清晰(Working/Episodic/Semantic/Procedural)
  • 串行调用锁(run_serial_agent_call)避免 rate limit

问题:

  • [agentscope_agent.py] 文件过长(963 行),建议拆分。get_structured_response 方法超过 200 行,违反单一职责
  • [agentscope_agent.py:280] _call_agentscope_agent 中 3 次重试逻辑与 RateLimitError 处理混在一起,建议提取独立方法
  • [base.py:174] create_agent 函数中 use_agentscope 参数默认 True,但错误提示说 "Only AgentScope backend is supported",参数设计多余
  • [serial_calls.py] _delay_seconds() 从环境变量读取但默认 0,可能导致 rate limit 问题未被缓解

4. Strategy 模块 — 85/100

文件:

  • updater.py

优点:

  • 信念矩阵初始化、更新、合并逻辑清晰
  • apply_revealed_role 和 apply_seer_check 硬更新设计合理
  • _SYSTEM_NOTES 保护系统标记不被 LLM 输出覆盖

问题:

  • [updater.py:153] known_wolf_seats_for_player 中 participates_in_wolf_team 被调用两次(一次判断自己,一次判断 others),可优化
  • [updater.py:175] ensure_agent_belief_state 中 observer_seat == 0 的 warning 只在初始化时触发,后续不检查,可能导致静默错误
  • 缺少信念矩阵的持久化机制,对局中断后无法恢复

5. Evaluation 模块 — 88/100

文件:

  • runner.py
  • pipeline.py

优点:

  • 评测 Runner 设计完善,支持场景、重复、种子控制
  • PostGame Pipeline 分步执行,单步失败不阻断后续步骤
  • 支持 skip_llm 模式,适合快速迭代
  • 产物管理完整(manifest、steps、artifacts)

问题:

  • [runner.py:107] asyncio.wait_for(engine.play_game(), timeout=...) 超时后没有清理 engine 状态,可能导致资源泄漏
  • [pipeline.py:353] _coach 步骤中直接读写 JSON 文件,没有异常处理,文件损坏会导致整个步骤失败
  • [pipeline.py:437] skill_loader.list_role_skill_files.cache_clear() 在每次 pipeline 结束后清除缓存,高并发场景可能影响性能

6. GameState 模块 — 82/100

文件:

  • game_state.py

优点:

  • 状态管理清晰,阶段推进逻辑正确
  • 投票权重支持(警长 1.5 票)
  • 序列化/反序列化支持

问题:

  • [game_state.py:117] next_phase 中 NIGHT → DAY_DISCUSSION 的转换条件 self.round_number == 1 只在首夜检查警长选举,但如果 enable_sheriff=True 且首夜无人死亡,逻辑正确但可读性差
  • [game_state.py:225] get_vote_counts 中渡鸦标记(raven_marked)逻辑:如果 raven_marked 不在 vote_counts 中会添加 1 票,但这意味着渡鸦标记的目标即使 0 票也有 1 票,可能与预期不符
  • 缺少状态快照/回滚机制,调试困难

7. Victory 模块 — 80/100

文件:

  • victory.py

优点:

  • 胜利条件分层清晰(特殊胜利 → 情侣 → 狼人 → 村民)
  • 血月使徒特殊处理正确

问题:

  • [victory.py:38] check_victory 按固定顺序检查,如果多个胜利条件同时满足(理论上不可能但代码未防御),只返回第一个
  • [victory.py:143] check_white_lover_wolf_victory 和 check_lover_victory 有重叠逻辑,建议提取公共方法
  • [victory.py:162] check_thief_victory 中盗贼随阵营胜利,但实际调用的是 check_werewolf_victory / check_villager_victory,可能返回不同的 winner_ids

8. Frontend 模块 — 75/100

文件:

  • App.tsx
  • store.ts

优点:

  • UI 设计精美,3D + 玻璃态效果
  • Zustand 状态管理简洁
  • 拖拽调整面板高度功能完善

问题:

  • [store.ts] 所有 API 调用没有重试机制,网络抖动会导致操作丢失
  • [store.ts:60] fetchState 失败时 fallback 到 EMPTY_START_STATE,但用户可能正在游戏中,突然回到 START_SCREEN 体验差
  • [App.tsx:56] 拖拽事件监听器在组件卸载时没有清理,可能导致内存泄漏
  • [store.ts] 缺少类型安全,nightSkillAction 的 additional?: any 应该使用具体类型
  • Frontend 与 Backend API 契约没有类型共享,容易不一致

9. Interaction 模块 — 85/100

文件:

  • phase_interaction.py

优点:

  • Protocol 接口定义清晰
  • 超时控制按阶段区分(night/day/vote)
  • Roundtable 设计支持多人讨论

问题:

  • [phase_interaction.py:176] _timeout_for_phase 中 phase 匹配使用字符串比较,容易拼写错误,建议用枚举
  • PhaseInteractionHub Protocol 的方法签名复杂,参数多,建议考虑使用 dataclass 封装

10. Memory 模块 — 78/100

文件:

  • runtime_memory_manager.py

优点:

  • 五层记忆架构(Working/Episodic/Semantic/Procedural/Belief)设计完整
  • 信念技能匹配(refresh_belief_skills)创新
  • 事件去重机制(_seen_event_keys)避免重复记录

问题:

  • [runtime_memory_manager.py:103] get_context_for_decision 中 include_belief 参数默认 True,但调用方可能不需要信念上下文,浪费 token
  • [runtime_memory_manager.py:225] _inject_semantic_context 中直接访问 self.semantic._backend(私有属性),违反封装
  • LLM Compressor 失败时没有降级策略,可能导致记忆压缩失败

二、总体问题汇总

类别 严重程度 数量 说明
可复现性 高 2 随机种子未传递、shuffle 无种子
资源泄漏 中 3 超时未清理、事件监听器未清理
代码复杂度 中 4 文件过长、方法过长、递归替代
类型安全 低 3 any 类型、私有属性访问
错误处理 中 2 JSON 读写无异常处理、降级策略缺失

三、改进建议(优先级排序)

优先级 建议 影响模块 预估工作量
P0 为 setup_game 添加随机种子参数,确保评测可复现 Game Engine 小
P0 拆分 agentscope_agent.py(963 行 → 3-4 个文件) Agent Team 中
P1 添加状态快照/回滚机制,便于调试 GameState 中
P1 Frontend 添加 API 重试和错误恢复 Frontend 小
P1 修复拖拽事件监听器内存泄漏 Frontend 小
P2 统一 phase 枚举,避免字符串比较 Interaction 小
P2 添加信念矩阵持久化 Strategy 中
P2 评测超时后清理 engine 状态 Evaluation 小
P3 _handle_vote_tie 改为迭代实现 Game Engine 小
P3 LLM Compressor 添加降级策略 Memory 中

四、模块评分雷达图

项目配置与工程化  ████████████████████ 90/100
Game Engine      █████████████████░░░ 85/100
Agent Team       ████████████████░░░░ 80/100
Strategy         █████████████████░░░ 85/100
Evaluation       ██████████████████░░ 88/100
GameState        ████████████████░░░░ 82/100
Victory          ████████████████░░░░ 80/100
Frontend         ███████████████░░░░░ 75/100
Interaction      █████████████████░░░ 85/100
Memory           ███████████████░░░░░ 78/100

五、总结

项目整体架构优秀,模块化程度高,代码质量良好(Ruff 0 错误)。主要优势在于:

  1. 架构设计: Mixin 模式、Protocol 接口、事件系统都体现了良好的工程素养
  2. 评测体系: Runner + Pipeline 的设计支持 A/B 测试、多场景评测
  3. 创新功能: 信念矩阵、记忆系统、投票意向追踪都是亮点

需要重点关注的改进方向:

  1. 可复现性: 评测场景必须保证确定性,随机种子传递是刚需
  2. 代码维护性: agentscope_agent.py 文件过长,拆分后更易于维护和测试
  3. 前端健壮性: API 重试、错误恢复、内存泄漏修复能显著提升用户体验

六、修复状态(2026-06-05 核实)

报告项 结论 处理
setup_game shuffle 无种子 属实 已修复:GameConfig.role_shuffle_seed + setup_game 使用 random.Random(seed);评测/CLI 透传种子;新增 test_setup_game_role_shuffle_seed.py
on_game_end 未 await 误报 on_game_end 为同步方法,无需 await
_handle_vote_tie 递归 部分属实 已改为 _append_vote_tie_no_elimination 迭代收尾,消除自我递归
unsafe-fixes = true 属实 已改为 false(pyproject.toml)
create_agent(use_agentscope) 多余 属实 已移除该参数
serial_calls 默认 delay 0 属实 默认改为 1.0,与 .env.example 一致
semantic._backend 私有访问 属实 已改为 SemanticMemory.has_backend 公开属性
_timeout_for_phase 字符串比较 属实 已改用 GamePhase 枚举
Frontend 无重试 属实 已添加 frontend/src/api/retry.ts,store.ts 统一使用
fetchState 失败回 START 属实 游戏中失败时保留上一状态,仅冷启动回 EMPTY_START_STATE
拖拽监听器未清理 属实 App.tsx 卸载时通过 dragCleanupRef 清理
nightSkillAction 使用 any 属实 已定义 NightSkillAdditional
agentscope_agent.py 过长 属实但未拆 大重构,暂未动
信念矩阵持久化 / 状态快照 需求型 未实现
LLM Compressor 无降级 误报 已有 fallback_compress
评测 random.seed 未传递 误报 Runner 已 random.seed(seed);现额外保证角色洗牌种子
渡鸦 0 票加 1 票 设计行为 有单测覆盖,非 bug