Skip to content

02 Models组件

在上一篇文章中,我们创建了第一个Agent,并且在Agent中使用了Model组件。Model(模型)在Agent系统中扮演着"大脑"的角色,所有的推理、决策、输出都是由LLM做出。

除此之外,Model不仅仅只能在Agent中使用,它也可以独立调用,本文就来系统地介绍LangChain V1.x中Models组件的详细用法。

一、模型的创建

在LangChain中,创建一个聊天模型对象,最简单的方式就是通过init_chat_model,下面以GPT为例进行模型对接,在对接对应模型提供商模型时,首先要安装对应的依赖包

bash
pip install -U "langchain[openai]"

创建并调用model对象

python
import dotenv
from langchain.chat_models import init_chat_model

dotenv.load_dotenv()

# 1.创建model对象
model = init_chat_model(
    "gpt-4o-mini"
)

# 2.调用大模型,返回AIMessage
print(model.invoke("你好,你是?"))

执行结果如下,返回一个AIMessage对象。

image-20260607153202211

在LangChain v0.2中,LangChain将一部分集成模型厂商的依赖包独立出来了,其他的模型厂商的依赖包放到了community 社区包中,在LangChain v1.0中,将这些对接不同大模型厂商的依赖包,全部都独立出来了,比如常见的langchain-openailangchain-deepseeklangchain-anthropiclangchain_qwq(阿里千问)等等依赖包,在使用LangChain时,按需引入即可。

这里将模型切换到deepseek的deepseek-v4-flash,首先,安装对应的依赖:

bash
uv add langchain-deepseek
uv sync

在.env文件中,添加DeepSeek的API秘钥

properties
# DEEPSEEK大模型
DEEPSEEK_API_KEY=sk-*******************************

切换到deepseek-v4-flash模型,直接修改模型名称即可,LangChain会自动匹配并并创建对应模型的对象。

python
import dotenv
from langchain.chat_models import init_chat_model

dotenv.load_dotenv()

# 1.创建model对象
model = init_chat_model(
    "deepseek-v4-flash"
)

# 2.调用大模型,返回AIMessage
print(model.invoke("你好,你是?"))

执行结果如下:

image-20260607155300258

二、模型参数

在创建模型时,支持通过指定模型参数来改变模型的行为,LangChain支持以下通用的标准参数:

参数名类型是否必填参数作用
modelstringtrue指定使用的模型,支持直接指定模型名称或者使用提供者:模型名称
api_keyStringfalse模型秘钥,默认从系统变量中获取,也可以在创建模型时指定。
temperaturenumberfalse模型温度,温度越低输出内容越确定,温度越高模型输出越有创造性
max_tokensnumberfalse响应结果的最大token数量,可以有效的控制
timeoutnumberfalse超时时间,以秒为单位
max_retriesnumberfalse因为服务端网络超时或限流等原因,重试的最大次数。

init_chat_model方法是通过Python中的**kwargs接收的,模型参数使用方法如下,就创建了一个聊天模型对象。

python
model = init_chat_model(
    model="deepseek-v4-flash",
    temperature=0,  # 温度为0
    max_tokens=500,  # 最大输出token为500
    max_retries=3,  # 服务端错误最大重试次数为3次
    timeout=60  # 模型响应超时时间为60s
)

在不同模型中,除了支持这些标准参数外,特定模型还支持一些自定义参数,这些自定义参数可以在LangChain中的集成文档中找到:https://docs.langchain.com/oss/python/integrations/chat

三、模型调用

前面我们已经使用invoke方法来调用过模型了,除了invoke之外,还有两个方法来调用大模型:stream()、`batch()。

下面分别介绍这三个方法的用法。

3.1 invoke

invoke是最简单、最直接的一种调用方式,它是一种同步调用方式,也就是等LLM生成完所有的结果,再返回给调用方,最终结果被包装成一个AIMessage对象,invoke支持三种方式传递消息:直接传递字符串、传递消息列表、传递消息对象列表。

代码示例如下:

python
import dotenv
from langchain.chat_models import init_chat_model
from langchain.messages import SystemMessage, HumanMessage

dotenv.load_dotenv()

# 1.创建model对象
model = init_chat_model(
    model="deepseek-v4-flash"
)

# 2.调用大模型,返回AIMessage
print("----------------------传递字符串-------------------")
print(model.invoke("你好,你是?").content)
print("----------------------传递消息列表-------------------")
print(model.invoke([
    {"role": "system", "content": "你是一个AI智能助手,你的名字叫flash助手"},
    {"role": "human", "content": "你好你是"},
]).content)
print("----------------------传递消息对象列表-------------------")
print(model.invoke([
    SystemMessage("你是一个AI智能助手,你的名字叫flash助手"),
    HumanMessage("你好你是"),
]).content)

执行结果如下:

json
----------------------传递字符串-------------------
你好!我是 DeepSeek,由深度求索公司创造的 AI 助手。很高兴认识你!😊

我是纯文本模型,但支持许多强大的功能:
- **免费使用**:完全免费,无需付费
- **超大上下文**:1M token,可以一次性处理《三体》三部曲那么长的内容
- **文件处理**:支持上传图片、PDF、Word、Excel、PPT 等文件,提取文字信息
- **联网搜索**:需要时可以手动开启联网功能获取最新信息
- **语音输入**:App 端支持语音交互

无论你想聊天、问问题、写文章、分析资料,还是解决工作学习上的难题,我都很乐意帮忙!有什么我可以帮你的吗?🤗
----------------------传递消息列表-------------------
你好!我是flash助手,很高兴为你服务!有什么可以帮你的吗?尽管问吧,我会尽力解答!
----------------------传递消息对象列表-------------------
你好!我是你的AI智能助手Flash助手,很高兴为你服务!有什么问题或需要帮助的地方吗?尽管问我吧!😊

3.2 stream

在LLM生成内容过程中,往往需要比较长的时间,这是如果等到全部生成完之后,一起返回给用户,用户体验会很差,那么采用LLM输出一点,就给用户展示一点的方式,这种方式就是stream流式输出。

示例代码如下,通过stream方法,就可以实现类似ChatGPT那种打字机效果,这里stream方法返回的不再是一个完整的AIMessage对象,而是每个chunk都是一个AIMessageChunk对象,在这个对象的text属性中返回了文本信息,在循环中将这些chunk对象拼接起来,就是最终的完整输出信息。

python
import dotenv
from langchain.chat_models import init_chat_model

dotenv.load_dotenv()

# 1.创建model对象
model = init_chat_model(
    model="deepseek-v4-flash"
)

result = None

# 2.调用大模型,返回AIMessage
for chunk in model.stream("请你简要介绍一下什么是LangChain框架"):
    print(chunk.text, end="", flush=True)
    print("\n")

    if result is None:
        result = chunk
    else:
        result += chunk

print("\n")
print("--------------------最终完整输出结果----------------------")
print(result.content)

直接结果如下:

json
Lang
Chain
是一个
开源
框架

专门
用于
简化
基于

语言
模型
应用
(中间省略...)
的门


复杂度

--------------------最终完整输出结果----------------------
LangChain 是一个开源框架,专门用于简化基于大语言模型(LLM)的应用开发。它提供了一套模块化工具,帮助开发者将 LLM 与外部数据源、API、工具(如搜索引擎、数据库)以及多步骤逻辑相结合,从而构建更强大、更智能的应用(如聊天机器人、文档问答、自动化工作流等)。

核心组件包括:
- **模型(Models)**:统一接口对接多种 LLM(如 OpenAI、Hugging Face 等)。
- **提示模板(Prompts)**:管理和优化输入提示,支持动态变量。
- **链(Chains)**:将多个组件(模型、工具、数据处理)组合成可重复的执行流程。
- **代理(Agents)**:让 LLM 自主决策调用哪些工具来完成复杂任务。
- **记忆(Memory)**:在对话或会话中保存历史状态,实现上下文感知。

通过 LangChain,开发者可以快速搭建原型并复用已有组件,降低 LLM 应用的门槛与复杂度。

3.3 batch

除了,使用invokestream单次请求大模型行之外,LangChain还支持使用batch批量请求LLM,这里的批量请求指是利用并发机制来同时请求LLM,千万不要理解成一个请求中返回多个问题的结果。

示例代码如下,在调用batch方法时传递三个问题,batch方法在底层就会并行去调用LLM,等到三次调用都返回结果后,才继续向下执行。

python
import dotenv
from langchain.chat_models import init_chat_model

dotenv.load_dotenv()

# 1.创建model对象
model = init_chat_model(
    model="deepseek-v4-flash"
)

results = model.batch([
    "你好你是",
    "你是什么模型?",
    "你的上下文窗口多大?"
])

for result in results:
    print(result)

执行结果如下:

image-20260607225643300

使用batch方法需要等到多个LLM请求结果都返回回来才会继续想下执行,如果想拿到一个结果就返回一个请求结果,就需要使用batch_as_completed方法。

python
import dotenv
from langchain.chat_models import init_chat_model

dotenv.load_dotenv()

# 1.创建model对象
model = init_chat_model(
    model="deepseek-v4-flash"
)

for result in model.batch_as_completed([
    "你好你是",
    "你是什么模型?",
    "你的上下文窗口多大?"
]):
    print(result)

执行结果:

image-20260607233658490

如果需要限制并发调用个数,可以传递max_concurrency属性指定并发数。

python
results = model.batch([
    "你好你是",
    "你是什么模型?",
    "你的上下文窗口多大?"
], config={
    'max_concurrency': 2,  # 限制最多2个并发调用
})

四、工具调用

通过model去调用LLM所构建的应用,本质上还是聊天机器人,如果我们想让LLM去完成一些工作,给LLM这个超级大脑装上手脚,可以通过给模型绑定工具,用户->model和工具的交互方式如下图:

image-20260608093618510

给model绑定特定的工具需要使用bind_tools方法,这样model在后续的调用就知道可以调用的工具有哪些,使用bind_tools时,传入需要绑定的工具列表,并且循环调用模型,如果模型返回的AIMessage中包含tool_calls参数,则根据工具名称找到对应的工具,调用指定工具并传递tool_call工具调用参数。并且在每一个tool_call参数中,都有对应的tool_call_id,作为这次工具调用的唯一标识。

工具调用结束后,工具调用结果就是一个ToolMessage对象,在ToolMessage对象中包含与tool_calls参数对应的tool_call_id,将工具消息保存到消息列表,下一轮调用LLM时,一起传递给LLM,LLM会再次通过推理,来判断是否需要调用工具,依旧会通过tool_calls参数返回工具调用信息,直到tool_calls信息为空,则说明LLM输出最终结果,整个循环结束。

python
import dotenv
from langchain.chat_models import init_chat_model
from langchain.messages import HumanMessage
from langchain.tools import tool

dotenv.load_dotenv()


# 1、定义工具
@tool
def get_today_ai_news() -> str:
    """获取今天最新的AI资讯"""
    return (
        "1. Agent成为AI核心方向\n"
        "2. GPT-5.5强化推理与编程\n"
        "3. Claude新版本提升代码能力\n"
        "4. Gemini升级多模态能力\n"
        "5. AI正进入操作系统层"
    )


@tool
def search_weather(city: str):
    """查询今日天气"""
    return f"今日{city}天气晴,东风4级,体感舒适"


# 2、构建工具名->工具函数的映射
tools_map = {
    "get_today_ai_news": get_today_ai_news,
    "search_weather": search_weather
}

# 3.创建model对象
model = init_chat_model(
    model="deepseek-v4-flash"
)

# 4.绑定工具
bind_tools_model = model.bind_tools([get_today_ai_news, search_weather])
messages = [
    HumanMessage("获取今日最新AI资讯")
]

# 5.执行循环
while True:
    ai_message = bind_tools_model.invoke(messages)
    messages.append(ai_message)
    if not ai_message.tool_calls:
        break

    for tool_call in ai_message.tool_calls:
        tool_message = tools_map.get(tool_call.get("name")).invoke(tool_call)
        # 6、添加工具消息到消息列表
        messages.append(tool_message)

# 7.输出结果
print(f"最终结果:{messages[-1].content}")

执行结果如下:

python
最终结果:以下是今天最新的 **AI 资讯速览** 🚀:

---

### 📰 今日AI要闻(5条)

1. **🤖 Agent 成为AI核心方向**
   AI智能体(Agent)正成为行业发展的核心焦点,各大厂商纷纷加码布局。

2. **🧠 GPT-5.5 强化推理与编程**
   OpenAI 的新版本 GPT-5.5 在逻辑推理和代码生成能力上进一步升级,性能显著提升。

3. **💻 Claude 新版本提升代码能力**
   Claude 发布了新版本,代码编写与理解能力得到增强,开发者体验更佳。

4. **🎨 Gemini 升级多模态能力**
   Google Gemini 在多模态(图像、文字、音频等)处理方面迎来重要升级,交互更丰富。

5. **⚙️ AI 正进入操作系统层**
   AI 正从应用层渗透到操作系统底层,未来 AI OS 概念或将加速落地。

---

如果想了解某一条资讯的更多细节,欢迎告诉我!😊

五、结构化输出

在一些场景下,需要model按照指定的格式返回数据,比如按指定格式输出目前最受欢迎的五首流行歌曲,返回给前端展示,示例如下:

json
{
  "songs": [
    {
      "song_name": "晴天",
      "singer": "周杰伦"
    },
    {
      "song_name": "稻香",
      "singer": "周杰伦"
    },
    {
      "song_name": "孤勇者",
      "singer": "陈奕迅"
    },
    {
      "song_name": "起风了",
      "singer": "买辣椒也用券"
    },
    {
      "song_name": "光年之外",
      "singer": "邓紫棋"
    }
  ]
}

在LangChain中进行结构化输出可以通过with_structured_output方法,传入结构化的数据模型,这里可以传入Pydantic模型、TypeDict类、JSON Schema,更推荐使用Pydantic模型,所以这里以Pydantic模型的用法为例来展示结构化输出的用法。

python
import dotenv
from langchain.chat_models import init_chat_model
from pydantic import BaseModel, Field

dotenv.load_dotenv()


class Song(BaseModel):
    """歌曲信息类"""
    song_name: str = Field(description="歌曲名称")
    singer: str = Field(description="歌手")


class SongList(BaseModel):
    """歌曲列表"""
    songs: list[Song] = Field(description="歌曲列表")


# 1.创建model对象
model = init_chat_model(
    "gpt-4o"
)

with_structured_model = model.with_structured_output(SongList)

# 2.调用大模型,返回AIMessage
print(with_structured_model.invoke("请输出5首中文流行歌曲"))

执行结果如下:

songs=[Song(song_name='匆匆那年', singer='王菲'), Song(song_name='七里香', singer='周杰伦'), Song(song_name='模特', singer='李榮浩'), Song(song_name='江南', singer='林俊杰'), Song(song_name='听海', singer='张惠妹')]