第 4 章 / 共 8 章

第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万亿美元

工具选择策略

当智能体拥有多个工具时,它是如何决定调用哪个的呢?

核心逻辑是:

  1. AI分析当前任务需要什么能力
  2. 对比各个工具的description
  3. 选择最匹配的那个
最佳实践:
  • 每个工具只做一件事,保持功能单一
  • 工具描述要区分度明显,避免歧义
  • 参数命名要直观,如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)系统。智能体如何在多轮对话中记住之前的交流内容?如何让智能体拥有"长期记忆"?敬请期待!