实现工具搜索——让代理在需要时动态发现和使用合适的工具。
什么是工具搜索
当你有很多工具时,不需要一次性把所有工具告诉代理。工具搜索让代理在需要时:
- 搜索可用的工具
- 查看工具的描述
- 选择最合适的工具
- 获取完整的工具定义
实现方式
class ToolRegistry:
def __init__(self):
self.tools = {}
def register(self, name, description, schema, func):
self.tools[name] = {
"description": description,
"schema": schema,
"func": func
}
def search(self, query):
"""根据搜索词返回相关的工具。"""
results = []
for name, tool in self.tools.items():
if query.lower() in name.lower() or query.lower() in tool["description"].lower():
results.append(name)
return results[:5] # 最多返回 5 个
def get_tool(self, name):
"""获取工具的完整定义。"""
return self.tools.get(name)
# 使用
registry = ToolRegistry()
registry.register(
"search_database",
"搜索数据库中的用户记录",
{...},
search_db
)
# 代理需要数据库相关工具时
matches = registry.search("database")
# 返回 ["search_database", "update_database", ...]
在代理循环中使用
def agent_with_tool_search(prompt):
messages = [{"role": "user", "content": prompt}]
# 第一步:让代理描述它需要什么
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=256,
messages=[
{"role": "user", "content": prompt},
{"role": "assistant", "content": "我需要做什么?"},
{"role": "user", "content": "请描述你需要什么类型的工具。"}
]
)
need = response.content[0].text
# 搜索匹配的工具
matches = registry.search(need)
# 加载匹配的工具
available_tools = [
registry.get_tool(m) for m in matches
]
# 继续代理循环,使用可用工具