尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Agent-Reach:构建大模型智能体的统一触达与编排框架

Agent-Reach:构建大模型智能体的统一触达与编排框架 1. 项目起点为什么需要 Agent-Reach这两年做大模型应用身边所有人都在聊 Agent。朋友圈里晒得最多的就是我用 AutoGPT 做了什么、我的 Agent 能自己订机票了。但真正把 Agent 推到生产环境的人心里都清楚一件事模型本身从来不是瓶颈卡脖子的是触达。所谓触达就是 Agent 能调多少工具、能连多少系统、能把一次真实业务操作跑通到哪一步。你让 Agent 写一首诗、总结一份文档这很容易因为只涉及纯文本生成。但你要是让 Agent 去查一下这个月的订单数据、帮用户提交一个退款申请、再同步一下客服工单状态问题马上就来了——它能不能稳定地接通你们内部系统调用失败了它怎么处理它在什么范围内有权限做这些操作这些事模型一概不知道得靠工程架构来解决。Agent-Reach 这个名字字面意思是智能体的触达能力。我最初把它定位成一个内部工具用来解决 Agent 项目里反复出现的那些够不着、不稳定、没记录的问题。后来发现它实际上可以沉淀为一套通用的 Agent 触达与编排框架负责把外部工具、内部 API、数据库、消息通道统一接入让 Agent 只通过一套标准接口就能完成各种真实操作同时把权限、超时、重试、审计这些底层脏活扛下来。这篇文章把整个项目的设计思路、核心实现、踩坑记录和排查经验完整写出来。适合正在做 Agent 落地、或者准备把 AI 接入到生产线上的开发者参考。如果你只是调用一个现成的 API 做做 Demo那 Agent-Reach 对你帮助不大但如果你要把 Agent 接到真实业务系统里这篇文章里的很多问题你早晚会遇到。2. 项目整体设计与思路拆解2.1 Agent 落地的真实瓶颈模型不缺能力缺手脚回顾我自己做 Agent 项目的经历最痛苦的不是 prompt 调不好也不是模型选型而是让 Agent 真正动手干活这一环。早期我做过一个客服工单分类助手模型部分用 GPT-4效果非常好分类准确率超过人工。但一到生产环境就崩了——不是因为模型分类分错了而是因为 Agent 需要去查工单系统、需要知道这个用户是不是 VIP、需要把处理结果写回系统。这些操作每一个都要对接一套不同的 API 协议有的走 REST有的是老项目的 WebService还有的得直接连数据库查。所有对接代码堆在一起项目里充满了各种胶水代码改一个接口牵一发动全身。很多 Agent 项目死在这一步不是模型不行是 Agent 的手脚不够长、不够稳。Agent-Reach 要解决的核心问题就是把这些手脚统一管理起来。让 Agent 不用关心目标系统用什么协议、走什么认证、返回什么格式只需要向 Agent-Reach 描述自己的需求由 Agent-Reach 负责路由到正确的工具、执行调用、处理异常、返回结果。整个设计围绕一个关键词Reach触达。具体拆成四个问题触达什么Agent 能调哪些工具、哪些数据源这是资源侧的接入问题。怎么触达Agent 的请求如何被路由到正确的工具这是调度问题。允不允许触达谁能调这个工具一次调用最多能消耗多少资源这是权限与配额问题。触达得怎么样调用成不成功、耗了多久、返回了什么这是可观测性问题。想明白这四个问题之后Agent-Reach 的架构其实已经出来了。2.2 Agent-Reach 的核心架构连接、路由、执行、观测四层我见过很多 Agent 框架上来就给你画一个非常复杂的调度图各种消息中间件、状态机、向量数据库。但对于大多数团队来说真正需要的不是复杂度是清晰度。所以 Agent-Reach 从一开始就坚持一个原则分层少、边界清楚、每层只做一件事。整个架构分四层连接层Connect负责把各种不同的外部系统接入进来。每个接入目标被封装成一个 Connector屏蔽掉底层协议差异。比如同样一个查询订单操作电商系统走 HTTP API老 ERP 走 FTP 文件交换新数据平台走 GraphQL但只要封装成 Connector对上暴露的接口就是一致的。路由层Route接收自然语言请求把它匹配到具体的 Connector 和参数。这是 Agent-Reach 和一个普通的 API 网关最大的区别。普通网关是调用方明确知道自己要调哪个接口而 Agent 场景下模型只知道自己要查订单并不知道应该调哪个 Connector路由层需要解决这种语义不确定性。执行层Reach真正发起调用处理超时、重试、限流、幂等等问题。这一层相当于给 Agent 的每次触达上了一道保险防止 Agent 因为一次网络抖动就处于失控状态。观测层Observe记录每一次触达的完整链路谁调的、调了什么、带了什么参数、返回了什么、花了多久、有没有报错。这层在生产环境中尤其重要。因为 Agent 的行为天然具有不确定性如果没有完整的调用日志出问题时你只能对着模型输出干瞪眼。这四个层的设计不是一开始就定好的是做了几个项目、烂摊子收多了之后才总结出来的。接下来我会把每一层的具体实现细节拆开讲。3. 连接层设计怎么让 Agent 够得着所有系统3.1 Connector 抽象一个统一接口吃遍所有协议连接层是 Agent-Reach 的第一道关。它的职责可以用一句大白话讲清楚不管目标系统是什么技术栈对上层统统表现为给我输入参数我给你返回结果。我定义了一个最小的 Connector 接口核心只有三个方法class BaseConnector: def describe(self) - dict: 返回这个连接器的能力描述包括功能说明、参数 Schema、返回结果 Schema pass def validate(self, params: dict) - dict: 校验参数合法性转换成目标系统需要的格式 pass def execute(self, params: dict, context: dict) - dict: 实际发起调用返回统一格式的结果 pass这里最关键的是 describe 方法。它返回的是一份结构化能力描述包含这个 Connector 能做什么、需要哪些参数、参数的类型和约束、返回结果的格式。为什么重要因为 Agent 路由层做语义匹配时全靠这份描述来判断当前这个请求应该交给谁处理。你可能会问为什么不让模型直接看函数签名然后决定调用哪个 API我试过最早期就是这么干的把十几个 API 的文档直接塞给模型。结果模型经常误解参数含义比如把用户的手机号字段传到订单号参数里还振振有词地觉得自己没错。后来把所有工具统一描述成标准 Schema再配合严格的参数校验这个问题才基本解决。在具体实现上我封装了三种最常用的 Connector 类型HttpConnector适用于绝大多数 REST/GraphQL API支持 GET/POST/PUT/DELETE支持 JSON/Form 数据格式认证方式支持 API Key、OAuth2、Basic Auth。SqlConnector适用于需要直查数据库的场景。注意这个连接器做了 SQL 白名单限制只允许执行 SELECT 查询写操作一律走专门的业务 API避免 Agent 手滑执行了 DELETE。ScriptConnector适用于执行本地脚本、调用命令行工具比如让 Agent 跑一段 Python 脚本处理数据或者执行一个运维脚本检查服务器状态。这三种类型基本覆盖了绝大多数业务场景。每种 Connector 里我最关注两个问题参数映射和错误归一化。参数映射解决的是目标系统字段名不一致的问题错误归一化则是把所有底层异常统一转成标准的错误码后文会展开讲。3.2 能力描述规范让 Agent 真正看懂每个工具Connector 的 describe 方法里返回的能力描述实际是一份 JSON Schema只不过我对它做了几个 Agent 场景特有的约定。一个典型的能力描述长这样{ name: order.query, description: 根据用户手机号或订单号查询订单详情包含商品清单、金额、物流状态, params: { type: object, properties: { phone: {type: string, pattern: ^1\\d{10}$, description: 用户手机号}, order_id: {type: string, description: 订单号格式为 20 位数字} }, oneOf: [{required: [phone]}, {required: [order_id]}] }, returns: { type: object, properties: { order_status: {type: string, enum: [pending, paid, shipped, completed, cancelled]}, total_amount: {type: number}, items: {type: array} } } }这里有三个跟普通 API 文档不一样的设计点。第一个是参数约束必须可校验。上面 Schema 里的 pattern、oneOf 不是摆设Connector 的 validate 方法会严格校验这些约束。模型传参不合法时Agent-Reach 会返回一个结构化的错误信息并自动引导模型修改参数后重试而不是把错误抛给用户。第二个是能力描述必须面向任务而不是面向接口。我见过很多团队做工具接入时直接把后端接口的文档原样照搬当作工具描述结果模型看到createOrderV2这种接口名根本不知道怎么用。Agent-Reach 的要求是description 必须描述这个工具解决什么问题比如创建一个新订单需要提供商品 ID 和数量会自动计算金额而不是POST /api/order 接口。第三个是返回结果必须标准化。我把所有结果统一包装成 {success, data, error} 三层结构。这样模型处理结果时逻辑极其简单先看 success 字段为真就提取 data为假就读取 error 信息调整策略。3.3 配置化接入流程不写代码也能接新系统Connector 的封装写起来不难难得是每个新系统都要写一遍代码费时费力。Agent-Reach 做了配置化改造大部分系统接入已经不需要写代码了。现在接入一个新 API 的完整流程是在配置文件里声明这个 API 的 base_url、认证方式、接口路径、参数映射规则然后写一份能力描述 JSON重启服务即可。真正需要写 Python 代码的只有那些本就无法通过标准 HTTP 访问的遗留系统。配置文件大概长这样connectors: - name: erp.inventory.query type: http base_url: https://erp.internal.example.com endpoint: /api/v1/inventory/{sku_id} method: GET auth: type: api_key header_name: X-ERP-TOKEN secret_ref: secrets/erp_token params_mapping: sku_id: sku_id response_mapping: stock: data.stock_count warehouse: data.warehouse_name配置化的好处显而易见接入新工具的时间从一两天缩短到两小时而且配置本身可以纳入 Git 版本管理每次改动都有记录出了问题能追溯。4. 路由与执行层让 Agent 每次都触达正确4.1 三级路由策略从精确匹配到语义兜底路由层的任务是把 Agent 的自然语言请求映射到具体的 Connector。我踩过很多坑之后总结了一套三级路由策略从最硬到最软逐级兜底。第一级是精确匹配。如果请求里直接提到了工具名或明确的动作词比如用户说帮我查一下 order.query 这个功能或者 prompt 里明确要求调用某个工具直接命中对应 Connector。这级基本不会出错但覆盖的场景有限。第二级是语义匹配。这是最常用的路径借助向量相似度把请求映射到 Connector。实现上我把每个 Connector 的 describe 信息里的 name、description、params 字段拼成一段文本用 embedding 模型转成向量存起来。运行时把用户的请求也转成向量计算余弦相似度取 Top-K 个候选连接器。这里我踩过一个大坑只比较 description 的相似度远远不够。比如帮我查快递到哪了和查询订单物流状态语义上是同一件事但字面上差异很大单纯文本向量匹配的分数不高。后来我把返回结果的字段名、参数的取值范围说明也拼进向量文本里命中率明显上升。核心逻辑是能力描述向量 工具名 功能描述 参数说明 返回值说明信息越全面匹配越准。第三级是通用兜底。当语义匹配的分数低于阈值时说明请求大概率不在当前工具集的可覆盖范围内。这时候 Agent-Reach 不会硬编一个匹配结果而是返回一个未找到合适工具的响应并列出当前已接入的工具清单让模型自己判断是改写请求重新匹配还是如实告知用户能力边界。这个兜底行为极其重要宁可让 Agent 承认自己做不到也不能让它调错工具。三级路由的完整判断流程可以这样理解先用精确规则拦下明确的请求再用向量匹配处理大部分自然语言需求最后用阈值判断拦住匹配不上或置信度太低的请求形成一个从高置信到低置信的漏斗。4.2 权限与配额控制不能让 Agent 为所欲为Agent 一旦能真正触达业务系统权限控制就成了整个项目里最不能马虎的环节。我的原则是给 Agent 的最小权限应该小于等于给一个人工客服的最小权限。Agent-Reach 的权限模型包含三个维度第一个维度是用户维度。系统要记录当前这个 Agent 是在为谁服务。A 用户登录后请求查询订单Agent-Reach 会校验这个用户是否有查询订单的权限以及他能否查询目标订单。这一层直接对接公司现有的 SSO 和权限系统防止用户通过 Agent 越权访问别人的数据。第二个维度是工具维度。每个 Connector 可以单独开关也可以配置允许调用的用户组/角色。比如订单退款这个 Connector只对客服主管角色开放查询库存则对所有运营人员开放。这个维度的配置极其简单一个 YAML 文件搞定但它能避免很多灾难性事故。第三个维度是资源配额。Agent 调用是有成本的无论是 API 费用还是对内部系统的压力。Agent-Reach 支持每个 Connector 配置单次调用配额比如最大返回行数、最大请求体大小、每分钟调用频率、每日调用次数上限。超限就熔断熔断后自动通知管理员。我在生产环境里最常遇到的一个事故就是 Agent 在循环重试一个失败的接口。模型发现调用失败后会认为我多试几次可能就成功了然后以极高频率反复调用同一个接口直接把下游系统打挂。后来我做了两个防护一是单次会话里同一个 Connector 最多自动重试 3 次且间隔递增二是全局限流同一个 Agent 实例对同一个 Connector 的调用频率超过阈值后后续请求直接排队而不是立即执行。有了这两道闸才彻底治好了Agent 手滑连击的问题。4.3 执行保障超时、重试、幂等一个都不能少执行层处理的是真实调用过程中的各种不确定因素。三个词总结超时、重试、幂等。超时控制是我最早做的也是最容易做错的。一开始我给所有 Connector 统一设置了 10 秒超时结果有些秒级返回的接口被无谓地挂起 10 秒有些本来需要 30 秒生成长的报表接口却一直被超时中断。后来改成每个 Connector 在能力描述里可以声明自己的超时时间比如 order.query 设 5 秒report.generate 设 60 秒。执行层按声明值动态调整超时设置。重试策略要讲究稳但不能傻。Agent-Reach 的重试判断标准是连接超时和 5xx 错误可以重试4xx 错误参数错误、认证失败绝不重试。因为 4xx 错误重试一万次结果都一样只会浪费资源、延时暴露问题。重试次数默认 3 次采用递增间隔0.5 秒、2 秒、5 秒。还有一个细节重试前要重新走一遍参数校验防止模型第一次传参不完整第二次补全后才成功。幂等是执行层里容易被忽略但极其重要的设计。Agent 和普通程序不一样它自己不知道上次操作到底成没成功。比如 Agent 发起了一个给用户退款的调用网络超时了Agent 会重试。如果退款接口没有幂等保护用户就被退了两次款。Agent-Reach 的做法是每次调用生成一个全局唯一的 request_id透传给下游系统下游系统记录这个 request_id 与处理结果的对应关系。当重试请求带着同一个 request_id 到达时下游直接返回上次的处理结果不再重复执行。这个机制跟支付系统里的幂等键是一个思路。5. 实战演练让 Agent 自动处理一条客服工单5.1 场景设定与工具准备理论讲多了容易飘我用一个完整的实战场景把前面这些设计串起来。假设我们要做一个智能客服工单处理 Agent。用户通过客服页面提交了一个问题我上周买的手机订单还没发货帮我查一下怎么回事。这个 Agent 需要触达的系统有三个用户中心服务提供用户身份验证和基本信息查询订单服务提供订单查询、状态更新工单服务创建工单、更新工单状态在 Agent-Reach 里接入这三个系统每个系统只需要一个 HttpConnector 配置。以订单服务为例配置文件里声明好 base_url、接口路径、参数映射。接入完成后的目标很明确Agent 收到用户的咨询后能够自动完成验证用户身份 - 查询订单 - 获取物流状态 - 把处理结果更新到工单这一串真实业务操作。5.2 Prompt 与工具描述配合让 Agent 知道何时用哪个工具工具接入好了还有一个关键点怎么让 Agent 在正确的场景里主动使用工具。我在系统 prompt 里写明了工具使用规则核心就三条第一条先查再答。所有涉及具体数据的问题必须先调用工具查询不能凭记忆回答。防止模型一本正经地胡说八道比如虚构出一个根本不存在的订单号。第二条一次只做一件事。如果用户的诉求很复杂拆成多个步骤每一步先调用工具、拿到结果确认无误后再进入下一步。不要让模型一次性写出调用用户中心 调用订单服务 返回结果的猜测性答案因为后续步骤依赖于前一步的真实返回结果。第三条工具调用失败时不要瞎编替代方案。遇到明确报错用户不存在、订单号格式错误必须向用户索要正确信息或如实反馈而不是伪造一个结果继续对话。prompt 里有了这三条规则配合 Connector 的能力描述Agent 的行为就会稳定很多。这里我特别想强调先查再答这条它几乎消除了 Agent 在业务场景里一半以上的幻觉问题。5.3 完整执行链路拆解一次真实对话背后的流程现在用户发来消息我上周买的手机订单还没发货帮我查一下怎么回事。这条消息进入 Agent-Reach 后的完整处理链路如下第一步路由层接收请求文本我上周买的手机订单还没发货帮我查一下怎么回事经过语义匹配最高分的是 order.query 这个 Connector置信度 0.91。第二步执行层调用 order.query但参数校验发现缺少必填参数 order_id。Agent-Reach 不会直接报错而是返回一个参数缺失提示带上需要 20 位订单号或 11 位手机号的指引。第三步Agent 看到参数缺失提示向用户追问查到您的账号了请问方便提供一下订单号或者下单手机号吗用户回复了手机号。第四步Agent 带着手机号参数重新发起对 order.query 的调用。此时 Agent-Reach 先做权限校验——确认这个用户是否有查询该订单的权限。校验通过后实际向订单服务发起 HTTP 请求。第五步订单服务返回该手机号最近的订单状态为paid物流信息为空说明还未发货。Agent-Reach 把返回结果包装成标准结构即 successtrue、data 包含订单号和状态字段。第六步Agent 拿到订单信息后判断这是一个未发货但已付款的异常场景。它继续调用另一个工具即工单服务里的 create_ticket创建一个催发货工单并把订单号、用户问题描述都填进去。第七步工单创建成功后Agent 向用户回复查到了订单已付款但目前还在备货中已经帮您提交了催发货申请工单号是 T20240613001后续会有人跟进。整个链路走完用户只看到了两轮对话但背后 Agent 已经完成了用户身份验证、订单查询、异常判断、工单创建四步真实操作。我的测试结果是这个场景在工具配置完善的情况下成功率能稳定达到 90% 以上剩余 10% 基本是用户提供的手机号格式异常或订单确实不存在属于需要人工介入的边界情况。5.4 人工复核与回退机制Agent 不是全自动的我在做过一个版本之后意识到全自动在真实业务环境下是不现实的。Agent 执行关键操作之前需要插入人工复核节点。我的做法是给 Connector 增加一个叫 review_policy 的配置。对于查询订单这类只读操作走全自动对于创建工单这类写操作默认走人工复核对于退款删除数据这类高风险操作则强制双人复核即主管和该业务负责人系统各审一道全部通过后才会真的执行给下游系统。具体实现是在执行层埋了一个 Hooks 机制。当某个 Connector 的调用被标记为需要复核时请求不会立刻发送到目标系统而是进入一个審批队列由人工审核通过后再自动执行。Agent 在进入复核状态时会收到一个返回操作已提交等待人工确认。然后它会告诉用户这个操作需要稍等片刻。这个机制在项目上线初期帮了大忙有几单高危操作都被人工审核拦了下来原因是 Agent 在语境理解上还是会有偏差比如它把客户本人退款和帮客户发起退款搞混了。人工复核是 Agent 落地时最实际的一道保险宁可慢一点不能错一点。6. 常见问题与排查技巧实录6.1 典型问题速查表做 Agent-Reach 的这几个月我在内部和几个合作团队里收集了不少典型问题整理了一张速查表遇到问题可以先对着这张表排查。现象可能原因排查方法解决方案Agent 明确提到某工具但路由匹配不到精确匹配规则里没有包含该工具的别名检查路由日志查看用户原始请求和匹配分数在 exact_match 配置里补充常见说法如订单和查单所有请求都走兜底匹配分数低工具能力描述过于简略或者向量索引未更新检查 embedding 是否落后于工具描述变更修改 describe 后重新生成本向量工具调用频繁超时下游系统本身慢或超时设置不合理查看观测层耗时分布区分 P50/P99调整该连接器单独的 timeout 配置重试后仍然失败下游系统持续性故障查看错误码是否为 5xx 或连接超时开启熔断暂停该工具一段时间避免无效重试Agent 循环调用同一失败工具模型认为多试几次能成功查看调用链是否出现同一工具反复调用启用单会话重试次数限制查询到了别人的数据权限校验未生效检查当前用户的角色和授权范围补齐用户维度到工具维度的授权映射6.2 排查思路从观测日志里找线索Agent-Reach 的观测层是整个项目里投入产出比最高的模块。每次调用都会记录一条完整的 trace包括 request_id、用户、Connector 名称、输入参数、输出结果、耗时、错误信息、路由命中方式等。排查问题的第一原则不要去看模型输出先看 trace。因为模型输出只是表象真正的问题往往发生在调用链路的某个环节。我举个例子有次 Agent 总在查询订单后告诉用户订单不存在但用户明明能看到自己的订单。查 trace 发现Agent 把用户提供的手机号传给了order_id参数参数校验时手机号无法通过 order_id 的数字格式校验于是返回了订单不存在。定位到这一步解决方案就很简单在能力描述中加强参数说明同时在 promt 里明确要求确认参数含义后再调用。第二个经验是给每次关键决策点打日志。我在路由层、参数校验、重试判断、权限校验这四个位置都打了结构化日志。出问题时可以快速判断是匹配错了、参数错了、权限不够还是环境故障不用从海量日志里大海捞针。第三个经验是建立 trace 与对话的关联。用户的一次对话可能触发多次工具调用我把这些调用都用同一个 session_id 串起来。这样如果用户反馈机器人答非所问可以通过 session_id 把整个对话期间的每一次工具调用都拉出来一目了然。6.3 经验教训三个让我印象最深的坑第一个坑向量匹配太乐观。一开始我的兜底逻辑是只要 Top-1 匹配分数大于 0.6 就用它结果发现有时两个工具描述相似度很高但实际用途截然不同。比如订单列表查询和已删除订单查询描述几乎一样处理逻辑却完全不同。后来我加了一道关键约束校验在路由阶段预先检查请求里是否包含某个工具的必要信息比如用户请求里没有订单号且没有手机号就不可能路由到订单查询工具把明显不满足前置条件的候选工具过滤掉匹配准确率才上来。第二个坑生产环境中的配置漂移。有一次下游订单服务升级了接口把订单状态的枚举值从 pending/paid 改成了 pending_payment/paid/unfulfilled但 Agent-Reach 的返回 Schema 里还写的是旧枚举。结果 Agent 拿到新枚举后无法理解返回结果全是未知状态用户体验瞬间崩塌。这次事故让我意识到工具描述与下游系统的契约必须建立自动化检查机制检测到下游接口变化时主动标记该 Connector 为不健康暂停使用并通知维护人员更新描述。第三个坑把 Agent 当普通 API 调用方设计。普通 API 网关只关心路由对不对、参数全不全、响应快不快但 Agent 场景多了一个语义理解偏差的维度。用户说查一下订单Agent 可能理解为查一下最近订单列表也可能理解为查一下某笔订单详情。这两种理解调用的是不同的工具。Agent-Reach 之所以要保留三级路由而不是直接用全语义匹配就是为了兼容模型可能理解错这件事。系统设计的默认假设越贴合模型的实际行为模式就越稳。7. 从 Agent-Reach 到通用 Agent 基建的一些反思Agent-Reach 做到现在我最大的感受是Agent 落地的工程难度不在模型侧而在触达侧。模型的能力今天已经非常强了真正决定一个 Agent 项目能否上线的是那些看似不起眼的基础设施——工具怎么接入、路由怎么设计、权限怎么控制、问题怎么追踪。这个项目从一开始的内部工具逐渐演变成了一套相对通用的 Agent 基础设施核心经验可以总结为几条工具接入必须配置化别让开发人力成为接入瓶颈路由必须有多级容错精确匹配兜不住所有自然语言权限必须最小化并且能复核Agent 不值得你无条件信任观测必须全程留痕否则出了问题就只能猜。如果你也在做类似的 Agent 落地项目我建议不要急着写业务代码先把触达这件事想清楚。问自己几个问题Agent 要连几个系统每个系统的认证和参数规范是什么谁来控制它的权限边界调用失败时它该怎么做有没有完整的调用日志能回溯这几个问题有答案了再开始动手写代码你会发现整个开发过程顺畅得多。我自己在实际使用中最受益的一个设计是所有工具都走统一 Schema 描述这件小事。一开始觉得多写了很多冗余配置甚至有点不耐烦。但后来排查问题的时候几乎每一次都是靠着这份统一描述快速定位到模型误解了参数含义或者工具描述还不够精确这两类核心原因。现在回头看这个当初觉得麻烦的设计反而是整个系统里性价比最高的一笔投入。最后再分享一个小技巧Agent-Reach 的控制面板里我把每个工具最近 24 小时的调用成功率、平均耗时、Top 失败原因都放在一页里。每天早上先扫一眼这块面板哪些工具有异常、哪些外部系统不稳几分钟就能掌握全局。做 Agent 基础设施稳定性永远比花哨的功能重要。把触达这条链路管住了Agent 才能真正从 Demo 走向生产环境。
返回列表