| 大家好,我是工藤学编程 🦉 | 一个正在努力学习的小博主,期待你的关注 |
|---|---|
| 实战代码系列最新文章😉 | 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流程完全契合:
- 用户输入:提出需求(比如"计算3×12的结果");
- 大模型分析意图:判断这个需求需要用工具(乘法计算不是文本推理强项);
- 选择工具:从绑定的工具列表里,选中"乘法工具";
- 提取参数:从需求中提取参数(a=3,b=12);
- 调用工具:代码执行工具,得到结果(36);
- 结果格式化:把工具返回的原始结果(36)转成自然语言("3乘以12的结果是36");
- 最终回复:把格式化后的结果反馈给用户。
五、 核心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 准备工作
- 安装依赖:确保已安装langchain相关包
bash
pip install langchain langchain-openai
- 获取通义千问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大模型!🚀