Agent 工具发现是当可用工具数量很大时,组织、检索并按需向模型提供当前任务所需能力的机制。它解决的是“模型此刻应该看见哪些工具”,而 Agent 工具调用 解决的是“模型怎样从已经可见的工具中发起一次调用”。
为什么需要工具发现
把全部工具 Schema 放入每次模型请求,会占用上下文,降低缓存稳定性,并增加名称重叠和误选。随着多个服务、插件和 Skill 被接入,工具目录本身需要版本、权限、索引和质量治理。
能力采用专用工具、通用执行器还是 Skill,决定单项能力的接口和维护方式;工具发现决定同时暴露哪些能力。两项决策相互影响,但不能混为一谈。
层次化组织与按需加载
最基础的方法是只向模型提供轻量索引,需要时再加载完整定义。工具可以按服务、领域或操作性质分组,例如搜索、读取、解析、查询和执行。层次结构应帮助模型缩小候选范围,但不能依赖含糊分类掩盖工具自身的边界。
工具索引至少应包含稳定 ID、名称、用途摘要、所属服务、风险等级、权限要求和版本。完整定义加载后,应在后续轨迹中保持身份一致,避免同名工具悄然改变含义。
检索式预筛选
当目录更大时,可以根据用户请求或任务状态检索少量候选,再把候选 Schema 提供给模型。检索可以结合关键词、语义相似度、服务分类、权限和历史使用信息。
一次性预筛选只依据任务开始时的信息,可能漏掉执行中才暴露的能力需求。因此系统应允许继续搜索,而不是把第一批候选视为完整工具集。
主动工具发现
主动发现让 Agent 在执行过程中声明能力缺口,例如“需要读取某种文档格式”或“需要查询指定业务系统”。发现服务再匹配相关服务和工具,并返回候选定义。典型流程是:
- Agent 判断当前工具不足,并描述需要完成的动作、输入和期望输出;
- 系统先按服务或领域筛选,再在候选组内匹配具体工具;
- 权限层过滤当前身份不可用的能力;
- Harness 把选中的完整定义追加到当前轨迹;
- Agent 调用工具,并在结果不足时改写需求或继续发现。
发现结果应保留稳定工具 ID、来源、版本和加载位置。动态加载不应无提示地替换已出现的 Schema,否则历史调用将难以解释,缓存和复现也会失效。
Skills 作为轻量发现方式
Agent Skills 通常先暴露名称和描述,命中任务后再读取说明与资源,相当于用目录浏览实现渐进式发现。它不一定需要向量索引或正式 Schema 注入,但规模继续扩大时,仍需要分类、搜索、版本和权限过滤。
MCP 可以为工具提供统一的列举和调用协议,但接入多个服务器后仍可能得到很大的工具集合。是否使用 MCP,与是否按需披露工具是两个独立决定。
无匹配、降级与安全
没有足够匹配时,系统应明确返回“未找到”,并允许 Agent 缩小或改写需求、使用基础工具手工完成、请求安装可信能力,或向用户报告缺口。低相似度候选不能被包装成确定匹配。
发现层必须在返回候选前执行租户、身份、许可和风险过滤。工具描述和外部目录属于不可信输入,不能覆盖系统规则;安装新工具、授予权限或执行高风险操作仍需独立确认。
评测
工具发现应分别评估召回和任务结果:正确工具是否进入候选集、错误工具是否被排除、模型是否最终选择正确、发现轮数、上下文开销、延迟、缓存命中、无匹配判断和越权暴露。只测最终答案会掩盖发现层与调用层各自的问题。