第 5 章:工具使用(Tool Use / Function Calling)
一、核心定义
工具使用(Tool Use):智能体通过函数调用(Function Calling)机制与外部 API、数据库、服务交互,甚至执行代码,从而突破大语言模型训练数据的局限,获取实时信息和执行实际操作的能力。
可视化示意图:
图 1:智能体使用工具的一些示例
图 2:工具使用设计模式
关键机制:
1. 工具定义 → 向 LLM 描述工具的用途、名称和参数
2. LLM 决策 → 判断是否需要调用工具
3. 生成函数调用 → 输出结构化调用请求(JSON)
4. 工具执行 → 框架执行实际函数
5. 返回结果 → 工具输出返回给智能体
6. LLM 处理 → 整合结果生成最终回复
函数调用 vs 工具调用:
- 函数调用:调用预定义的代码函数
- 工具调用:更广义,包括 API、数据库、其他智能体等
二、为什么需要工具使用?
| 没有工具的问题 | 工具使用的优势 |
|---|---|
| 知识静态,仅限训练数据 | 获取实时、最新信息 |
| 无法执行计算 | 调用计算器、代码解释器 |
| 无法访问私有数据 | 查询公司数据库、用户数据 |
| 无法触发实际操作 | 发送邮件、控制智能设备 |
| 与外部世界脱节 | 与现实世界交互 |
核心思想:工具是连接 LLM 推理能力与外部功能的桥梁。
三、典型应用场景
1. 信息检索
用户: 伦敦天气怎么样?
智能体 → 识别需要天气工具 → 调用天气 API("伦敦") → 获取数据 → 格式化回复
实例:天气查询、新闻搜索、股票价格。
价值:提供实时、准确的信息。
2. 数据库/API 交互
用户: 产品 X 有货吗?
智能体 → 调用库存 API → 获取库存数量 → 告知用户
实例:电商库存查询、订单状态、支付处理。
价值:访问结构化业务数据。
3. 计算与数据分析
用户: 苹果股价多少?买100股能赚多少?
智能体 → 调用股票 API → 调用计算器工具 → 返回结果
实例:金融计算、统计分析、数据处理。
价值:执行精确计算。
4. 发送通信
用户: 给约翰发邮件说明天开会
智能体 → 提取收件人/主题/正文 → 调用邮件 API → 发送
实例:邮件、短信、通知推送。
价值:触发实际沟通行为。
5. 代码执行
用户: 这段 Python 代码做什么?
智能体 → 调用代码解释器 → 运行代码 → 分析输出
实例:代码分析、数据处理脚本、自动化任务。
价值:执行确定性逻辑和计算。
6. 设备控制
用户: 关掉客厅的灯
智能体 → 调用智能家居 API → 发送控制指令
实例:智能家居、物联网设备。
价值:与物理世界交互。
四、工具使用流程
完整流程
| 步骤 | 职责 | 输入/输出 |
|---|---|---|
| 1. 工具定义 | 开发者 | 描述工具名称、用途、参数类型 |
| 2. 用户请求 | 用户 | 自然语言查询 |
| 3. LLM 决策 | 大语言模型 | 判断是否需要工具 |
| 4. 生成调用 | 大语言模型 | JSON 格式的函数调用 |
| 5. 工具执行 | 框架/编排层 | 执行实际函数 |
| 6. 返回结果 | 工具 | 输出数据 |
| 7. 整合回复 | 大语言模型 | 生成最终用户回答 |
关键设计要点
- 清晰的工具描述:LLM 依赖描述判断何时使用
- 结构化参数:明确参数类型和必填/可选
- 错误处理:工具失败时的降级策略
- 结果格式化:统一的返回格式便于 LLM 处理
五、主流框架对比
| 框架 | 工具定义方式 | 核心组件 | 内置工具 | 适用场景 |
|---|---|---|---|---|
| LangChain | <code>@tool</code> 装饰器 | <code>create_tool_calling_agent</code>, <code>AgentExecutor</code> | 少量第三方集成 | 自定义工具为主 |
| Google ADK | <code>FunctionTool</code>, 预置工具 | <code>Agent.tools</code> | Google Search, 代码执行, Vertex AI Search | Google 生态集成 |
| CrewAI | <code>@tool</code> 装饰器 | <code>Agent.tools</code>, <code>Crew</code> | 部分集成 | 多智能体协作 |
代码示例位置:
- LangChain:<code>codes/Chapter-05-Tool-Use-LangChain-Example.py</code>
- CrewAI:<code>codes/Chapter-05-Tool-Use-CrewAI-Example.py</code>
- ADK Google Search:<code>codes/Chapter-05-Tool-Use-ADK-Example-Google-Search.py</code>
- ADK 代码执行:<code>codes/Chapter-05-Tool-Use-ADK-Example-Code-Execution.py</code>
- ADK 企业搜索:<code>codes/Chapter-05-Tool-Use-ADK-Example-AI-Search.py</code>
六、Google ADK 特色工具
1. Google Search 工具
from google.adk.tools import google_search
agent = Agent(
name="search_agent",
tools=[google_search], # 直接使用内置工具
...
)
价值:直接接入 Google 搜索引擎。
2. 代码执行工具
from google.adk.code_executors import BuiltInCodeExecutor
agent = LlmAgent(
name="calculator",
code_executor=BuiltInCodeExecutor(), # 沙箱代码执行
...
)
价值:安全执行 Python 代码进行计算。
3. Vertex AI Search 工具
vsearch_agent = agents.VSearchAgent(
name="enterprise_search",
datastore_id=DATASTORE_ID, # 企业私有数据存储
...
)
价值:查询企业私有知识库。
4. Vertex Extensions
- 结构化的 API 封装
- 企业级安全和隐私保护
- 自动执行(vs 函数调用的手动执行)
七、关键概念速查
| 概念 | 定义 |
|---|---|
| 工具使用 (Tool Use) | 智能体调用外部功能的能力 |
| 函数调用 (Function Calling) | LLM 生成结构化函数调用请求 |
| 工具定义 (Tool Definition) | 描述工具的名称、用途、参数 |
| 编排层 (Orchestration Layer) | 执行工具调用的框架/中间件 |
| 结构化输出 (Structured Output) | JSON 格式的函数调用请求 |
| 代码执行器 (Code Executor) | 沙箱环境中运行代码的工具 |
| Vertex Extensions | Google 的企业级 API 封装 |
八、常见问题
Q1:LLM 如何知道何时调用工具?
LLM 根据工具描述和用户请求判断。描述越清晰,判断越准确。可以在 system prompt 中引导。
Q2:工具调用会增加延迟吗?
会。每次调用增加 1 次 API 请求 + 工具执行时间。可通过并行调用多个工具优化。
Q3:工具调用失败怎么办?
应在工具中实现错误处理,返回清晰的错误信息。LLM 可根据错误信息重试或告知用户。
Q4:能否调用多个工具?
可以。LLM 可以决定依次或并行调用多个工具。框架通常支持工具链(Tool Chaining)。
Q5:如何确保工具安全?
1) 输入验证和清洗;2) 权限控制;3) 沙箱执行(代码);4) 审计日志;5) 速率限制。
Q6:工具定义需要包含什么?
必须:名称、功能描述、参数列表(类型、必填/可选)。推荐:使用示例、返回格式、错误情况。
九、参考资源
官方文档
代码示例
- LangChain 实现:<code>codes/Chapter-05-Tool-Use-LangChain-Example.py</code>
- CrewAI 实现:<code>codes/Chapter-05-Tool-Use-CrewAI-Example.py</code>
- ADK 系列:<code>codes/Chapter-05-Tool-Use-ADK-Example-*.py</code>
扩展阅读
- 原文章节:<code>11-Chapter-05-Tool-Use.md</code>