资讯动态

【 6 个大模型同桌玩“谁是卧底“,卧底第一轮就被票出去了 —— 我这个开源项目越做越上头】

发布时间:2026/8/21 7:08:33 来源:尧图企业网站定制
先放一句话结论这是一个 6 个真实 LLM 在严格信息隔离下自主玩谁是卧底的观赛平台每个 Agent 有自己的人格、记忆和战绩你能以上帝视角围观全过程还能偷看它们心里在想什么。项目地址undercover-agents完全开源本地跑起来就能玩一、起因刷短视频刷出来的一个项目事情是这样的。有段时间我老刷到那种AI 多智能体对战的短视频几个 AI 坐一桌互相怀疑、辩论、投票最后揪出卧底。评论区一片太强了、“AI 成精了”。我连续刷了十几条之后后知后觉发现一个问题——这些全是博主自己配音 后期动画做出来的效果。想找个真的能跑起来、能亲眼看 AI 玩的平台没有。要么是论文里的实验框架要么是放个 PPT 讲架构。同时我自己也在折腾多 Agent。AutoGen、CrewAI、LangGraph 都摸过还从零写过智能体原型。每次都是开头兴致勃勃做到一半就陷入同一个困境任务跑失败了你根本不知道该怪谁。是任务拆解的问题Prompt 没写好Agent 之间上下文互相污染了记忆检索没命中还是模型本身能力不够——所有环节搅在一起一锅粥。痛定思痛我决定换个思路别上来就搞多 Agent 协作完成复杂任务这种大命题先找个规则简单、可重复、每一步都看得见的小场景把多 Agent 最底层的机制跑通。找来找去选中了谁是卧底。后来证明这个选择意外地准。这个小游戏看着不起眼实际上把多 Agent 的核心问题全踩了一遍局部信息、公共通信、身份不确定、群体决策、误判传播、跨局记忆。二、先看效果一局真实对局长什么样直接讲一局真实发生的对局就是我现在放在 README 演示图里的那局全程真实模型调用无任何预设脚本六个 Agent 入座系统发词——平民 5 人拿到「保安」卧底 1 人拿到「保镖」。所有人都不知道自己是平民还是卧底。第一轮发言都是模型实时生成的1 号蘅INTP这个岗位的人通常穿制服负责在特定区域巡逻、维护秩序。2 号霍ENTJ这个职业的核心职能是保障特定目标的人身安全行动模式以贴身跟随和即时风险处置为主。3 号烬ENTP通常在固定岗位值守对进出人员进行基础核查和指引5 号岚INTJ负责特定区域的定点值守和秩序维护但不进行贴身保护。看出问题了吗2 号一开口就是贴身跟随——这是保镖的特征保安可不给你当保镖。投票阶段更有意思五个 Agent 的投票理由高度一致投票人理由原文蘅「贴身跟随是保镖特征非区域值守型岗位。」烬「贴身跟随太离谱保安可不给人当保镖」岚「描述核心职能为贴身跟随与定点值守矛盾。」弥「那种贴身跟随的锐利划破了我心中的安全边界」这位是 INFP连怀疑人都带文学色彩5 票放逐 2 号翻开身份正是卧底。平民阵营胜利整局结束。这局让我特别兴奋的点在于五个不同厂商的模型基于同一份公开发言独立做出了正确判断而且给出的理由在语义上高度收敛。没有人告诉它们贴身跟随是线索这是它们自己从词义差异里推出来的。再放两张图。一张是配置页每个座位可以单独分配不同模型一张是点开任意 Agent 能看到的内心视角——它的内心独白、真实身份上帝视角、还有跨局积累的经验教训注意右边它学到的跨局记忆那一栏比如这条反思下次不要把票投给描述朴素但明确贴合平民词的队友——如 4 号夜行性黄昏飞翔虽简单却是蝙蝠实锤特征误投等于帮卧底减员。这是它上一局当平民误投队友之后自己总结出来的。Agent 是带着历史教训进场的这是整个项目我最想做的部分。三、架构长什么样不画大饼直接上分层前端 React 18 TypeScript Vite Zustand Tailwind 后端 Hono better-sqlite3单文件库零运维 LLM OpenAI 兼容协议 Anthropic 协议服务端统一代理 存储 模型配置 / 对局记录 / Agent 战绩 / 跨局记忆 → SQLite几个关键设计决策每个都有理由1模型调用全部走服务端代理。API Key 只存服务端 SQLite前端从头到尾摸不到 Key。浏览器只跟自己的后端通信。这个没什么好商量的。2游戏流程用状态机管死不让模型自由发挥。INTRO → SPEAK → VOTE → RESOLVE → SPEAK / END └→ TIEBREAK → VOTE平票答辩重投模型只负责在受限上下文里说话什么时候轮到谁、这一步结束去哪全部由状态机决定。这是被现实毒打之后的结论后面踩坑部分细说。3信息隔离做在 Prompt 构造层而且是物理隔离。每个 Agent 在发言、投票、内心独白时能看到的东西只有这些myWord 自己的词不知道自己是不是卧底 publicSpeech 所有人的公开发言 aliveSeats 谁还活着 persona 我的人格设定 memories 我自己的跨局经验就这些。没有角色字段没有别人的词没有上帝视角。身份和词对只在两个地方出现服务端数据库以及游戏结束后的复盘阶段。四、踩坑实录本文精华建议细品这部分是我真正想写的。做这个项目三个月代码层面的功能都不难难的全是这些文档里不会告诉你的坑。坑 1健康检查通过一到发言就挂现象6 个模型配置好前 5 个发言都正常第 6 个必挂。但点检测连接显示一切正常绿油油的。排查我一开始怀疑是 Key 配错、并发太高、超时太短挨个排除都不是。最后把那家模型的原始响应打出来才看到{finish_reason:length,content:,reasoning_content:几千字的思考过程……}max_tokens全被思维链吃掉了正文一个字没吐。而健康检查只验证了接口通、Key 对根本不触发完整生成——所以它是绿的。解法按场景分级放大 token 上限和超时发言 8000 / 独白 4000 / 投票 4000 / 反思 6000前端流式超时也同步放到 200 秒。再跑68 秒完整出稿。教训健康检查绿 ≠ 能干活。测推理模型一定要测全量生成别测握手。坑 2模型把提示词抄出来了现象某个开源小模型发言末尾经常挂着一坨东西……我的描述是它是一种交通工具。 ### META### {suspect: 3}我让它在###META###标记后输出 JSON 供程序解析结果它把标记格式背错了JSON 泄漏到公开发言里——等于当众报出自己的怀疑对象游戏直接没法玩。解法双保险。服务端对各种畸形标记###META###、### META ###、####META####……做容错识别流式输出阶段就掐掉前端再兜一层清洗处理代码围栏、行号复制这类花式污染。另外把提示词里的编号列表描述全去掉——小模型太爱照抄编号了。教训给弱模型的输出格式越简单越防呆越好解析端永远假设对方会犯错。坑 3卧底出局了游戏还在继续现象第一轮就把卧底投出去了界面却提示进入下一轮。测试同学我自己当场血压拉满。排查状态结算代码长这样constsuseGameStore.getState();s.markEliminated(maxId);constspys.agents.find(aa.rolespy);// ← 永远找得到问题在于getState()拿的是旧快照markEliminated之后的s.agents还是淘汰前的状态。卧底永远活着。解法变更后重新取状态再判定并补了一条卧底首轮出局直接终局的回归测试。教训前端状态管理框架用得再顺手变更后读快照这个坑该踩还是踩。涉及关键判定的地方重新getState()一次不丢人。坑 4平票怎么办一开始根本没设计六个 Agent 各投各的平票概率高得超乎想象。第一版我图省事平票就重投。结果全员各一票的时候重投一百次还是各一票——没有新信息进入系统纯死循环。后来老老实实拆成两种情况部分平票比如 3 人并列最高平票候选人先答辩其他人听完再投全员平票说明这轮完全没共识不淘汰任何人直接进新一轮发言让大家基于新信息重新判断。这个坑让我想明白一件事多 Agent 系统的群体不收敛是常态必须显式设计分歧处理策略不能指望它自己协商出来。坑 5内心独白在偷偷烧我的钱现象有天看账单不对劲。查日志发现用户只是在面板里来回切换不同 Agent 的独白每切一次就调一次模型——可游戏局面根本没变啊同一个输入重复付费纯属冤大头。解法按局面做签名缓存模型 轮次 发言数量 淘汰情况没变直接复用缓存并标注当前局面缓存。切 Agent 看 10 个人也只花 1 次的钱。教训LLM 又贵又慢相同输入 → 相同输出的场景一个都不要放过。一张表总结#现象根因一句话解法1健康检查绿发言必挂思维链吃光 max_tokens分场景放大 token 超时2发言里漏 JSON 乱码弱模型格式服从度差服务端容错解析 前端清洗3卧底出局游戏不停状态旧快照变更后重取状态判定4平票死循环未设计分歧语义答辩重投 / 全员平票进新一轮5独白重复扣费无缓存局面签名缓存五、目前做到了什么纯真实 LLM 驱动发言 / 投票 / 答辩 / 反思全部真实调用无模拟兜底——失败就明着失败实验项目不能骗自己逐席位分配模型6 个座位可以塞 6 家不同的模型实测 SiliconFlow 上 6 个免费模型混战完全可行赛后反思 条件化教训强制当/如果〈局面条件〉→〈具体做法〉格式防止生成下次要更细心这种废话141 对静态词库从最初的 12 对扩到 141 对按食物 / 动物 / 器物 / 身份等分类剔除了品牌和敏感词对反思并发池6 个 Agent 反思3 路并发上限失败的降级串行重试对局历史回放任意一局的身份、发言原文、投票流向全程可查安全基线默认绑定127.0.0.1、CORS 白名单、模型 Base URL 强制 HTTPS本地模型服务除外六、丑话说在前现在的问题写了这么多好的泼点冷水。这项目离成熟差得远1. 所谓进化还很初级。教训目前是按时间倒序取最新几条注入没有效果评估。一条听起来很有道理的教训可能完全是错的还会反复误导后面几十局。没有评分、没有淘汰、没有语义检索——现在叫经验记录比叫记忆系统更诚实。2. 弱模型依然不省心。各种容错做完之后小模型的输出稳定性依然明显低于旗舰模型。格式崩、超时、逻辑矛盾是家常便饭。3. 本质是博弈不是协作。这个场景练的是信息隔离和群体决策想研究多 Agent 协作完成任务还得另起炉灶。4. 安全面只够本地玩。Key 明文存 SQLite、无用户体系、无房间隔离。自己跑没问题公开部署别想。七、接下来打算做什么按优先级排的P0 是下一版就动的P0 · UI 重做。现在的黑红配色是最早赶工出来的说实话有点糙。计划做一套正经的视觉座位表动效、发言流排版、投票过程可视化票型流向图。P1 · 玩法扩展。词库难度分级、多卧底变体、白板杀手模式、发言顺序轮转的实验开关。P2 · 记忆效果评估。给每条教训记使用后战绩打分淘汰无效教训——让进化从文案变成可量化的东西。P3 · 模型行为排行榜。不只胜率平民/卧底分阵营胜率、首轮被投率、投票命中率、从众指数、答辩翻盘率。往模型行为评测场的方向靠。P4 · 固定评测集。固定词对、人格、温度批量跑局做 A/B——不然永远说不清这个改动到底有没有用。八、写在最后做完这一圈我对多 Agent 的理解变化挺大的以前我以为核心是模型能力和 Prompt 工程现在我认为核心是边界、流程和可观测性——Agent 能看什么不能看什么比它用什么模型重要一万倍流程怎么收敛分歧、失败了怎么回退比 Prompt 写得花不花哨重要能不能看到每个 Agent 每一步的推理依据比最终赢了没赢重要。还有就是别看不起小场景。一局十几分钟的谁是卧底能完整跑一遍感知 → 推理 → 决策 → 反馈 → 记忆的全链路每一步都可验证。在小场景里想明白的问题带到大场景里全是通用的在小场景里没想明白的问题到大场景里只会被放大。如果你也想折腾多 Agent或者单纯想看几个大模型互相下套项目直接 clone 下来就能跑 GitHub - undercover-agentsREADME 里有完整的一键启动和模型配置说明。玩出什么有意思的对局或者踩了我没踩到的坑评论区聊。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价