跳转至

工具数量很多时,如何做发现、路由和候选集控制?

  • ID:Q034
  • 难度:进阶 / 系统设计
  • 标签:Tool Discovery、Tool Routing、Registry、Semantic Search、Candidate Set

可视化图解

flowchart TD
  Q[当前任务与状态] --> R[语义 Tool Router]
  T[Tool Registry] --> R
  R --> F[权限 环境 风险过滤]
  F --> K[Top-K 候选工具]
  K --> M[模型选择具体工具]
  M --> V[Runtime 再次校验]
  V --> E[执行]

核心结论

工具路由的目标不是让模型从全部工具中“自由选择”,而是根据用户、任务和状态构造一个最小、合法、区分度高的候选集。 工具越多,Schema Token、选择歧义、越权风险和错误调用都会上升。

一、先建立 Tool Registry

Registry 不是工具名列表,而是可治理的元数据:

{
  "tool_id": "logs.search.v2",
  "name": "search_deployment_logs",
  "description": "按服务、环境和时间范围搜索部署日志",
  "domain": "observability",
  "risk": "read_only",
  "required_scopes": ["logs:read"],
  "input_schema": {},
  "output_schema": {},
  "latency_class": "medium",
  "cost_class": "low",
  "version": "2.1",
  "status": "active"
}

Registry 负责版本、所有者、权限、健康度、成本和弃用,不应由 Prompt 文本承担。

二、分层路由

对应流程使用 Mermaid 图解展示。

1. 硬过滤

先去掉:无权限、环境不匹配、已禁用、风险等级不允许、当前状态不可用的工具。

2. 规则路由

错误码、文件类型、实体 ID、命令意图等强信号优先走规则,便宜且稳定。

3. 语义工具检索

将工具名称、描述、输入输出、示例和领域标签构造成检索文档,根据 Query 找 Top-K。它适合工具生态动态扩展,但需要 Hard Negative,例如 search_usersearch_order_user

4. LLM 选择

模型只看到候选工具,并可输出“不需要工具”或“信息不足需澄清”。

三、工具描述如何设计

好的描述必须说明:

  • 能做什么;
  • 不能做什么;
  • 何时使用;
  • 关键参数语义;
  • 输出内容;
  • 是否有副作用。

避免两个工具只在名称上有细微区别。若边界无法说明,可能应该合并工具或提升一个抽象层。

四、动态候选集

候选集随状态变化:

  • 未确认用户身份时,不暴露订单写工具;
  • 只读诊断阶段,仅暴露查询工具;
  • 确认修复方案后,才加入变更工具;
  • 进入特定项目后,只加载该项目 Skill 与工具。

这比在 System Prompt 中告诉模型“暂时不要调用”更可靠。

五、工具组与层级目录

工具规模很大时,先选领域,再选工具:

一级路由可由规则或轻模型完成,二级由语义检索 + LLM 选择。不要构建过深层级,否则路由错误会累积。

六、MCP 动态发现的边界

MCP 可以让客户端发现 Server 暴露的工具,但“发现得到”不等于“应该全部给模型”。Host 仍需做权限过滤、命名冲突处理、版本锁定和候选控制。

七、回退和澄清

低置信度时:

  • 返回多个候选让上层 Router 决策;
  • 询问缺失参数;
  • 使用只读探测工具;
  • 转入人工;
  • 不执行高风险默认动作。

八、评估指标

  • Tool Selection Accuracy;
  • Candidate Recall:正确工具是否进入候选;
  • Candidate Set Size;
  • 不必要工具调用率;
  • 参数补全成功率;
  • 越权拦截率;
  • 路由延迟与 Token;
  • 工具混淆矩阵。

错误要区分:正确工具没被召回,还是召回后模型选错。

常见错误回答

工具做 Embedding,然后检索 Top-5。

还缺权限、状态、版本、风险和健康度过滤。

工具超过 20 个模型就会选错。

不存在跨模型通用的固定阈值,应该通过候选规模实验和混淆矩阵确定。

面试口述版

我会先建立包含权限、风险、版本、健康度和输入输出 Schema 的 Tool Registry。路由时先做租户、权限和状态硬过滤,再通过规则或语义检索召回小候选集,最后让模型选择,Runtime 仍做最终授权。候选集会随任务阶段动态变化,高风险写工具不会一开始就暴露。评估时分开看正确工具是否被召回和模型是否选对,并分析混淆矩阵,而不是把全部工具 Schema 一次塞给模型。

结合个人项目

CI/CD Agent 可按日志、构建、Kubernetes、源码和配置分域;诊断阶段只暴露只读工具,只有用户确认后才动态加入重启、回滚或修改配置能力。