摘要

大语言模型(LLM)的对话能力已成为自然语言处理领域的核心应用方向,而 LangChain 作为主流的大模型应用开发框架,为聊天模型的集成与调度提供了标准化解决方案。本文基于 LangChain 框架,系统梳理聊天模型的核心概念,详细阐述通过第三方 API(OpenAI、DeepSeek)和本地部署(Ollama)两种方式定义聊天模型的实现方法,重点解析ChatOpenAIinit_chat_model工厂函数的使用逻辑,以及invoke()核心调用方法的工作机制。结合可运行代码实例,实现从基础调用到可配置模型、跨服务商兼容的完整实践,为大模型对话应用的开发提供理论参考与工程范式。

关键词

LangChain;大语言模型;聊天模型;API 调用;本地部署;Runnable 接口

一、引言

随着 GPT-5、DeepSeek 等大语言模型的迭代,对话式 AI 应用已广泛渗透于文本生成、机器翻译、智能问答等场景。现代 LLM 通常通过聊天模型接口对外提供服务,该接口以消息列表为输入、以 AI 消息为输出,区别于传统纯文本补全模型的字符串输入输出模式。

LangChain 作为连接大模型与应用场景的桥梁,对聊天模型进行了标准化封装:一方面兼容各类主流模型服务商的 API,另一方面通过Runnable接口统一了模型调用范式。本文将基于 LangChain 的核心设计,从概念界定、API 集成、本地部署三个维度,完整拆解聊天模型的开发流程,解决开发者在模型切换、参数配置、调用兼容等方面的核心痛点。

二、LangChain 聊天模型的核心概念

2.1 聊天模型与基础 LLM 的区别

在 LangChain 的设计体系中,基础 LLM聊天模型存在明确边界:

  1. 基础 LLM:以纯文本补全为核心能力,API 接收单个字符串提示,输出字符串补全结果(如 OpenAI GPT-5 的基础文本模型);
  2. 聊天模型:由基础 LLM 提供能力支撑,专门针对对话场景优化,输入为聊天消息列表(包含系统指令、用户提问、助手回复等角色),输出为AI 消息对象,更贴合实际对话的交互逻辑。

二者的核心差异可通过输入输出形式直观区分,如图 1 所示:基础 LLM 实现 “输入字符串→输出字符串” 的映射,而聊天模型实现 “消息列表→AI 消息” 的映射。

2.2 Runnable 接口的核心地位

LangChain 的所有聊天模型均实现了标准 Runnable 接口,该接口定义了模型的核心调用规范,其中invoke()方法是实现 “单个输入→对应输出” 的核心入口,为不同服务商、不同部署方式的模型提供了统一的调用范式,是实现跨模型兼容的关键。

三、通过第三方 API 定义 LangChain 聊天模型

第三方 API 是企业与开发者使用大模型的主流方式,LangChain 针对不同服务商提供了专属封装与通用工厂函数两种实现路径,以下以 OpenAI 和 DeepSeek(OpenAI 兼容模型)为例展开实践。

3.1 方式一:基于专属类ChatOpenAI实现

ChatOpenAI是 LangChain 为 OpenAI 系列模型(如 gpt-5-mini)提供的专属实现类,继承自BaseChatOpenAI并实现 Runnable 接口,支持通过参数灵活配置模型行为。

3.1.1 核心初始化参数

ChatOpenAI的初始化参数覆盖模型选择、生成策略、网络配置三大维度,核心参数如表 1 所示:

参数名 参数描述
model 要使用的 OpenAI 模型名称(如 gpt-5-mini)
temperature 采样温度,值越高回复越灵活,值越低回复越保守
max_tokens 生成的最大令牌数
openai_api_key OpenAI API 密钥(未传入时从环境变量读取)
base_url API 请求的基础 URL(兼容第三方模型的核心参数)
max_retries 请求失败后的最大重试次数
3.1.2 基础调用实现(OpenAI)

首先安装依赖包,配置环境变量(OPENAI_API_KEY),再通过ChatOpenAI实现基础对话调用:

# 安装依赖
# pip install -U langchain-openai

from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage

# 1. 初始化OpenAI聊天模型
gpt_model = ChatOpenAI(
    model="gpt-5-mini",
    temperature=0,  # 保守采样,保证回复准确性
    max_retries=2   # 最大重试2次
)

# 2. 构造对话消息列表
messages = [
    SystemMessage(content="你是一名专业的翻译助手,仅执行英文到中文的翻译任务"),
    HumanMessage(content="my name is xiaoming")
]

# 3. 调用invoke()方法执行对话
result = gpt_model.invoke(messages)
print("GPT-5-mini回复:", result.content)
# 预期输出:我的名字是小明
3.1.3 兼容调用实现(DeepSeek)

DeepSeek 模型兼容 OpenAI 的 API 规范,因此可通过ChatOpenAI类,仅修改base_urlmodel参数实现调用,无需更换核心代码:

import os
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser

# 1. 从环境变量读取DeepSeek API密钥
DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY")

# 2. 初始化DeepSeek聊天模型(兼容OpenAI接口)
deepseek_model = ChatOpenAI(
    model="deepseek-chat",  # DeepSeek对话模型名称
    openai_api_key=DEEPSEEK_API_KEY,
    base_url="https://api.deepseek.com/v1",  # DeepSeek官方API地址
    temperature=0
)

# 3. 构造消息并执行链式调用(模型+输出解析器)
messages = [
    SystemMessage(content="Translate English to Chinese accurately."),
    HumanMessage(content="my name is xiaoming")
]
parser = StrOutputParser()  # 提取AI消息中的纯文本内容
chain = deepseek_model | parser
result = chain.invoke(messages)
print("DeepSeek回复:", result)
# 预期输出:我的名字是小明

3.2 方式二:基于工厂函数init_chat_model()实现

init_chat_model()是 LangChain 提供的通用聊天模型工厂函数,支持通过model_provider参数快速切换不同服务商的模型,无需修改核心调用逻辑,极大提升了代码的可维护性与扩展性。

3.2.1 核心优势与参数说明

该函数的核心优势是跨服务商兼容,支持 OpenAI、DeepSeek、Anthropic 等主流模型,核心参数如表 2 所示:

参数名 参数描述
model 模型名称(如 gpt-5-mini、deepseek-chat)
model_provider 模型服务商(openai/deepseek/anthropic 等)
configurable_fields 运行时可动态配置的字段(如 model、temperature)
config_prefix 配置前缀,用于区分多模型的运行时参数
temperature/max_tokens ChatOpenAI同名参数,功能一致
3.2.2 基础跨模型调用

通过init_chat_model()可同时初始化 OpenAI 和 DeepSeek 模型,并以统一方式调用,实现 “一套代码,多模型兼容”:

# 安装依赖:OpenAI需langchain-openai,DeepSeek需langchain-deepseek
# pip install -U langchain-openai langchain-deepseek

from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage

# 1. 初始化OpenAI模型
gpt_model = init_chat_model(
    model="gpt-5-mini",
    model_provider="openai",
    temperature=0
)

# 2. 初始化DeepSeek模型
deepseek_model = init_chat_model(
    model="deepseek-chat",
    model_provider="deepseek",
    temperature=0
)

# 3. 统一调用invoke()方法
question = HumanMessage(content="What's your name?")
gpt_result = gpt_model.invoke(question)
deepseek_result = deepseek_model.invoke(question)

print("GPT-5-mini:", gpt_result.content)
print("DeepSeek:", deepseek_result.content)
3.2.3 可配置模型的动态调度

通过configurable_fields参数,可实现模型的运行时动态配置,无需重新初始化模型即可切换服务商、调整参数,适用于多场景动态调度的业务需求:

from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage

# 1. 初始化可配置模型(指定可动态修改的字段)
configurable_model = init_chat_model(
    temperature=0,  # 默认温度
    configurable_fields=["model", "model_provider", "temperature"],
    config_prefix="first"  # 配置前缀,区分多模型参数
)

# 2. 动态配置为OpenAI模型并调用
openai_config = {
    "configurable": {
        "first_model": "gpt-5-mini",
        "first_model_provider": "openai",
        "first_temperature": 0
    }
}
result_openai = configurable_model.invoke(
    HumanMessage(content="What's your name?"),
    config=openai_config
)

# 3. 动态配置为DeepSeek模型并调用
deepseek_config = {
    "configurable": {
        "first_model": "deepseek-chat",
        "first_model_provider": "deepseek",
        "first_temperature": 0.5
    }
}
result_deepseek = configurable_model.invoke(
    HumanMessage(content="What's your name?"),
    config=deepseek_config
)

print("动态配置-OpenAI:", result_openai.content)
print("动态配置-DeepSeek:", result_deepseek.content)

3.3 invoke()方法的核心机制

invoke()是 Runnable 接口的核心方法,定义为abstractmethod invoke(input: Input, config: RunnableConfig | None = None, **kwargs: Any) -> Output,其核心逻辑如下:

  1. 输入参数input为 Runnable 实例(如聊天消息列表),config为运行时配置(如可配置模型的参数);
  2. 执行流程:将输入转换为模型可识别的格式,发送请求至模型服务商,接收响应后封装为 AI 消息对象;
  3. 返回值:返回与输入对应的输出(聊天模型返回AIMessage对象)。

该方法是 LangChain 统一所有模型调用的核心,无论是 API 调用还是本地部署,均通过invoke()实现核心交互。

四、通过本地部署的 LLM 定义聊天模型

对于数据隐私要求高、无法访问公网 API 的场景,本地部署 LLM是最优选择。LangChain 通过ChatOllama类,完美兼容 Ollama 部署的本地模型(如 DeepSeek-R1),实现离线对话能力。

4.1 前置准备:Ollama 环境部署

  1. 安装 Ollama:从Ollama 官方网站下载并安装对应系统的 Ollama 客户端;
  2. 拉取本地模型:通过终端执行ollama pull deepseek-r1:70b,拉取 DeepSeek-R1 70B 模型;
  3. 启动 Ollama 服务:默认监听127.0.0.1:11434,支持自定义地址与端口。

4.2 ChatOllama核心参数

ChatOllama是 LangChain 为 Ollama 部署模型提供的专属实现类,同样实现 Runnable 接口,核心初始化参数如表 3 所示:

参数名 参数描述
model 本地部署的 Ollama 模型名称(如 deepseek-r1:70b)
base_url Ollama 服务的地址(默认http://127.0.0.1:11434
num_ctx 上下文窗口大小,决定模型可处理的最大文本长度
num_gpu 启用的 GPU 数量(macOS 默认启用金属支持,Windows/Linux 按需配置)
temperature 采样温度,与 API 模型参数功能一致

4.3 本地模型调用实践

安装 LangChain 的 Ollama 依赖包后,通过ChatOllama实现本地 DeepSeek-R1 模型的对话调用:

# 安装依赖
# pip install -U langchain-ollama

from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage

# 1. 初始化本地聊天模型
local_deepseek = ChatOllama(
    model="deepseek-r1:70b",
    base_url="http://192.168.0.220:11434",  # 自定义Ollama服务地址
    num_ctx=4096,  # 扩大上下文窗口
    temperature=0
)

# 2. 调用invoke()方法执行本地对话
result = local_deepseek.invoke(
    HumanMessage(content="What's your name? Introduce yourself briefly.")
)

# 3. 打印完整响应与核心内容
print("本地DeepSeek-R1完整响应:", result)
print("本地DeepSeek-R1核心回复:", result.content)

执行上述代码后,模型将在本地完成推理计算,无需访问公网 API,响应结果包含content(核心回复)、metadata(推理元数据,如令牌数、耗时)等信息,满足离线场景的对话需求。

五、总结与展望

本文系统阐述了 LangChain 聊天模型的核心概念与实践路径,从基础概念出发,明确了聊天模型与基础 LLM 的区别及 Runnable 接口的核心地位;从API 调用维度,实现了基于ChatOpenAI的专属调用与兼容调用、基于init_chat_model()的跨服务商动态调度;从本地部署维度,完成了 Ollama 环境下 DeepSeek-R1 模型的离线调用。

LangChain 通过标准化的接口设计与灵活的配置机制,降低了大模型聊天应用的开发门槛,实现了 “一次开发,多模型兼容” 的工程目标。未来,随着大模型技术的迭代,LangChain 将进一步完善多模态聊天模型、分布式推理等能力,为大语言模型的产业化落地提供更强大的支撑。

对于开发者而言,掌握本文所述的核心方法,可快速适配不同场景的聊天模型需求:公网场景优先选择 API 调用,隐私场景采用本地部署,多模型调度场景使用init_chat_model()工厂函数,结合invoke()方法与链式调用,可高效构建高可维护性的大模型对话应用。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐