1. 从一次“答非所问”说起:Agent-Reach到底在解决什么
我大概在半年前接手过一个智能客服项目,当时的系统已经能流畅回答“你们公司有什么产品”“退货流程是什么”这类常见问题。但运营团队提了一个很实际的需求:用户如果问“我的订单现在到哪了”,助手最好能直接查一遍物流,把结果甩给他,而不是回一句“请登录官网自行查询”。
我一开始觉得这不过是接两个API的事,结果越做越发现不对劲:查物流需要订单号,订单号在用户上下文里;查完物流之后,如果物流超时还要触发提醒;提醒要发到企业微信,企业微信又要调另一个服务的接口。每个环节单独看都有现成的SDK,但把这些组合成一个能稳定跑在产生环境里的闭环,工作量比写十个单点调用都大。更麻烦的是,这套东西今天要查物流,明天要查库存,后天可能还要查合同审批进度,每加一个能力,都要重新写一遍“意图识别→参数提取→接口调用→结果格式化”的胶水代码。
后来我去看了几个开源项目,发现很多人都在做类似的事,但大部分方案都停留在“给大模型配几个工具函数”的阶段。真正的问题是:当一个Agent需要同时触达内部多个系统和外部多个服务时,没有一个统一的、可管理、可观测、可降级的通道。仅仅有工具调用还不够,我们需要一个能让Agent“够得着”所有需要的资源的通道,还要让这个通道能监控、能限流、能审计。
这就是Agent-Reach这个项目立项时的原始动机。它不是一个纯模型项目,也不是一个纯接口网关项目,而是处于两者之间的“触达层”——把Agent的意图翻译成对真实世界服务的调用,再把调用结果翻译回Agent能理解的上下文。如果你正在做的项目也有类似的痛点,比如助手需要查真实订单、推真实消息、改真实配置,这篇内容应该能给你一个挺有价值的参照系。
这篇文章我会把Agent-Reach从设计思路到落地部署的完整链路拆开讲一遍,包括中间踩过的几个坑、对几个关键选型的纠结,以及它在我这边的生产环境里跑了大半年的真实表现。里面有些配置和架构是我根据自己项目的实际情况做的取舍,未必是所有场景的最优解,但思路可以作为你设计自己的触达层时的参考。
2. 重新理解“触达”:Agent需要的不只是一堆API
Agent-Reach这个名字里的“Reach”我觉得起得挺准。很多人一说给Agent加工具,脑子里浮现的是“多写几个Python函数,注册给大模型当function calling用”。但从Agent-Reach的角度看,这远远不够。
2.1 两个层面的“可达性”
我在设计项目时把“触达”拆成了两个层面,或者说两种“可达性”:
第一层是能力可达性,指Agent能调用哪些外部能力。比如查物流、查天气、创建工单、发消息,这些都是能力。能力层解决的是“能做什么”的问题,通常以工具函数或API集合的形式存在。
第二层是数据可达性,指Agent在执行任务时需要访问哪些数据,包括对话上下文里的用户信息、业务系统的实时数据、知识库里的文档片段等。数据层解决的是“用什么干活”的问题。很多Agent项目失败,不是模型能力不行,而是数据到不了模型手里。
Agent-Reach把这两层统称为一个“通道”,并且规定:任何外部能力接入Agent之前,必须先注册成一种标准化的“可触达资源”,带上元数据、输入输出schema、鉴权方式、超时策略、QPS上限。Agent本身不关心这个能力背后是HTTP接口、gRPC服务、数据库查询还是另一个Agent,它只关心能不能通过Agent-Reach触达。
为什么要这么设计?因为我之前吃过亏。早期我做工具调用时,是把所有工具函数直接塞给大模型,让模型自己挑选。结果模型偶尔会选错工具,或者参数传得驴唇不对马嘴。后来我意识到,问题不只在模型侧,还在于工具定义太“平”了——所有工具平铺在模型面前,缺失边界、互相干扰。Agent-Reach的思路则是把工具按领域分组、按依赖分层,让Agent像走路由一样,先到对应域,再选工具,而不是面对一堆乱糟糟的函数签名猜自己要干嘛。
2.2 为什么不能直接用现成的编排框架
决定自研这个触达层之前,我也认真评估过市面上几个主流的Agent编排方案。说实话,它们的对话管理、上下文记忆、插件机制都做得不错,但到了“触达真实业务系统”这个环节,普遍会碰到几个共性的坎:
- 工具注册通常一把梭,缺少精细的接口字段级描述。模型本来就不擅长对齐隐含的业务参数,接口文档再写得含糊,效果就更不稳定了。
- 大多数编排框架默认工具调用是“请求-响应”模式,但真实业务里大量调用是非阻塞的:提交一个审批、下发一个任务、触发一次异步导入,调用方只拿到“已受理”,结果要等回调或轮询。很多框架对这类异步链路支持得很别扭。
- 观测性普遍偏弱。生产环境里不光是“调通了没有”的问题,还有“这次调用花了多久”“外部服务变慢时对Agent的整体时延影响多大”“用户的某个请求到底经过了哪些工具”这些运维视角的问题。纯编排框架很难回答。
所以Agent-Reach在设计上并没有去替代任何编排框架,而是定位成一个“可被编排框架挂载的触达层”。它对外暴露两种接口:一种是给大模型看的工具描述服务,另一种是给编排框架用的运行时服务。这个定位让它既能独立使用,也能嵌入LangChain、Dify这类已有的技术栈里。
2.3 核心模块的划分
Agent-Reach的整体结构可以划分为四个模块,下面这个表格大致描述了每个模块的职责和关键设计点:
| 模块 | 职责 | 关键设计点 |
|---|---|---|
| 资源注册中心 | 管理所有可触达能力的元数据、版本、状态 | 支持灰度变更、离线标记、依赖关系声明 |
| 意图路由引擎 | 将用户请求路由到正确的资源域 | 显式意图优先,语义匹配兜底,可回退 |
| 执行编排器 | 负责参数组装、调用外部服务、结果标准化 | 统一异步模型,支持超时熔断,记录审计日志 |
| 观测与治理 | 监控调用质量、成本、延迟、错误率 | 实时追踪一次请求完整的工具调用链 |
这四个模块拆开看都不复杂,难点在于组合在一起之后,能不能保持低耦合、高内聚,同时又能扛住生产流量。后面几节我会逐一展开讲每个模块的设计细节和实现方式。
3. 环境选型与依赖矩阵:在OpenAI函数调用和轻量自建之间找到平衡
说实话,Agent-Reach在技术选型上并没有追求“全新技术栈”,反而是故意用了不少保守的组件。在这一行干久了你会慢慢意识到:系统越底层,越要稳。很多项目死掉不是因为不够新,而是因为新的东西太多,出了问题连责任边界都划分不清。
3.1 基础运行环境与语言选择
Agent-Reach的核心运行时我选了Python 3.11+。选择理由有三点:
- Agent生态的大部分工具链都是Python优先,接入各种模型SDK、做prompt处理、写工具函数,Python效率最高。
- Python的异步生态已经足够成熟,利用asyncio完全可以承载高并发的调度任务。
- 团队招聘和维护成本低,在Python生态里出问题的概率可控。
不过我要提醒一个Python项目的“隐藏消耗”:依赖管理。Agent-Reach早期因为依赖冲突浪费了很多时间,尤其是pydantic版本和fastapi版本之间的兼容性问题。后面我引入了uv做依赖解析,才把环境复现这件事稳定下来。如果你也要搭类似的项目,强烈建议从第一天就用锁文件管理依赖,别到了部署阶段才来填坑。
3.2 Agent内核与模型接入
Agent-Reach依赖一个可插拔的Agent内核来负责“思考”,而触达层本身不重复造轮子。我这边默认适配了OpenAI的function calling协议,同时兼容Anthropic、Qwen等主流模型的工具调用格式。
细节上有一个很值得说的点:不同模型的工具调用格式差异并不只是“字段名不一样”这么简单。比如OpenAI的function calling要求工具描述尽量精简,否则模型会忽略细节;而Qwen的工具调用对参数约束的遵循度又和描述里的措辞强相关。我的做法是,在Agent-Reach里为每种模型做一层“工具描述适配器”,核心是把资源注册中心的统一Schema翻译成每个模型更容易理解的tool描述。不要小看这个适配层,实测下来,同样的一个查订单工具,适配前后的调用准确率能差出十几个百分点。
3.3 运行时服务的周边依赖
Agent-Reach的部署形态是一个带WebSocket支持和异步任务队列的Python服务。周边依赖我选了一套相对常规的组合:
- 用Redis做分布式锁、限流计数和异步任务队列,存储中间态信息。
- 用PostgreSQL存资源定义、调用审计日志、路由规则这类结构化数据。
- 用向量库(我这边用的Milvus)存历史任务的语义索引,用于后续的任务相似度匹配和路由兜底。
- 用Grafana Loki收集运行日志,配合Prometheus监控调用指标。
这套组合没什么惊喜,胜在运维经验和社区资料都多,出了问题容易查。对于速度和性能要求更高的朋友,可以考虑把Redis换成NATS之类更轻的消息系统,但对于大多数业务场景,Redis已经足够了。这几项是关于基础运行时依赖的通用实践组合,具体到你的场景里,数据库选型完全可以换成你们团队更熟悉的组件,核心思路是:状态、任务、监控三类基础设施要有明确归属,不要杂糅在一起。
3.4 最大的依赖其实只有一个:外部系统愿意配合
技术选型这部分最想强调的一点是:Agent-Reach真正处理的最复杂的依赖关系其实在外部。每个要接入的业务系统都像北京的立交桥,端口、协议、权限、限流方式各自为政。为了让触达层不被这些外部细节绑架,我在Agent-Reach的资源接入协议里规定了三件套:
- 每个能力必须声明明确的超时等级:快(100ms)、中(1s)、慢(5s+)。
- 每个能力必须提供可测试的沙箱环境,配置前先调通沙箱,再切生产。
- 每个能力必须定义降级策略:挂了之后是给Agent返回明确报错,还是返回缓存数据,还是静默降级为“暂不支持”。
这三点看着简单,但真正推动起来需要和业务系统负责人沟通很多轮。技术方案再完美,外部系统半推半就地配合,整体效果也会大打折扣。这是Agent-Reach落地时最大的隐性依赖,也是大多数同类项目被忽略的痛点。
4. 从三大核心模块出发,拆解Agent-Reach的骨架实现
这一节我会直接讲Agent-Reach的核心实现路径,不兜圈子。整个项目的代码骨架,本质上就是把三类核心模块变成一套可以跑起来的服务。这三个模块分别是:资源注册中心与标准Schema、意图路由引擎、执行编排器。理解了这三个模块,整个项目的骨架就清楚了。
4.1 第一步:定义统一资源Schema
能让所有工具在一套框架里被管理和调用的地基,就是统一Schema。我在项目里定义了一套轻量的JSON Schema规范,每个“可触达资源”必须符合这个规范才能注册。Schema里核心字段包括:
resource_id:资源唯一标识,全局唯一,不可变更。display_name:给模型看的名称,要简短、不含歧义。description:给模型看的描述,说明“什么时候该用这个工具”“这个工具不擅长什么”。input_schema:结构化入参定义,包括每个字段的类型、必填性、枚举范围、示例值。output_schema:输出结构的定义,帮助模型和上层系统理解返回结果。auth_type:调用的鉴权方式,支持none、api_key、oauth2、mutual_tls。timeout_level:超时等级,可选fast、medium、slow,对应不同的超时阈值。rate_limit:该资源的调用频率上限,单位是次/分钟。tags:能力标签,用于意图路由的匹配和检索。
我把这套Schema写成Pydantic模型,在注册时就做严格的类型校验。这样做的好处是可以把问题提前暴露在配置阶段。很多Agent项目在跑起来之后才发现工具参数写错了,然后浪费很多调试时间和模型调用次数。用强类型Schema卡住入口,是Agent-Reach第一个让我少踩很多坑的设计。
补充说一个字段描述的例子,同样是“查天气”,不同的描述方式效果差异很明显:
- 糟糕的描述:“获取天气信息”。
- 好一点的描述:“根据城市名和日期查询天气情况,支持国内主要城市,返回温度、湿度、风力。当用户提到‘今天冷吗’‘明天适合出游吗’时使用。”
描述里不仅要说清楚工具是干什么的,还要给模型一些“使用线索”——什么类型的用户问法应该想到这个工具。这个经验是从多次模型调用失败中总结来的,写资源定义时多花一分钟,模型调用时能少浪费几十次token。
4.2 第二步:意图路由引擎,怎么把请求送到正确的“域”
资源注册好了之后,用户请求进来,当前对话上下文会被送到意图路由引擎。引擎第一件事是“分域”。Agent-Reach把资源按业务域分组,例如:
- 订单域:查订单、改地址、取消订单、申请售后。
- 物流域:查物流轨迹、预报送达时间、发起物流拦截。
- 消息域:发企业微信消息、发邮件、发短信、推送App通知。
- 知识域:检索FAQ、查询政策条款、获取产品文档。
路由时引擎会先判断用户的请求属于哪个域,再在域内部挑选具体工具。这相当于先做一道粗粒度的分类,再做细粒度的选择。这种两段式设计比让模型直接从几百个工具里选一个要稳定得多。
路由策略我用的是“规则优先,模型兜底”的混合模式。规则层通过关键词和正则表达式来处理高频、表达明确的需求,例如用户说“订单号ORD”且要求“查询订单”,直接路由到query_order,不经过模型判断。这样既快又省token。规则覆盖不到的问法则交给一个轻量的分类模型来处理。分域用关键词规则和少量样本训练的分类模型结合,单次判断耗时控制在50ms以内。最后如果两者都没把握,引擎会回退到Agent内核的通用路由器,让大模型自己判断。
这里有一个很关键的经验:不要盲目相信模型的路由能力。在很多场景里,模型面对上百个工具时会“眼花缭乱”,频繁选到相似但错误的工具。通过强制分域把候选集从上百个缩小到十来个,模型的准确率会有质的提升。
4.3 第三步:多工具协同的数据透传机制
Agent-Reach的一个核心使用场景是“多工具配合完成一个任务”,这就涉及工具间数据的传递。我设计的方案是:每次调用链路的中间数据都存进一个临时的“执行上下文”对象里,工具A的输出被写入上下文的指定key上,工具B可以通过声明input_from来引用前序步骤的输出字段。
举个例子:实现“用户问我的订单到哪了”。这表面上是一个需求,实际要分三步执行:
- 从对话上下文里提取用户ID,调用
get_user_orders获得最近的订单列表。 - 拿到订单号后,调用
get_logistics_info查物流轨迹。 - 将轨迹数据和预期送达时间拼接成自然语言返回给用户。
这三步之间存在一个时间上严格的依赖关系,Agent-Reach用“执行上下文”把每一步的中间结果保存起来。执行过程可以持续几分钟,用户可以随时查看当前任务靠在哪一步、下一步预计何时开始。前一步失败时,后续步骤会根据依赖关系自动取消或重试。
数据透传有一个容易出错的地方:步骤之间字段名不一致。工具A输出字段叫order_no,工具B的入参却叫orderId。我的做法是在执行编排器里添加一个“字段映射”配置,执行时自动完成重命名和类型转换。这个映射配置在做跨系统对接时尤其重要,因为它避免了在业务代码里写大量数据搬运的胶水代码。
5. 触达能力的可观测性:一次失败的调用怎么追踪
可观测性设计是我在产品上线运行了一段时间后被迫补上的重要部分。早期Agent-Reach只记录“这次用户请求调用了哪些工具”,后来用户反馈“助手回答变慢了”,但我根本不知道慢在哪里,也无从判断是哪一步工具调用拖了后腿。于是我对可观测体系做了一轮系统性的重构推进。
5.1 为每一次调用委托生成Trace
Agent-Reach现在会为每个用户请求生成一个全局唯一的request_id,这个ID会传递给链路中的每一次工具调用、每一次外部HTTP请求、每一次数据库查询。调用日志全部带上这个ID,按request_id聚合后,可以看到一条完整的工具调用链路:哪个工具先被调、耗时多少、返回了什么、下一步选了哪个工具等。
实现上我直接接入了OpenTelemetry的标准,定义了agent.reach.call、agent.reach.tool、agent.reach.llm三类span,分别覆盖整体请求、工具调用和模型调用。这样不管是看单次请求日志,还是用Jaeger做分布式追踪,都能看到完整视图。建议你在自己项目里也尽早接入这类标准,后期补的话改造面会很大。
5.2 调用质量的三级评价机制
光能看到调用记录还不够,生产里更需要回答“这次调用到底算不算成功”。Agent-Reach对单次资源调用给出了三个层级的质量评价:
- 调用成功:外部服务返回了2xx/正常响应,技术层面没问题。
- 结果可用:返回值非空,且通过了schema校验,字段类型和范围都符合预期。
- 业务有效:结合当前上下文判断,返回值满足用户意图。这一步通常由Agent内核在最终生成时裁决。
实际统计下来,很容易出现“调用成功但结果不可用”的情况,比如某外部系统的接口经常返回空列表,HTTP状态码200但业务上等于什么都没查出来。把这些细颗粒度的状态记录下来,输出成报表,你就能清晰看到哪些外部服务对Agent的“真实贡献”很低,进而推动上游优化或补充降级方案。
5.3 限流熔断与成本控制
Agent-Reach里实现了一个非常实用的“双维度限流”机制:既限制单个资源的调用频率,又限制单个用户请求的总调用次数。第二种限制的效果是防止Agent陷入“反复重试”“绕圈调用”的死循环。默认单个请求最多执行10次工具调用,超了直接终止并返回“请求过于复杂,建议简化问题”的提示。
成本控制对于大量依赖模型分类/路由的场景也很重要。我加了一个简单的成本估算器,每次调用记录token消耗,按资源域聚合,每周汇总一次成本报表。这样做的好处是可以及时发现异常尖峰,比如某天某个工具触发了N次模型重试,消耗翻了三倍,报表上看一眼就能定位到问题入口。
6. 生产落地:Agent-Reach在一家电商企业内的真实接入案例
理论讲了不少,这一节我拿一个实际落地案例来收束一下。半年前我和一家做电商的朋友团队合作,在他们客服系统里完整接入了Agent-Reach。这个案例有一定的典型性,因为他们的系统和大多数传统企业的系统一样——有点年头、接口规范参差不齐、但数据齐全。
6.1 从订单系统迁到物流系统,再到消息触达
第一阶段的接入目标是解决“订单-物流-消息”三个域的联通问题。他们内部有一个老订单接口,查询参数是user_id + shop_id,返回的是订单JSON数组;物流商新版的查询协议是带签名校验的gRPC服务;客服还原有一个企业微信机器人,负责给用户推送消息。
这三个系统风格完全不同,但在Agent-Reach的资源注册中心里,它们都变成了标准化的“资源”。在接入过程中我发现,真正费时间的根本不是写调用代码,而是梳理每个接口的边界语义。比如他们的订单接口无法区分“用户最近订单”和“用户历史订单”,Agent-Reach的路由规则里必须加一条:默认最近30天的订单视为“最近订单”,特殊请求明确时间范围。这类业务规则沉淀在资源定义里,后续维护起来非常清晰。
6.2 客服场景的Prompt与工具配合效果
接入Agent-Reach之后,客服场景的对话流程有了一定改善。用户问“我的订单到哪了”时,新流程是:先去订单域查订单,拿单号;再去物流域查轨迹,拿物流状态;最后消息域按需触发一条带链接的通知。整套动作在3~5秒内完成,用户体感从“让我自己查”变成了“直接告诉我”。
为了稳住回答质量,我在Agent-Reach的编排里还加了Agent指令的补充约束:查询类任务必须先调用工具再组织语言,禁止模型凭空编造。只这一条配置,就把回答的幻觉率压低了近四成。类似这种治理手段,有时比模型调优带来的收益还大,也更可控、可审计。
6.3 从“能力触达”到“决策触达”的尝试
在第一阶段的三个域跑通之后,他们开始琢磨更有意思的玩法:能不能让Agent不只是“查信息”,而是“参与决策”。具体场景是:用户发起退货申请时,Agent根据订单金额、品类、历史售后记录等多方数据评估“快速退款”额度。
决策触达比能力触达复杂得多,因为它需要同时读取多个域、默认规则与风险判断交织。Agent-Reach在这个场景里主要承担了“规则引擎”的角色——先拉齐订单信息、用户历史、商品类目,再按预设规则计算风险等级,生成“建议动作”。最终是否执行,仍然由人工业务员确认。这个谨慎的“半自动”设计,让决策类Agent在业务侧接受度提高了很多。
7. 常见配置文件、参数选型与周边基建的优化建议
这一节回到工程细节,讲一讲Agent-Reach在配置和运行参数方面值得调整的几个点。这些参数有的影响稳定性,有的影响成本,有的是纯粹的“不加会后悔”。
7.1 资源注册与依赖声明示例
在Agent-Reach里,一个资源在配置文件中通常长这样:
{ "resource_id": "order.query_user_orders", "display_name": "query_user_orders", "description": "查询指定用户近期的订单列表。当用户询问自己的订单、最近购买记录时使用。", "domain": "order", "input_schema": { "user_id": {"type": "string", "required": true, "description": "用户唯一标识"}, "limit": {"type": "integer", "required": false, "default": 5, "description": "返回订单数量上限"} }, "output_schema": { "orders": {"type": "array", "items": {"type": "object"}} }, "auth_type": "api_key", "timeout_level": "medium", "rate_limit": 100, "tags": ["order", "user"] }其中timeout_level直接决定Agent-Reach为该调用分配的超时上限:fast为300ms,medium为1000ms,slow为5000ms。这个参数直接影响用户侧的整体响应时延,因为Agent内核在工具没有返回时必须等待。对于慢接口,建议在后端做异步化处理,而不是把Agent的前端等待时间撑到5秒以上。
7.2 超时、重试与降级参数的组合策略
外部服务调用失败时,Agent-Reach默认按“超时重试一次,失败后触发降级策略”的路径走。这里有一个组合参数值得细调:重试间隔和全局超时上限。
我建议把重试间隔设为上一次调用耗时的1.5倍,最少200ms。如果外部服务本身已经出问题,间隔太短的重试只会放大压力。全局超时上限的意思是:即便某个资源配置了slow等级,一次用户请求的完整工具链也不允许超过20秒。这能避免多个慢工具串联时整体体验崩塌。
降级策略要按业务类型分。对于“查天气”这类工具,降级到返回缓存数据是合理的。对于“转账”这类工具,降级策略必须是“明确拒绝并提示人工处理”,绝不能静默返回假成功。这里建议在资源Schema里直接写明其“不可降级”属性,防止后续改动时被误配。
7.3 缓存与上下文压缩的取舍
Agent-Reach支持把高频查询工具的输出结果缓存到Redis里,缓存时间按资源定义中的cache_ttl字段控制。这里需要注意一点:Agent场景下的缓存时间通常要比普通API网关短得多。普通的天气接口缓存10分钟没问题,但库存接口如果缓了10分钟,用户拿到的可能就是过期库存。
上下文压缩是我后来加的又一个省成本手段:当一次请求的工具调用链特别长时,把每步工具的长输出摘要成一句话,只把摘要放入最终提示词上下文。实测下来token消耗能减少约30%到50%,且对最终回答质量影响不大。压缩策略的触发条件是链路上工具数量超过3个,或已用token超过6000。低于这个阈值不值得压缩,因为摘要本身也有成本和延迟。
7.4 周边基建建议:日志、告警、混沌测试
最后给一个周边基建的建议,未必直接在代码层面,但对稳定运行帮助巨大。Agent-Reach建议按“工具调用质量”配置告警:如果某个工具从“调用成功”到“结果可用”的比例跌破80%,自动触发告警并通知对应的系统负责人。这种业务导向的告警比纯技术告警有更强的推动力——一旦某个系统的接口质量下降,它的负责团队会愿意优先处理。
如果条件允许,我建议为每个关键工具做一次“混沌测试”演练:故意停掉某个外部系统,观察Agent-Reach的降级链路是否按预期工作。这种演练建议放在低峰期执行,演练前先确认降级策略已上线且日志可追踪。你会发现很多平时发现不了的问题,例如某个外部服务明明不可用,Agent却因为得到了一段看似正常的错误JSON而继续往下走,产生一个不明所以的最终回答。
8. 扩展与调优方向:从“能力触达”升级为“结果可信”
Agent-Reach跑通之后,我最近在思考的已经不再是怎么接更多工具,而是怎么提升“结果可信性”。触达能力解决的只是“够得着信息”,但在很多严肃场景里,光“够得着”远远不够,还需要“信得过”。
8.1 给调用结果增加“置信度”字段
我在新版的资源Schema里给每个外部调用结果增加了confidence_score字段,取值范围0到1。这个分数由两部分组成:一是外部系统返回数据自身的质量信号,比如数据完整性、时效性、历史正确率;二是Agent-Reach的校验器对返回值和用户意图匹配度的判断。两者加权后得到最终置信度。
如果置信度低于阈值,Agent不会被禁止回答,但必须在回答里显式标注“信息可能不完整”之类的限定词,或者进一步向用户发起一次澄清。这个机制说白了就是让Agent具备“知道自己不知道”的能力。目前这个置信度计算还是基于规则,后续计划引入一个小型的排序模型来学习不同场景下哪些信号更重要。
8.2 多Agent协同:触达层作为共享底座
另一个我正在尝试的方向是让Agent-Reach成为多Agent系统的共享底座。不同角色的Agent(客服Agent、售后Agent、运营分析Agent)共用一套资源中心,但各自有不同的路由规则和权限边界。
这样的好处很明显:一套资源接入,多个Agent复用。关键是权限模型要跟着Agent走。在Agent-Reach里,权限绑定在资源使用者的agent_profile上,而不是绑定在资源本身。客服Agent可以调退款审批查询工具,但运营Agent不行;运营Agent可以调数据报表工具,但客服Agent看不到。这像一门课把教室借给不同班级使用,每个班级的课表和能碰到的教具都不一样。
8.3 最终形态:让Agent真正触达业务的毛细血管
Agent-Reach距离一个理想的“触达层”形态还有不少路要走,包括支持更多协议(消息队列协议、GraphQL等)、提供更细粒度的成本分摊视角、让路由策略可以线上热更新等。但核心思路已经清晰:Agent要真正走进业务闭环,离不开一个独立于模型、独立于业务系统的触达层。这个层不负责思考,也不负责存储,它负责的是让思考变成行动,让行动产生结果。
最后分享一个我在实际运行中最有感触的事:Agent-Reach上线后的第一个月,团队里最常用的并不是那些炫酷的多工具协同场景,而是“查看一次请求完整调用轨迹”这个最简单的功能。它让我们第一次看清了Agent在真实请求里的每一步动作。一个AI系统,当你能看到它在干什么、为什么这么干、干了多久,你会发现信任感一下子就建立起来了。而信任感,恰恰是所有Agent落地最稀缺、也最值钱的东西。