角色边界、消息契约与拓扑选择
“研究员、作者、审核员”三个名字不会自动产生三种能力。只有工具、上下文、验收或权限确实不同,拆分才减少复杂度。一个查库存并返回数量的任务用函数即可;跨资料独立研究和受限写入则适合拆开。
把交接变成可校验消息
完整标准库实验:子任务消息只传目标 ID、局部材料与允许能力;协调者在接受结果时按任务、版本、角色检查身份。
python
tasks = {"a": {"version":1, "owner":"research", "allowed_sources":{"doc:1"}}}
def accept(message):
task = tasks.get(message["task"])
if task is None or message["version"] != task["version"]:
return "stale"
if message["sender"] != task["owner"]:
return "wrong_owner"
if not set(message["sources"]) <= task["allowed_sources"]:
return "invalid_source"
if message["status"] not in {"success","partial","failed"}:
return "invalid_status"
return message["status"]
m = {"task":"a", "version":1, "sender":"research", "sources":["doc:1"], "status":"partial"}
assert accept(m) == "partial"
assert accept({**m,"sender":"writer"}) == "wrong_owner"
assert accept({**m,"version":0}) == "stale"
print("partial remains partial")部分成功不应被协调者改为 success。来源白名单只能证明它允许访问,不证明结论得到来源支持;汇总还要保留命题到证据的映射。真正通信需认证 sender,本例只展示接收侧业务协议。
谁掌握后续控制权
Pipeline 的顺序固定;router 选择一个分支;supervisor 反复调用子 Agent 并收尾;handoff 则转移控制权。层级结构减少上层上下文,但可能丢失细节。黑板让多个角色共享状态,必须处理冲突;peer-to-peer 减少中心节点却增加终止与责任判断难度;debate 可能共享同一模型偏差,投票不等于独立证据。
Agent-as-a-tool 适合返回有限结果给调用者,handoff 适合接收者继续与用户交互。每次交接传任务约束、证据、未解决问题和剩余预算,而不是复制完整历史。凭据只保留在工具执行器,不能随消息转发。跨进程协议还需消息 ID、相关 ID、超时和重放策略。
练习
增加 status=failed 且 sources=[] 的合法消息测试;向 sources 注入 doc:secret 必须 invalid_source;解释为什么错误消息也要验证任务身份。