概述

上一篇我们用 init_chat_model 跑通了第一个 LangChain 程序:

from langchain.chat_models import init_chat_model

model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
    temperature=0,
)

response = model.invoke("用三句话解释 LangChain")
print(response.text())

这段代码看起来很简单,但它背后藏着 LangChain 模型层最核心的设计思想:

业务代码尽量面向统一模型接口,供应商差异尽量收敛到模型初始化和集成包里。

为什么这件事重要?

因为真实项目里,模型经常会变:

  • 今天用 OpenAI,明天想测试 Claude。
  • 国内网络环境下,需要切 DeepSeek、通义、智谱或其他供应商。
  • 本地开发时想用 Ollama 跑开源模型,线上再用商业模型。
  • 一个任务需要便宜模型做分类,另一个任务需要强模型做复杂推理。
  • 某个供应商偶发超时,希望自动切到备用模型。

如果业务代码和某个厂商 SDK 深度绑定,每次换模型都要改一堆代码。LangChain 模型层要解决的,就是这个问题。

模型层不是让所有模型能力变得一样,而是让“调用模型的工程接口”尽量稳定。

核心概念:Provider、Package、Model Name

学 LangChain 模型层,先分清三个词。

概念 中文理解 示例
Provider 模型供应商或平台 OpenAI、Anthropic、DeepSeek、Ollama
Package LangChain 对应供应商集成包 langchain-openailangchain-anthropic
Model Name 具体模型名称 gpt-4o-minideepseek-chatllama3.1

这三个东西经常被初学者混在一起。

例如:

model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
)

这里:

  • openai 是供应商。
  • gpt-4o-mini 是模型名。
  • 你本地需要安装 OpenAI 对应集成包,例如 langchain-openai

再看 Ollama:

model = init_chat_model(
    "llama3.1",
    model_provider="ollama",
)

这里:

  • ollama 是供应商。
  • llama3.1 是你本地 Ollama 中存在的模型名。
  • 你本地需要安装 langchain-ollama,并且 Ollama 服务要已经启动。

关键点:LangChain 不负责发明模型名,模型名通常会传给对应供应商 API。模型是否存在、是否有权限、是否支持某个能力,要以供应商为准。

安装方式:用哪个供应商就装哪个集成包

LangChain 新版本生态中,很多供应商集成被拆成独立包。你不需要一口气安装所有模型供应商,只安装当前要用的即可。

OpenAI:

pip install -U langchain langchain-openai

Anthropic / Claude:

pip install -U langchain langchain-anthropic

DeepSeek:

pip install -U langchain langchain-deepseek

Ollama:

pip install -U langchain langchain-ollama

如果你想一次性跑本文多个示例,可以安装:

pip install -U langchain langchain-openai langchain-anthropic langchain-deepseek langchain-ollama python-dotenv

有些官方文档也会使用 extra 形式,例如:

pip install -U "langchain[openai]"

两类写法的目的都是安装对应供应商集成。实际项目中,我更习惯显式写出 langchain-openailangchain-anthropic 这类包名,因为依赖关系更清楚,也更方便排查环境问题。

环境变量:不同供应商的 Key 不一样

建议继续使用 .env 管理本地密钥:

OPENAI_API_KEY=sk-xxxx
ANTHROPIC_API_KEY=sk-ant-xxxx
DEEPSEEK_API_KEY=sk-xxxx

Python 代码中读取:

from dotenv import load_dotenv

load_dotenv()

不同供应商使用不同的环境变量名称。常见规则如下:

供应商 常见环境变量
OpenAI OPENAI_API_KEY
Anthropic ANTHROPIC_API_KEY
DeepSeek DEEPSEEK_API_KEY
Ollama 通常不需要 API Key,本地服务默认地址常见为 http://localhost:11434

不要把 API Key 写死在代码里。 一旦代码进入仓库、截图、日志或报错信息,密钥就可能泄露。

推荐入口:init_chat_model

LangChain 官方文档中,独立调用聊天模型的常见入口是:

from langchain.chat_models import init_chat_model

最基本的用法:

model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
)

也可以把供应商和模型名写在同一个字符串里:

model = init_chat_model("openai:gpt-4o-mini")

这两种写法的核心区别是表达方式不同。

我更建议初学阶段使用显式参数:

model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
)

原因很简单:读代码的人可以一眼看出哪个是模型名,哪个是供应商。

等你熟悉后,在配置文件里使用字符串形式也很方便:

MODEL_ID = "openai:gpt-4o-mini"
model = init_chat_model(MODEL_ID)

一个统一函数:把模型切换收敛到配置层

不要在业务逻辑里到处写:

init_chat_model(...)

更好的做法是写一个模型工厂函数。

创建 models.py

from langchain.chat_models import init_chat_model


def build_chat_model(provider: str, model_name: str, temperature: float = 0):
    return init_chat_model(
        model_name,
        model_provider=provider,
        temperature=temperature,
        timeout=60,
        max_retries=3,
    )

业务代码只依赖这个函数:

from dotenv import load_dotenv
from models import build_chat_model

load_dotenv()

model = build_chat_model(
    provider="openai",
    model_name="gpt-4o-mini",
)

response = model.invoke("解释一下 LangChain 的模型层")
print(response.text())

当你要切换到 DeepSeek:

model = build_chat_model(
    provider="deepseek",
    model_name="deepseek-chat",
)

当你要切换到 Ollama:

model = build_chat_model(
    provider="ollama",
    model_name="llama3.1",
)

业务调用仍然是:

response = model.invoke("解释一下 LangChain 的模型层")

不要把模型切换散落在业务代码里,要把它收敛到配置层或模型工厂里。

四个供应商示例:OpenAI、Claude、DeepSeek、Ollama

下面用同一个问题,分别初始化四类模型。

OpenAI

安装:

pip install -U langchain langchain-openai

.env

OPENAI_API_KEY=sk-xxxx

代码:

from dotenv import load_dotenv
from langchain.chat_models import init_chat_model

load_dotenv()

model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
    temperature=0,
)

response = model.invoke("用三句话解释什么是 RAG")
print(response.text())

适合场景:

  • 通用问答。
  • 文本生成。
  • 结构化输出。
  • 工具调用。
  • 多模态应用,具体能力取决于所选模型。

Anthropic / Claude

安装:

pip install -U langchain langchain-anthropic

.env

ANTHROPIC_API_KEY=sk-ant-xxxx

代码:

from dotenv import load_dotenv
from langchain.chat_models import init_chat_model

load_dotenv()

model = init_chat_model(
    "claude-3-5-haiku-latest",
    model_provider="anthropic",
    temperature=0,
)

response = model.invoke("用三句话解释什么是 RAG")
print(response.text())

适合场景:

  • 长文本理解。
  • 写作和总结。
  • 指令遵循要求较高的任务。
  • 需要稳健语言表达的对话场景。

模型名会随供应商发布节奏变化。生产项目不要把“网上某篇文章里的模型名”当成长期固定事实,应该以供应商后台和官方文档为准。

DeepSeek

安装:

pip install -U langchain langchain-deepseek

.env

DEEPSEEK_API_KEY=sk-xxxx

代码:

from dotenv import load_dotenv
from langchain.chat_models import init_chat_model

load_dotenv()

model = init_chat_model(
    "deepseek-chat",
    model_provider="deepseek",
    temperature=0,
)

response = model.invoke("用三句话解释什么是 RAG")
print(response.text())

适合场景:

  • 中文问答。
  • 成本敏感的文本处理。
  • 代码理解和生成。
  • 国内网络环境下的替代模型方案。

如果你使用的是 OpenAI 兼容接口,也可以考虑供应商提供的 OpenAI-compatible endpoint。但这种方式属于另一个层面的接入方式,和 langchain-deepseek 集成包不是同一个概念。

Ollama

Ollama 是本地模型运行工具。它不是云模型 API,而是在你的电脑或服务器上运行模型。

先安装并启动 Ollama,然后拉取模型:

ollama pull llama3.1

安装 LangChain 集成:

pip install -U langchain langchain-ollama

代码:

from langchain.chat_models import init_chat_model

model = init_chat_model(
    "llama3.1",
    model_provider="ollama",
    temperature=0,
)

response = model.invoke("用三句话解释什么是 RAG")
print(response.text())

适合场景:

  • 本地开发调试。
  • 数据不能出内网的场景。
  • 对成本敏感但能接受本地推理速度的任务。
  • 离线环境下的实验和学习。

需要注意,Ollama 模型能力取决于你本地拉取的具体模型、参数规模、量化方式和机器性能。不是所有本地模型都适合复杂 Agent 或高质量结构化输出。

对比:init_chat_model vs 具体模型类

除了 init_chat_model,你也可以直接使用具体模型类。

例如 OpenAI:

from langchain_openai import ChatOpenAI

model = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0,
)

Claude:

from langchain_anthropic import ChatAnthropic

model = ChatAnthropic(
    model="claude-3-5-haiku-latest",
    temperature=0,
)

Ollama:

from langchain_ollama import ChatOllama

model = ChatOllama(
    model="llama3.1",
    temperature=0,
)

两种方式怎么选?

方式 优点 适合场景
init_chat_model 统一入口,适合用配置切换供应商 多模型切换、教程、通用业务代码
具体模型类 能直接看到供应商特有参数 深度使用某个供应商能力

例如某些 OpenAI 特有参数、Anthropic 特有参数、Ollama 本地推理参数,不一定都能通过统一写法表达得很清楚。这时直接用具体模型类会更直观。

通用业务优先 init_chat_model,供应商深度优化可以使用具体模型类。

标准参数:temperature、max_tokens、timeout、max_retries

不同供应商参数很多,但有几类参数最常见。

temperature:控制随机性

model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
    temperature=0,
)

temperature 越低,输出越稳定;越高,输出越发散。

建议:

场景 temperature
分类、抽取、结构化输出 0 或接近 0
技术问答、客服回复 00.3
创意写作、标题生成 0.7 以上

不要迷信某个固定值。最终还是要看评估结果。

max_tokens:控制输出长度

model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
    max_tokens=500,
)

max_tokens 通常限制模型本次最多生成多少 token。

注意它不是“输入 + 输出”的总上下文窗口,而是输出侧限制。不同供应商具体语义可能略有差异,生产环境要看对应供应商文档。

timeout:控制等待时间

model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
    timeout=30,
)

如果模型长时间没有返回,客户端会超时。

建议:

  • 同步 Web 请求:超时时间不要太长,避免接口卡死。
  • 后台任务:可以适当放宽。
  • Agent 多轮工具调用:需要结合整体任务超时,而不只是单次模型超时。

max_retries:控制重试次数

model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
    max_retries=3,
)

模型服务可能遇到网络抖动、限流、服务端错误。适当重试可以提高稳定性。

但重试不是越多越好:

  • 重试会增加用户等待时间。
  • 重试可能放大流量压力。
  • 对非幂等工具调用要格外小心。

如果是普通模型调用,重试通常是合理的。如果模型调用背后还会触发外部副作用,需要设计幂等机制和任务状态。

三种调用方式:invoke、stream、batch

LangChain 聊天模型通常支持三类常见调用方式。

invoke:一次输入,一次完整输出

response = model.invoke("解释一下 LCEL")
print(response.text())

这是最容易理解的同步调用方式。

适合:

  • 简单问答。
  • 分类。
  • 摘要。
  • 结构化抽取。
  • 后端任务中的一次模型调用。

invoke() 返回完整消息对象。对聊天模型来说,常见返回类型是 AIMessage

stream:边生成边输出

for chunk in model.stream("写一段 200 字的 LangChain 介绍"):
    print(chunk.text, end="", flush=True)

stream() 会持续产生 chunk。用户不需要等模型全部生成完,就能看到内容逐步出现。

适合:

  • 聊天界面。
  • 长文本生成。
  • 用户体验要求高的应用。

流式输出的关键点是:前端、后端、网关都要支持流。如果后端已经把所有内容收集完再一次性返回,前端就看不到真正的流式效果。

batch:批量处理多个独立输入

questions = [
    "LangChain 是什么?",
    "LCEL 是什么?",
    "RAG 是什么?",
]

responses = model.batch(questions)

for response in responses:
    print(response.text())

batch() 适合处理一批互相独立的问题。

典型场景:

  • 批量摘要。
  • 批量分类。
  • 批量生成标签。
  • 批量清洗文本。

注意,batch() 不是供应商服务端批处理 API 的同义词。它更多是 LangChain 客户端层面的批量调用抽象。具体并发行为、限流策略和成本控制,生产环境里仍然要认真设计。

输入格式:字符串、消息列表、Prompt 输出

聊天模型不只能接收字符串。

方式一:直接传字符串

response = model.invoke("解释一下 Prompt Template")

LangChain 会把它转换成用户消息。

适合快速测试。

方式二:传字典消息列表

conversation = [
    {"role": "system", "content": "你是一个严谨的技术导师。"},
    {"role": "user", "content": "解释一下 Prompt Template。"},
]

response = model.invoke(conversation)

这种方式适合你已经有一组标准消息结构。

方式三:传 LangChain 消息对象

from langchain.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage("你是一个严谨的技术导师。"),
    HumanMessage("解释一下 Prompt Template。"),
]

response = model.invoke(messages)

消息对象更适合和 LangChain 生态里的 Prompt、Memory、Agent 状态配合。

方式四:传 Prompt 模板的输出

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个严谨的技术导师。"),
    ("human", "解释一下这个概念:{topic}"),
])

messages = prompt.invoke({"topic": "Prompt Template"})
response = model.invoke(messages)

这就是上一篇文章中的写法。

模型最终看的都是消息,Prompt 模板只是帮你更稳定地构造消息。

输出格式:AIMessage 不只是字符串

很多初学者会以为模型返回的就是字符串。

实际上,聊天模型通常返回一个消息对象:

response = model.invoke("解释一下 RAG")

print(type(response))
print(response)
print(response.text())

为什么不直接返回字符串?

因为模型响应里可能不只有文本,还可能包含:

  • 普通文本内容。
  • 工具调用请求。
  • token 使用量。
  • 停止原因。
  • 模型供应商返回的元数据。
  • 多模态内容块。

所以 LangChain 使用消息对象承载这些信息。

如果你只需要文本,可以使用:

response.text()

如果你在 chain 里希望最终直接得到字符串,可以加 StrOutputParser

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个技术导师。"),
    ("human", "解释一下:{topic}"),
])

chain = prompt | model | StrOutputParser()

result = chain.invoke({"topic": "RAG"})
print(result)

这也是 prompt | model | parser 这种结构的价值:把中间消息对象和最终业务输出分开处理。

多模型配置:用环境变量切换

如果你不想每次改代码,可以把模型配置放到 .env

LLM_PROVIDER=openai
LLM_MODEL=gpt-4o-mini
LLM_TEMPERATURE=0

代码:

import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model

load_dotenv()

provider = os.getenv("LLM_PROVIDER", "openai")
model_name = os.getenv("LLM_MODEL", "gpt-4o-mini")
temperature = float(os.getenv("LLM_TEMPERATURE", "0"))

model = init_chat_model(
    model_name,
    model_provider=provider,
    temperature=temperature,
)

response = model.invoke("解释一下 LangChain 模型层")
print(response.text())

切换到 DeepSeek,只改 .env

LLM_PROVIDER=deepseek
LLM_MODEL=deepseek-chat
LLM_TEMPERATURE=0

切换到 Ollama:

LLM_PROVIDER=ollama
LLM_MODEL=llama3.1
LLM_TEMPERATURE=0

这样业务代码就不用动。

多模型路由:不同任务用不同模型

实际项目中,不一定所有任务都用同一个模型。

例如:

  • 简单分类:用便宜、快的小模型。
  • 复杂推理:用更强的大模型。
  • 本地调试:用 Ollama。
  • 生产回答:用云模型。

可以写一个简单路由:

from langchain.chat_models import init_chat_model


def get_model_for_task(task_type: str):
    if task_type == "classify":
        return init_chat_model(
            "gpt-4o-mini",
            model_provider="openai",
            temperature=0,
        )

    if task_type == "reasoning":
        return init_chat_model(
            "claude-3-5-haiku-latest",
            model_provider="anthropic",
            temperature=0,
        )

    if task_type == "local_dev":
        return init_chat_model(
            "llama3.1",
            model_provider="ollama",
            temperature=0,
        )

    raise ValueError(f"Unsupported task_type: {task_type}")

调用:

model = get_model_for_task("classify")
response = model.invoke("判断这句话的情绪:这个产品太难用了")
print(response.text())

这个例子只是演示思路。生产环境中,路由规则通常来自配置中心、实验平台、租户配置或灰度策略,而不是硬编码在函数里。

模型回退:主模型失败时切备用模型

多模型切换的另一个常见场景是 fallback。

例如主模型超时,切到备用模型:

from langchain.chat_models import init_chat_model

primary_model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
    temperature=0,
    timeout=20,
    max_retries=2,
)

backup_model = init_chat_model(
    "deepseek-chat",
    model_provider="deepseek",
    temperature=0,
    timeout=30,
    max_retries=1,
)


def invoke_with_fallback(prompt: str):
    try:
        return primary_model.invoke(prompt)
    except Exception as exc:
        print(f"Primary model failed: {exc}")
        return backup_model.invoke(prompt)


response = invoke_with_fallback("解释一下模型 fallback 策略")
print(response.text())

这个版本很简单,但已经表达了核心思路。

生产环境要补充:

  • 只对可重试错误 fallback,例如超时、限流、服务端错误。
  • 不要对认证失败、参数错误、模型不存在盲目 fallback。
  • 记录主模型失败原因。
  • 标记最终使用的是哪个模型。
  • 对不同模型输出做一致性评估。
  • 如果任务涉及工具调用,确认备用模型也支持同样能力。

fallback 不是简单 try-except,而是可靠性策略的一部分。

模型能力差异:不能只看能不能 invoke

很多人看到下面这行代码能跑,就以为模型已经可以无缝替换:

response = model.invoke("你好")

这其实只是最浅层的兼容。

真正做业务时,要关注模型能力矩阵:

能力 为什么重要
上下文长度 决定能放多少历史对话、检索片段和工具结果
工具调用 决定 Agent 能否稳定调用外部函数
结构化输出 决定能否稳定返回 JSON / Schema
多模态 决定是否能处理图片、音频、视频
推理能力 决定复杂任务、代码任务、规划任务效果
中文能力 决定中文业务场景体验
延迟 决定用户等待时间
价格 决定大规模调用成本
稳定性 决定生产可用性

所以,LangChain 的统一接口解决的是“怎么调用”,不是“所有模型效果一样”。

一个模型能不能替换另一个模型,要用真实任务评估,而不是只跑一句 hello

常见误区一:以为换模型只要改模型名

从代码表面看,似乎只要改这里:

model = init_chat_model("openai:gpt-4o-mini")

变成:

model = init_chat_model("anthropic:claude-3-5-haiku-latest")

就完成迁移了。

但真正要检查:

  • 依赖包是否安装。
  • API Key 是否配置。
  • 模型名是否有效。
  • 参数是否被目标供应商支持。
  • 输出格式是否一致。
  • 工具调用是否一致。
  • 流式输出是否一致。
  • 错误类型和重试行为是否符合预期。

对于简单文本生成,迁移可能确实很顺滑。对于 Agent、结构化输出、多模态和工具调用,必须认真验证。

常见误区二:把 provider 和 model 写混

错误写法:

model = init_chat_model(
    "openai",
    model_provider="gpt-4o-mini",
)

正确写法:

model = init_chat_model(
    "gpt-4o-mini",
    model_provider="openai",
)

或者:

model = init_chat_model("openai:gpt-4o-mini")

记住:

  • model_provider 写供应商。
  • 第一个参数写模型名。
  • 冒号写法中,冒号前面是供应商,后面是模型名。

常见误区三:忘记安装供应商集成包

如果你写:

model = init_chat_model(
    "claude-3-5-haiku-latest",
    model_provider="anthropic",
)

但没有安装:

pip install -U langchain-anthropic

就可能遇到导入错误或找不到集成的问题。

排查顺序:

python -m pip list
python -m pip show langchain-anthropic
python -m pip install -U langchain-anthropic

如果你用的是虚拟环境,确认 pippython 属于同一个环境:

python -c "import sys; print(sys.executable)"
python -m pip --version

常见误区四:本地 Ollama 没启动

Ollama 不是只安装 Python 包就能用。

你还需要:

  1. 安装 Ollama。
  2. 启动 Ollama 服务。
  3. 拉取本地模型。
  4. 确认模型名正确。

例如:

ollama pull llama3.1
ollama list

如果模型不存在:

init_chat_model("llama3.1", model_provider="ollama")

就会调用失败。

如果服务没有启动,也会连接失败。

常见误区五:参数在不同供应商间不完全通用

temperaturemax_tokenstimeout 这类参数相对通用,但并不意味着所有供应商都完全一致。

例如:

  • 有些模型不支持某个采样参数。
  • 有些供应商对 max_tokens 的字段名和语义不同。
  • 有些模型不支持 tool calling。
  • 有些模型不支持 JSON schema 级别的结构化输出。
  • 有些本地模型对流式输出支持不稳定。

因此,通用参数适合放在公共配置里,供应商特有参数最好单独处理。

示例:

def build_model(provider: str, model_name: str):
    common_kwargs = {
        "temperature": 0,
        "timeout": 60,
        "max_retries": 3,
    }

    if provider == "openai":
        return init_chat_model(
            model_name,
            model_provider="openai",
            **common_kwargs,
        )

    if provider == "ollama":
        return init_chat_model(
            model_name,
            model_provider="ollama",
            **common_kwargs,
        )

    return init_chat_model(
        model_name,
        model_provider=provider,
        **common_kwargs,
    )

后面如果要给 OpenAI 或 Ollama 加供应商特有参数,可以放到对应分支里,而不是污染所有模型。

实战封装:一个可切换模型的小 Demo

下面给出一个完整 Demo。

目录结构:

model-switch-demo/
  .env
  main.py
  model_factory.py

.env

LLM_PROVIDER=openai
LLM_MODEL=gpt-4o-mini
OPENAI_API_KEY=sk-xxxx
ANTHROPIC_API_KEY=sk-ant-xxxx
DEEPSEEK_API_KEY=sk-xxxx

model_factory.py

from langchain.chat_models import init_chat_model


def build_chat_model(
    provider: str,
    model_name: str,
    temperature: float = 0,
    timeout: int = 60,
    max_retries: int = 3,
):
    return init_chat_model(
        model_name,
        model_provider=provider,
        temperature=temperature,
        timeout=timeout,
        max_retries=max_retries,
    )

main.py

import os

from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

from model_factory import build_chat_model

load_dotenv()

provider = os.getenv("LLM_PROVIDER", "openai")
model_name = os.getenv("LLM_MODEL", "gpt-4o-mini")

model = build_chat_model(
    provider=provider,
    model_name=model_name,
    temperature=0,
)

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个严谨的 LangChain 技术导师,回答要准确、简洁。"),
    ("human", "请用三句话解释:{topic}"),
])

chain = prompt | model | StrOutputParser()

result = chain.invoke({"topic": "为什么 LangChain 要抽象模型层"})

print(f"Provider: {provider}")
print(f"Model: {model_name}")
print(result)

运行:

python main.py

切换模型时,只改 .env

LLM_PROVIDER=deepseek
LLM_MODEL=deepseek-chat

或者:

LLM_PROVIDER=ollama
LLM_MODEL=llama3.1

这就是“业务代码不动,只切模型配置”的基本形态。

生产建议:模型层应该怎么设计?

如果只是学习 Demo,直接写 init_chat_model 没问题。

但生产项目建议至少做到以下几点。

建议一:模型配置集中管理

不要在多个业务文件里散落模型名:

init_chat_model("gpt-4o-mini", model_provider="openai")

建议集中到:

  • .env
  • YAML / TOML 配置文件
  • 配置中心
  • 数据库租户配置

这样灰度、回滚、A/B 测试都会更容易。

建议二:记录每次调用的模型信息

日志中至少记录:

  • provider
  • model_name
  • temperature
  • timeout
  • max_retries
  • latency
  • error_type
  • token_usage,如果供应商返回

没有这些信息,线上排查会很痛苦。

建议三:模型切换要有评估集

不要凭主观感觉切模型。

至少准备一批真实业务问题,比较:

  • 正确率。
  • 格式稳定性。
  • 响应延迟。
  • token 成本。
  • 工具调用成功率。
  • 用户可接受程度。

模型切换是工程行为,不是只改一行配置。

建议四:区分任务模型和聊天模型

同一个系统里可以有多个模型:

  • chat_model:负责面向用户对话。
  • classifier_model:负责意图分类。
  • extractor_model:负责结构化抽取。
  • reasoning_model:负责复杂推理。
  • fallback_model:负责兜底。

不要默认“一个模型包打天下”。很多时候,小模型处理简单任务更快、更便宜、更稳定。

总结

本文从 init_chat_model 出发,拆解了 LangChain 模型层的核心用法。

如果只记住一句话:

LangChain 模型层的价值,是把不同供应商的调用方式统一成相对稳定的 ChatModel 接口,让业务代码可以更容易地切换、组合和治理模型。

再具体一点:

  • Provider 是模型供应商,例如 OpenAI、Anthropic、DeepSeek、Ollama。
  • Package 是 LangChain 对应供应商的集成包,例如 langchain-openai
  • Model Name 是具体模型名,通常由供应商定义,并透传给供应商 API。
  • init_chat_model 是初始化聊天模型的统一入口之一。
  • invoke 适合普通同步调用。
  • stream 适合聊天和长文本生成。
  • batch 适合批量处理独立输入。
  • AIMessage 不只是字符串,里面可能包含工具调用、元数据和 token 信息。
  • 代码层面能切模型,不代表效果层面可以无脑替换。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐