多智能体使用指南
多智能体协作设计CLI工具的实战指南,主张按职责切角色并行运行,靠契约规则与裁决记录收敛冲突,并给出看板状态机、降级触发与串行边界。
需求只有一句:做一个追踪代码里
TODO/FIXME注释的 CLI 工具。 做法:三个 Agent(用户体验 / 技术架构 / 挑刺者)+ 一个 Team Lead,在同一个对话里跑三轮,收敛出三份可评审的设计文档。 本文是《CLI 场景下多 Agent 协作》的配套实战篇,所有提示词与模板可直接复制。文中引用的结论均来自本仓库docs/下的三份产出。
0. 结论先行
先说这次协作的真实收益,避免把「多 Agent」讲成玄学:
| 检查点 | 单 Agent 常见结果 | 本次多 Agent 结果 |
|---|---|---|
| 产品定位 | 直接开始写扫描器 | 第一轮就被质疑「你凭什么不是 rg 别名」(Q1),被迫重定位 |
| 技术风险 | 设计稿一路顺滑,实现期爆雷 | 设计期被挑出 16 条代码级反例 + 14 条架构缺陷(A-01 ~ A-14) |
| 跨角色冲突 | 无人指出,埋进代码 | done 后是否隐藏、非 TTY 是否切机器格式,两处正面冲突在文档里被裁决 |
| 交付形态 | 一份「我想好了」的方案 | 三份互相引用、带裁决记录、可追溯分歧来源的文档 |
一句话概括:多 Agent 的价值不是「多几个窗口」,而是让「产品判断 / 工程实现 / 风险质疑」三件事同时发生,而不是串行返工。
1. 为什么这次拆了三个角色
一个助手同时处理多类问题时,需要留意下面三种情况:
| 问题 | 表现 | 代价 |
|---|---|---|
| 上下文过载 | 同时处理交互设计、存储方案、误报治理 | 输出漂移、反复返工 |
| 任务抢占 | 一个子问题打断另一个子问题 | 节奏混乱、不可追踪 |
| 验收缺失 | 只「做完」没「验完」 | 交付不稳定 |
而「TODO 追踪 CLI」恰好是一个横跨三类职责的需求:
- 产品判断:完成的任务还要不要默认显示?Markdown 笔记里的 TODO 要不要一起收录?
- 工程实现:怎么区分不同语言的注释?代码移动后,怎样认出原来的 TODO?扫描 5 万个文件能否达到 5 秒的性能目标?
- 风险质疑:直接用
rg搜索不够用在哪里?索引会不会保存敏感代码?这个看板以后会不会没人维护?
这三类问题的正确答案来自互相矛盾的直觉——工程师想「全量诚实」,UX 想「首屏别劝退」,风险官想「先证明需求存在」。让一个 Agent 同时扮演三种角色,结果通常是「谁也没说服谁,然后悄悄选了一个」。
2. 角色设计:把通用四角色映射到这个需求
通用模型是 FE / BE / TEST / RV 四类:
| Agent | 职责边界 | 输入 | 输出 |
|---|---|---|---|
| Frontend Agent | 页面、组件、交互、状态展示 | UI Speckit、接口契约 | 前端实现与截图证据 |
| Backend Agent | API、数据模型、业务规则 | Feature Speckit、数据模型 | 接口实现与调用样例 |
| Test Agent | 回归用例、边界场景、失败复现 | 需求验收项、日志 | 测试结果与失败清单 |
| Review Agent | 规则一致性、风险审查、合并建议 | 以上所有产出 | 审查意见与合并决策 |
这次没有前后端,我按**「职责而非技术栈」**重新映射,这是最关键的一步:
| 本次角色 | 对应通用角色 | 职责边界 |
|---|---|---|
| UX Agent | Frontend Agent | 命令体系、输出格式、零配置上手、空态与错误态 |
| Architecture Agent | Backend Agent | 技术选型、分层、数据模型、扫描流水线、性能预算 |
| Devil’s Advocate | Test + Review Agent | 质疑需求前提、列代码级反例、审架构缺陷、给止损线 |
| Team Lead(我) | Team Lead | 锁契约、分任务、收 Round 汇总、裁决无法自洽的问题 |
禁止越界原则(四条,写进建队提示词里):
- UX Agent 不得规定实现方案(只提约束与验收,比如「首屏 ≤10 条」而不是「用 SQLite 分页」)
- Architecture Agent 不得跳过验收直接宣称完成(性能预算写进验收标准,不是优化项)
- Devil’s Advocate 不得「顺手改设计」,只产出质疑与缓解方案
- Team Lead 不直接大改方案,只裁决与纠偏
Sub-agent 还是 Agent Teams? 简单、独立、一次性任务用 Sub-agent(主 Agent 分派 → 子 Agent 返回)。 跨角色、需要持续协调、需要互相质疑的任务用 Agent Teams。 本次三者之间存在真实冲突(见 §5、§6),必须靠成员互通解决,所以选 Teams。
3. 开工前:开关、检查清单、建队
3.1 打开 Agent Teams
codebuddy # 打开 CLI在 CLI 中输入 /config → 找到 [Experimental] Agent Teams → Enter 切为 true → Esc 退出。
脚本化环境也可以直接:
export CODEBUDDY_CODE_EXPERIMENTAL_AGENT_TEAMS=1核验点:[Experimental] Agent Teams = true,并顺手确认响应语言(简体中文)。
3.2 Step 0:启动前检查(必做)
- 锁定工作目录 —— 所有 Agent 只操作当前仓库
- 锁定 Speckit / SpeckitList 版本 —— 避免中途变更需求
- 明确权限边界 —— 本例只允许写
docs/,禁止删除文件、禁止执行高风险命令 - 设定最大轮次 —— 本例设 6 轮,实际 3 轮收敛
- 建立证据目录 —— 产出落在
docs/architecture.md、docs/ux-design.md、docs/risks.md
3.3 一句话建队
在同一个对话里直接发自然语言,不需要另开会话:
我正在设计一个帮助开发者追踪代码中 TODO 注释的 CLI 工具。请创建一个团队从不同角度探索这个问题:- 一个负责用户体验设计;- 一个负责技术架构;- 一个扮演"挑刺者",专门提出质疑与风险。请先完成团队创建并给出每位成员的职责分工与首轮任务。预期行为:自动创建团队 → 生成成员并分配初始任务 → 成员以不同颜色区分。
3.4 看板与状态机
pending -> in_progress -> completed \-> blocked -> in_progress| 任务ID | Owner | 状态 | 依赖 | 验收标准 |
|---|---|---|---|---|
| UX-1 | UX Agent | pending | — | 命令体系 + 三个画像 + 首屏样本 + 空态/错误态 |
| ARCH-1 | Architecture Agent | pending | — | 选型 + 分层 + 数据模型 + 性能预算 |
| DA-1 | Devil’s Advocate | pending | UX-1, ARCH-1 | 质疑清单 + 代码级反例 + 止损线 |
| LEAD-1 | Team Lead | pending | 全部 | 冲突裁决 + 里程碑 |
规则:
- 同一时刻主线任务只有一条
in_progress,但允许 UX-1 / ARCH-1 并行推进 blocked必须写明阻塞原因 + 解锁条件 + 预计恢复时间completed必须附证据(命令输出 / 文档链接 / 数据)- 按文档切分任务,避免多个 Agent 同时改同一文件
4. Round 1:并行产出,各自为战
4.1 任务指令(四段式:目标 / 边界 / 验收标准 / 禁止项)
[任务ID] ARCH-1目标:给出技术选型、分层架构、数据模型与扫描流水线设计边界:只写 docs/architecture.md,不改 UX 文档,不写实现代码输入:需求一句话 + 设计约束(5 万文件 P95 < 5s、单二进制、零外网请求)输出:架构文档(伪代码接口 + 表结构 + 性能预算 + 里程碑)验收标准:三条核心取舍有明确取舍理由;性能预算写进验收标准而非优化项; 每个失败模式都有降级路径禁止项:替 UX 决定默认视图;把"待优化"当"已达标"[任务ID] UX-1目标:给出命令体系、输出格式、零配置上手路径与空态/错误态文案边界:只写 docs/ux-design.md,不规定实现方案输入:需求一句话 + 三类用户画像(独立开发者 / Tech Lead / CI Bot)输出:设计文档(命令表 + 终端输出样例 + 五条设计原则)验收标准:每条示例命令可直接复制;首屏 ≤10 行结论;空态与错误态有文案禁止项:指定存储方案或解析算法;引入需要 init 的前置步骤[任务ID] DA-1目标:质疑需求前提、挑出致命风险、给出可验证的止损线边界:只写 docs/risks.md,不顺手改设计输入:需求一句话 + UX-1 / ARCH-1 的产出输出:10 个尖锐问题 + 16 条代码级反例 + 风险总表 + 9 条止损信号验收标准:每条质疑必须配缓解方案;每条止损信号必须有阈值与判定方式禁止项:只提问题不给出路;用"可能有问题"这类不可验证的表述4.2 Round 1 汇总
## Round 1 汇总- 完成:ARCH-1 选型 Go + SQLite + 语言感知状态机;UX-1 给出命令体系与三个画像; DA-1 给出 Q1~Q10 与 R-01~R-16- 阻塞:无(三者输入不互相依赖,是本次能并行的唯一原因)- 新增风险:DA-1 指出 Q10 —— 真正的瓶颈可能是"不想做"而不是"找不到", 若成立,整个产品定位要转向- 需人工决策:默认视图全量 vs 活跃子集- 下一轮:三者交叉评审,把质疑逐条落到设计修改关键观察:这一轮能并行的前提是输入不互相依赖——三个角色读的是同一个需求,产出的是三份不同文档。如果让 UX 依赖架构的存储方案才能写命令设计,那就必须串行。
5. Round 2:冲突是价值,不是故障
这一轮是整场协作收益最高的部分。冲突按「契约 → 规则 → 实现优先级」的顺序处理。
5.1 契约层冲突(最严重,会连锁破坏)
| 质疑 | 原设计 | 修正 |
|---|---|---|
A-01:context_hash 进了指纹 | base_fp = sha256(repo_id + kind + text + context_hash) | 紧随 TODO 的 3 行代码是全文件最容易变的地方,改一次代码身份就变 → 用户态全丢 |
A-02:repo_id 进了指纹 | 由 git remote URL 归一 | HTTPS↔SSH 切换、fork、CI 用 token 克隆,都会让全库指纹改变 |
| A-03:浅克隆不是「作者为空」而是「时间为错值」 | blame 失败则软降级 | fetch-depth: 1 是 CI 默认态,blame 返回边界提交日期 ≈ 今天 → 三年前的 TODO 显示 age: 0d。空值是诚实的,错值是腐蚀性的 |
| A-06:前 8KB 含 NUL 判二进制 | 先判 NUL | UTF-16 文件充满 NUL(.cs / .ps1)→ 必须先看 BOM 再判 NUL,否则静默漏报 |
点名纠偏指令:
@Architecture Agent你当前跑偏点:identity 设计把易变字段(context_hash、repo_id)放进了 fingerprint。请仅做以下修改:1) base_fp 收敛为 sha256(kind + normalized_text),context_hash 降级为非身份属性;2) repo_id 从 fingerprint 中移除(索引本就按仓库分库);3) 浅克隆(git rev-parse --is-shallow-repository = true)时硬失败富化, created_at 置 null,UI 显示 age: unknown,绝不显示错误 age;4) 编码探测顺序改为:BOM 优先 → 严格 UTF-8 → latin1 兜底。禁止修改:UX 文档、UX 的指纹需求(UX 会另行提"路径也不能进指纹")。输出:变更章节 + 每条修正的理由。记录要求:每次点名干预都要留「触发原因 → 干预内容 → 结果变化」。这条记录后来成了 docs/architecture.md §6 的裁决记录,是复盘时唯一能还原现场的东西。
5.2 隐私泄漏面(UX 反向补充了架构的盲区)
架构原本只防「blame 邮箱」。UX Agent 指出了一个架构没覆盖的出口:
用
actions/cache缓存index.db到 CI,等于把全仓库 blame 邮箱上传到缓存服务。
这条质疑的价值在于它同时解决了另一件事——架构自己的性能结论是「blame 是首屏唯一大头」。于是最终决策:
scan: blame: auto # 检测 CI=1 时自动降级为 never blame_budget: 800ms一个改动同时关掉隐私泄漏面和性能瓶颈。这种「跨角色互补」是单 Agent 最难自发产生的。
5.3 规则层冲突:非 TTY 到底输出什么
- 架构原方案:非 TTY 自动切机器格式
- UX 反驳:
todo ls | head、| less、> report.txt全是非 TTY,但用户期望的仍是表格
裁决:采纳 UX。非 TTY 只做两件事——关颜色、宽度固定 100 列;机器格式必须显式 --format。这条写进了 OutputMode 的接口注释里。
6. Round 3:唯一需要人类拍板的问题
三轮讨论后仍需要人工决定的是:todo done <id> 之后,默认视图还显示它吗?
| 方案 | 挫败感 | 风险 |
|---|---|---|
| 显示(架构原方案) | 高且不可逆:每天刷到已 done 的条目 → 用户判工具没用并弃用 | 无 |
| 隐藏(UX 方案) | 无 | 「误以为债消失了」——可用计数与提示消解 |
裁决判据是风险的不对称性:挫败感无法用提示消解,认知偏差可以。所以选隐藏,并补三条兜底:
- 汇总行永远显示全貌:
3 open · 2 closed(注释仍在源码)· 1 vanished - 首次
done的回执必须写明「源码注释还在,去todo ls --unsynced看」 - 给这个状态一个出口:
--unsynced视图,作为「v1 不写回源码」下唯一的收敛路径
裁决记录在架构文档 §6.1,并且连带改了里程碑——--unsynced 从「可选视图」升级为 M2 必过项。
这条要特别注意:这类问题不该由任何一个 Agent 单方面默认。架构负责人最初的选择是「默认显示」,如果没人挑战它,它会一路带进代码里,等到用户反馈「工具无视我的操作」时为时已晚。
同一轮里还定了一条产品价值观:不做任何形式的债务评分 / 健康度 / 团队排行榜。理由是可验证的:一旦出现单一标量,它必然被考核,被考核必然被操纵(删 TODO 而不是修 TODO)。统计改为只报双向流量,作者分组按平均 age 排序而不是条数。
7. 什么时候该降级
三条触发条件,命中任意一条立即停止并行:
- 同类错误连续 2 轮未收敛
- 跨模块修改范围不可控
- 验证结果与改动结论冲突
降级指令模板:
进入降级模式:1) 暂停所有并行任务;2) 保留主任务 UX-1;3) 将 ARCH-1、DA-1 转为串行;4) 先修订 Speckit 中的冲突字段定义;5) 修订后重新执行并输出差异报告。本次没有触发降级,但第二轮一度接近:UX 在 v0.4 二次反馈中指出「指纹不含路径」带来两个新问题(同一指纹对应多处出现、改一个字等于换一条身份)。这类「修好一个 bug 引入另一个」的信号,就是降级的预警——幸好它附了缓解方案(用 context_hash 做编辑配对锚点、Crockford Base32 去形近字符),才没有真的停下来。
8. 红线与证据链
8.1 安全红线
- 不在命令与日志中明文暴露密钥
- 不允许未审查的危险文件操作
- 不允许跳过验收直接标记完成
8.2 质量红线
- 不接受「改动大但无验证」
- 不接受「通过构建但无边界测试」
- 不接受「成功结论与证据不一致」
8.3 每个任务至少保留四项证据
输入指令 / 关键改动 / 验证输出 / 结论(通过或阻塞)。
本次的验证输出大多是可复跑的数据,不是形容词:
# 隐私:证明零外网请求mitmproxy 抓包,默认配置下外网请求数 = 0
# 性能:写进验收标准,不是优化项5 万文件冷扫描 P95 < 5s(macOS/Linux)· < 8s(Windows)二次扫描(无变更)< 0.3s
# 定位:证明不是 rg 别名增量信息率 = 本工具独有字段数 / 总字段数(age / owner / status / due / 引入 commit —— rg 一个都给不了)止损线:增量信息率 < 30% 立即停手重定位8.4 交付四件套
- 功能验收:三份文档覆盖命令体系 / 架构 / 风险
- 质量验收:每条质疑配缓解方案,每条止损线有阈值
- 风险验收:无越权操作,仓库内零污染写入
- 复盘产物:看板 + 三轮 Round 汇总 + 裁决记录 + 未闭环项
交付摘要模板:
## 交付摘要- 目标功能:- 完成任务:- 阻塞与解决:- 风险处理:- 验证结果:- 可复用模板:8.5 实验特性当前的能力边界(写进看板顶部)
- 会话恢复后,成员状态可能无法完整恢复 —— 关键协作必须可重放(这也是要留 Round 汇总的原因)
- 单会话只维护一支团队,避免多团队并行导致上下文混线
- 不做「团队套团队」的嵌套编排,复杂场景用「并行 + 降级串行」
9. 团队协作指令速查
| 操作 | 用途 |
|---|---|
@成员名 | 只给指定成员下发任务或纠偏(首选,不要全体重来) |
@all | 全员广播统一约束,例如「冻结契约,禁止新增字段」 |
Tab | 补全成员名,降低误 @ |
Ctrl+T | 打开/查看共享任务看板 |
口令固定四段式:目标 / 边界 / 验收标准 / 禁止项。
每轮固定产物五条:本轮目标 · 实际改动 · 验证结果 · 风险与阻塞 · 下一轮建议。
## Round N 汇总- 完成:- 阻塞:- 新增风险:- 需人工决策:- 下一轮计划:10. 小结
三个可复制的经验:
-
角色按职责切,不按技术栈切。 没有前后端的需求,照样能映射出 UX / 架构 / 挑刺者的三角。挑刺者这个角色在单 Agent 模式下几乎必然缺失——因为没人愿意质疑自己刚写得挺顺的方案。
-
并行的前提是输入不互相依赖。 能让三个角色读同一份需求、写三份不同文档,才谈得上并行。一旦 UX 要等架构的存储方案,就直接串行,别硬撑。
-
留裁决记录,而不是留结论。 三个月后没人记得「为什么默认视图是活跃子集」,但只要有裁决记录(双方判据 + 风险不对称性 + 三条兜底),后来者就能判断这个决定要不要推翻。
这次分工是否值得,最终还是要看它发现了哪些遗漏、减少了多少返工,以及协调本身花了多少时间。角色数量本身说明不了收益。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
评论区
正在加载 GitHub 评论…