ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI Agent 记忆与上下文工程实战(5):多 Agent 协作的上下文隔离:角色、黑板与消息总线

AI Agent 记忆与上下文工程实战(5):多 Agent 协作的上下文隔离:角色、黑板与消息总线 为什么隔离是个记忆问题上一篇把单会话的检索时机与注入位置排上了日程但那些账都默认一个前提窗口里只有你一个 Agent 的东西。一旦上多 Agent 协作——规划、调研、执行、评审各司其职——窗口这个稀缺资源立刻被多方争用前两篇所有的预算规律全部乘以协作人数重新结算。多数团队的第一反应是大家看同一份记录最保险把所有 Agent 的消息流水原样广播给每个成员。这个决定的破坏力要到协作进入第二周才显现A Agent 把 B 早已被推翻的草稿当成现行方案复述C 的评审意见里混进了 D 的调试日志每个 Agent 的注意力都被别人的思维垃圾稀释而且没人说得清是哪一步串了台。所以先把本篇的核心论点亮出来上下文隔离不是组织信任问题是记忆系统的写入边界问题——定义谁能读到什么本质上就是在定义长期记忆的命名空间与发布流程。三种拓扑与一条光谱多 Agent 共享上下文有三种基本拓扑。全程共享shared transcript每个 Agent 的上下文包含所有人从第一轮到上一轮的全部消息。信息覆盖率 100%成本是平方级的——第 n 轮每个 Agent 都要重读约 n 倍的历史四个 Agent 二十轮就是四份全量账。消息总线message busAgent 之间点对点传话只把上一条消息交给下游。成本近似常数但断供严重除了紧邻上游其他 Agent 掌握的约束与决策一律看不见跨角色的信息通路被物理切断。黑板blackboard借鉴经典分布式 AI 的黑板架构——Agent 不互读流水而是把结论性条目需求、约束、方案、验收标准以压缩形式写上公共黑板各自按订阅的键拉取相关条目。成本介于两者之间且近似线性增长覆盖率的成败全押在黑板上写了什么的纪律上。三者构成一条光谱共享越多成本与污染越高上下文相关性越低共享越少越干净但越断供。工程上没有终点站只有按信息类型分道定稿走黑板工作过程留在私有区定向请求走总线。实验一四种拓扑的成本-覆盖对账下面模拟 4 个 Agent 协作 20 轮各自有固定角色开销与订阅需求消息体积与主题用固定种子生成对比全程共享、消息总线、黑板、黑板摘要四种拓扑的注入量、撞墙轮次与需要信息覆盖率每个 Agent 在每轮能否读到它订阅的键。生产系统里体积由真实组装器统计这里用确定性模拟呈现增长形状。importrandom rngrandom.Random(492)AGENTS[规划,调研,执行,评审]ROUNDS20WINDOW9000# 每个 Agent 的上下文窗口(计量单位)BASE_ROLE800# 各自角色设定的固定开销KEYS[需求,约束,方案,接口,验收,里程碑]NEED_KEYS{# 每个 Agent 真正需要的信息(订阅需求)规划:{需求,约束,里程碑},调研:{需求},执行:{方案,约束,接口},评审:{方案,需求,验收},}msgs[]# 每轮每个 Agent 产出一条消息: (轮次, 作者, 体积, 信息键)forrinrange(ROUNDS):forainAGENTS:msgs.append((r,a,rng.randint(180,520),rng.choice(KEYS)))definject_size(topo,r,a):past[mforminmsgsifm[0]r]iftopo全程共享:returnBASE_ROLEsum(m[2]forminpast)iftopo消息总线:prevAGENTS[(AGENTS.index(a)-1)%len(AGENTS)]returnBASE_ROLEsum(m[2]forminpastifm[1]prevandm[0]r-1)iftopo黑板:rel[mforminpastifm[3]inNEED_KEYS[a]]returnBASE_ROLEsum(int(m[2]*0.4)forminrel)rel[mforminpastifm[3]inNEED_KEYS[a]]oth{m[3]forminpast}-NEED_KEYS[a]returnBASE_ROLEsum(int(m[2]*0.4)forminrel)60*len(oth)print(拓扑 末轮平均注入 全程累计 首次撞墙轮 需要信息覆盖率)fortopoin(全程共享,消息总线,黑板,黑板摘要):lastsum(inject_size(topo,ROUNDS-1,a)forainAGENTS)/len(AGENTS)totalsum(inject_size(topo,r,a)forrinrange(ROUNDS)forainAGENTS)brokenext((rforrinrange(ROUNDS)forainAGENTSifinject_size(topo,r,a)WINDOW),None)cover0checked0forrinrange(4,ROUNDS):forainAGENTS:forneedinNEED_KEYS[a]:checked1iftopo消息总线:continue# 总线只传上游消息, 订阅键一律断供coverany(m[3]needforminmsgsifm[0]r)print(%-10s %10.0f %10.0f %-8s %8.1f%%%(topo,last,total,(第%d轮%(broke1))ifbrokeisnotNoneelse无,100.0*cover/checked))print(\n全程共享的注入量增长(每轮 4 个 Agent 均值, 计量单位):)forrinrange(0,ROUNDS,4):avgsum(inject_size(全程共享,r,a)forainAGENTS)/len(AGENTS)print( 第%2d 轮: %6.0f (窗口 %d)%(r1,avg,WINDOW))print(\n结论: 全量共享最先压垮最勤奋的发言者; 总线最省但断供;)print(黑板订阅摘要在成本与覆盖率之间取得平衡——隔离不是不信任, 而是给注意力做分账。)运行输出拓扑 末轮平均注入 全程累计 首次撞墙轮 需要信息覆盖率 全程共享 28210 1103492 第8轮 100.0% 消息总线 1206 91410 无 0.0% 黑板 5588 250279 无 100.0% 黑板摘要 5798 265219 无 100.0% 全程共享的注入量增长(每轮 4 个 Agent 均值, 计量单位): 第 1 轮: 800 (窗口 9000) 第 5 轮: 5964 (窗口 9000) 第 9 轮: 10805 (窗口 9000) 第13 轮: 17136 (窗口 9000) 第17 轮: 23594 (窗口 9000) 结论: 全量共享最先压垮最勤奋的发言者; 总线最省但断供; 黑板订阅摘要在成本与覆盖率之间取得平衡——隔离不是不信任, 而是给注意力做分账。四个数字讲四件事。全程共享第 8 轮撞墙单会话的平方级膨胀到了多 Agent 变成每 Agent 都平方协作人数一多最先死的是话最多的角色——这不是调窗口能救的是拓扑病。消息总线末轮只花 1206 单位但覆盖率 0%省钱的另一面是评审 Agent 从来没见过需求条目它只能基于上游转述干活转述质量决定一切。黑板把末轮注入压到 5588约为全量共享的 1/5同时覆盖率拉满因为写上黑板的是压缩后的结论条目而非原始流水。黑板摘要多花约 6% 的成本给非订阅键各留一行存在性提示——当 Agent 不知道接口这个键存在时它连要定向询问的机会都没有这一行摘要就是通讯录。这与第三篇的结论同构共享区放断言不放过程。该隔离什么污染与断供的双向账把消息流水全藏起来就安全了吗隔离过度会付出另一种代价。下面量化三种共享粒度的两类事故率版本污染下游把被废弃的草稿当成现行方案复述与依据断供缺少为什么这么定的记录被追问时重新推理出矛盾结论。importrandom rngrandom.Random(4922)TRIALS400MODES{# 模式: (被废弃草稿重新污染输出的概率, 因缺少依据而答错下游追问的概率)草稿全共享:(0.28,0.02),只共享定稿:(0.00,0.34),定稿决策日志:(0.03,0.06),}print(共享模式 版本污染率 依据断供率 综合失手率(独立假设))contam_obs{}starve_obs{}formode,(pc,ps)inMODES.items():contamsum(1for_inrange(TRIALS)ifrng.random()pc)/TRIALS starvesum(1for_inrange(TRIALS)ifrng.random()ps)/TRIALS contam_obs[mode]contam starve_obs[mode]starve bothcontamstarve-contam*starveprint(%-12s %7.3f %7.3f %7.3f%(mode,contam,starve,both))print(\n污染的定义: 评审 Agent 的上下文里有执行 Agent 三个被推翻的草稿, 它把某个)print(被废弃版本当成现行方案重新提出——多 Agent 系统特有的交叉污染事故形态。)print(断供的定义: 只给定稿, 用户追问为什么砍了方案B, 下游 Agent 无决策依据可引,)print(只能重新推理一遍, 大概率与当初结论相矛盾。)print(\n决策日志的粒度要求: 每条一行议题|决定|理由|时间戳, 体积约为草稿的 1/20;)print(它同时压低污染与断供——这就是黑板模式存在的理由。)运行输出共享模式 版本污染率 依据断供率 综合失手率(独立假设) 草稿全共享 0.305 0.022 0.321 只共享定稿 0.000 0.312 0.312 定稿决策日志 0.020 0.065 0.084 污染的定义: 评审 Agent 的上下文里有执行 Agent 三个被推翻的草稿, 它把某个 被废弃版本当成现行方案重新提出——多 Agent 系统特有的交叉污染事故形态。 断供的定义: 只给定稿, 用户追问为什么砍了方案B, 下游 Agent 无决策依据可引, 只能重新推理一遍, 大概率与当初结论相矛盾。 决策日志的粒度要求: 每条一行议题|决定|理由|时间戳, 体积约为草稿的 1/20; 它同时压低污染与断供——这就是黑板模式存在的理由。综合失手率从 0.321草稿全共享到 0.312只共享定稿几乎持平——两个极端各错各的全共享错在复读废案不共享错在无据辩护。定稿决策日志把两率同时压到个位数失手率 0.084比任一极端好近四倍。这个一行日志换双向安全的结构正是经典黑板架构在 LLM 时代重新流行的原因ChatDev、MetaGPT 这类框架里 Agent 间传递的不是聊天流水而是阶段产物加评审意见本质上都是同一张黑板。工程落地三个平面各管一段私有平面每个 Agent 的工作草稿、工具回显、中间推理只进自己家会话内滚存、跨会话按第三篇的写入路径归档永不广播。黑板平面只放结论性条目写入即发布——格式统一为键值出处版本写新条目必须作废旧条目沿用第三篇的关闭旧区间追加新区间订阅方按键拉取拉取时叠加时近打分。总线平面定向请求-响应把接口文档的超时约定发我一份这类一次性查询走这里响应结果若被确认为长期有效由接收方提请上黑板而不是留在私聊里发霉。三个平面再加一条总纪律没有任何信息可以同时出现在两个平面——定稿上了黑板草稿就该从可检索区退场重复是污染的温床。预算层面给每个 Agent 的注入配额先扣除私有工作集剩余再分给黑板订阅黑板订阅按键限额而不是全局 top-k防止某一热点键吸干所有 Agent 的窗口。常见陷阱一是广播成瘾所有消息进所有窗口美其名曰信息透明第 8 轮撞墙、撞完墙开始截断截掉的恰恰是各 Agent 自己的角色设定。二是黑板当聊天室把未定稿的讨论原样贴上黑板污染率瞬间回到草稿全共享的水平还多了一份权威感包装。三是私有区无出口一切不上黑板、全走点对点私聊系统里出现只有调研 Agent 知道需求变了的孤儿知识其他 Agent 集体拿着旧约束干活。四是订阅无表每个 Agent 拉所有看起来相关的条目等价于软性全共享成本曲线重新变弯。五是缺存在性提示Agent 不知道黑板上有哪些键连定向询问都不知道该问谁断供被误诊为模型能力不行。落地清单定义信息分级草稿/工具回显进私有区定稿与决策日志上黑板一次性查询走总线黑板条目四要素键、值、出处轮次、版本号更新即作废旧版读方永远只认有效版每 Agent 注入配额两层分配先保私有工作集剩余按订阅键限额拉黑板禁全局 top-k键目录存在性提示常驻每个 Agent 头部60 单位一行也值得排障工具链支持这条输出引用了哪个平面的哪条条目交叉污染事故要能 5 分钟内定位到写入者隔离做完了还有一个大户没进账本工具定义。几十个工具的 schema 静态摊进每个 Agent 的窗口是仅次于对话历史的第二吞噬者而且它连摘要的资格都没有。下一篇《AI Agent 记忆与上下文工程实战6工具定义的生命周期大量工具的裁剪与动态注入》把这块固定开销变成可调度资源。参考来源Wikipedia, Blackboard (artificial intelligence)https://en.wikipedia.org/wiki/Blackboard_(artificial_intelligence)Wikipedia, Message bushttps://en.wikipedia.org/wiki/Message_busQian et al., ChatDev: Communicative Agents for Software Developmenthttps://arxiv.org/abs/2307.07924Hong et al., MetaGPT: Meta Programming for A Multi-Agent Collaborative Frameworkhttps://arxiv.org/abs/2308.00352Anthropic Engineering, Building Effective Agentshttps://www.anthropic.com/engineering/building-effective-agents
返回列表