前情提要在 P1 中我们已经学会了用 LCEL 搭一条最简单的链from langchain_core.output_parsers import StrOutputParser from langchain_deepseek import ChatDeepSeek llm ChatDeepSeek(modeldeepseek-v4-flash) parser StrOutputParser() chain llm | parser print(chain.invoke(你好))创建上面这样一条链这条链能跑但有个问题——模型只会说不会做。你问它今天昆明天气怎么样它只能回答抱歉我无法获取实时数据。在本篇博客中我们就来解决这个LLM的痛点我们会学会三种调用大模型的姿势然后给 AI 上手脚让它不再只有大脑即工具让它真正能动起来。三种姿势调用大模型在LangChain中我们有多种方式来定义一个LLM不同的姿势适用于不同的环境在本小节中我们会学习到不同的调用方式方式1ChatOpenAI这是最直接的用法指定模型名就行。不仅支持 OpenAI也兼容 DeepSeek 等国内厂商因为它们都兼容 OpenAI 的 API 格式。不过需要注意的是如果我们使用ChatOpenAI来调用非OpenAI的AI我们需要引入一些其它的参数此处我们以deepseek为例import os from langchain_community.chat_models import ChatOpenAI from langchain_core.output_parsers import StrOutputParser llm ChatOpenAI( modeldeepseek-v4-flash, base_urlhttps://api.deepseek.com, api_keyos.getenv(DEEPSEEK_API_KEY), # 从环境变量读取 ) paser StrOutputParser() chain llm | paser print(chain.invoke(你好))我们可以看到我们需要单独给出这个厂商的base_url和api_keyapi_key我们都知道是从环境变量中获取到的在P1里我们就已经讲过了那么base_url是怎么来的呢让我们看到deepseek的接口文档我们可以看到在文档中都是给出来了的所以我们在调用一个AI的时候可以多看看它的API文档适用场景你就用一家厂商代码写死就行方式2init_chat_model一个工厂函数模型名换一下就能切换厂商不用改代码结构。我们同样用一个例子来看一下from langchain.chat_models import init_chat_model llm init_chat_model( modeldeepseek-v4-flash, model_providerdeepseek ) llm.invoke(你好).pretty_print()我们可以看到在这个模式下参数都是一样的我们只需要修改里面的内容就可以实现调用不同的模型适用场景你要对比不同模型效果或者项目需要灵活切换厂商方式3ChatOllama本地部署模型跑在自己机器上不依赖网络数据不出门。不过这个会涉及到本地部署的操作我们这里就不多赘述了大概给大家一个代码例子from langchain_ollama import ChatOllama model ChatOllama( modelllama3, base_urlhttp://localhost:11434, ) print(model.invoke(你是谁).content)适用场景离线环境、数据敏感场景、想省 API 费用工具Tools一句人话解释为什么需要工具大模型只会说话不会动手——它查不了天气、读不了数据库、算不了复杂数学而工具就是 AI 的外挂让它能干人的活。那么我们到底要怎样才可以定义并用上工具呢接下来我们就会通过逐步实现一个可以进行运算的大模型来展示创建工具LangChain 提供了 tool装饰器把普通 Python 函数一键变成工具。args_schemafrom langchain_core.tools import tool tool def add(a: int, b: int) - int: 两数相加 Args: a: 第一个整数 b: 第二个整数 Returns: 两数之和 return a b注意函数名 工具名文档字符串 工具描述缺一不可模型就是通过名称和描述来理解这个工具是干什么的。 一个小彩蛋我们来讲讲描述这里发生了什么LangChain 自动把你的函数名、文档字符串、参数类型打包成 JSON Schema 发给模型模型就是通过这个 Schema 来理解add 是加法工具参数 a 和 b 都是整数。因此工具描述是非常重要的最好是像文章示例这样把用途参数返回都写上去帮助大模型更好理解工具的作用不过是除了这样的描述方式外还有三种其它方式我们简述一下Pydanticfrom dataclasses import Field from langchain_core.tools import tool from pydantic import Field, BaseModel class addInput(BaseModel): a: int Field(description第一个整数) b: int Field(description第二个整数) tool(args_schemaaddInput) def add(a: int, b: int) - int: 两数之和 return a bAnnotatedfrom langchain_core.tools import tool from typing_extensions import Annotated tool def add(a: Annotated[int, 第一个整数], b: Annotated[int, 第二个整数]) - int: 两数之和 return a bStructuredToolfrom langchain_core.tools import StructuredTool def add(a: int, b: int) - int: return a b add_tool StructuredTool.from_function( funcadd, nameadd, description两数之和 )绑定工具工具定义好了怎么让模型知道它可以用用 bind_tools() 绑定工具。我们依旧用一个例子来帮助大家理解from langchain.chat_models import init_chat_model from langchain_core.tools import tool tool def add(a: int, b: int) - int: 两数相加 Args: a: 第一个整数 b: 第二个整数 Returns: 两数之和 return a b llm init_chat_model( modeldeepseek-v4-flash, model_providerdeepseek ) llm_with_tools llm.bind_tools([add]) # 绑定add工具 llm.invoke(3 5等于多少).pretty_print()通过上述一个代码我们就实现了一个简易的可以调用加法工具的大模型注意bind_tools()这个方法里面需要传入工具列表因此哪怕只有一个工具也需要以列表形式存在实战小练习我们来实现一个输入城市名称就可以输出实时天气的工具from langchain_deepseek import ChatDeepSeek import requests from langchain_core.tools import tool # 定义查询天气工具 tool def get_weather(city: str) - str: 查询指定城市的实时天气。 Args: city: 城市中文名称如昆明、北京 resp requests.get( fhttps://wttr.in/{city}?format{city}今日%t, %Clangzh, timeout5, ) return resp.text llm ChatDeepSeek(modeldeepseek-v4-flash) # 定义llm llm_with_tools llm.bind_tools([get_weather]) # 绑定工具 msg llm_with_tools.invoke(北京) tool_call msg.tool_calls[0] # 手动调用一下工具 result get_weather.invoke(tool_call[args]) print(result)
LangChain P2 | 给LangChain装上手脚[MacOS]
发布时间:2026/6/15 1:31:42
前情提要在 P1 中我们已经学会了用 LCEL 搭一条最简单的链from langchain_core.output_parsers import StrOutputParser from langchain_deepseek import ChatDeepSeek llm ChatDeepSeek(modeldeepseek-v4-flash) parser StrOutputParser() chain llm | parser print(chain.invoke(你好))创建上面这样一条链这条链能跑但有个问题——模型只会说不会做。你问它今天昆明天气怎么样它只能回答抱歉我无法获取实时数据。在本篇博客中我们就来解决这个LLM的痛点我们会学会三种调用大模型的姿势然后给 AI 上手脚让它不再只有大脑即工具让它真正能动起来。三种姿势调用大模型在LangChain中我们有多种方式来定义一个LLM不同的姿势适用于不同的环境在本小节中我们会学习到不同的调用方式方式1ChatOpenAI这是最直接的用法指定模型名就行。不仅支持 OpenAI也兼容 DeepSeek 等国内厂商因为它们都兼容 OpenAI 的 API 格式。不过需要注意的是如果我们使用ChatOpenAI来调用非OpenAI的AI我们需要引入一些其它的参数此处我们以deepseek为例import os from langchain_community.chat_models import ChatOpenAI from langchain_core.output_parsers import StrOutputParser llm ChatOpenAI( modeldeepseek-v4-flash, base_urlhttps://api.deepseek.com, api_keyos.getenv(DEEPSEEK_API_KEY), # 从环境变量读取 ) paser StrOutputParser() chain llm | paser print(chain.invoke(你好))我们可以看到我们需要单独给出这个厂商的base_url和api_keyapi_key我们都知道是从环境变量中获取到的在P1里我们就已经讲过了那么base_url是怎么来的呢让我们看到deepseek的接口文档我们可以看到在文档中都是给出来了的所以我们在调用一个AI的时候可以多看看它的API文档适用场景你就用一家厂商代码写死就行方式2init_chat_model一个工厂函数模型名换一下就能切换厂商不用改代码结构。我们同样用一个例子来看一下from langchain.chat_models import init_chat_model llm init_chat_model( modeldeepseek-v4-flash, model_providerdeepseek ) llm.invoke(你好).pretty_print()我们可以看到在这个模式下参数都是一样的我们只需要修改里面的内容就可以实现调用不同的模型适用场景你要对比不同模型效果或者项目需要灵活切换厂商方式3ChatOllama本地部署模型跑在自己机器上不依赖网络数据不出门。不过这个会涉及到本地部署的操作我们这里就不多赘述了大概给大家一个代码例子from langchain_ollama import ChatOllama model ChatOllama( modelllama3, base_urlhttp://localhost:11434, ) print(model.invoke(你是谁).content)适用场景离线环境、数据敏感场景、想省 API 费用工具Tools一句人话解释为什么需要工具大模型只会说话不会动手——它查不了天气、读不了数据库、算不了复杂数学而工具就是 AI 的外挂让它能干人的活。那么我们到底要怎样才可以定义并用上工具呢接下来我们就会通过逐步实现一个可以进行运算的大模型来展示创建工具LangChain 提供了 tool装饰器把普通 Python 函数一键变成工具。args_schemafrom langchain_core.tools import tool tool def add(a: int, b: int) - int: 两数相加 Args: a: 第一个整数 b: 第二个整数 Returns: 两数之和 return a b注意函数名 工具名文档字符串 工具描述缺一不可模型就是通过名称和描述来理解这个工具是干什么的。 一个小彩蛋我们来讲讲描述这里发生了什么LangChain 自动把你的函数名、文档字符串、参数类型打包成 JSON Schema 发给模型模型就是通过这个 Schema 来理解add 是加法工具参数 a 和 b 都是整数。因此工具描述是非常重要的最好是像文章示例这样把用途参数返回都写上去帮助大模型更好理解工具的作用不过是除了这样的描述方式外还有三种其它方式我们简述一下Pydanticfrom dataclasses import Field from langchain_core.tools import tool from pydantic import Field, BaseModel class addInput(BaseModel): a: int Field(description第一个整数) b: int Field(description第二个整数) tool(args_schemaaddInput) def add(a: int, b: int) - int: 两数之和 return a bAnnotatedfrom langchain_core.tools import tool from typing_extensions import Annotated tool def add(a: Annotated[int, 第一个整数], b: Annotated[int, 第二个整数]) - int: 两数之和 return a bStructuredToolfrom langchain_core.tools import StructuredTool def add(a: int, b: int) - int: return a b add_tool StructuredTool.from_function( funcadd, nameadd, description两数之和 )绑定工具工具定义好了怎么让模型知道它可以用用 bind_tools() 绑定工具。我们依旧用一个例子来帮助大家理解from langchain.chat_models import init_chat_model from langchain_core.tools import tool tool def add(a: int, b: int) - int: 两数相加 Args: a: 第一个整数 b: 第二个整数 Returns: 两数之和 return a b llm init_chat_model( modeldeepseek-v4-flash, model_providerdeepseek ) llm_with_tools llm.bind_tools([add]) # 绑定add工具 llm.invoke(3 5等于多少).pretty_print()通过上述一个代码我们就实现了一个简易的可以调用加法工具的大模型注意bind_tools()这个方法里面需要传入工具列表因此哪怕只有一个工具也需要以列表形式存在实战小练习我们来实现一个输入城市名称就可以输出实时天气的工具from langchain_deepseek import ChatDeepSeek import requests from langchain_core.tools import tool # 定义查询天气工具 tool def get_weather(city: str) - str: 查询指定城市的实时天气。 Args: city: 城市中文名称如昆明、北京 resp requests.get( fhttps://wttr.in/{city}?format{city}今日%t, %Clangzh, timeout5, ) return resp.text llm ChatDeepSeek(modeldeepseek-v4-flash) # 定义llm llm_with_tools llm.bind_tools([get_weather]) # 绑定工具 msg llm_with_tools.invoke(北京) tool_call msg.tool_calls[0] # 手动调用一下工具 result get_weather.invoke(tool_call[args]) print(result)