ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

多Agent协作不再乱:Agent触达中台架构设计与落地实践

多Agent协作不再乱:Agent触达中台架构设计与落地实践 如果你所在的公司过去一年同时上线了三个以上基于大模型的Agent我的经验是它们很快就会乱成一锅粥。这不是说单个Agent不好用而是说当客服Agent、营销Agent、数据分析Agent各自接到任务、互相抢工具、还共享一份业务数据时冲突几乎是必然的。Agent-Reach这个名字是我们在解决这个问题的过程中给内部项目中台起的代号。它的核心目标不是再造一个Agent框架而是解决Agent与外部系统之间的“最后一公里”谁可以触达什么、以什么方式触达、触达过程如何被审计与回滚。如果你正在把Agent从个人玩具推向部门级甚至公司级的基础设施这篇文章的架构思路和踩坑记录应该能帮你省下不少时间。1. 为什么单个Agent好用一群Agent就翻车先说一个真实的混乱场景。我们公司内部有四个独立团队分别做了代理客服、营销外呼助手、报表问答和运营工单处理四个Agent系统每个都能在“单挑”场景下跑得不错。但业务方真正想要的是一连串动作用户在客服窗口说“帮我查一下上个月的订单为什么还没发货”客服Agent需要调用订单系统、物流系统、还得通知运营Agent创建一个跟进工单同时营销Agent要标记这个用户有过售后记录。这个链条一旦串起来问题就全冒出来了。第一大痛点是工具抢占无仲裁。客服Agent和营销Agent同时调用同一个CRM写入接口分别试图修改“客户备注”字段后写入的会把先写入的覆盖掉。没有一个人能说清楚当时的写入顺序对不对数据最终长什么样完全取决于Agent的调用时序这在整个数据链路里是不可接受的。第二大痛点是权限边界失守。每个Agent单独接入时都申请了“必要的最小权限”但当一个Agent能调用另一个Agent的工具时权限就变了入口是客服Agent出口却是营销Agent的群发能力。审计时你根本说不出一条用户查询请求到底最终触碰了哪些系统这在我们内部安全评审的时候直接被打了回来。第三大痛点是链路断裂导致业务事故。比如订单系统响应超时A Agent重试三次失败后放弃但B Agent并不知道这次失败还在给用户推送“订单已加急处理”的确认消息。用户收到的是错误信息而两个Agent各自觉得“自己没做错”。Agent-Reach就是在这些问题清单上立项的。它的设计初衷很朴素给所有Agent一个统一的路由出口让每一次触达都有声明、有鉴权、有记录、有补偿。它不是要替代LangChain或者自研的多Agent编排框架而是做编排框架之下、外部系统之上的那一层“连接调度层”。2. Agent-Reach的核心设计三层模型与声明式触达项目启动前我们花了两周时间讨论了一个关键问题是所有Agent的通信都要经过中台还是只有触达外部系统时才经过中台最后的选择是后者。只对“触达”做收敛不干涉Agent之间的自由对话编排这样接入成本最低原有Agent框架也不需要伤筋动骨地改造。2.1 三层结构Agent层、Reach层、执行层整个体系分三层Agent层各个业务Agent负责对话理解、任务规划、决策生成。这一层该用什么框架用什么框架我们的要求只有一个对外部系统的调用必须声明为“触达意图”而不是直接在代码里拼HTTP请求。Reach层Agent-Reach中台负责意图路由、权限校验、协议转换、限流熔断、链路追踪。所有从Agent发往外部的调用都会先落在这里。执行层CRM、订单中心、物流网关、消息推送服务等实际业务系统通过统一网关或HTTP/Webhook接口被调用。这个分离带来的第一个好处是Agent层不再需要关心“某个下游系统当前是否健康”“API协议是REST还是gRPC”“调用失败要不要重试”这些全部下沉到Reach层处理。Agent只需要表达“我要查物流状态”Reach层负责找到物流网关、检查配额、补全认证、执行调用并把结果转译回统一格式。2.2 声明式触达把“怎么做”变成配置所有Agent接入Agent-Reach时都要提供一份YAML声明文件。刚开始团队觉得这是额外负担但上线三个月后大家都认同这份声明文件实际上成了全公司Agent能力地图的入口。agent_id: support-agent agent_name: 客服助手 intents: - id: query_order_status target: order-gateway.ops.svc action: query_order required_params: [order_id] rate_limit: 300/min fallback: cache_only_read - id: create_ticket target: ticket-system.ops.svc action: create_ticket required_params: [user_id, category, desc] rate_limit: 100/min require_approval: true - id: push_notice target: message-gateway.ops.svc action: push permission_check: data_classification_high requires: [user_consent]每个intent条目表达的是“这个Agent在什么场景下想要对哪个目标系统做什么”。Reach层真正执行时会按照权限策略表、审批规则、限流配置来放行或拦截。为什么这么设计因为Agent的规划能力是不确定的但企业级系统的触达边界必须是确定的。你可以允许大模型自由规划任务拆解路径但绝不能让大模型自由决定调用哪个接口、传哪些参数。声明式触达就是把“自由规划”和“受控执行”切开的一条线。2.3 触达意图的解析流程当一个Agent发来触达请求Agent-Reach的处理链路是这样的Agent端SDK把意图请求封装成标准消息包含agent_id、intent_id、参数、请求ID。Reach层先校验agent_id的签名和intent_id是否在注册表中存在这一步拦截掉90%的非法请求。查询路由表找出该intent对应的目标服务和动作映射如果目标服务的健康度异常直接进入降级分支。权限引擎校验这个Agent是否有权限执行该intent是否涉及高敏感数据需不需要人工审批根据数据分级规则决定是否放行。参数校验与协议转换补全下游系统所需的认证凭证、时区、单位等隐藏约束。执行调用同时记录完整请求与响应到事件流中。整个过程从Agent发起调用的角度看和直接调用一个普通API几乎没有区别——SDK封装了全部内部逻辑。这也是我们对自己的硬性要求接入成本高一点点没关系但不能让团队为了接入而重写业务逻辑。3. 关键模块拆解注册、路由、会话与熔断的落地整个中台最核心的四个模块分别解决了运行时的四个问题谁能来、往哪走、上下文怎么延续、出问题怎么降级。3.1 注册中心与Agent元数据我们基于已有的服务注册中心做了二次开发给每个Agent增加了一套元数据描述除了基础的agent_id、服务地址更关键的是权限等级、数据敏感级别、QPS配额预设。配额的设定一开始用固定值结果发现不同业务时段差异极大大促期间营销Agent的触达频率是日常的十倍如果配额设死系统会在流量洪峰时刻疯狂拒绝合法请求。后来改成了动态配额基础配额加弹性配额弹性部分受全局水位影响。这个调整让大促期间的触达成功率从不足60%提升到97%以上。3.2 意图路由器路由表与动态降级路由器是Agent-Reach里最容易被低估的组件。我们把路由表设计成可热更新的策略组每一条路由规则包含意图名称目标服务可以是服务名或路由别名匹配条件例如订单类型为“预售”时走预售订单专用通道超时设置与重试策略降级方案链实际运维中发现重试策略不能统一设成“重试三次”因为不同下游的幂等性不一样。订单创建接口重试会导致建单失败幂等键冲突而物流查询接口重试是无害的。所以路由表里每条路由都单独配了重试语义幂等操作可以自动重试非幂等操作一律不重试直接抛给上层做业务补偿。3.3 会话上下文与业务血缘做过系统的人都知道链路追踪系统类似OpenTelemetry能解决“调用链长什么样”的问题但解决不了“业务状态在哪个环节被修改”的问题。Agent-Reach额外维护了一套会话上下文结构以用户会话为粒度保存关键业务状态切片这个用户当前的订单号、售后单号、上一次客服结论。有了会话上下文垫底跨Agent的协作才变得体面。以前客服Agent和运营Agent各自查一遍订单状态现在客服Agent查完写入会话上下文运营Agent直接从上下文中取“order_status_cache”少一次外部调用还减少了重复查询的负载。一次普通售后处理工具调用次数从平均17次降到了9次。3.4 熔断与降级触达也要按“电梯限载”处理Agent触达外部系统的频率比人类操作高得多下游系统经常被突如其来的Agent流量打挂。我们的熔断策略参考了大规模微服务治理的成熟方案但做了针对Agent场景的微调基于滑动窗口统计下游错误率超过20%进入熔断熔断后的降级动作不是简单的直接拒绝而是查预案表比如订单系统挂了先走缓存只读缓存也没有就返回“服务繁忙”并生成工单由人工跟进。踩过的坑是熔断状态不能由Agent触发即时恢复。曾有大模型为了完成用户指令反复触达熔断中的服务把下游拖到雪崩边缘。后续调整后Agent在触达被拒时必须接受“当前不可达”的既定事实转而执行备选方案而不是原地重试轰炸。4. 从Demo到生产性能瓶颈与稳定性的实战数据Demo阶段跑得很顺利但压测和灰度阶段暴露出一堆只会在生产环境冒出来的问题。这一节我挑几个影响最大的展开。4.1 事件量暴涨存储先扛不住了因为每一次触达都要记录审计日志接入Agent-Reach后日志事件量从每天二十万条暴涨到近百万条而且每条事件都要保留业务字段、路由信息、调用参数、响应摘要单条数据能到2-3KB。业务方要求至少保留180天以备排查存储量直接别撑爆了。最终方案是分级存储热事件最近7天放云上的内存数据库冷事件7到180天压缩后落到对象存储。查询路径也做了分级实时排查走内存索引历史追溯走异步分析任务绝不允许业务前台直接跑180天全量查询。4.2 路由层超时预算的分配Agent到下游系统多了一层路由意味着超时预算也得重新切分。以前Agent直接调用下游系统1200ms超时是够用的现在Agent到Reach层要花掉一部分Reach到下游又要一部分总预算不变的情况下两层分到的额度都很紧张。我们最终的切分方案是本地SDK到Reach层预留150ms局域网内实际通常30ms以内Reach层到下游系统预留900ms剩下150ms给Agent侧的模型推理和其他开销。这套预算模型上线后P95链路时延从280ms升到320ms换来的代价是触达行为的完全可审计。这个取舍我们认为是值得的。4.3 幂等设计的两次事故第一起事故是客服Agent重试导致同一个工单被创建了三次用户收到了三条一模一样的处理通知。根因是业务下游系统的创建接口不是天然幂等的而路由器的重试策略一刀切了。后来我们给重试机制加了两个约定要求下游提供幂等键没有幂等键的接口重试只会发生在“明确无副作用”的读操作上。第二起事故和“补偿”有关。某个外部渠道的推送接口返回了“已接受”但实际没有送达Agent层显示触达成功用户却没收到消息。后来触达状态增加了“回执确认”对于关键渠道需要等待渠道的回执回调才算触达成功否则自动转入人工补发流程。5. 避坑清单这些坑能别踩就别踩这一部分全是血泪经验我按踩坑的频率和价值做了排序。5.1 字段冲突是最大的隐性数据杀手多个Agent写同一个实体的不同字段单看每个Agent的写入都合理合起来就会互相覆盖。比如客服Agent写入“客户备注要求立即发货”营销Agent同一秒写入“客户备注大促活动敏感客户”后写入者覆盖了前者客服那边看到备注没了以为系统出了问题。Agent-Reach维护了一张字段级冲突矩阵凡是两个Agent的写入目标有交集必须配置合并策略或人工仲裁。宁可让流程慢一点也不能让数据静默丢失。5.2 审批节点挂起会让链路卡死开启require_approval的触达如果审批人响应慢会拖住整条业务链路。有一段时间客服工单流转特别慢查了半天定位到审批系统消息队列积压有些审批单挂了两天才有人处理。后续优化成“分级审批超时降级”紧急触达走即时审批通道超时五分钟未响应自动转给备选审批人非紧急触达允许在超时后降级为“先执行事后审计”但要明确记录降级原因。这一套组合拳让工单流转时长缩短了40%。5.3 不要在上下文里拼明文凭证Agent-Reach需要替Agent保管下游系统的凭证刚开始的版本确实把凭证放在上下文里传递结果在一次调试时凭证信息被打进日志虽然没有造成泄露事故但这个问题足够严重。后续改为凭据引用机制上下文里只存凭据ID真正的密钥放在独立的凭据管理服务里Reach层执行调用前临时换取。审计日志里也不允许出现密钥字段统一脱敏。5.4 不同模型对工具描述的敏感度不同同一个intent定义GPT系列模型能稳定理解部分其他模型会频繁误配参数。这是因为各家模型的工具调用指令遵循规范的能力有差异。我们在Agent端SDK里加了工具描述校准机制意图清单里额外提供“参数示例值”而不是只给参数名和类型显著提高了一批小模型在触达意图上的正确率。5.5 Agent间通信也要定义“语言”很多方案只顾Agent和系统之间的通信协议忽略了一个细节不同Agent之间的信息传递格式。如果没有统一的业务实体定义客服Agent传过来的“订单对象”用的是自己的字段命名orderId运营Agent期望的是另一个命名order_no路由器会平白多出大量字段映射逻辑。Agent-Reach的schema registry要求所有Agent交换业务实体时必须引用统一schema版本升级遵循兼容规则字段新增必须是可选的删除字段需要提前多版本共存。一开始大家嫌麻烦但半年之后这条规范成了整个Agent生态最稳的地基。6. 关于项目边界、接入节奏和演进方向的一些想法Agent-Reach解决了“Agent触达混乱”的问题但它不是万能的。它不解决Agent自身的规划质量问题不替代业务系统自身的性能优化也不负责提升大模型的回答准确率。它的聚焦点非常明确把Agent和外部系统之间的连接变得像企业内部微服务调用一样规范、可控、可审计。接入节奏上建议分三步走第一步先接查询类、无副作用的低频触达积累审计数据和团队信心第二步接写入类操作配合字段级冲突矩阵和幂等协议第三步再接审批流、高敏感操作和跨部门协作场景。短期来看编排框架的灵活性和中台的强管控会有一点张力但长期来看没有管控的自由Agent在企业环境里走不远。从演化的角度讲这一代Agent的瓶颈在于Agent之间的相互连接能力而不只是单个模型的能力增长。Agent-Reach做的本质上就是把这种连接能力变成基础设施无论底层模型未来换不换这套连接规范都不会白费。如果你也在公司里推多个Agent我的建议是不要纠缠于“谁的Agent更聪明”先把触达的秩序定下来。边界清晰之后聪明才有价值。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进