零基础学AI大模型之LLM绑定Tool工具实战

大家好,我是工藤学编程 🦉 一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉 C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列🐷 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
分库分表 分库分表之实战-sharding-JDBC分库分表执行流程原理剖析
消息队列 深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK)
AI大模型 零基础学AI大模型之LangChain Tool工具

前情摘要

1、零基础学AI大模型之读懂AI大模型
2、零基础学AI大模型之从0到1调用大模型API
3、零基础学AI大模型之SpringAI
4、零基础学AI大模型之AI大模型常见概念
5、零基础学AI大模型之大模型私有化部署全指南
6、零基础学AI大模型之AI大模型可视化界面
7、零基础学AI大模型之LangChain
8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路
9、零基础学AI大模型之Prompt提示词工程
10、零基础学AI大模型之LangChain-PromptTemplate
11、零基础学AI大模型之ChatModel聊天模型与ChatPromptTemplate实战
12、零基础学AI大模型之LangChain链
13、零基础学AI大模型之Stream流式输出实战
14、零基础学AI大模型之LangChain Output Parser
15、零基础学AI大模型之解析器PydanticOutputParser
16、零基础学AI大模型之大模型的"幻觉"
17、零基础学AI大模型之RAG技术
18、零基础学AI大模型之RAG系统链路解析与Document Loaders多案例实战
19、零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析
20、零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战
20、零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战
21、零基础学AI大模型之RAG系统链路构建:文档切割转换全解析
22、零基础学AI大模型之LangChain 文本分割器实战:CharacterTextSplitter 与 RecursiveCharacterTextSplitter 全解析
23、零基础学AI大模型之Embedding与LLM大模型对比全解析
24、零基础学AI大模型之LangChain Embedding框架全解析
25、零基础学AI大模型之嵌入模型性能优化
26、零基础学AI大模型之向量数据库介绍与技术选型思考
27、零基础学AI大模型之Milvus向量数据库全解析
28、零基础学AI大模型之Milvus核心:分区-分片-段结构全解+最佳实践
29、零基础学AI大模型之Milvus部署架构选型+Linux实战:Docker一键部署+WebUI使用
30、零基础学AI大模型之Milvus实战:Attu可视化安装+Python整合全案例
31、零基础学AI大模型之Milvus索引实战
32、零基础学AI大模型之Milvus DML实战
33、零基础学AI大模型之Milvus向量Search查询综合案例实战
33、零基础学AI大模型之新版LangChain向量数据库VectorStore设计全解析
34、零基础学AI大模型之相似度Search与MMR最大边界相关搜索实战
35、零基础学AI大模型之LangChain整合Milvus:新增与删除数据实战
36、零基础学AI大模型之LangChain+Milvus实战:相似性搜索与MMR多样化检索全解析
37、零基础学AI大模型之LangChain Retriever
38、零基础学AI大模型之MultiQueryRetriever多查询检索全解析
39、零基础学AI大模型之LangChain核心:Runnable接口底层实现
40、零基础学AI大模型之RunnablePassthrough
41、零基础学AI大模型之RunnableParallel
42、零基础学AI大模型之RunnableLambda
43、零基础学AI大模型之RunnableBranch
44、零基础学AI大模型之Agent智能体
45、零基础学AI大模型之LangChain Tool工具


本文章目录

  • 零基础学AI大模型之LLM绑定Tool工具实战
    • [一、 为什么要给大模型"绑定工具"?](#一、 为什么要给大模型“绑定工具”?)
    • [二、 关键注意:大模型不"直接干活",只"指挥干活"](#二、 关键注意:大模型不“直接干活”,只“指挥干活”)
    • [三、 工具绑定的核心要素:3件事让大模型"会用工具"](#三、 工具绑定的核心要素:3件事让大模型“会用工具”)
    • [四、 大模型绑定工具的技术流程:从"提问"到"回复"7步走](#四、 大模型绑定工具的技术流程:从“提问”到“回复”7步走)
    • [五、 核心API:用.bind_tools()给大模型"装工具"](#五、 核心API:用.bind_tools()给大模型“装工具”)
      • [5.1 bind_tools()方法参数说明](#5.1 bind_tools()方法参数说明)
      • [5.2 关键提醒](#5.2 关键提醒)
    • [六、 工具调用三步曲:大模型是怎么"用工具"的?](#六、 工具调用三步曲:大模型是怎么“用工具”的?)
    • [七、 完整实战:从0到1实现"大模型绑定计算器工具"](#七、 完整实战:从0到1实现“大模型绑定计算器工具”)
      • [7.1 准备工作](#7.1 准备工作)
      • [7.2 完整代码(带详细注释)](#7.2 完整代码(带详细注释))
      • [7.3 运行结果(示例)](#7.3 运行结果(示例))
    • [八、 进阶实战:绑定"天气查询工具",解决实时数据痛点](#八、 进阶实战:绑定“天气查询工具”,解决实时数据痛点)
      • [8.1 完整代码](#8.1 完整代码)
      • [8.2 运行结果(示例)](#8.2 运行结果(示例))
    • [九、 实战踩坑指南:3个常见问题及解决办法](#九、 实战踩坑指南:3个常见问题及解决办法)
    • [十、 小结:绑定工具是大模型"落地干活"的关键一步](#十、 小结:绑定工具是大模型“落地干活”的关键一步)

零基础学AI大模型之LLM绑定Tool工具实战

一、 为什么要给大模型"绑定工具"?

之前我们学过,LangChain的Tool工具能让大模型拥有调用外部能力的"潜力",但这还不够------就像买了螺丝刀、扳手却没交给工人,工具再好也用不起来。而给大模型"绑定工具",就是把这些工具"递到"大模型手里,让它能根据需求,自己判断什么时候用、用哪个工具。

举个场景:问大模型"北京今天天气""369×258等于多少",没绑工具时它要么答非所问,要么算错;绑了"天气查询工具""计算器工具"后,它会自动调用工具获取实时数据、精准计算,再把结果用口语化的方式反馈给你。

这就像钢铁侠的AI助手贾维斯------光有智能不够,得绑定战甲的武器、飞行、防护系统,才能真正帮钢铁侠战斗。给大模型绑定工具,就是给它装"手和脚",让它从"只会说"的AI,变成"会动手干活"的AI。

二、 关键注意:大模型不"直接干活",只"指挥干活"

很多人会误以为"大模型绑定工具后,自己就会执行工具"------其实不是!这里有个核心误区要理清:

大模型的"工具调用",本质是生成工具需要的参数(比如"查询北京天气"里的"北京"),而实际执行工具(调用API、计算数据)的动作,是由我们的代码(或Agent)来完成的。

简单说:大模型是"指挥官",负责判断用什么工具、传什么参数;工具是"士兵",负责执行具体操作;我们写的代码是"通信兵",把指挥官的指令传给士兵,再把士兵的结果回传给指挥官。

三、 工具绑定的核心要素:3件事让大模型"会用工具"

要让大模型顺利用起来绑定的工具,必须做好3个核心要素,少一个都可能出问题:

要素 作用 示例
工具描述 告诉大模型"这个工具能干嘛、怎么用" "天气查询工具:输入城市名,返回实时天气(晴/雨、气温)"
参数解析 大模型从自然语言中提取工具需要的结构化参数 从"查上海明天温度"中,提取参数{"城市":"上海","日期":"明天"}
执行反馈 把工具的执行结果(比如JSON数据)转成自然语言 把{"weather":"晴","temp":22}转成"上海明天晴,气温22℃"

四、 大模型绑定工具的技术流程:从"提问"到"回复"7步走

给大模型绑定工具后,一次完整的交互流程就像流水线,每一步都环环相扣,和我们之前学的Agent流程完全契合:

  1. 用户输入:提出需求(比如"计算3×12的结果");
  2. 大模型分析意图:判断这个需求需要用工具(乘法计算不是文本推理强项);
  3. 选择工具:从绑定的工具列表里,选中"乘法工具";
  4. 提取参数:从需求中提取参数(a=3,b=12);
  5. 调用工具:代码执行工具,得到结果(36);
  6. 结果格式化:把工具返回的原始结果(36)转成自然语言("3乘以12的结果是36");
  7. 最终回复:把格式化后的结果反馈给用户。

五、 核心API:用.bind_tools()给大模型"装工具"

支持工具调用的大模型(比如GPT-4o、通义千问、智谱清言等),都提供了简单的绑定方法------bind_tools(),只要把定义好的工具列表传进去,就能完成"工具交付"。

5.1 bind_tools()方法参数说明

python 复制代码
def bind_tools(
    self,
    tools: Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]],  # 工具列表(必须传)
    *,
    tool_choice: Optional[Union[dict, str, Literal["auto", "none", "required", "any"], bool]] = None,  # 工具选择策略(auto=自动选)
    strict: Optional[bool] = None,  # 是否严格校验工具参数
    parallel_tool_calls: Optional[bool] = None,  # 是否支持并行调用多个工具
    **kwargs: Any,
) -> Runnable[LanguageModelInput, BaseMessage]:

5.2 关键提醒

不是所有大模型都支持bind_tools()!只有明确标注"支持工具调用"的聊天模型(比如ChatOpenAI、ChatZhipu、ChatTongyi等)才能用,普通文本生成模型(比如GPT-3.5-turbo-instruct)不支持。

六、 工具调用三步曲:大模型是怎么"用工具"的?

给大模型绑定工具后,它用工具的过程就分三步,我们用伪代码拆解清楚:

第一步:大模型生成"工具调用指令"

大模型分析需求后,会生成包含"工具名、参数"的指令,存在tool_calls属性里(content内容为空,因为它不直接回答,只指挥工具):

python 复制代码
# 1. 定义工具(加法、乘法)
tools = [add, multiply]
# 2. 初始化支持工具调用的大模型
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
# 3. 绑定工具
llm_with_tools = llm.bind_tools(tools)
# 4. 用户提问
query = "3 * 12等于多少?"
# 5. 大模型生成工具调用指令
ai_msg = llm_with_tools.invoke(query)
# 打印工具调用指令(tool_calls属性)
print(ai_msg.tool_calls)

输出结果(包含工具名、参数、唯一ID):

python 复制代码
[
  {
    'id': 'call_ea723d86cf804a088b946a', 
    'function': {'arguments': '{"a": 3, "b": 12}', 'name': 'multiply'}, 
    'type': 'function'
  }
]

第二步:执行工具,获取结果

我们的代码遍历tool_calls,找到对应的工具,传入参数执行,得到结果后生成ToolMessage(包含工具调用ID,用于和大模型指令对应):

python 复制代码
# 遍历工具调用指令
for tool_call in ai_msg.tool_calls:
    # 根据工具名选择对应的工具函数
    selected_tool = {"add": add, "multiply": multiply}[tool_call["name"].lower()]
    # 执行工具(传入tool_call,自动解析参数)
    tool_msg = selected_tool.invoke(tool_call)
    print(tool_msg)

输出结果(ToolMessage对象,包含结果和调用ID):

python 复制代码
ToolMessage(content='36', name='multiply', tool_call_id='call_ea723d86cf804a088b946a')

第三步:反馈结果,大模型生成最终回复

ai_msg(工具调用指令)和tool_msg(工具执行结果)都加入消息列表,再传给大模型,大模型会把结果转成自然语言回复:

python 复制代码
# 构建消息列表(用户提问 + 工具调用指令 + 工具执行结果)
messages = [HumanMessage(query), ai_msg, tool_msg]
# 大模型生成最终回复
result = llm_with_tools.invoke(messages)
print(result.content)

输出结果(口语化回复):

python 复制代码
3 乘以 12 的结果是 36。

七、 完整实战:从0到1实现"大模型绑定计算器工具"

光说不练假把式,我们用通义千问(qwen-plus)为例,写一个完整可运行的案例------让大模型绑定"加法""乘法"工具,解决精准计算问题。

7.1 准备工作

  1. 安装依赖:确保已安装langchain相关包
bash 复制代码
pip install langchain langchain-openai
  1. 获取通义千问API密钥:从阿里云百炼平台申请,替换代码中的api_key

7.2 完整代码(带详细注释)

python 复制代码
# 1. 导入必要模块
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

# 2. 定义工具(加法、乘法)------用@tool装饰器快速定义
@tool  # 标记这是一个Tool工具
def add(a: int, b: int) -> int:
    """实现两个整数的加法运算,用于解决加法计算问题"""
    return a + b

@tool
def multiply(a: int, b: int) -> int:
    """实现两个整数的乘法运算,用于解决乘法计算问题"""
    return a * b

# 3. 初始化支持工具调用的大模型(通义千问qwen-plus)
llm = ChatOpenAI(
    model_name="qwen-plus",  # 模型名(支持工具调用)
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 通义千问兼容OpenAI的接口地址
    api_key="sk-xxx",  # 替换成你的API密钥
    temperature=0.7  # 随机性:0~1,0越精准
)

# 4. 给大模型绑定工具------关键步骤
llm_with_tools = llm.bind_tools([add, multiply])  # 传入工具列表

# 5. 定义用户需求(乘法计算)
user_query = "计算369乘以258的结果"

# 6. 第一步:大模型生成工具调用指令
# 构建消息列表(只包含用户提问)
messages = [HumanMessage(content=user_query)]
# 大模型分析需求,生成工具调用指令
ai_msg = llm_with_tools.invoke(messages)
# 打印工具调用指令(看大模型选了什么工具、传了什么参数)
print("=== 大模型生成的工具调用指令 ===")
print(ai_msg.tool_calls)
# 把工具调用指令加入消息列表
messages.append(ai_msg)

# 7. 第二步:执行工具,获取结果
print("\n=== 执行工具并获取结果 ===")
for tool_call in ai_msg.tool_calls:
    # 根据工具名找到对应的工具函数
    tool_map = {"add": add, "multiply": multiply}
    selected_tool = tool_map[tool_call["name"].lower()]
    print(f"选中的工具:{selected_tool.name}")
    # 执行工具(自动解析tool_call中的参数)
    tool_result_msg = selected_tool.invoke(tool_call)
    print(f"工具执行结果:{tool_result_msg.content}")
    # 把工具结果加入消息列表
    messages.append(tool_result_msg)

# 8. 第三步:大模型生成最终回复
print("\n=== 大模型最终回复 ===")
final_response = llm_with_tools.invoke(messages)
print(final_response.content)

7.3 运行结果(示例)

复制代码
=== 大模型生成的工具调用指令 ===
[{'id': 'call_1319a58494c54998842092', 'function': {'arguments': '{"a":369,"b":258}', 'name': 'multiply'}, 'type': 'function'}]

=== 执行工具并获取结果 ===
选中的工具:multiply
工具执行结果:95202

=== 大模型最终回复 ===
369 乘以 258 的结果是 95202。

八、 进阶实战:绑定"天气查询工具",解决实时数据痛点

我们再升级一下------绑定"天气查询工具",让大模型能获取实时天气(对接聚合数据天气API,你可以换成自己熟悉的API)。

8.1 完整代码

python 复制代码
import requests
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

# 1. 定义实时天气查询工具(对接聚合数据API)
@tool
def get_real_time_weather(city: str) -> str:
    """
    调用实时天气API,获取指定城市的实时天气信息
    参数:city - 城市名称(如"北京""上海")
    返回:天气状况、气温、风力等口语化描述
    """
    # 替换成你的聚合数据API密钥(申请地址:https://www.juhe.cn/docs/api/id/73)
    api_key = "你的聚合数据API密钥"
    # 天气API接口地址
    url = f"http://v.juhe.cn/tianqi/index?city={city}&key={api_key}"
    try:
        response = requests.get(url, timeout=10)
        data = response.json()
        if data["error_code"] == 0:
            # 解析天气数据
            sk = data["result"]["sk"]  # 实时天气数据
            weather = sk["weather"]  # 天气状况
            temp = sk["temp"]  # 气温
            wind = sk["wind_strength"]  # 风力
            return f"{city}实时天气:{weather},气温{temp}℃,风力{wind}"
        else:
            return f"天气查询失败:{data['reason']}"
    except Exception as e:
        return f"天气查询异常:{str(e)}"

# 2. 初始化大模型并绑定工具
llm = ChatOpenAI(
    model_name="qwen-plus",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key="你的通义千问API密钥",
    temperature=0.5
)
# 绑定天气查询工具
llm_with_weather_tool = llm.bind_tools([get_real_time_weather])

# 3. 用户提问:查北京实时天气
user_query = "查一下北京现在的天气"
messages = [HumanMessage(content=user_query)]

# 4. 大模型生成工具调用指令
ai_msg = llm_with_weather_tool.invoke(messages)
messages.append(ai_msg)

# 5. 执行工具并获取结果
for tool_call in ai_msg.tool_calls:
    selected_tool = {"get_real_time_weather": get_real_time_weather}[tool_call["name"].lower()]
    tool_result = selected_tool.invoke(tool_call)
    messages.append(tool_result)

# 6. 大模型生成最终回复
final_response = llm_with_weather_tool.invoke(messages)
print(final_response.content)

8.2 运行结果(示例)

复制代码
北京实时天气:晴,气温22℃,风力1-2级。

九、 实战踩坑指南:3个常见问题及解决办法

常见问题 原因 解决办法
大模型不生成tool_calls 工具描述不清晰,大模型不知道什么时候用 给工具写详细文档字符串(比如"用于查询实时天气")
工具执行报错"参数错误" 大模型提取的参数格式不对 用Pydantic模型定义参数(参考之前LangChain Tool教程)
提示"模型不支持bind_tools" 用了不支持工具调用的模型 换成ChatOpenAI、qwen-plus、ChatZhipu等支持工具调用的模型

十、 小结:绑定工具是大模型"落地干活"的关键一步

这篇我们学了给大模型绑定Tool工具的完整流程------用bind_tools()方法把工具"递"给大模型,大模型负责"指挥"(生成工具调用指令),我们的代码负责"执行"(调用工具获取结果),最后大模型把结果转成自然语言回复。

核心就是一句话:Tool工具是大模型的"手脚",绑定工具就是把"手脚"装到大模型身上,让它从"只会聊天的AI"变成"能解决实际问题的AI"

如果本文对你有帮助,欢迎点赞+关注+收藏🌟 ,有任何问题或实战需求,欢迎在评论区留言交流~ 我是工藤学编程,陪你从零到一玩转AI大模型!🚀

相关推荐
乾元2 小时前
ISP 级别的异常洪泛检测与防护——大流量事件的 AI 自动识别与响应工程
运维·网络·人工智能·安全·web安全·架构
机器之心2 小时前
多模态推理新范式!DiffThinker:用扩散模型「画」出推理和答案
人工智能·openai
linhx2 小时前
【AIGC工作流】解构AI短剧生产管线:从手动调用DeepSeek+MJ,到Agent一站式自动化的演进
人工智能·自动化·aigc
棒棒的皮皮2 小时前
【深度学习】YOLO模型评估之指标、可视化曲线分析
人工智能·深度学习·yolo·计算机视觉
驭白.3 小时前
不止于自动化:新能源汽车智造的数字基座如何搭建?
大数据·人工智能·自动化·汽车·数字化转型·制造业
企业智能研究3 小时前
什么是数据治理?数据治理对企业有什么用?
大数据·人工智能·数据分析·agent
阿里云大数据AI技术3 小时前
面向 Interleaved Thinking 的大模型 Agent 蒸馏实践
人工智能
AI Echoes4 小时前
LangChain 非分割类型的文档转换器使用技巧
人工智能·python·langchain·prompt·agent
哔哔龙4 小时前
LangChain核心组件可用工具
人工智能
全栈独立开发者4 小时前
点餐系统装上了“DeepSeek大脑”:基于 Spring AI + PgVector 的 RAG 落地指南
java·人工智能·spring