零基础学AI大模型之LangChain Tool工具

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

前情摘要

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实战
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智能体


本文章目录

  • [零基础学AI大模型之LangChain Tool工具](#零基础学AI大模型之LangChain Tool工具)
    • [一、 大模型的"软肋":再会说,也干不了"实事"](#一、 大模型的“软肋”:再会说,也干不了“实事”)
    • [二、 Tool工具:大模型连接外部世界的"桥梁"](#二、 Tool工具:大模型连接外部世界的“桥梁”)
    • [三、 Tool工具生命周期:从"定义"到"用起来"就四步](#三、 Tool工具生命周期:从“定义”到“用起来”就四步)
    • [四、 LangChain创建Tool:三种方式,从简单到灵活](#四、 LangChain创建Tool:三种方式,从简单到灵活)
      • [4.1 方式一:@tool装饰器------一行代码搞定简单工具](#4.1 方式一:@tool装饰器——一行代码搞定简单工具)
      • [4.2 方式二:配置参数------自定义工具名称、参数规则](#4.2 方式二:配置参数——自定义工具名称、参数规则)
      • [4.3 方式三:继承BaseTool------完全自定义,控制度最高](#4.3 方式三:继承BaseTool——完全自定义,控制度最高)
    • [五、 实战:用Tool解决大模型的两个"痛点"](#五、 实战:用Tool解决大模型的两个“痛点”)
    • [六、 Tool核心组件:搞懂这5点,工具不踩坑](#六、 Tool核心组件:搞懂这5点,工具不踩坑)
    • [七、 小结:Tool是大模型的"手脚",Agent是"大脑"](#七、 小结:Tool是大模型的“手脚”,Agent是“大脑”)

零基础学AI大模型之LangChain Tool工具

一、 大模型的"软肋":再会说,也干不了"实事"

之前我们学过大模型(LLM)很会"聊天"------写文案、答问题、编故事样样行,但一遇到"动手干活"的事就犯难。比如问它"今天北京天气""12345×6789等于多少",它要么答非所问,要么算错,核心问题是大模型有四个明显的"软肋":

  • 实时数据:训练数据有截止日期,查不到最新天气、股票;
  • 精确计算:擅长文本推理,不擅长复杂数学运算;
  • 专业知识:法律条款、医疗指南等专业内容易出错;
  • 外部对接:没法直接调用CRM、API等现有系统。

就像一个没带工具的工人,空有一身力气,却拧不了螺丝、测不了尺寸。而LangChain的Tool工具,就是给大模型装上"螺丝刀""卷尺"------让它能调用外部能力,把"会说"变成"会干"。

二、 Tool工具:大模型连接外部世界的"桥梁"

Tool工具到底是什么?简单说,它是大模型与外部功能交互的"接口"------让大模型能像我们用APP一样,调用函数、API、数据库等外部能力。

它的核心价值就是突破大模型的"静态限制" ,具体能做四件事:

  1. 实时拿数据:调用天气、股票API,获取最新信息;
  2. 精准做计算:调用计算器工具,搞定复杂数学题;
  3. 查专业知识:对接法律数据库、医疗论文库,获取权威内容;
  4. 连外部系统:操作CRM录入客户信息、调用OA发起审批。

有了Tool,大模型就从"只会纸上谈兵的理论家",变成了"能动手解决问题的实干家"。

三、 Tool工具生命周期:从"定义"到"用起来"就四步

不管多复杂的Tool,从创建到被大模型调用,都要经历四个阶段,和我们之前学的Agent流程能无缝衔接:

  1. 工具定义:写代码定义工具(比如"乘法计算器""天气查询"),明确它能做什么、要什么参数;
  2. Agent注册:把工具告诉Agent(相当于给Agent"交工具");
  3. 自动调用:Agent分析需求,判断该用哪个工具,自动传参调用;
  4. 结果处理:工具返回结果,Agent要么直接反馈,要么结合结果继续推理。

四、 LangChain创建Tool:三种方式,从简单到灵活

LangChain提供了三种创建Tool的方法,覆盖从"快速上手"到"自定义开发"的所有需求,我们结合代码一步步学:

4.1 方式一:@tool装饰器------一行代码搞定简单工具

这是最常用的方式,给普通函数加个@tool装饰器,函数就变成了大模型能调用的Tool。关键是要写文档字符串,告诉大模型这个工具的用途。

python 复制代码
# 导入tool装饰器(注意是从langchain_core导入)
from langchain_core.tools import tool

# 给函数加@tool装饰器,变成Tool
@tool
def multiply(a: int, b: int) -> int:
    """把传递的两个整数参数相乘,返回乘积结果。用于解决数学乘法计算问题"""
    return a * b

# 测试下这个Tool的属性(帮我们理解Tool的结构)
print("工具名称:", multiply.name)  # 输出:multiply(默认是函数名)
print("工具描述:", multiply.description)  # 输出:我们写的文档字符串
print("工具参数:", multiply.args)  # 输出:参数列表(a和b,都是int)
print("是否直接返回结果:", multiply.return_direct)  # 输出:False(默认不直接返回,交给Agent处理)
print("工具参数schema:", multiply.args_schema.model_json_schema())  # 输出参数的详细规则
print("调用工具计算2×3:", multiply.invoke({"a": 2, "b": 3}))  # 输出:6

4.2 方式二:配置参数------自定义工具名称、参数规则

如果想给工具起自定义名字、严格校验参数,就用args_schema指定Pydantic模型(我们之前学过PydanticOutputParser,用法类似)。

python 复制代码
# 导入必要模块
from pydantic import BaseModel, Field
from langchain_core.tools import tool

# 用Pydantic定义参数模型,指定参数描述(帮助大模型理解该传什么)
class CalculatorInput(BaseModel):
    a: int = Field(description="要相乘的第一个整数,必须是整数类型")
    b: int = Field(description="要相乘的第二个整数,必须是整数类型")

# 自定义工具名称(multiplication-tool),指定参数模型
@tool("multiplication-tool", args_schema=CalculatorInput, return_direct=True)
def multiply(a: int, b: int) -> int:
    """Multiply two numbers.(英文描述也可以,大模型能识别)"""
    return a * b

# 测试
print("工具名称:", multiply.name)  # 输出:multiplication-tool(自定义名称)
print("调用工具计算5×6:", multiply.invoke({"a": 5, "b": 6}))  # 输出:30(return_direct=True,直接返回结果)

4.3 方式三:继承BaseTool------完全自定义,控制度最高

如果工具逻辑复杂(比如要调用多个API、处理异常),就继承BaseTool类,手动实现工具的名称、描述、执行逻辑。虽然代码多,但能实现任意需求。

python 复制代码
from langchain_core.tools import BaseTool
from pydantic import BaseModel, Field
from typing import Optional

# 1. 定义参数模型
class WeatherInput(BaseModel):
    city: str = Field(description="要查询天气的城市名称,比如"北京""上海"")

# 2. 继承BaseTool,实现自定义天气工具
class WeatherTool(BaseTool):
    # 工具名称(唯一标识)
    name: str = "weather-check-tool"
    # 工具描述(告诉大模型该用它查天气)
    description: str = "查询指定城市的实时天气,返回天气状况、气温和穿衣建议"
    # 参数模型(用于参数校验)
    args_schema: type[BaseModel] = WeatherInput
    # 是否直接返回结果
    return_direct: bool = True

    # 核心方法:实现工具的执行逻辑(必须叫_run)
    def _run(
        self, city: str, run_manager: Optional[any] = None
    ) -> str:
        """执行查询逻辑,这里用模拟数据(实际可对接真实天气API)"""
        # 真实场景下,这里可以用requests调用天气API
        mock_weather = {
            "北京": "晴,气温12-22℃,适合穿薄外套",
            "上海": "阴转小雨,气温15-18℃,建议带雨伞"
        }
        return f"{city}实时天气:{mock_weather.get(city, '暂未查询到该城市天气')}"

# 3. 创建工具实例并测试
weather_tool = WeatherTool()
print("调用天气工具查北京天气:", weather_tool.invoke({"city": "北京"}))
# 输出:北京实时天气:晴,气温12-22℃,适合穿薄外套

五、 实战:用Tool解决大模型的两个"痛点"

光说不练假把式,我们用两个实战案例,看看Tool是怎么解决大模型"不会计算""没有实时数据"的问题:

实战1:用Tool搞定精确乘法计算

大模型算"1234×5678"容易出错,用我们写的multiplication-tool就能轻松搞定:

python 复制代码
from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool

# 1. 定义乘法工具
@tool
def multiply(a: int, b: int) -> int:
    """把两个整数相乘,返回乘积,用于精确解决乘法计算问题"""
    return a * b

# 2. 初始化大模型(用ChatOpenAI,也可以用本地模型)
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo")

# 3. 定义Agent提示词(告诉Agent可以用工具)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你可以使用提供的工具解决问题,先判断是否需要用工具,再调用工具"),
    ("user", "{input}")
])

# 4. 创建Agent并注册工具
tools = [multiply]
agent = create_react_agent(llm=llm, tools=tools, prompt=prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 5. 让Agent解决"1234×5678"
result = agent_executor.invoke({"input": "计算1234乘以5678的结果"})
print("最终结果:", result["output"])

运行后会看到Agent的思考过程:"需要计算乘法,调用multiply工具,参数a=1234,b=5678",最终返回精确结果1234×5678=7006652

实战2:用Tool获取实时天气

大模型不知道最新天气,我们用WeatherTool对接真实API(这里用聚合数据的天气API,你可以换成自己的):

python 复制代码
import requests
from langchain_core.tools import BaseTool, tool
from pydantic import BaseModel, Field

# 1. 定义真实天气查询工具(对接聚合数据API)
@tool
def get_real_weather(city: str) -> str:
    """调用真实天气API,获取指定城市的实时天气,包括温度、天气状况、风力"""
    # 替换成你的聚合数据API密钥(申请地址:https://www.juhe.cn/docs/api/id/73)
    api_key = "你的API密钥"
    url = f"http://v.juhe.cn/tianqi/index?city={city}&key={api_key}"
    response = requests.get(url)
    data = response.json()
    if data["error_code"] == 0:
        sk = data["result"]["sk"]  # 实时天气数据
        return f"{city}实时天气:{sk['weather']},气温{sk['temp']}℃,风力{sk['wind_strength']}"
    else:
        return f"查询失败:{data['reason']}"

# 2. 让Agent调用这个工具
from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(temperature=0)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你可以使用工具查询实时天气,直接返回结果"),
    ("user", "{input}")
])

tools = [get_real_weather]
agent = create_react_agent(llm=llm, tools=tools, prompt=prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 查询上海实时天气
result = agent_executor.invoke({"input": "查一下上海现在的天气"})
print(result["output"])

运行后,Agent会自动调用get_real_weather工具,返回上海的实时天气------这就解决了大模型"没有实时数据"的痛点。

六、 Tool核心组件:搞懂这5点,工具不踩坑

不管用哪种方式创建Tool,核心都是这5个组件,理解它们就能灵活设计工具:

组件 作用 示例
名称(name) 工具唯一标识,Agent靠名称调用工具 "multiplication-tool"、"weather-check-tool"
描述(description) 告诉Agent工具能做什么,什么时候用 "查询指定城市实时天气"、"解决乘法计算问题"
输入参数(args_schema) 定义参数规则(类型、描述),做参数校验 用Pydantic模型定义city(str)、a(int)
执行函数(func/_run) 工具的核心逻辑,实际干活的代码 调用API、计算乘积、查询数据库
返回模式(return_direct) 是否直接返回结果给用户 True(直接返回)、False(Agent继续处理)

七、 小结:Tool是大模型的"手脚",Agent是"大脑"

这篇我们学了LangChain的Tool工具,核心就是一句话:Tool给大模型装"手脚",让它能调用外部能力;Agent给大模型装"大脑",让它知道该用哪个手脚

我们学了三种创建Tool的方式:@tool装饰器(快速用)、配置参数(自定义)、继承BaseTool(全控制),还通过实战解决了大模型"不会计算""没有实时数据"的痛点------这些知识和之前学的Agent、RAG结合起来,就能搭建出能独立干活的AI系统(比如"自动查天气+安排会议"的Agent)。

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

相关推荐
LucianaiB2 小时前
【基于昇腾平台的CodeLlama实践:从环境搭建到高效开发】
运维·人工智能·性能优化
AI题库2 小时前
NLTK自然语言处理实战:1.3 NLTK核心数据结构
数据结构·人工智能·自然语言处理
计算机程序设计小李同学2 小时前
基于贝叶斯分类算法的垃圾邮件筛选器开发
人工智能·分类·数据挖掘
小龙2 小时前
【学习笔记】模型的权重数据到底是干嘛的
人工智能·笔记·学习·权重
小程故事多_802 小时前
重读ReAct,LLM Agent的启蒙之光,从“空想”到“实干”的范式革命
前端·人工智能·aigc
JH灰色2 小时前
【大模型】-LlamaIndex框架(与LangChain区别)
数据库·langchain
戴西软件2 小时前
戴西软件AICrash:基于机器学习的行人保护仿真新范式
大数据·人工智能·机器学习·华为云·云计算·腾讯云·aws
愚公搬代码2 小时前
【愚公系列】《扣子开发 AI Agent 智能体应用》018-提示词编写和优化(扣子平台设置提示词案例)
人工智能
科士威传动2 小时前
滚珠导轨平行度与平面度的精准保障方法
人工智能·科技·平面·机器人·自动化·制造