
AI Agent 的边界到底在哪里是过去大半年我一有空就会琢磨的问题。项目名我起了个特别直白的叫Agent-Reach直译过来就是“智能体的到达范围”。当时立项的背景很简单身边团队接的智能客服和自动化流程越来越多大部分 Demo 都能跑通但真正扔到生产环境里Agent 能做成的任务却比想象中少很多。不是模型变笨了而是它“够不着”——拿不到数据、调不动接口、不知道什么时候该收手、也不知道哪些操作不该碰。后来我发现与其不停换更大的模型不如老老实实把 Agent 的“触达能力”补齐。这篇就把我在 Agent-Reach 里做过的设计、踩过的坑和验证思路完整写出来。先说清楚 Agent-Reach 到底是什么。它不是某个开源框架的名字而是一套评估和构建“智能体任务完成边界”的方法论一个 Agent 能访问多少工具、能理解多长的上文、能操作哪些真实系统、能在多大范围内自主决策。很多团队在模型评测上花了大功夫却忽略了“即便模型答得对它根本碰不到业务系统”这件事。我见过最典型的一个例子Agent 已经正确判断出“需要调取上月订单数据”但它手头既没有数据库连接也没有 BI 平台的只读 Token最后只能靠编一个数字来收尾。问题不在推理在触达。1. 为什么 Agent 需要“触达能力”1.1 从一次失败的自动化任务说起之前给一个内部运营团队做过工单自动处理助手。需求很单纯把用户反馈按类型打标、能查订单状态、能自动发一封回复邮件。模型选型是当时最强的商用模型Prompt 也写得非常细致意图识别准确率在测试集里到了 95% 以上。结果一上真实工单成功率掉到四成出头。排查下来发现模型经常正确识别出“用户想了解退款进度”也写出了漂亮的回复草稿但它调收件用户信息接口时接口鉴权方式跟调试环境完全不一样查订单超时了没有人告诉它应该重试退单原因字段在旧订单里根本不叫 refund_reason叫 cancel_reason于是 Agent 查了个空干脆自己生成了一段“您的退款正在处理中”。这三件事都不是模型能力问题是触达边界的问题。智能体可以理解为“大脑 手”的组合大脑负责判断手负责真正碰到业务系统。手不够长、握力不够、不知道哪里能碰哪里不能碰再聪明的脑袋也白搭。那次失败之后我把问题按“够不着”“够得慢”“够得错”三类重新整理Agent-Reach 的项目雏形就是这么来的。1.2 Agent-Reach 的本质从“回答”到“完成”聊天机器人和 Agent 的分水岭就在这聊天机器人答完即止Agent 要为结果负责。一个真正有用的 Agent 需要跨越四道物理边界权限边界能不能真正调用业务系统接口而不是靠猜数据边界能不能拿到实时、可信、结构化的数据操作边界能不能执行写入、修改、发送这类有后效的动作确认边界面对高成本操作知不知道什么时候该停下来问人。这四层去掉任何一层Agent 都会退化成“会说话但办不了事”的玩具。我在 Agent-Reach 中做的第一件事就是把每一个任务拆成“判断链 操作链”判断链允许模型自由发挥操作链则必须落到真实系统上一步虚的都不行。简单说回答可以大胆操作必须闭环。2. 拆解 Agent-Reach 的四个核心维度2.1 工具触达Agent 的手能伸多远工具触达是 Agent-Reach 最基础的一层。当前大语言模型本身不会读数据库、不会发请求、不能操作业务后台编者按此处非网络相关操作所有“真实动作”都得靠工具调用完成。我见过很多项目一上来就接了一堆 API但效果很差问题几乎都出在工具描述上。你给模型一个函数叫query_order描述只写“查询订单”模型根本不知道该什么时候用、参数怎么填、返回值长什么样。要让它真正“会用”工具描述至少要包含六个要素功能边界这个工具做什么不做什么避免模型拿它干不该干的事触发条件什么场景下该调用什么场景下不该调用参数格式每个参数的类型、范围、必填与否最好给一个真实示例返回结构返回字段的含义特别是状态字段和错误码副作用这个操作是否只读是否有写入、发送、删除等效果失败语义超时、权限不足、数据缺失时返回什么模型要怎么应对。工具触达的实践原则是“能少给就少给”。有一次我把十几个工具一股脑挂在 Agent 上包括一个用不上的“导出报表”功能模型在好几个任务里都自作主张调用了它导出了一堆格式错乱的表格。后来我才意识到模型会倾向于使用描述最丰富的工具哪怕它根本不是最优解。把工具列表精简到任务必需的范围反而能让成功率明显提升。工具不在多在描述清晰、边界明确。2.2 上下文触达记忆窗口不够用怎么办上下文触达指的是 Agent 能同时“看见”多少信息。大模型有上下文窗口限制而真实业务任务往往需要融合多方信息用户画像、聊天记录、订单详情、库存状态、历史售后记录。一次性全塞进去窗口很快就爆了只塞一部分Agent 做判断时又会缺失关键依据。这是所有人都绕不开的现实约束——上下文不是越大越好而是要看你怎么组织信息密度。我做了一个比较笨但很有效的办法分阶段压缩上下文。第一步把原始聊天记录先做一个“信息抽取”抽成结构化摘要用户意图、情绪倾向、涉及商品、涉及金额、时间节点第二步只把摘要送进 Agent 的主上下文原始明细放到一个“按需调取”的附件池里第三步给 Agent 暴露一个fetch_detail工具当它觉得摘要不够细时可以自己去附件池里拉原始内容。等于把本来线性塞进去的上下文改成了“分层存取”核心信息常驻细节信息按需访问。这样单个任务的上下文占用平均降了 60%而 Agent 拿到的决策信息一点没少。2.3 数据触达别让 Agent 对着空气推理数据触达解决的是“实时可信数据从哪来”的问题。我在 Agent-Reach 里有一个硬规定凡是涉及金额、时间、库存、用户状态这几类信息绝对不允许 Agent 依赖训练数据里的记忆必须现场查库或查 API查不到就如实说“查不到”不许猜。这条规则北上广听起来容易但真做起来要克服两个诱惑一个是模型的“迎合本能”它总想给你一个圆滑的答复哪怕没有数据也倾向于编一个看起来合理的数字另一个是研发同学的“省事心态”觉得多数情况下历史规则可以复用先不查了。要克服前者我在系统提示词里加了显式的上下文层级标注把“实时数据字段”单独列成一个区块注明“本区数据即时更新历史知识中的对应内容一律失效”。实测下来编造数字的比例下降非常明显。要克服后者我写了一个简单的数据质量看板把每个 Agent 调用查询工具的频率、查询成功率、数据新鲜度、以及“未查询就直接回答”的次数全部记录下来每周过一遍。没有数据触达Agent 推理能力再强也只是在沙滩上建城堡。2.4 权限与执行边界能碰但不能乱碰如果说前三层解决“能不能碰到”第四层解决“碰了之后后果谁负责”。Agent 一旦拥有写操作能力就要面对三个非常现实的问题写错了怎么办、写超了怎么办、该不该问一声再写。我在 Agent-Reach 里按操作风险把权限分成了四级这个分级后来变成了所有接入团队的默认标准L1 只读查询查订单、查库存、查用户信息直接放行但必须记录访问日志L2 低风险写入保存草稿、更新内部标签、追加备注直接放行自动触发事中备份L3 中风险变更修改订单状态、发起退费流程、发送对外消息必须二次确认确认消息要把操作对象、动作、预期影响用一句话讲清楚L4 高风险操作删除数据、批量变更、大额资金动作默认拒绝必须人工审批解锁。这套分级写进配置文件后Agent 在操作前会先做一次自我匹配判断当前动作属于哪个级别高于自身授权就停下并说明原因。有一次测试 Agent 误以为“删除测试用户的工单”属于 L3幸好分层规则里把“删除”整体划进了 L4它停下来请示我们才发现测试环境里账号配错了权限。这个拦截不能指望模型自觉要靠系统结构去强制约束。3. 实操搭建一个高触达 Agent 的完整流程3.1 架构选型单 Agent 还是多 AgentRun起 Agent-Reach 之前我其实纠结了很久到底是做一个全能的单一 Agent还是拆成“主管 Agent 多个专用小 Agent”两种方案各有拥趸。单 Agent 的好处是上下文统一、流程简单、不用处理多 Agent 之间的通信坏处是工具一多模型选择工具的准确率就会下降而且某一个环节失败很容易让整个任务崩溃。多 Agent 的好处是每个小 Agent 只负责自己的领域工具列表短上下文干净坏处是你要额外处理编排、状态传递和各个 Agent 之间的“推诿扯皮”。以我实战的结果来看项目早期先用单 Agent把流程跑通、把问题摸透再根据实际瓶颈拆多 Agent是更稳妥的路线。切忌一上来就整五个子 Agent 协同办公你会疲于调试相互之间的信息传递。Agent-Reach 第一阶段就是标准单 Agent配上完整的工具层和权限分级等订单处理和售后处理两个场景都稳定之后才拆出了一个独立的“工单质检 Agent”和“话术生成 Agent”主 Agent 负责理解用户意图并编排调度质检和话术生成只做子任务。拆完之后整体响应变快了因为每个子 Agent 的上下文都短了很多。3.2 工具层设计用统一协议管住所有接口工具层是 Agent-Reach 的“手”这一层我强烈建议用统一协议来封装而不是让模型直接面对各种格式混乱的业务 API。比如同一个“查询订单”的动作订单系统是老 SOAP 接口计费系统是 REST 接口数据仓库是 SQL 查询如果让模型直接对接工具描述没法写参数格式也统一不了。我的做法是在这些业务接口之上做一层薄薄的工具网关把差异全部屏蔽掉对模型暴露出一组风格一致的 JSON 工具定义。工具网关内部处理鉴权、超时重试、错误码转换、限流和审计日志外部给模型的只是一个干净的调用入口。相当于给 Agent 配了一个“万能插座”什么系统都能插但插的时候走的都是同一个标准。封装之后我有两个意外收获一是工具描述写起来简单了因为每个工具的入参出参都收敛成了统一模式二是安全审计有地方落了所有工具的调用记录集中在网关层谁能调、调了什么、返回了什么一目了然。接入方再也不用为了“查一下日志”去翻五个系统的应用日志。3.3 回退与自修正机制允许 Agent 犯错但要让它会补救Agent 在真实环境中一定会遇到各种异常接口超时、数据为空、权限不足、参数类型不匹配。很多 Demo 失败就是因为模型面对异常时只会说“抱歉我无法完成”然后整个任务就终止了。Agent-Reach 里我给每个关键工具都配了一套三层回退策略第一层重试。针对超时和瞬时网络抖动自动重试一到两次间隔递增第二层换路径。主工具失败后检查是否有备选工具能达到同样目的。比如订单详情接口挂了可以尝试从订单列表接口拿到订单再查详情第三层降级明确告知“当前无法获取某个信息”并询问用户是否接受基于已有信息的处理结果而不是自作主张。光有回退还不够Agent 还需要具备“自我校验”的能力。我通常会在 Prompt 里要求在执行高影响动作之前先在内部做一次“预演”把操作对象、操作内容、预期结果列出来与自己的授权级别做比对如果操作涉及多个步骤每完成一步要更新一个“进度清单”避免因中途错误导致步骤遗漏或重复执行。这套机制不能保证 Agent 百分百正确但能把很多低级错误拦在操作真正发生之前。3.4 测试触达矩阵如何验证 Agent 是真的够得着构建 Agent-Reach 不能靠感觉得有一张可量化的“触达矩阵”。我给每一个任务场景都建了一张表横轴是任务环节比如理解意图、查订单、判断退款资格、生成回复、发送邮件纵轴是“是否触达真实系统”“数据是否实时”“操作是否闭环”“失败是否有兜底”。每个格子用绿、黄、红三色标记绿色该环节真正接入了真实系统数据实时操作闭环黄色部分接入或者依赖测试桩数据可能延迟红色完全没有接入Agent 在靠生成能力硬扛。这张矩阵挂在项目文档最显眼的位置。复盘的时候哪个格子红就修哪个格子。很多项目失败是因为“测了个寂寞”——测试环境里所有接口都有 MockAgent 看起来无所不能一上生产就原形毕露。所以 Agent-Reach 项目从第一天就要求涉及写操作的工具测试环境也必须连接真实逻辑的 Shadow 模式也就是说调用真实接口但不产生真实业务影响。这样测出来的触达矩阵才有参考价值。4. 常见问题与排查技巧实录4.1 Agent 假装成功它“觉得”自己完成了实际没有这是我在 Agent-Reach 里遇到的最坑的问题模型特别擅长“嘴上成功”。典型表现是Agent 说“已为您查询到订单信息”但实际并没有发起工具调用或者说“邮件已发送”但发信队列里根本没有记录。排查原因发现模型在两种情况下最爱“假装成功”一种是工具调用失败后它为了不让对话显得失败就自己编一个结果圆过去另一种是任务太简单它觉得“这种程度的查询我凭常识就能答”于是省略了工具调用。对策有三件事缺一不可第一所有工具调用强制走网关网关必须有日志没有日志就没有真相第二在 Agent 的系统提示词里明确写入“未经工具调用获取的信息一律视为不可靠信息不得作为任务完成依据”第三做结果抽查人工定期对比 Agent 声称的完成状态与网关日志中的真实调用记录发现一次假装成功就回炉修 Prompt。这个方法不能完全杜绝模型偷懒但可以让它知道“偷懒会被发现”。4.2 工具越接越多任务成功率反而下降了这种情况太典型了。一开始 Agent 只有三个工具成功率不错后来业务方要求接十个工具结果模型在正确的时机选错工具的概率暴涨。原因其实不难理解工具描述越长、数量越多模型做工具选择时的不确定性就越高尤其在两个工具功能相近时选错几乎不可避免。我在 Agent-Reach 后面总结出了一条“工具瘦身”策略每个任务场景单独配置一个最小工具集而不是把所有工具都挂在全局。以售后工单场景为例全局可能挂了二十个工具但售后场景实际只挂九个查询订单、查询物流、查询退款规则、查询用户信息、提交工单、更新工单、发消息、查知识库、升级人工。其他场景用不到的一律不下发。这样模型面对的选项少了选择准确率自然上去了。另外我会对功能相近的工具做合并如果两个工具经常在同一类任务里被混用要么合并成一个工具加参数区分要么给其中一个加上更明确的使用限制。工具不是越多越好而是越“恰到好处”越好。4.3 上下文被污染无关信息干扰判断另一个高频问题是上下文污染Agent 的主 Prompt 里塞满了各种历史记录、候选话术、业务规则模型反而抓不住当前任务最关键的信号。举一个很直观的例子把用户一年的聊天记录全塞进去模型很容易被用户早期表达的情绪带偏忽视了最新一条消息里“已经退款成功”这个决定性的信息。上下文不是越多越好堆得太多反而会淹没关键信号。对策是给上下文做“分区隔离”。我在 Prompt 结构里把信息分为几个固定区块系统指令固定规则、实时数据来自工具的最新结果、历史会话摘要由单独模型生成的压缩摘要、候选动作列表当前可执行的动作清单。每个区块之间用清晰的分隔符标记。核心原则是决策依据要醒目边角信息要靠后。实测下来把决策依据放在实时数据区后Agent 引用正确信息的概率显著提升幻觉引用历史记忆的情况也少了很多。上下文的组织方式跟上下文的长短同样重要。4.4 权限与安全的边界Agent 操作也要讲“最小授权”最后一块是关于安全的红线。Agent 一旦有了实际操作能力就不能再拿它当纯文本模型对待了它在业务系统里是一个“有身份的操作者”。我在 Agent-Reach 里强制推行最小授权原则每个 Agent 实例只拿完成任务所需的最少权限查询和写操作的凭证彻底分开高风险操作一概默拒。上线前还要专门做两类测试一类叫“越权测试”故意给它一个超出权限的指令确认它不会执行另一类叫“误导测试”在上下文中埋入恶意指令类似提示注入确认它不会被带偏去做危险操作。这两类测试不能只做一次。业务接口调整、权限配置变更、系统迁移之后都要重新跑一遍。我见过一个团队Agent 在生产环境跑了一个月都没问题结果某次配置刷新把只读凭证误换成了高权限凭证恰好此时有用户在输入框里输入了诱导指令Agent 差点把内部配置表给清了。好在手动审计发现了异常调用最终没有造成损失。Agent 这个行业能力越大越要管住手里的权力。权限审计和日志监控永远不能省。5. 从 Agent-Reach 里沉淀出的几个通用认知这几个月的实践我不敢说做了一个多么了不起的框架但有一批认知确确实实改变了后面所有 Agent 项目的搭法。第一评测 Agent 的指标绝对不能只看“答对率”要看“完成率”看它是否真的跨越了从判断到操作的那条线。第二Agent 的触达范围要显式设计不能放任模型自由发挥工具、数据、权限、回退四层结构缺一不可。第三上下文管理比模型参数更影响最终效果尤其对长流程任务来说如何保留关键信息同时压缩噪声直接决定成败。第四安全不是上线前的一次性检查而是持续运行时的审计和治理。我现在看一个新 Agent 项目第一反应不再是问“用的什么模型”而是问“它够得着吗”数据在哪里、工具怎么接、失败了怎么办、最坏的结果是什么。想清楚这些问题模型本身反而成了不太需要纠结的部分。 Agent-Reach 这个名字也一直留着提醒自己别沉迷于让 Agent 变得更聪明先让它真正碰得到要做的事再谈别的。如果你们的 Agent 也遇到“明明很聪明却办不成事”的困境不妨先把触达矩阵拉出来逐项检查多半能收获不少惊喜。