Models(模型)的连接
目前LangChain有两种与大语言模型连接的核心方法,对应两种抽象的接口:LLM 和 ChatModel ,分别对接“文本补全型”和“对话聊天型”大语言模型。
- 基础文本生成接口(LLM),这种接口连接方式官方已经不再推荐使用,下面我来简单说明:
在LangChain中,LLM接口的用途为纯文本补全(text completion)模型。输入输出都是字符串,典型的就是用于旧版 GPT-3(如 text-davinci-003)、某些本地模型(如通过 Hugging Face pipeline 加载的非聊天模型)。
为什么说是非聊天模型?在 LangChain(以及现代 LLM API)中,“聊天格式”(chat format)特指 以“消息列表(list of messages)”作为输入,每条消息带有角色(role) ,例如:
[
SystemMessage(content="你是一个数学老师。"),
HumanMessage(content="2+2等于多少?"),
AIMessage(content="2+2等于4。"),
HumanMessage(content="那 3+3 呢?")
]
这种格式源于 OpenAI 的 Chat Completions API,其底层请求结构是:
{
"model": "gpt-4o",
"messages": [
{"role": "system", "content": "你是一个数学老师。"},
{"role": "user", "content": "2+2等于多少?"},
{"role": "assistant", "content": "2+2等于4。"}
]
}
这就是支持聊天格式的模型:能理解 system/user/assistant 等角色,并据此生成上下文连贯的回复。
而不支持聊天格式的模型:只接受一个纯字符串作为输入,比如 "2+2等于多少?",没有角色、没有对话历史的概念。比如:
输入:"法国的首都是"
输出:"巴黎。"
这种模式,它可能能勉强续写,但这不是“原生支持聊天格式”,而是靠你手动构造 prompt 模拟对话。
- LangChain的第二种模型连接方式,通过ChatModel(聊天对话接口),也是官方主推的一种,通过ChatOpenAI和init_chat_model两种方法来连接模型,下面通过代码来展示使用方法:
from langchain_openai import ChatOpenAI # 模型交互工具
from langchain_core.messages import HumanMessage # 用户消息载体
import os # 系统环境工具
from dotenv import load_dotenv # 环境变量加载工具
# 加载环境变量
load_dotenv()
# 初始化模型,设置参数
chat = ChatOpenAI(
model="deepseek-chat",
streaming=True, # 流式响应
temperature=0.7, # 模型温度(0-1之间,越高越随机,越低越严谨)
max_tokens=1000, # 模型生成的最大token数
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url=os.getenv("DEEPSEEK_BASE_URL")
)
# 发送消息与打印内容
response = chat.invoke([HumanMessage(content="你好,介绍一下你自己")])
print(response.content)
这是一个使用ChatOpenAI的简单示例,该类适用于API接口兼容 OpenAI 规范的模型(如 DeepSeek),因为这些模型遵循了 OpenAI 的请求/响应格式,通过ChatOpenAI和自定义base_url/api_key 适配。但是,不是所有的模型接口都兼容OpenAI,所以,LangChain开发了一个统一的方法:init_chat_model,该方法适用于官方适配的绝大多数主流模型提供商(如 OpenAI、DeepSeek、Anthropic 等),示例如下:
from langchain_core.output_parsers import StrOutputParser
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
# 加载项目根目录的 .env,确保可读取 DEEPSEEK_API_KEY
load_dotenv()
# 自动适配底层 API,无需手动配置 base_url
model = init_chat_model(model="deepseek-chat", model_provider="deepseek")
# 直接使用模型 + 输出解析器搭建一个链
basic_qa_chain = model | StrOutputParser()
# 测试链
response = basic_qa_chain.invoke("你好,介绍一下你自己")
print(response)
以上两种都是 ChatModel 接口的具体实现方式,核心差异集中在兼容性和配置复杂度上,具体对比如下:
| 对比维度 | ChatOpenAI 类 | init_chat_model 方法 |
|---|---|---|
| 核心定位 | 适配 OpenAI 规范的专属工具 | 兼容多厂商的通用工具 |
| 适用场景 | 连接 API 兼容 OpenAI 规范的模型(如 DeepSeek、GPT 系列) | 连接 LangChain 官方适配的主流模型(OpenAI、DeepSeek、Anthropic 等) |
| 兼容性 | 仅支持 OpenAI 规范兼容模型,小众模型可能失效 | 覆盖绝大多数主流厂商,兼容性更广 |
| 配置复杂度 | 需手动指定 base_url 和对应厂商 API 密钥 | 仅需指定 model 和 model_provider,自动适配底层配置 |
| 参数控制粒度 | 可精细控制 OpenAI 规范相关参数(如 streaming、frequency_penalty) | 以通用参数为主,厂商特有参数需通过 **kwargs 传递 |
| 切换模型成本 | 切换非 OpenAI 规范模型时,需重新适配配置 | 切换模型仅需修改 model 和 model_provider 参数 |
| 上手难度 | 需了解目标模型的 OpenAI 兼容情况,略高 | 无需关注底层 API 差异,上手更简易 |
通过以上的对比结果,我们得出两点建议
- 若你使用的模型明确兼容 OpenAI 规范(如 DeepSeek、GPT-3.5/4 系列),且需要精细控制模型参数,优先选 ChatOpenAI 类;
- 若你需要频繁切换不同厂商的模型(如今天用 DeepSeek、明天用 Anthropic Claude),或不确定模型是否兼容 OpenAI 规范,优先选 init_chat_model 方法,效率更高、兼容性更有保障。