第4章:工具使用与调用
上一章我们学习了ReAct架构,知道了智能体通过"思考→行动→观察"的循环来解决问题。而行动的核心就是工具(Tool)。本章将详细介绍工具的概念、定义和使用方法。
什么是工具(Tool)
如果把智能体比作一个人,那么:
- 大语言模型 = 大脑,负责思考和决策
- 工具 = 手,负责与外部世界交互
定义:工具是智能体可调用的外部功能,让AI能够获取实时信息、执行计算、操作文件、调用API等。没有工具,AI只能依赖训练时的知识,无法与动态变化的世界交互。
举个例子:
- 问"1+1等于几" → AI可以直接回答,不需要工具
- 问"今天北京天气如何" → AI需要调用天气查询工具
- 问"2023年中国GDP是多少" → AI需要调用搜索引擎工具
常见工具类型
根据功能不同,智能体常用的工具可以分为以下几类:
| 工具类型 | 功能说明 | 典型示例 |
|---|---|---|
| 搜索工具 | 搜索互联网信息 | Google搜索、必应搜索、新闻搜索 |
| 计算工具 | 执行数学运算 | 计算器、Python执行器 |
| 数据库工具 | 查询和操作数据库 | SQL查询、知识库检索 |
| API调用工具 | 调用外部服务API | 天气API、股票API、地图API |
| 文件操作工具 | 读写文件 | 读取文档、保存结果到文件 |
| 代码执行工具 | 执行编程代码 | Python解释器、代码运行环境 |
工具的定义
要让AI能够使用工具,我们需要为每个工具定义以下信息:
工具的基本要素
{
"name": "search", // 工具名称(调用时使用)
"description": "搜索互联网信息", // 工具描述(AI判断何时使用)
"parameters": { // 参数定义
"query": { // 参数名
"type": "string", // 参数类型
"description": "搜索关键词",
"required": true // 是否必填
},
"num_results": {
"type": "integer",
"description": "返回结果数量",
"required": false, // 选填参数
"default": 5
}
},
"return_value": { // 返回值说明
"type": "array",
"description": "搜索结果列表"
}
}
工具定义详解
- name:工具的唯一标识,建议用英文、小写、下划线分隔
- description:描述工具的功能,这是最重要的字段,AI靠它来判断是否调用该工具
- parameters:定义工具的输入参数,包括类型、描述、是否必填
- return_value:说明工具会返回什么数据(帮助AI理解如何处理结果)
重要:description字段的质量直接影响工具调用的准确性。描述要清晰、具体,说明工具能做什么、在什么场景下使用。
工具描述的重要性
为什么description如此重要?因为AI是根据描述来决定调用哪个工具的。
看下面的对比:
❌ 不好的描述: "这是一个搜索工具" → AI不知道该什么时候用它 ✅ 好的描述: "搜索互联网获取最新信息。当你需要查询实时新闻、 当前事件、或需要比训练数据更新的信息时使用此工具。" → AI清楚理解:需要最新信息时就调用它
描述编写技巧:
- 说明工具的功能:这个工具能做什么
- 说明使用场景:什么情况下应该调用它
- 说明输入输出:需要什么参数,返回什么结果
工具调用示例
下面我们用一个实际的例子来展示如何定义和使用工具。假设我们要创建一个能搜索和计算的智能体:
# 定义工具列表
tools = [
{
"name": "search",
"description": "搜索互联网获取最新信息。当你需要查询实时数据、
新闻事件或当前信息时使用此工具。",
"parameters": {
"query": {
"type": "string",
"description": "搜索关键词,应简洁明确",
"required": True
}
}
},
{
"name": "calculate",
"description": "执行数学计算。当你需要进行数字运算、求平均值、
百分比计算等时使用此工具。",
"parameters": {
"expression": {
"type": "string",
"description": "数学表达式,如 '100 / 5' 或 '(23.5 + 45.2) / 2'",
"required": True
}
}
}
]
# AI根据用户输入决定调用哪个工具
用户问:"2023年GDP最高的三个国家是哪几个?"
AI思考:用户问的是2023年的GDP数据,这是实时信息,我需要搜索
AI调用:search(query="2023年GDP最高的三个国家")
工具返回:["美国", "中国", "德国"]
用户接着问:"这三个国家GDP的平均值是多少?"
AI思考:需要计算平均值,但我需要具体的数值
AI调用:search(query="2023年美国中国德国GDP数值")
工具返回:美国27.36万亿,中国17.79万亿,德国4.46万亿
AI思考:现在可以计算平均值了
AI调用:calculate(expression="(27.36 + 17.79 + 4.46) / 3")
工具返回:16.536666...
AI回答:平均值为约16.54万亿美元
工具选择策略
当智能体拥有多个工具时,它是如何决定调用哪个的呢?
核心逻辑是:
- AI分析当前任务需要什么能力
- 对比各个工具的description
- 选择最匹配的那个
最佳实践:
- 每个工具只做一件事,保持功能单一
- 工具描述要区分度明显,避免歧义
- 参数命名要直观,如
query表示查询、location表示地点
错误处理
工具调用不可能总是成功的。网络问题、参数错误、服务不可用等都会导致调用失败。智能体需要有能力处理这些情况:
常见错误类型
| 错误类型 | 可能原因 | 处理策略 |
|---|---|---|
| 网络超时 | 服务响应慢、网络不稳定 | 重试1-2次,仍失败则告知用户 |
| 参数错误 | 必填参数缺失、类型不匹配 | 检查参数定义,修正后重试 |
| 服务不可用 | API故障、服务维护 | 尝试替代工具或告知用户暂时无法查询 |
| 结果为空 | 查询条件无匹配结果 | 调整参数重新查询,或告知用户未找到 |
# 错误处理示例流程 AI调用:search(query="abcdefg12345") 工具返回:错误 - 未找到相关结果 AI思考:搜索没有结果,可能是关键词太特殊 AI行动:调整关键词,用更通用的词搜索 AI调用:search(query="相关概念") 或 AI思考:多次尝试后仍失败,向用户说明情况 AI回答:抱歉,暂时无法查询到相关信息,请稍后重试
注意:工具调用失败时,不要让智能体"编造"结果。应该如实告知用户或尝试其他方案。
实战:创建搜索+计算智能体
现在让我们完成一个完整的实战任务:
任务:创建一个带有搜索和计算工具的智能体,让它回答:"2023年GDP最高的三个国家,他们的平均值是多少?"
步骤1:定义工具
# 工具定义
tools_definition = [
{
"name": "web_search",
"description": "搜索互联网获取最新的事实性信息。当你需要查询实时数据、
统计数据、新闻或任何可能随时间变化的信息时使用。",
"parameters": {
"query": {
"type": "string",
"description": "搜索查询语句,应该简洁且包含关键信息",
"required": True
}
}
},
{
"name": "math_calculator",
"description": "执行精确的数学计算。当你需要进行加减乘除、求平均值、
计算百分比等数学运算时使用。",
"parameters": {
"expression": {
"type": "string",
"description": "数学表达式字符串,例如 '100 + 200' 或 '(a + b) / c'",
"required": True
}
}
}
]
步骤2:模拟执行过程
【用户问题】
2023年GDP最高的三个国家,他们的平均值是多少?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【第一轮】
Thought: 用户询问2023年GDP最高的三个国家及其平均值。
我需要先搜索GDP排名信息,获取具体国家和数值。
Action: 调用 web_search
参数: query="2023年世界各国GDP排名前三"
Observation:
搜索结果显示:
1. 美国 - 27.36万亿美元
2. 中国 - 17.79万亿美元
3. 德国 - 4.46万亿美元
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【第二轮】
Thought: 已获得三个国家的GDP数据:
美国: 27.36万亿,中国: 17.79万亿,德国: 4.46万亿
现在需要计算平均值:(27.36 + 17.79 + 4.46) / 3
Action: 调用 math_calculator
参数: expression="(27.36 + 17.79 + 4.46) / 3"
Observation:
计算结果:16.536666... ≈ 16.54
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【第三轮】
Thought: 已获取所有需要的信息,可以给出完整答案。
Finish:
📊 2023年GDP排名前三国家分析
🏆 排名:
1. 美国 - 27.36万亿美元
2. 中国 - 17.79万亿美元
3. 德国 - 4.46万亿美元
📈 平均值计算:
(27.36 + 17.79 + 4.46) ÷ 3 = 16.54万亿美元
💡 分析:
• 美国GDP遥遥领先,是第三名的6倍多
• 中国稳居第二,约为美国的65%
• 三国的平均GDP约为16.54万亿美元
工具组合的艺术
实际应用中,智能体往往需要组合多个工具来完成复杂任务。例如:
- 搜索 + 计算:获取数据后进行统计分析
- 搜索 + 代码执行:获取信息后编程处理
- 数据库查询 + API调用:内部数据结合外部服务
- 文件读取 + 搜索 + 保存:处理文档工作流
设计思路:将复杂任务拆解成多个小工具,每个工具职责单一,通过ReAct循环将它们串联起来。这样既灵活又易于维护。
本章小结
本章我们学习了工具的定义和使用:
- 工具是智能体的"手",让AI能与外部世界交互
- 常见工具类型:搜索、计算、数据库、API、文件操作等
- 工具定义包含:名称、描述、参数、返回值
- 描述是关键,AI通过描述决定何时调用工具
- 要有错误处理机制,应对工具调用失败的情况
预告:下一章我们将学习记忆(Memory)系统。智能体如何在多轮对话中记住之前的交流内容?如何让智能体拥有"长期记忆"?敬请期待!