第 3 课
← 返回系列列表

工具使用模式(Tool Use)

Agentic AI — AI 智能体设计模式

智能体调用外部 API、数据库、搜索引擎等工具扩展能力。

工具使用模式(Tool Use)

课程简介

智能体调用外部 API、数据库、搜索引擎等工具扩展能力。

🎬 本课程视频:Agentic AI — AI 智能体设计模式


工具使用模式(Tool Use):扩展智能体的能力边界

一、为什么需要工具使用模式?

大语言模型有两大天生短板。第一,知识截止日期——模型训练完成后就无法获取新的信息。比如一个 2023 年训练的模型,它不知道 2024 年发生的事件。第二,不擅长精确计算——模型本质上是基于概率的推理系统,对于数学计算和精确的逻辑推导并不擅长。

工具使用模式的核心洞察是:不要试图让模型变得更聪明,而是给它提供能够弥补其短板的外部工具。这就好比一个人虽然记忆力有限,但可以通过查阅笔记和计算器来完成复杂的工作。

二、ReAct 框架:思考-行动-观察循环

ReAct(Reasoning + Acting)是工具使用模式最经典的实现框架。它将推理和行动结合在一个循环中:

思考(Thought):分析当前状态,决定需要什么信息
行动(Action):调用工具获取信息或执行操作
观察(Observation):获取工具返回的结果
思考(Thought):基于新信息,决定下一步
...循环直到问题解决...

2.1 ReAct 的具体工作流程

让我们通过一个实际例子来理解:

用户问题:今天是 2026 年 7 月 27 日,请查一下这个日期有什么历史事件?

第 1 轮:
思考:用户想知道 2026 年 7 月 27 日的历史事件。我需要先查一下日期信息。
行动:调用 search("2026年7月27日 历史事件")
观察:[搜索返回了当天发生的重大历史事件列表]
行动:将检索结果整理成自然语言回答用户。

每一步中,模型都在「思考」下一步需要做什么,然后「行动」调用工具,从「观察」中获取反馈,再进行下一轮「思考」。

2.2 ReAct 的提示词模板

在实际实现中,ReAct 框架通过精心设计的提示词来引导模型行为:

你是一个能够使用以下工具的智能助手。在回答用户问题时,请遵循以下步骤:

1. 思考(Thought):分析用户的问题,决定下一步行动。
2. 行动(Action):如果需要调用工具,选择工具并提供参数。
3. 观察(Observation):等待工具返回结果。
4. 重复步骤 1-3,直到你认为已经获得足够信息来回答用户。
5. 回答(Answer):基于所有收集到的信息,给用户一个完整的回答。

可用工具:
- search(query): 搜索互联网获取实时信息
- calculator(expression): 执行数学计算

请严格按照以下格式输出:
思考:[你的思考过程]
行动:[工具名称]([参数])
观察:[工具返回结果]
思考:[你的下一步思考]
...
回答:[最终回答]

三、工具定义与 JSON Schema

为了让智能体能正确调用工具,每个工具都需要用标准化的格式定义。最常用的是 JSON Schema 格式:

{
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "获取指定城市的当前天气信息",
        "parameters": {
          "type": "object",
          "properties": {
            "city": {
              "type": "string",
              "description": "城市名称,如 北京、上海、深圳"
            },
            "units": {
              "type": "string",
              "enum": ["celsius", "fahrenheit"],
              "description": "温度单位"
            }
          },
          "required": ["city"]
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "search_database",
        "description": "在内部知识库中搜索信息",
        "parameters": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "搜索关键词"
            },
            "limit": {
              "type": "integer",
              "description": "返回结果数量上限",
              "default": 5
            }
          },
          "required": ["query"]
        }
      }
    }
  ]
}

工具定义的关键要素:
1. 名称(name):工具的标识符,必须唯一且语义清晰
2. 描述(description):用自然语言描述工具的功能。这个字段对 AI 模型选择工具至关重要,描述越准确,模型选择正确工具的概率越高
3. 参数(parameters):用 JSON Schema 定义工具需要的参数,包括类型、描述、枚举值、是否必需等
4. 返回值:定义工具返回的数据格式,让模型知道如何处理返回结果

四、实际代码实现

下面是使用 OpenAI 函数调用 API 实现工具使用模式的完整代码:

import openai
import json
import requests

# 定义工具
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_time",
            "description": "获取当前的日期和时间",
            "parameters": {
                "type": "object",
                "properties": {
                    "timezone": {
                        "type": "string",
                        "description": "时区,例如 Asia/Shanghai",
                        "default": "Asia/Shanghai"
                    }
                }
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "calculate",
            "description": "执行数学计算",
            "parameters": {
                "type": "object",
                "properties": {
                    "expression": {
                        "type": "string",
                        "description": "数学表达式,如 2 + 3 * 4"
                    }
                },
                "required": ["expression"]
            }
        }
    }
]

def call_tool(tool_name, tool_args):
    '''执行工具调用并返回结果'''
    if tool_name == "get_current_time":
        from datetime import datetime
        return {"result": datetime.now().isoformat()}
    elif tool_name == "calculate":
        try:
            result = eval(tool_args["expression"])
            return {"result": result}
        except Exception as e:
            return {"error": str(e)}
    return {"error": "未知工具"}

# 主循环:思考-行动-观察
def agent_loop(user_input, max_steps=5):
    messages = [
        {"role": "system", "content": "你是一个能够调用工具的智能助手。"},
        {"role": "user", "content": user_input}
    ]

    for step in range(max_steps):
        response = openai.chat.completions.create(
            model="gpt-4",
            messages=messages,
            tools=tools,
            tool_choice="auto"
        )
        msg = response.choices[0].message

        if msg.tool_calls:
            # 模型决定调用工具
            messages.append(msg)
            for tool_call in msg.tool_calls:
                func_name = tool_call.function.name
                func_args = json.loads(tool_call.function.arguments)
                print(f"调用工具: {func_name}({func_args})")

                result = call_tool(func_name, func_args)
                messages.append({
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": json.dumps(result)
                })
        else:
            # 模型直接回答
            return msg.content

    return "达到最大步数限制"

# 测试
result = agent_loop("现在是几点?帮我计算 367 * 859 等于多少")
print(result)

五、安全考虑

工具使用模式让 AI 能够与外部世界交互,这带来了新的安全挑战。

5.1 权限控制

5.2 审计日志

5.3 输入验证

5.4 速率限制

六、总结

工具使用模式通过 ReAct 框架让 LLM 能够调用外部工具来获取实时信息和执行精确计算,弥补了模型的固有能力短板。标准化的工具定义(JSON Schema)和严谨的安全控制机制,是构建可靠工具使用系统的基础。

七、高级工具使用模式

7.1 动态工具发现

在复杂的系统中,智能体不一定需要预先知道所有工具。可以通过工具注册中心实现动态工具发现:

tool_registry = {
    "search": SearchTool(),
    "calculator": CalculatorTool(),
    "database": DatabaseTool(),
}

def discover_tools(task_description):
    """根据任务描述推荐合适的工具"""
    # 使用 LLM 分析任务需要的工具类型
    # 返回最相关的 top-K 个工具

7.2 工具组合与管道

高级场景中,工具可以组合成管道。例如:

搜索 -> 提取内容 -> 翻译 -> 摘要

智能体不是一次性调用所有工具,而是根据上一步结果决定下一步用哪个工具。这种自适应管道比固定流程灵活得多。

7.3 工具调用的错误恢复

工具调用不可能 100% 成功。健壮的系统需要错误恢复机制:

八、总结

工具使用模式让 LLM 从一个“知道很多但无法行动的”大脑,变成了一个“能想也能做”的行动者。

关键要点回顾:
- ReAct 框架是工具使用的核心模式
- 工具定义需要清晰的名称、描述和参数规范
- 工具描述的质量直接影响 LLM 选择工具的准确性
- 需要建立完善的权限控制和安全机制
- 高级场景可以组合工具形成处理管道

掌握了工具使用模式,你的 AI 系统就能与真实世界互动,获取实时信息,执行精确计算,真正成为有用的智能助手。

七、高级工具使用模式

7.1 动态工具发现

在复杂的系统中,智能体不一定需要预先知道所有工具。可以通过工具注册中心实现动态工具发现:

tool_registry = {
    "search": SearchTool(),
    "calculator": CalculatorTool(),
    "database": DatabaseTool(),
}

def discover_tools(task_description):
    """根据任务描述推荐合适的工具"""
    # 使用 LLM 分析任务需要的工具类型
    # 返回最相关的 top-K 个工具

7.2 工具组合与管道

高级场景中,工具可以组合成管道。例如:

搜索 -> 提取内容 -> 翻译 -> 摘要

智能体不是一次性调用所有工具,而是根据上一步结果决定下一步用哪个工具。这种自适应管道比固定流程灵活得多。

7.3 工具调用的错误恢复

工具调用不可能 100% 成功。健壮的系统需要错误恢复机制:

八、总结

工具使用模式让 LLM 从一个“知道很多但无法行动的”大脑,变成了一个“能想也能做”的行动者。

关键要点回顾:
- ReAct 框架是工具使用的核心模式
- 工具定义需要清晰的名称、描述和参数规范
- 工具描述的质量直接影响 LLM 选择工具的准确性
- 需要建立完善的权限控制和安全机制
- 高级场景可以组合工具形成处理管道

掌握了工具使用模式,你的 AI 系统就能与真实世界互动,获取实时信息,执行精确计算,真正成为有用的智能助手。

七、高级工具使用模式

7.1 动态工具发现

在复杂的系统中,智能体不一定需要预先知道所有工具。可以通过工具注册中心实现动态工具发现:

tool_registry = {
    "search": SearchTool(),
    "calculator": CalculatorTool(),
    "database": DatabaseTool(),
}

def discover_tools(task_description):
    """根据任务描述推荐合适的工具"""
    # 使用 LLM 分析任务需要的工具类型
    # 返回最相关的 top-K 个工具

7.2 工具组合与管道

高级场景中,工具可以组合成管道。例如:

搜索 -> 提取内容 -> 翻译 -> 摘要

智能体不是一次性调用所有工具,而是根据上一步结果决定下一步用哪个工具。这种自适应管道比固定流程灵活得多。

7.3 工具调用的错误恢复

工具调用不可能 100% 成功。健壮的系统需要错误恢复机制:

八、总结

工具使用模式让 LLM 从一个“知道很多但无法行动的”大脑,变成了一个“能想也能做”的行动者。

关键要点回顾:
- ReAct 框架是工具使用的核心模式
- 工具定义需要清晰的名称、描述和参数规范
- 工具描述的质量直接影响 LLM 选择工具的准确性
- 需要建立完善的权限控制和安全机制
- 高级场景可以组合工具形成处理管道

掌握了工具使用模式,你的 AI 系统就能与真实世界互动,获取实时信息,执行精确计算,真正成为有用的智能助手。

延伸阅读

← 反射模式(Reflection) 规划模式(Planning) →