LangChain 聊天模型核心能力 [ 1 ]
定义聊天模型
大语言模型(LLM)在各种与语言相关的任务(例如文本生成、翻译、摘要、问答等)中表现出色。现代 LLM 通常通过聊天模型接口访问,该接口将消息列表作为输入,并返回消息作为输出,而不是使用纯文本。
这里需要注意 LLM 与 LangChain 中 聊天模型 的关系:
- 在 LangChain 的官方文档中,认为 LLM 大多数是纯文本补全模型。这些纯文本模型封装的 API 接受一个字符串提示作为输入,并输出一个字符串补全结果(实际上 LLM 还包括多模态输入)。OpenAI 的 GPT-5 就是作为 LLM 来实现的。
- LangChain 中的聊天模型,通常由 LLM 提供支持,但经过专门调整以用于对话。关键在于,它们不是接受单个字符串作为输入,而是接受聊天消息列表【"message = [...]"】,并返回一条 AI 消息作为输出。

通过 API 定义聊天模型
方式 1:ChatOpenAI
ChatOpenAI 定义聊天模型在快速上手模块中已经涉及。
class langchain_openai.chat_models.base.ChatOpenAI 是 LangChain 为 OpenAI 的聊天模型(如 gpt-5, gpt-5-mini)提供的具体实现类。
其继承了 class langchain_openai.chat_models.base.BaseChatOpenAI,且 BaseChatOpenAI 实现了标准的 Runnable 接口。
ChatOpenAI 常用初始化参数说明
| 参数名 | 参数描述 |
|---|---|
| model | 要使用的 OpenAI 模型的名称 |
| temperature | 采样温度,温度值越高,AI 回答越天马行空;温度越低,回答越保守靠谱。 |
| max_tokens | 要生成的最大令牌数 |
| timeout | 请求超时时间 |
| max_retries | 最大重试次数 |
| openai_api_key / api_key | OpenAI API 密钥。如果未传入,将从环境变量中读取 OPENAI_API_KEY。 |
| base_url | API 请求的基本 URL。 |
| organization | OpenAI 组织 ID。如果未传入,将从 env var OPENAI_ORG_ID 中读取。 |
| ...... | ...... |
示例:
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="gpt-5-mini",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
# api_key="...",
# base_url="...",
# organization="...",
# other params...
)
若使用其它与 OpenAI 兼容的大模型,例如 DeepSeek,则可以使用以下定义方式:
import os
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
base_url="https://api.deepseek.com/v1",
openai_api_key=OPENAI_API_KEY,
model="deepseek-chat",
# ...
)
参数说明:
base_url:出于与 OpenAI 兼容考虑,要将 base_url 设置为 https://api.deepseek.com/v1 来使用,但注意,此处 v1 与模型版本无关。
openai_api_key:需要单独申请 DeepSeek 的 API Key,然后重新进行环境变量配置。
- DeepSeek API Key 申请地址: https://platform.deepseek.com/api_keys。
invoke () 调用
介绍 方式 2 之前,需要先来了解一下关于 Runnable 接口中的 .invoke() 调用。该方法是将单个输入转换为对应的输出。例如对于聊天模型来说,就是根据用户的问题输入,输出相应的答案。
invoke() 方法定义:
# 导入抽象方法装饰器:用于定义必须被子类实现的抽象方法
from abc import abstractmethod
# 导入 Any 类型注解:表示任意类型
from typing import Any
# ------------------------------
# 抽象方法:invoke
# 作用:定义一个**必须由子类实现**的核心执行入口
# 常用于 LangChain / Runnable / 工作流引擎 等框架
# ------------------------------
@abstractmethod # 装饰器:标记该方法为抽象方法,子类必须重写,否则实例化报错
def invoke(
# 参数1:运行时配置
# RunnableConfig | None:类型可以是 RunnableConfig 或 None(Union 类型)
# = None:默认值为 None,调用时可省略该参数
config: RunnableConfig | None = None,
# 参数2:可变关键字参数
# **kwargs:接收任意数量的关键字参数(key=value)
# : Any:参数值可以是**任意类型**,不做类型限制
**kwargs: Any,
) -> Output: # -> Output:返回值类型注解,规定该方法必须返回 Output 类型对象
# 抽象方法无具体实现,仅定义接口规范
pass
请求参数:
input:输入一个 Runnable 实例config:(默认空)用于 Runnable 的配置。
返回值:
- 返回一个 Runnable 实例
class langchain_core.runnables.config.RunnableConfig 常用参数说明
| 参数名 | 参数描述 |
|---|---|
| configurable | 通过 configurable_fields() 在此 Runnable 或子 Runnable 上配置的属性的运行时值。 |
| run_id | 针对此调用运行的跟踪器的唯一标识符。如果未提供,将生成新的 UUID。 |
| run_name | 此调用的跟踪器运行的名称。默认为类的名称。 |
| metadata | 此次调用和任何子调用的元数据。键是字符串,值是 JSON。类型:dict[str, Any] |
| ...... | ...... |
具体示例,下面的 方式 2 会用到~
方式 2: init_chat_model
ChatOpenAI 用于明确创建 OpenAI 聊天模型的实例。
而 init_chat_model() 是一个工厂函数,它可以初始化多种支持的聊天模型(如 OpenAI、Anthropic、FireworksAI 等),不仅仅是 OpenAI 的聊天模型。
init_chat_model() 函数定义
# 导入需要的类型(LangChain 标准依赖,原函数隐式依赖)
from typing import Any, Literal, Optional
from langchain.base_language import BaseLanguageModel
from langchain.chat_models.base import BaseChatModel
# ==========================================================
# LangChain 核心工厂函数:初始化聊天模型(Chat Model)
# 作用:根据模型名称 + 提供商,自动创建对应的聊天模型实例
# 比如自动创建 ChatOpenAI、ChatAnthropic、ChatZhipuAI 等
# ==========================================================
def init_chat_model(
# 必填参数:模型名称(比如 gpt-3.5-turbo、claude-3-sonnet、glm-4)
model: str,
# * 符号:表示后面所有参数必须用【关键字参数】传值,不能用位置参数
# 强制调用方式:init_chat_model("gpt-3.5", model_provider="openai")
*,
# 可选参数:模型提供商(比如 openai、anthropic、zhipu、ollama 等)
# 不传时,LangChain 会根据 model 名称自动推断
model_provider: str | None = None,
# 固定为 None:配置提供方(LangChain 内部预留参数)
# Literal[None] = None → 只能传 None,不能传其他值
config_provider: Literal[None] = None,
# 固定为 None:可配置字段(LangChain 内部预留参数)
configurable_fields: Literal[None] = None,
# 可选参数:配置前缀(用于多模型环境区分配置)
# 比如从环境变量读取配置时的前缀
config_prefix: str | None = None,
# 可变关键字参数:传递给具体模型的额外参数
# 比如 temperature、max_tokens、api_key、base_url 等
**kwargs: Any,
) -> BaseChatModel: # 返回值:返回一个通用聊天模型基类实例
"""函数实现体(LangChain 内部代码)"""
我是 LangChain 的初始化聊天模型函数:
1. 你必须告诉我【模型名字】
2. 可以告诉我【模型提供商】,不告诉我我自己猜
3. 后面几个参数现在没用,固定传 None 就行
4. 你可以随便传模型需要的其他参数
5. 我最后返回一个能直接用的聊天模型对象
init_chat_model() 常用参数说明
| 参数名 | 参数描述 |
|---|---|
| model | 要使用的模型的名称 |
| model_provider |
模型提供方。支持的
如果未指定,将尝试从模型推断 |
| configurable_fields |
设置哪些模型参数是可配置的。若配置为:
|
| config_prefix |
1. 配置为非空字符串,则模型将在运行时通过查找 2. 设置为空字符串,那么模型将可以通过 |
| temperature | 采样温度,温度值越高,AI 回答越天马行空;温度越低,回答越保守靠谱。 |
| max_tokens | 要生成的最大令牌数 |
| timeout | 请求超时时间 |
| max_retries | 最大重试次数 |
| openai_api_key / api_key | OpenAI API 密钥。如果未传入,将从环境变量中读取 OPENAI_API_KEY。 |
| base_url | API 请求的基本 URL。 |
| ...... | ...... |
init_chat_model() 函数返回一个与指定的 model_name 和 model_provider 相对应的 BaseChatModel(如 ChatOpenAI,ChatAnthropic 等)。
注意要是模型可配置,则返回一个聊天模型模拟器,该模拟器在传入配置后,于运行时才会初始化底层模型。【对应上面的 RunnableConfig】
示例 1:基本用法
使用不同的模型提供方,需要安装为其各自包,与设置各自的 API Key 环境变量!例如:
OpenAI 环境变量配置为:
OPENAI_API_KEY="your_openai_api_key"安装命令:
pip install -U langchain-openaiAnthropic 环境变量配置为:
ANTHROPIC_API_KEY="your_anthropic_api_key"安装命令:
pip install -U langchain-anthropicDeepSeek 环境变量配置为:
DEEPSEEK_API_KEY="your_deepseek_api_key"安装命令:
pip install -U langchain-deepseekGoogle VertexAI 环境变量配置为:
GOOGLE_API_KEY="your_google_api_key"安装命令:
pip install -U langchain-google-vertexai更多见这里【点击跳转】
from langchain.chat_models import init_chat_model
# gpt-5-mini: langchain-openai ChatOpenAI 实例
model = init_chat_model("gpt-5-mini", model_provider="openai", temperature=0)
# deepseek_model: deepseek-chatmodel 实例
deepseek_model = init_chat_model("deepseek-chat", model_provider="deepseek", temperature=0)
# 由于所有模型集成都实现了ChatModel接口,因此可以以相同的方式使用它们。
print("gpt-5-mini: " + model.invoke("what's your name").content + "\n")
print("deepseek-chat: " + deepseek_model.invoke("what's your name").content + "\n")
输出:
gpt-5-mini: I'm called ChatGPT. How can I assist you today?
deepseek-chat: I'm DeepSeek chat! 😊 You can call me DeepSeek or just Chat if you'd like. I'm here to help with anything you need, ask me anything! 🚀
示例 2:创建可配置模型
class langchain_core.runnables.config.RunnableConfig 常用参数说明
| 参数名 | 参数描述 |
|---|---|
| configurable | 通过 configurable_fields() 在此 Runnable 或子 Runnable 上配置的属性的运行时值。 |
| run_id | 针对此调用运行的跟踪器的唯一标识符。如果未提供,将生成新的 UUID。 |
| run_name | 此调用的跟踪器运行的名称。默认为类的名称。 |
| metadata | 此次调用和任何子调用的元数据。键是字符串,值是 JSON。类型:dict[str, Any] |
| ...... | ...... |
# 可配置模型模拟器 1
configurable_model_1 = init_chat_model(temperature=0)
# 动态修改配置,初始化模型并调用
configurable_result_1 = configurable_model_1.invoke(
"what's your name!",
config={"configurable": {"model": "gpt-5-mini"}}
)
print("configurable1: " + configurable_result_1.content + "\n")
这段代码的核心是:先创建一个「未绑定具体模型、仅带默认参数的可配置模板」,在真正调用 invoke 时,才通过 config 动态指定模型并覆盖配置,整个过程是延迟初始化 + 运行时动态绑定模型的流程。
具体来说:
init_chat_model(temperature=0)只设置默认参数(如温度 = 0),不指定具体 model,返回的不是一个固定模型实例,而是一个支持运行时配置的 Runnable 模板;- 调用
.invoke("问题", config={"configurable": {"model": "gpt-5-mini"}})时,LangChain 会读取config里的model,动态创建 / 切换到对应模型,并合并默认参数与运行时配置; - 最后用指定的
gpt-5-mini执行推理,返回结果,实现同一个模板对象,每次调用可换不同模型的效果。
输出:
configurable1: I'm called ChatGPT. How can I assist you today?
示例 3:具有默认值的可配置模型
# 可配置模型模拟器 2
configurable_model_2 = init_chat_model(
model="gpt-5-mini",
temperature=0.5,
configurable_fields=("model", "model_provider", "temperature", "max_tokens"),
config_prefix="first",
)
# 动态修改配置,初始化模型并调用
configurable_result_2 = configurable_model_2.invoke(
"what's your name?",
config={
"configurable": {
"first.model": "deepseek-chat",
"first.temperature": 0.0,
"first.max_tokens": 100,
}
}
)
print(configurable2: " + configurable_result_2.content + "\n")
这段代码的核心是:先创建一个带默认模型、带默认参数、且明确开放可修改字段、带前缀隔离的可配置模板,在真正调用 invoke 时,通过带前缀的 config 动态覆盖允许修改的参数,整个过程是默认配置 + 运行时安全覆盖的流程。
具体来说:
init_chat_model(...)先指定默认模型 gpt-5-mini、默认温度 0.5,同时通过 configurable_fields 明确只允许运行时修改model、model_provider、temperature、max_tokens这 4 个参数,并通过 config_prefix="first" 给配置加前缀做隔离,返回的是一个受严格约束、可安全动态配置的 Runnable 模板;- 调用
.invoke(..., config={"configurable": {"first.model": "...", "first.temperature": "...", "first.max_tokens": "..."}})时,LangChain 会读取带前缀的配置项,只覆盖声明过允许修改的字段,合并默认参数与运行时配置; - 最后用覆盖后的配置(deepseek-chat、温度 0.0、max_tokens=100)执行推理,返回结果,实现同一个模板对象、安全可控地动态修改参数的效果。
输出:
configurable2: My name is DeepSeek chat! 😊 I'm here to help you with any questions or topics you're curious about. How can I assist you today?
第一个写法 configurable_model_1 是极简、无预设、自动全开的动态模型,你只给了默认 temperature=0,没有指定 configurable_fields 和 config_prefix,所以它默认允许你在 invoke 时直接覆盖 model 等核心参数,且不需要加前缀,直接用 {"model": "xxx"} 就能改;
而第二个写法 configurable_model_2 是完整、严格、带前缀、手动限定的动态模型,你不仅提前指定了默认模型 gpt-5-mini、默认温度 0.5,还通过 configurable_fields 明确只允许覆盖指定的 4 个参数,并通过 config_prefix="first" 强制覆盖时必须使用带前缀的键(如 first.model),目的是实现参数隔离、避免多模型配置冲突,比第一种更规范、更安全、更适合正式项目使用。
通过本地部署的 LLM 定义聊天模型
ChatOllama
若想使用 ChatOllama,需要先安装 Ollama 包:
pip install -U langchain-ollama
class langchain_ollama.chat_models.base.ChatOllama 是 LangChain 为通过 Ollama 部署的聊天模型提供的具体实现类。ChatOllama 同样也实现了标准的 Runnable 接口。
ChatOllama 常用初始化参数说明
| 参数名 | 参数描述 |
|---|---|
| model | 要使用的 Ollama 模型的名称 |
| temperature | 采样温度,温度值越高,AI 回答越天马行空;温度越低,回答越保守靠谱。 |
| timeout | 请求超时时间 |
| base_url | API 请求的基本 URL。 |
| num_ctx | 设置用于生成下一个令牌的上下文窗口的大小。(默认值:2048) |
| num_gpu | 要使用的 GPU 数量。在 macOS 上,默认为 1 表示启用金属支持,默认为 0 表示禁用。 |
| ...... | ...... |
示例:
from langchain_ollama import ChatOllama
ollama_uchat = ChatOllama(model="deepseek-r1:70b", base_url="http://192.168.100.212:11434")
result = ollama_uchat.invoke("what's your name?")
print(result)
输出:
content='\n\n\nI am DeepSeek R1, an artificial intelligence developed by DeepSeek. You can ask me any questions and I will do my best to assist you.\n'
additional_kwargs={}
response_metadata={
'model': 'deepseek-r1:70b',
'created_at': '2025-08-07T06:32:57.406792Z',
'done': True,
'total_duration': 18002690044,
'load_duration': 8010575409,
'prompt_eval_duration': 9739978000,
'eval_count': 44,
'eval_duration': 7896407000,
'usage': {'input_tokens': 8, 'output_tokens': 44, 'total_tokens': 52}}
id='run-7f3467a07dc9a17e-0'
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)