3.6 工具搜索:大规模工具库的管理之道
3.6.1 大规模工具库的挑战:上下文污染与 Token 黑洞
随着 Agent 能力的增长,很快会面临一个棘手的问题:工具数量爆炸。 一个成熟的企业级助手可能集成了 Jira、GitHub、Salesforce、AWS 和内部数据库,可用工具轻易超过 100 个。
如果尝试将这 100 个工具的完整定义(名称+描述+参数Schema)全部塞进 API 请求:
Token 成本激增:每次对话的 Overhead 可能高达几万 Token。
注意力分散:过多的选项会“稀释”模型的注意力,导致它混淆相似的工具(如
delete_user和remove_member)。延迟增加:庞大的 Prompt 处理速度变慢。
工具搜索 (Tool Search) 正是为了解决这一问题而生。它引入了类似“图书馆索引”的机制,通过 按需加载 (Deferred Loading),让 Claude 有能力在数千个工具中精准找到所需的那一个,而无需预先加载所有细节。
3.6.2 核心机制:按需加载
工具搜索的工作流程打破了传统的“一次性全部提供”模式:
定义:在
tools列表中,可以提供数千个工具,但将绝大多数标记为defer_loading: true。隐藏:对于这些延迟加载的工具,Claude 初始时看不到它们的完整定义。它只知道“这里有很多关于数据库和代码的工具”。
索书号:不仅如此,为了帮助 Claude 找到它们,会提供一个特殊的 工具搜索工具。
发现:当用户问“重启数据库”时,Claude 意识到自己当前手中的工具不够用,于是调用“搜索工具”。
加载:搜索工具返回了最相关的 3 个工具(如
restart_db_service)。此时,这 3 个工具的完整定义才真正进入上下文窗口。
这是一个典型的 Retrieve-Read 模式在工具使用上的应用。
3.6.3 内置搜索变体
Anthropic API 提供了原生的搜索能力,这意味着不需要自己写向量数据库来实现工具检索(虽然完全可以这么做)。
内容搜索
这是最通用的搜索模式,基于关键词匹配。
Type ID:
tool_search_tool_bm25_20251119原理:经典的 BM25 算法。它根据工具的
name和description计算相关性。适用场景:你的工具描述写得非常自然语言化,或者用户提问比较模糊。
User: “服务器卡死了”
Search: "server performance lag"
Match:
check_cpu_usage,restart_nginx
正则搜索
基于 Python 风格的正则表达式进行精确匹配。
Type ID:
tool_search_tool_regex_20251119适用场景:拥有严格命名规范的工具库。
Pattern:
aws_ec2_.*(查找所有 EC2 相关工具)Pattern:
(?i)user(查找所有包含 user 的工具,忽略大小写)
3.6.4 API 定义示例
下面是如何在一个请求中混合使用“立即加载”工具和“搜索”工具的示例:
3.6.5 工具的选择与命名空间化原则
在大规模工具生态中,简单地增加工具数量往往会导致反效果。本小节总结Anthropic实战中发现的工具设计关键原则。
原则一:选择正确的工具而非所有工具
许多团队的误区是"如果某个系统有API,我们就为它创建工具"。但更多工具≠更好的Agent。
关键问题是:让Agent选择大量工具会分散它的注意力,导致它混淆相似的工具或做出次优选择。
建议:
从少而精的工具开始(10-15个核心工具)
通过评估识别哪些工具被频繁使用、哪些被忽视
只增加经过验证确实能改善性能的工具
对于重复功能的工具,优先保留最清晰、最常用的那个
原则二:工具命名空间化与前缀设计
当工具库扩展到数十个乃至数百个时,命名空间变得关键。
命名空间的目的有两个:
帮助Agent理解工具分类:通过前缀,Agent能推断出哪些工具属于同一类
减少工具搜索空间:好的前缀能帮助工具搜索算法更精准地定位
命名模式对比:
无前缀
create_user, update_config
简洁
难以分类,大规模下容易混淆
前缀命名(推荐)
user_create, user_update, config_update
清晰的分类,BM25搜索更高效
名字略长
嵌套命名
github.repo.create, github.issue.list
最清晰的层级
可能与某些API限制冲突
实践建议:
使用
service_resource_action或service_action模式相似功能的工具应使用相同前缀:
slack_send_message,slack_list_channels,slack_delete_channel避免通用词:"list" 比 "get_all" 更清晰,"create" 比 "new" 更标准
原则三:精确化工具选择而非参数扩张
一个常见的设计陷阱是在一个工具上不断添加参数,试图覆盖所有用例。但结果往往是:
Agent 面对大量可选参数感到困惑
工具的语义变得模糊("这个工具到底是用来做什么的?")
Token 消耗增加(每个请求都要传入完整的参数定义)
更好的做法:
创建多个专注的工具而不是一个包罗万象的工具
每个工具应该有清晰、单一的职责
可选参数应该少于3个;如果超过,考虑拆分工具
示例:
❌
send_message(channel, text, emoji_reaction, thread_id, scheduled_time, format, encrypt)✅
send_message(channel, text),add_reaction(message_id, emoji),schedule_message(channel, text, time)
融入自 Anthropic 的《Writing effective tools for agents》中关于工具选择与命名空间化的最佳实践
3.6.6 评估驱动的工具改进流程
理想的工具设计不是一次性完成的,而是通过评估、测试和迭代逐步优化的过程。Anthropic 在内部大规模应用了这个流程,并取得了显著成果。
三步循环:评估 → 分析 → 改进
第一步:建立评估框架
在改进工具之前,需要有量化的衡量标准:
定义代表性的任务集(来自实际使用场景)
对于每个任务,明确验证标准(什么样的结果算成功)
评估标准可以是精确匹配、AI评判或人工评审
示例:
第二步:运行评估并分析结果
执行Agent在所有任务上的表现,收集详细的执行日志:
Agent 调用了哪些工具
每个工具调用的参数是什么
返回结果是否有用
Agent 最终是否正确完成了任务
关键:
记录Agent的"思维过程"(推理步骤)
捕捉Agent遇到的困惑或重试
量化效率指标:总Token数、API调用次数、完成时间
第三步:与Agent合作迭代改进
这是最关键的一步——使用Agent本身来分析和改进工具。
做法:
将评估日志导入Claude Code或您的编程环境
要求Agent分析:哪些工具描述导致了混淆?哪些工具参数不清晰?
Agent会建议改进方案(优化描述、拆分工具、重命名等)
实施改进,重新运行评估,验证是否有改善
实战案例数据
Anthropic 内部的Slack MCP服务器优化:
初始版本(人工编写):准确率 62%
第一轮迭代(Agent优化描述):准确率 71%
第二轮迭代(Agent优化参数设计):准确率 78%
第三轮迭代(Agent建议拆分工具):准确率 85%
关键改进:
明确"何时"调用工具:从 "发送消息" 改为 "发送文本消息到特定频道(而不是创建频道)"
优化参数:合并了5个"可选"参数,只保留了2个关键参数
拆分工具:将"message_search"拆分为"search_by_text"和"search_by_author"
最佳实践建议
从小规模评估开始(10-20个任务)
重点关注"失败案例"的根本原因
优先改进高频工具(被调用次数多但成功率低的)
定期运行全量评估以检测回归
建立基准测试集,确保改进不会伤害已有的功能
融入自 Anthropic 的《Writing effective tools for agents》中关于评估驱动迭代的最佳实践
3.6.7 最佳实践:构建可搜索的工具库
为了让搜索更高效,开发者需要像 SEO 专家一样优化工具定义。
命名规范化
使用具有层级结构的命名,便于正则搜索和人类理解。
category_action_object✅
github_issue_create,github_issue_close❌
new_task,close_it
关键词填充
在描述中显式加入同义词或标签。
description: "Updates user permissions. Keywords: admin, auth, rbac, grant, revoke."这样即使用户说“修改权限”或“授权”,都能被 BM25 命中。
引导地图 System Prompt
虽然 Claude 看不到具体的工具细节,但需要在 System Prompt 中给它一张“地图”。
Prompt: “你拥有以下类别的工具库:数据库管理、CRM 操作、AWS 运维。如果遇到相关问题,请使用
search_tools查找具体命令。”
3.6.8 与 MCP 的天作之合
工具搜索是 MCP (Model Context Protocol) 生态的关键粘合剂。
想象连接了 5 个 MCP 服务器:
Filesystem Server: 20 个文件操作工具
Postgres Server: 50 个数据库操作工具
Slack Server: 15 个通讯工具
GitHub Server: 30 个代码管理工具
总计 100+ 工具。如果没有工具搜索,每次对话的上下文 (Context) 都会爆满。有了工具搜索,可以轻松挂载所有这些服务器,让 Claude 成为真正的全能 Agent,而只在真正需要“读文件”时才加载文件系统的工具定义。
3.6.9 案例推演:企业级运维助手
User: “生产数据库好像有死锁,帮忙看看。”
Claude思考: 用户提到了数据库死锁。我当前没有直接的工具。系统提示说我有数据库工具。
Claude行动:
search_tools(query="database deadlock lock kill")API返回: 用于延迟加载的工具定义:
pg_stat_activity: 查看当前查询pg_terminate_backend: 杀进程pg_locks: 查看锁信息
Claude思考: 我需要先看锁。
Claude行动:
pg_locks()API返回: “Table users is locked by PID 1024.”
Claude行动:
pg_terminate_backend(pid=1024)
整个过程流畅自然,且只消耗了必要的 Token。
随着工具的增多,不仅面临管理的挑战,还面临连接的挑战。如何标准化地连接本地文件、远程服务和各类数据库?
最后更新于
