☰
多Agent协作不再乱:Agent触达中台架构设计与落地实践
2026/10/6 13:55:26 网站建设 项目流程

如果你所在的公司过去一年同时上线了三个以上基于大模型的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的处理链路是这样的:

  1. Agent端SDK把意图请求封装成标准消息,包含agent_id、intent_id、参数、请求ID。
  2. Reach层先校验agent_id的签名和intent_id是否在注册表中存在,这一步拦截掉90%的非法请求。
  3. 查询路由表,找出该intent对应的目标服务和动作映射,如果目标服务的健康度异常,直接进入降级分支。
  4. 权限引擎校验:这个Agent是否有权限执行该intent?是否涉及高敏感数据?需不需要人工审批?根据数据分级规则决定是否放行。
  5. 参数校验与协议转换,补全下游系统所需的认证凭证、时区、单位等隐藏约束。
  6. 执行调用,同时记录完整请求与响应到事件流中。

整个过程从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更聪明”,先把触达的秩序定下来。边界清晰之后,聪明才有价值。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询