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 核心机制:按需加载 (Deferred Loading)
工具搜索的工作流程打破了传统的“一次性全部提供”模式:
定义:在
tools列表中,可以提供数千个工具,但将绝大多数标记为defer_loading: true。隐藏:对于这些延迟加载的工具,Claude 初始时看不到它们的完整定义。它只知道“这里有很多关于数据库和代码的工具”。
索书号:不仅如此,为了帮助 Claude 找到它们,会提供一个特殊的工具搜索工具。
发现:当用户问“重启数据库”时,Claude 意识到自己当前手中的工具不够用,于是调用“搜索工具”。
加载:搜索工具返回了最相关的 3 个工具(如
restart_db_service)。此时,这 3 个工具的完整定义才真正进入上下文窗口。
这是一个典型的 Retrieve-Read 模式在工具使用上的应用。
3.6.3 内置搜索变体
Anthropic API 提供了原生的搜索能力,这意味着不需要自己写向量数据库来实现工具检索(虽然完全可以这么做)。
内容搜索 (BM25 Variant)
这是最通用的搜索模式,基于关键词匹配。
Type ID:
tool_search_tool_bm25_20251119原理:经典的 BM25 算法。它根据工具的
name和description计算相关性。适用场景:你的工具描述写得非常自然语言化,或者用户提问比较模糊。
User: "服务器卡死了"
Search: "server performance lag"
Match:
check_cpu_usage,restart_nginx
正则搜索 (Regex Variant)
基于 Python 风格的正则表达式进行精确匹配。
Type ID:
tool_search_tool_regex_20251119适用场景:拥有严格命名规范的工具库。
Pattern:
aws_ec2_.*(查找所有 EC2 相关工具)Pattern:
(?i)user(查找所有包含 user 的工具,忽略大小写)
3.6.4 API 定义示例
下面是如何在一个请求中混合使用“立即加载”工具和“搜索”工具的示例:
3.6.5 最佳实践:构建可搜索的工具库
为了让搜索更高效,开发者需要像 SEO 专家一样优化工具定义。
命名规范化
使用具有层级结构的命名,便于正则搜索和人类理解。
category_action_object✅
github_issue_create,github_issue_close❌
new_task,close_it
关键词填充 (Keyword Stuffing)
在描述中显式加入同义词或标签。
description: "Updates user permissions. Keywords: admin, auth, rbac, grant, revoke."这样即使用户说“修改权限”或“授权”,都能被 BM25 命中。
引导地图 System Prompt
虽然 Claude 看不到具体的工具细节,但需要在 System Prompt 中给它一张“地图”。
Prompt: "你拥有以下类别的工具库:数据库管理、CRM 操作、AWS 运维。如果遇到相关问题,请使用
search_tools查找具体命令。"
3.6.6 与 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.7 案例推演:企业级运维助手
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。
随着工具的增多,不仅面临管理的挑战,还面临连接的挑战。如何标准化地连接本地文件、远程服务和各类数据库?
最后更新于
