工具使用(Tool Use)| Agentic Design Patterns | 智能体设计模式

内容纲要

第 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. 整合回复 大语言模型 生成最终用户回答

关键设计要点

  1. 清晰的工具描述:LLM 依赖描述判断何时使用
  2. 结构化参数:明确参数类型和必填/可选
  3. 错误处理:工具失败时的降级策略
  4. 结果格式化:统一的返回格式便于 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=&quot;search_agent&quot;,
    tools=[google_search],  # 直接使用内置工具
    ...
)

价值:直接接入 Google 搜索引擎。

2. 代码执行工具

from google.adk.code_executors import BuiltInCodeExecutor

agent = LlmAgent(
    name=&quot;calculator&quot;,
    code_executor=BuiltInCodeExecutor(),  # 沙箱代码执行
    ...
)

价值:安全执行 Python 代码进行计算。

3. Vertex AI Search 工具

vsearch_agent = agents.VSearchAgent(
    name=&quot;enterprise_search&quot;,
    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>

滚动至顶部