零基础学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大模型!🚀

相关推荐
冬奇Lab2 分钟前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab2 分钟前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP4 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年4 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼4 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS4 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区5 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈5 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang6 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx
shengjk17 小时前
NanoClaw 深度剖析:一个"AI 原生"架构的个人助手是如何运转的?
人工智能