聊天模型的三种定义方式(ChatOpenAI / init_chat_model / ChatOllama)
上一篇我们完成了 LangChain 的快速上手,学会了「定义大模型 → 定义消息 → invoke 调用 → 输出解析 → 链式执行」的完整流程。
本篇我们聚焦第一步——聊天模型到底怎么定义,一共介绍三种方式:直接用ChatOpenAI、用工厂函数init_chat_model、以及接入本地模型的ChatOllama。
目录
- 先搞清楚:LLM 和聊天模型是一回事吗
- 方式一:ChatOpenAI
- invoke() 调用与配置参数
- 方式二:init_chat_model 工厂函数
- 方式三:ChatOllama 接入本地模型
- 三种方式怎么选
- 本篇小结
1. 先搞清楚:LLM 和聊天模型是一回事吗
大语言模型(LLM)在文本生成、翻译、摘要、问答等任务上表现出色。现代 LLM 通常通过聊天模型接口访问:输入是一个消息列表,输出是一条 AI 消息,而不是简单的纯文本进、纯文本出。
两者的区别:
- LLM(纯文本补全模型):接收一个字符串提示,输出一个字符串补全结果。OpenAI 的 GPT-5 就是作为 LLM 来实现的。
- 聊天模型:通常由 LLM 提供支持,但经过专门调整用于对话。它不接收单个字符串,而是接收聊天消息列表,并返回一条 AI 消息。
用一张图理解:
纯文本 LLM: "输入字符串" → [LLM] → "输出字符串"
聊天模型: Message
Message → [聊天模型] → AIMessage
Message
一句话总结:聊天模型 = 面向对话封装的 LLM,输入输出都是「消息」而不是「字符串」。
2. 方式一:ChatOpenAI
ChatOpenAI 是 LangChain 为 OpenAI 的聊天模型(如 gpt-5、gpt-5-mini)提供的具体实现类,它实现了标准的 Runnable 接口。
2.1 安装
pip install -U langchain-openai
2.2 定义模型
from langchain_openai import ChatOpenAI
# 最简单的定义方式
model = ChatOpenAI(model="gpt-5-mini")
2.3 常用初始化参数
| 参数名 | 参数描述 |
|---|---|
model | 要使用的 OpenAI 模型名称 |
temperature | 采样温度。值越高,回答越天马行空;值越低,回答越保守靠谱 |
max_tokens | 要生成的最大令牌数 |
timeout | 请求超时时间 |
max_retries | 最大重试次数 |
openai_api_key / api_key | OpenAI 密钥。不传则从环境变量 OPENAI_API_KEY 读取 |
base_url | API 请求的基本 URL |
organization | OpenAI 组织 ID,不传则从环境变量 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="...",
)
2.4 接入 OpenAI 兼容的大模型(重点)
很多国产大模型(如 DeepSeek)都提供了与 OpenAI 兼容的接口,此时不用换类,只改两个参数即可:
import os
from langchain_openai import ChatOpenAI
# 密钥建议从环境变量读取
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
model = ChatOpenAI(
base_url="https://api.deepseek.com/v1",
openai_api_key=OPENAI_API_KEY,
model="deepseek-chat",
)
参数说明:
base_url:出于兼容考虑,要设置为对方的接口地址,例如https://api.deepseek.com/v1。注意这里的v1与模型版本无关,只是接口路径的固定写法。openai_api_key:需要单独申请 DeepSeek 的 API Key,再配置到环境变量中。DeepSeek 申请地址:https://platform.deepseek.com/api_keys
提示:DeepSeek、通义、月之暗面、智谱等大多数国产模型都兼容 OpenAI 接口格式,这是实际开发中最常用的接入方式。
3. invoke() 调用与配置参数
model 是一个 Runnable(可运行)实例,调用它最直接的方法就是 .invoke():把单个输入转换为对应的输出。
3.1 invoke() 方法定义
def invoke(
input, # 输入一个 Runnable 实例(字符串或消息列表)
config: RunnableConfig | None = None, # 可选配置
**kwargs
):
...
input:输入,可以是字符串或消息列表。config:用于 Runnable 的运行时配置。
3.2 RunnableConfig 常用参数
| 参数名 | 参数描述 |
|---|---|
configurable | 在此 Runnable 或子 Runnable 上配置的属性运行时值 |
run_id | 本次调用的唯一标识符,不传则自动生成 UUID |
run_name | 本次调用的名称,默认为类名 |
metadata | 本次调用和子调用的元数据,键为字符串、值为 JSON |
3.3 最简单的调用
# 聊天模型可以直接接收字符串,内部会自动包装成消息
result = model.invoke("你好,介绍一下你自己")
print(result.content)
4. 方式二:init_chat_model 工厂函数
ChatOpenAI 只能创建 OpenAI(或兼容 OpenAI)的实例。如果你想在一套代码里灵活切换多家模型,推荐用工厂函数 init_chat_model(),它可以初始化 OpenAI、Anthropic、FireworksAI、DeepSeek、Ollama 等多种模型。
4.1 函数定义
def init_chat_model(
model: str,
*,
model_provider: str | None = None,
configurable_fields: Literal[None] = None,
config_prefix: str | None = None,
**kwargs
) -> BaseChatModel:
...
4.2 常用参数
| 参数名 | 参数描述 |
|---|---|
model | 要使用的模型名称 |
model_provider | 模型提供方,如 openai、anthropic、google_genai、ollama、deepseek;不传则尝试从模型名推断 |
configurable_fields | 设置哪些模型参数可在运行时配置 |
config_prefix | 配置前缀,用于在 config 中查找参数 |
temperature / max_tokens / timeout 等 | 与 ChatOpenAI 相同 |
model_provider 与需要安装的集成包对应关系:
openai→langchain-openaianthropic→langchain-anthropicgoogle_genai→langchain-google-genaiollama→langchain-ollamadeepseek→langchain-deepseek
4.3 示例1:基本用法
使用不同提供方前,先安装各自的包并配置对应 API Key 环境变量:
pip install -U langchain-openai # 环境变量 OPENAI_API_KEY
pip install -U langchain-deepseek # 环境变量 DEEPSEEK_API_KEY
from langchain.chat_models import init_chat_model
# 返回 langchain_openai.ChatOpenAI 实例
gpt_model = init_chat_model("gpt-5-mini", model_provider="openai", temperature=0)
# 返回 langchain_deepseek.ChatDeepSeek 实例
deepseek_model = init_chat_model("deepseek-chat", model_provider="deepseek", temperature=0)
# 所有模型都实现了统一接口,调用方式完全一致
print("gpt-5-mini: " + gpt_model.invoke("what's your name").content + "\n")
print("deepseek-chat: " + deepseek_model.invoke("what's your name").content + "\n")
4.4 示例2:创建「可配置模型」(运行时再决定用哪个模型)
不传具体模型名,模型会变成一个「模拟器」,在 invoke 时通过 config 动态指定:
# 可配置模型模拟器
configurable_model = init_chat_model(temperature=0)
# 动态传入配置,初始化模型并调用
result = configurable_model.invoke(
"what's your name",
config={"configurable": {"model": "gpt-5-mini"}}
)
print("configurable: " + result.content)
4.5 示例3:带默认值的可配置模型
通过 configurable_fields 指定哪些字段可运行时修改,通过 config_prefix 给配置加前缀:
configurable_model_2 = init_chat_model(
model="gpt-5-mini",
temperature=0,
configurable_fields=("model", "model_provider", "temperature", "max_tokens"),
config_prefix="first",
)
result = configurable_model_2.invoke(
"what's your name?",
config={
"configurable": {
"first_model": "deepseek-chat",
"first_temperature": 0.5,
"first_max_tokens": 100,
}
},
)
print("configurable2: " + result.content)
适用场景:一个服务要同时支持多家模型、或需要在不重启程序的情况下切换模型时,用
init_chat_model最方便。
5. 方式三:ChatOllama 接入本地模型
如果数据敏感、不想把请求发到云端,或者想免费跑开源模型,可以用 Ollama 在本地部署模型,再用 ChatOllama 接入。
5.1 安装
pip install -U langchain_ollama
前提:本机(或局域网内某台机器)已经安装并运行 Ollama,且通过 ollama pull 拉取了对应模型。
5.2 ChatOllama 常用参数
| 参数名 | 参数描述 |
|---|---|
model | 要使用的 Ollama 模型名称 |
temperature | 采样温度 |
timeout | 请求超时时间 |
base_url | Ollama 服务的地址 |
num_ctx | 上下文窗口大小(默认 2048) |
num_gpu | 使用的 GPU 数量,macOS 上默认 1 表示启用金属支持,0 表示禁用 |
5.3 示例
from langchain_ollama import ChatOllama
ollama_model = ChatOllama(
model="deepseek-r1:70b",
base_url="http://192.168.100.220:11434", # Ollama 默认端口 11434
)
result = ollama_model.invoke("what's your name?")
print(result)
如果 Ollama 就跑在本机,base_url 默认指向 http://localhost:11434,可以不写。
6. 三种方式怎么选
| 方式 | 适用场景 | 不适用场景 |
|---|---|---|
ChatOpenAI | 只用 OpenAI,或接入 OpenAI 兼容的国产模型(最常用) | 需要在多家非兼容模型间切换 |
init_chat_model | 一套代码对接多家模型、运行时动态切换模型 | 只固定用一家时略显啰嗦 |
ChatOllama | 本地部署、数据不出内网、免费跑开源模型 | 没有本地 GPU / 不想自己运维模型 |
7. 本篇小结
- 聊天模型接收消息列表、返回 AI 消息,是面向对话封装的 LLM。
ChatOpenAI是最常用的定义方式,改base_url和密钥即可接入 DeepSeek 等 OpenAI 兼容模型。init_chat_model是工厂函数,支持多家提供方,并能通过 config 在运行时切换模型。ChatOllama用于接入本地部署的开源模型,数据安全、零 API 费用。- 无论哪种方式,得到的都是 Runnable 实例,都可以用
.invoke()调用、用|串成链——这正是 LangChain 统一接口的好处。
下一篇我们讲聊天模型最核心的进阶能力——工具调用(Tool Calling),让大模型能够调用搜索、数据库等外部工具。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/Gao123456fy/article/details/166596113




