引言

2026年,一个生产级Agent可能需要调用数百甚至上千个工具。从发邮件到查数据库,从写代码到部署服务,工具是Agent与物理世界交互的桥梁。但工具数量增长带来了一个棘手的问题:Agent如何从数百个工具中选择正确的那个?

这不是一个简单的匹配问题。用户说"帮我看看昨天那个数据",Agent需要理解"昨天"是哪天、“那个数据"指什么、应该从哪个数据源查、用什么查询语言。工具选择架构的设计直接决定了Agent的能力边界。

一、工具选择的挑战

1.1 规模挑战

当工具数量少于20个时,可以将所有工具描述放入LLM上下文,让模型直接选择。但当工具数量达到数百个时,这种方法不再可行:

  • 上下文窗口被工具描述占满,留给推理的空间不足
  • 工具间描述相似,LLM容易混淆
  • 延迟增加,成本上升

1.2 语义挑战

用户意图与工具描述之间往往存在语义鸿沟。用户说"把这个发给老板”,Agent需要理解这是要发邮件,收件人是"老板",内容是"这个"(需要从上下文解析)。

1.3 组合挑战

有些任务需要组合多个工具。例如"帮我查一下竞品最近的价格变化并生成报告"需要:搜索竞品列表→查询各竞品价格→对比分析→生成报告文档。工具选择不仅要选对单个工具,还要规划正确的执行顺序。

二、工具选择架构分层

2.1 工具索引层

工具索引层负责工具的注册、描述和索引。每个工具的描述应包含:

tool_name: "send_email"
description: "发送电子邮件到指定收件人"
when_to_use: |
  - 用户要求发送邮件时
  - 需要将结果通过邮件分享时
when_not_to_use: |
  - 用户只是想保存内容(用save_file)
  - 用户想在聊天中直接展示(用display_result)
parameters:
  - name: to
    type: string
    description: "收件人邮箱地址"
    required: true
  - name: subject
    type: string
    description: "邮件主题"
    required: true
  - name: body
    type: string
    description: "邮件正文"
    required: true
examples:
  - input: "发邮件给john@example.com,主题是项目更新"
    output: "send_email(to='john@example.com', subject='项目更新', body='...')"
cost: "low"
latency: "medium"

2.2 工具路由层

工具路由层是架构的核心。当Agent接收到用户请求时,路由层负责从工具池中筛选出最相关的候选工具。

方案一:语义检索路由

将所有工具描述向量化,用户请求也向量化,通过向量相似度检索Top-K工具。这种方法适合工具数量大(>50)的场景。

def route_tools(user_query, tool_database, k=5):
    query_embedding = embed(user_query)
    similarities = cosine_similarity(query_embedding, tool_database.embeddings)
    top_k_indices = np.argsort(similarities)[-k:]
    return [tool_database.tools[i] for i in top_k_indices]

方案二:分类树路由

将工具按领域分类,构建层级分类树。先确定用户请求属于哪个领域,再在该领域内选择具体工具。

工具分类树:
├── 通信
│   ├── 邮件
│   ├── 即时消息
│   └── 日历
├── 数据
│   ├── 数据库查询
│   ├── 数据分析
│   └── 数据可视化
├── 文件
│   ├── 文档创建
│   ├── 文件搜索
│   └── 文件转换
└── 开发
    ├── 代码执行
    ├── 版本控制
    └── 部署管理

方案三:LLM路由

使用一个轻量级LLM作为路由器,根据用户请求和工具列表选择最合适的工具。这种方式灵活但延迟较高。

方案四:混合路由

2026年的最佳实践是混合路由:先用语义检索快速筛选Top-20工具,再用LLM从候选集中精确选择。这样在准确率和延迟之间取得平衡。

2.3 参数生成层

选定工具后,需要从用户请求中提取参数。这通常由LLM完成,但需要注意:

  • 必填参数缺失:向用户追问,不要猜测
  • 参数类型验证:在调用工具前验证参数类型和格式
  • 敏感参数确认:如密码、金额等需要用户确认

2.4 执行层

执行层负责实际调用工具并处理结果:

  • 超时控制:每个工具调用设置超时
  • 重试策略:可重试错误自动重试
  • 结果解析:将工具返回的原始数据解析为Agent可理解的格式
  • 错误处理:工具调用失败时提供有意义的错误信息

三、工具组合编排

3.1 线性组合

最简单的组合方式:工具A的输出作为工具B的输入。

search_web → extract_content → summarize → send_email

3.2 并行组合

多个工具同时执行,结果聚合后传递给下一步。

              → query_database_A →
split_query  →                     → merge_results → generate_report
              → query_database_B →

3.3 条件组合

根据中间结果决定执行路径。

analyze_data → if anomaly_detected:
                  → alert_team
               else:
                  → log_result

3.4 迭代组合

重复执行某个工具链直到满足条件。

refine_content → review_content → if quality < threshold:
                                    → refine_content (with feedback)
                                 else:
                                    → publish

四、动态工具发现

在开放环境中,工具集不是静态的。Agent需要能够动态发现和学习新工具。

4.1 工具注册中心

维护一个工具注册中心(Tool Registry),支持动态注册和注销。每个工具注册时需要提供标准化的描述文件。

4.2 运行时学习

Agent记录每次工具调用的成功率和效果,用于调整工具选择策略。如果某个工具频繁失败,Agent应该降低选择它的概率。

4.3 工具组合学习

通过分析历史数据,Agent可以发现有效的工具组合模式。例如,发现"搜索→提取→翻译→总结"是一个常用的组合,可以将其封装为一个复合工具。

五、安全与权限

5.1 工具权限分级

根据工具的副作用程度分级:

  • 只读工具(如查询数据):自动执行
  • 写操作工具(如修改文件):需要确认
  • 不可逆工具(如删除文件、发送邮件):必须人工确认
  • 高危工具(如部署服务、转账):需要二次验证

5.2 参数脱敏

工具调用日志中,敏感参数(如密码、Token)应脱敏处理。

5.3 沙箱执行

不确定安全的工具应在沙箱中执行,限制其文件系统访问、网络访问和系统调用权限。

六、评估与优化

6.1 工具选择准确率

定义指标:工具选择结果与人工标注的期望工具的一致率。按月评估,低于阈值时需要优化工具描述或路由策略。

6.2 工具调用成功率

每个工具的成功率、平均延迟、错误分布。低成功率的工具需要修复或替换。

6.3 A/B测试

新的工具选择策略应先进行A/B测试,验证效果后再全量上线。

结语

工具选择架构是Agent系统的"神经系统"——它连接了认知层(理解用户意图)和执行层(调用具体工具)。好的工具选择架构应该是透明的、可解释的、可进化的。

2026年的趋势是工具即服务(Tool-as-a-Service)——工具通过标准协议(如MCP)注册和发现,Agent可以跨组织使用工具。这带来了更大的工具池,也更迫切地需要高效的工具选择架构。

未来,我们期待Agent不仅能选择工具,还能创造工具——当现有工具无法满足需求时,Agent可以编写代码创建新工具并自动注册到工具池中。这将是Agent能力的一次质的飞跃。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。