工具使用模式(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 系统就能与真实世界互动,获取实时信息,执行精确计算,真正成为有用的智能助手。
延伸阅读
- 📺 B 站播放列表:Agentic AI — AI 智能体设计模式
- 📚 更多学习资源,请访问 deeplearning.ai 官网