当前位置: 首页 > news >正文

【AI 学习笔记】Tool Calling:让 AI 不再“纸上谈兵“

文章目录

    • 1. 为什么需要 Tool Calling?AI 的"知识囚笼"
    • 2. 什么是 Tool Calling?给 AI 一套工具箱
    • 3. Tool Calling 是如何工作的?
    • 3.1 在 LangChain 中如何实现?
      • 工具定义
      • 工具绑定
      • 调用和执行
    • 4. Tool Calling 的意义:从"博学"到"万能"
    • 5. Tool Calling 最佳实践
      • 工具设计原则
      • 技术选择
      • 示例对比
    • 总结
    • 参考

在捣鼓 AI 应用的时候,总是遇到一个词: Tool Calling(工具调用)。一开始觉得这个概念有点抽象,但随着我深入了解 LangChain 和一些 AI Agent 的实现后,我发现 Tool Calling 简直是为大语言模型(LLM)插上了翅膀,让它从一个"只会聊天"的语言天才,变成了一个能"动手干活"的实干家。

在这里插入图片描述
图片来源:LangChain tool_calling

术语说明:Tool Calling 有时也被称为 Function Calling(函数调用),这两个术语在实际使用中是可以互换的。官方文档中两种表述都会出现。

1. 为什么需要 Tool Calling?AI 的"知识囚笼"

我们都知道,像 GPT-4 或 Gemini 这样的 LLM 非常强大,它们能写代码、能写诗、能做翻译。但它们有一个天生的限制:它们生活在一个"信息茧房"里。

  • 知识有截止日期:模型的知识停留在它训练完成的那一刻,问它今天的天气,它不知道。
  • 无法与外界互动:它不能帮你发邮件、不能帮你订机票、也不能去访问一个网页来获取实时信息。

简单来说,没有 Tool Calling 的 LLM,就像一个博学但被关在房间里的智者,它知道很多事,但无法对外界产生实际影响。

2. 什么是 Tool Calling?给 AI 一套工具箱

Tool Calling 就是打破这个"囚笼"的钥匙。

它的核心思想是:授权 LLM 在需要的时候,去调用外部的工具(函数、API 等)来完成任务。

这就像你给一个聪明的实习生分配任务。这个实习生(LLM)本身很会写东西,但如果你让他"查一下公司最新的股价,并写一份总结报告",他需要:

  1. 判断:意识到自己不知道实时股价,需要借助外部工具。
  2. 选择工具:从他可用的工具(比如浏览器、公司的股价查询软件)中,选择一个最合适的。
  3. 执行工具:打开股价查询软件,输入公司代码,获取股价。
  4. 整合结果:拿到股价后,再结合自己的写作能力,完成最终的总结报告。

在这个过程中,Tool Calling 就是实习生判断、选择和执行工具的整个流程。LLM 不再仅仅是生成文本,它还能"决定"并"请求"执行一个动作,然后利用这个动作的结果来更好地完成我们的指令。

3. Tool Calling 是如何工作的?

虽然不同框架的实现细节不同,但核心流程大同小异:

  1. 定义工具:首先,作为开发者,我们需要先定义一套"工具"给 LLM。这套工具通常就是我们自己写的函数,比如 get_current_weather(city: str)send_email(to: str, subject: str, body: str)
  2. 用户提问:用户向 LLM 提出一个请求,比如"帮我查一下北京今天的天气怎么样?"
  3. LLM 的"智能决策":这里有个关键点 —— LLM 会智能分析用户的意图。如果用户只是说"你好",LLM 不会调用天气工具;只有当问题与工具功能相关时(如"北京天气怎么样?"),它才会在我们提供的工具列表中找到最匹配的 get_current_weather 工具。
  4. 生成工具调用请求:LLM 不会自己去执行这个函数。相反,它会生成一个特殊格式的"工具调用请求",具体包含:
  • name: 工具名称(如 get_current_weather
  • args: 调用参数(如 {'city': '北京'}
  • id: 调用标识符
  • type: ‘tool_call’

例如:[{'name': 'get_current_weather', 'args': {'city': '北京'}, 'id': 'call_123', 'type': 'tool_call'}]
5. 执行并返回:我们的应用程序接收到这个请求后,就在自己的代码环境中执行 get_current_weather('北京') 这个函数,得到结果,比如 {'temperature': '25°C', 'condition': '晴'}
6. LLM 组织语言:最后,应用程序把函数执行的结果再发回给 LLM。LLM 拿到这个信息后,就用更自然、更人性化的语言回复用户:“北京今天天气晴朗,温度是 25 摄氏度。”

整个过程是 LLM 和我们的代码之间的一次完美协作。LLM 负责"大脑"的部分(理解、决策),我们的代码负责"手脚"的部分(执行)。

重要: LLM 的"智能选择"是 Tool Calling 的核心特征。它不是盲目调用工具,而是根据用户输入的语义来判断是否需要以及如何使用工具。

3.1 在 LangChain 中如何实现?

说了这么多理论,让我们看看在 LangChain 这个流行框架中具体是怎么做的:

工具定义

使用 @tool 装饰器定义工具:

from langchain_core.tools import tool@tool
def get_current_weather(city: str) -> str:"""获取指定城市的当前天气Args:city: 城市名称"""# 这里是实际的天气查询逻辑# 实际应用中可能会调用天气 APIreturn f"{city}今天天气晴朗,温度25°C"@tool
def send_email(to: str, subject: str, body: str) -> str:"""发送邮件Args:to: 收件人邮箱subject: 邮件主题body: 邮件内容"""# 实际的邮件发送逻辑return f"邮件已发送给 {to}"

工具绑定

将工具绑定到支持工具调用的模型:

# 假设我们有一个支持工具调用的模型
model_with_tools = model.bind_tools([get_current_weather, send_email])

调用和执行

response = model_with_tools.invoke("北京今天天气怎么样?")# 如果模型选择调用工具,response.tool_calls 会包含调用信息
if response.tool_calls:# 获取工具调用信息tool_call = response.tool_calls[0]print(f"模型要调用: {tool_call['name']}")print(f"参数: {tool_call['args']}")# 执行对应的工具result = get_current_weather.invoke(tool_call['args'])print(f"执行结果: {result}")

4. Tool Calling 的意义:从"博学"到"万能"

理解了 Tool Calling 的工作原理后,它的重要性就不言而喻了:

  • 打破信息壁垒:通过接入搜索引擎、数据库等工具,LLM 可以获取实时、动态的信息。
  • 实现与现实世界的交互:可以操作各种软件 API,实现发邮件、订票、控制智能家居等功能,成为真正的"智能助理"。
  • Agent 的基石:它是构建更复杂的 AI Agent 的基础。Agent 的核心就是能够自主地、连续地调用多个工具来完成一个复杂的目标。没有 Tool Calling,Agent 就无从谈起。

5. Tool Calling 最佳实践

基于 LangChain 官方建议,在设计工具时需要注意:

工具设计原则

  • 工具命名要清晰get_weathertool1 更好,让 LLM 一眼就知道这个工具是干什么的
  • 工具描述要详细:在 docstring 中详细描述工具的功能和参数,帮助 LLM 理解何时使用该工具
  • 保持工具简单:一个工具专注做一件事,比复杂的多功能工具更容易被正确使用
  • 避免工具列表过长:太多选择会让 LLM “选择困难”,建议控制在合理数量内

技术选择

  • 选择支持工具调用的模型:专门优化过工具调用的模型(如 GPT-4、Claude 3 等)表现更好
  • 合理的错误处理:为工具执行失败的情况设计优雅的降级策略

示例对比

# ❌ 不好的工具设计
@tool
def tool1(data):"""处理数据"""# 功能不明确,参数类型不清楚pass# ✅ 好的工具设计
@tool
def calculate_mortgage_payment(principal: float, rate: float, years: int) -> float:"""计算房贷月供根据贷款本金、年利率和贷款年限,计算每月还款金额Args:principal: 贷款本金(元)rate: 年利率(小数形式,如 0.05 表示 5%)years: 贷款年限Returns:每月还款金额(元)"""monthly_rate = rate / 12num_payments = years * 12payment = principal * (monthly_rate * (1 + monthly_rate) ** num_payments) / ((1 + monthly_rate) ** num_payments - 1)return round(payment, 2)

总结

对我来说,Tool Calling 是学习 AI 应用开发时遇到的第一个"啊哈!"时刻。它清晰地揭示了 LLM 如何从一个纯粹的语言模型,转变为一个可以与真实世界互动的强大引擎。

它就像一座桥梁,连接了 LLM 的虚拟智能和我们现实世界的无限可能。理解了它,也就真正开始理解了如何构建一个有用的、能解决实际问题的 AI 应用。

更重要的是,通过学习 LangChain 等框架的具体实现,我们不仅能理解概念,还能动手实践。这种从理论到实践的过程,让 Tool Calling 不再是一个抽象的概念,而是成为了我们构建智能应用的得力工具。

怎么感觉跟 MCP 很像呢!!!需要深入对比一下。。。

参考

https://python.langchain.com/docs/concepts/tool_calling/

http://www.dtcms.com/a/293184.html

相关文章:

  • 深入解析 Fetch API 的 credentials 属性:Cookie 携带机制
  • 洛谷 P3478 [POI 2008] STA-Station
  • Ollama Docker 容器向容器内传输AI模型并挂载模型
  • 基于快速S变换的配电网故障选线
  • Android开发:Java与Kotlin深度对比
  • IDC权威认可:瑞数信息双项入选《中国大模型安全保护市场概览》
  • CSS+JavaScript 禁用浏览器复制功能的几种方法
  • AWE2026启动:加码AI科技,双展区联动开启产业新格局
  • LeetCode 刷题【11. 盛最多水的容器】
  • Zap日志库指南
  • PCIe Base Specification解析(三)
  • java多线程编程自用笔记
  • 论文笔记:EMR-MERGING: Tuning-Free High-Performance Model Merging
  • 2025.7.22 测试 总结
  • Qt/C++源码/监控设备模拟器/支持onvif和gb28181/多路批量模拟/虚拟监控摄像头
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ImageCarousel(图片轮播组件)
  • linux应用:spi_ioc_transfer结构cs_change说明
  • 【实时Linux实战系列】实时文件系统的特性与优化
  • 深入解析Hadoop中的Region分裂与合并机制
  • Adam、AdamW介绍,以及AdamW优势
  • 数控机床上滚珠螺杆故障怎么解决?
  • HITL节点介绍(Human-in-the-loop nodes)(指在自动化流程(如AI工作流或系统)中,允许人类在关键步骤直接参与、干预或修正的节点)
  • 【Verilog】竞争、冒险
  • 11.Java三大特性
  • 知识付费平台源码开发详解:内容审核、版权保护与防盗机制全方案
  • IMU(LSM6DSMTR+LIS2MDLTR)
  • STL学习(一、string容器)
  • C# 基于halcon的视觉工作流-章21-点查找
  • freertos任务调度关键函数理解 vTaskSwitchContext
  • 编程基础:常见数据类型详解