前言

作为 LangChain 生态的核心组件,聊天模型是连接大语言模型(LLM)与实际应用的桥梁。与传统纯文本补全模型不同,LangChain 中的聊天模型专门优化了对话交互能力,通过标准化的消息格式实现灵活调用,支持多模型切换、结构化输出、流式交互等高级功能。本文严格基于 LangChain 官方课件,结合实战代码与进阶知识点,带你从基础定义到核心能力,全面掌握聊天模型的使用方法。

一、核心定义:LangChain 中的聊天模型是什么?

在 LangChain 的设计体系中,聊天模型和 LLM(大语言模型)是「特殊与一般」的关系,其核心定位是「对话优化的 LLM 封装」:

  • LLM:多数指纯文本补全模型,接受单个字符串提示作为输入,输出字符串补全结果(部分支持多模态);
  • 聊天模型:由 LLM 提供底层支持,但经过对话场景优化,输入是消息列表(包含系统提示、用户提问、历史对话等),输出是 AI 消息对象,而非纯文本。

这种设计的核心优势在于:支持多轮对话上下文管理、角色边界清晰、输出格式标准化,能无缝适配复杂交互场景。

关键基础:标准化消息格式

聊天模型的核心输入是「消息列表」,LangChain 统一了三种核心消息类型,覆盖所有对话场景:

  • SystemMessage:系统角色消息,作为第一条消息传入,用于定义 AI 的行为准则(如 "你是专业翻译助手,回复简洁准确");
  • HumanMessage:用户角色消息,承载用户的查询、指令等输入内容;
  • AIMessage:AI 角色消息,聊天模型的输出结果,包含回答内容及元数据(如 Token 使用量、模型版本)。

所有消息类型均基于 LangChain 的Runnable接口实现,确保与框架其他组件(提示模板、记忆模块、工具)无缝兼容。

二、基础实现:三种核心定义方式

LangChain 提供了三种主流的聊天模型定义方式,分别适配「固定模型调用」「动态模型切换」「本地模型部署」场景,下面结合代码详细说明。

方式 1:直接定义特定模型(ChatOpenAI 类)

适合明确知道要使用的模型(如 OpenAI、DeepSeek),需手动指定模型名称、API 密钥、基础地址等参数,直观易懂,是入门首选。

调用模型的核心参数说明(通用标准化参数)
参数名 作用 示例
model 模型名称(需与服务商一致) "deepseek-chat"、"gpt-4o-mini"
api_key 模型服务商的身份凭证 "sk-xxx"(DeepSeek/OpenAI 密钥)
base_url API 请求基础地址(非 OpenAI 模型必需) DeepSeek 地址:"https://api.deepseek.com/v1"
temperature 采样温度(0-1):值越高越灵活,越低越严谨 0.3(保守)、0.8(创意)
max_tokens 生成的最大 Token 数(控制输出长度) 100、1024
timeout 请求超时时间(秒) 30(避免无限等待)
max_retries 请求失败后的重试次数 2
实战代码:调用 DeepSeek 聊天模型
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI

# 1. 定义DeepSeek聊天模型
model = ChatOpenAI(
    model="deepseek-chat",  # 模型名称(DeepSeek通用对话模型)
    api_key="sk-a5b3406086ec4c89832442954c60f210",  # 你的API密钥
    base_url="https://api.deepseek.com/v1",  # DeepSeek固定API地址
    temperature=0.3,  # 严谨模式,减少随机性
    max_tokens=100,  # 限制输出长度(100字以内)
    timeout=30,  # 30秒超时
    max_retries=2  # 失败重试2次
)

# 2. 定义消息列表(系统提示+用户输入)
messages = [
    SystemMessage(content="请补全一段故事,100个字以内,风格温馨治愈"),
    HumanMessage(content="一只猫正在__?")
]

# 3. 调用模型并输出结果
result = model.invoke(messages)
print("模型输出内容:", result.content)
print("输出元数据:", result.response_metadata)  # 包含Token使用量、模型版本等
输出对象说明

模型返回AIMessage对象,核心属性包括:

  • content:AI 的回答文本(核心关注内容);
  • response_metadata:响应元数据(Token 使用量、模型名称、请求 ID,用于调试);
  • usage_metadata:资源消耗统计(输入 / 输出 Token 数,用于成本核算)。

方式 2:灵活配置模型(init_chat_model 工厂函数)

init_chat_model是 LangChain 提供的高阶工厂函数,支持动态切换不同服务商的模型,无需修改核心调用逻辑,灵活性更强,是重点推荐的进阶用法。

核心优势
  1. 多模型统一接口:无论调用 OpenAI 还是 DeepSeek,调用方式完全一致;
  2. 动态配置能力:可在invoke时通过config参数修改模型、温度等参数;
  3. 简化配置:自动读取环境变量中的 API 密钥,无需硬编码。(提前在系统变量中保存)
实战场景 1:固定模型基本用法
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
import os

# 自动读取环境变量中的密钥(推荐做法)
os.environ["DEEPSEEK_API_KEY"] = "sk-xxx"
os.environ["OPENAI_API_KEY"] = "sk-xxx"

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

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

# 3. 统一调用方式
print("GPT-4o-mini回答:", gpt_model.invoke("你是谁?").content)
print("DeepSeek回答:", deepseek_model.invoke("你是谁?").content)
实战场景 2:动态切换模型(可配置模型模拟器)

适合测试不同模型效果、根据任务类型动态选择模型的场景:

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

# 1. 定义可配置模型(仅设置默认参数,不指定具体模型)
config_model = init_chat_model(temperature=0.3)

# 2. 定义消息
messages = [
    SystemMessage(content="请补全一段故事,100个字以内"),
    HumanMessage(content="一只猫正在__?")
]

# 3. 调用时动态指定模型(通过config参数)
# 切换为DeepSeek模型
result_deepseek = config_model.invoke(
    messages,
    config={"configurable": {"model": "deepseek-chat", "model_provider": "deepseek"}}
)

# 切换为GPT-4o-mini模型
result_gpt = config_model.invoke(
    messages,
    config={"configurable": {"model": "gpt-4o-mini", "model_provider": "openai"}}
)

print("DeepSeek补全:", result_deepseek.content)
print("GPT-4o-mini补全:", result_gpt.content)
实战场景 3:带默认参数的可配置模型

通过configurable_fields指定允许动态修改的参数config_prefix避免参数冲突:

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

# 1. 定义可配置模型(指定默认模型和可修改字段)
model = init_chat_model(
    model="gpt-4o-mini",  # 默认模型
    model_provider="openai",  # 默认服务商
    temperature=0.3,  # 默认温度
    max_tokens=1024,  # 默认最大Token数
    configurable_fields=("max_tokens", "model", "model_provider"),  # 允许动态修改的字段
    config_prefix="first"  # 参数前缀(避免冲突)
)

# 2. 定义消息
messages = [
    SystemMessage(content="请补全一段故事,100个字以内:"),
    HumanMessage(content="一只猫正在__?")
]

# 3. 调用时修改参数(动态切换为DeepSeek+限制输出为10Token)
result = model.invoke(
    messages,
    config={
        "configurable": {
            "first_max_tokens": 10,  # 前缀+字段名的命名规则
            "first_model": "deepseek-chat",
            "first_model_provider": "deepseek"
        }
    }
)

print(result.content)  # 输出限制在10Token以内

方式 3:调用本地部署模型(ChatOllama 类)

不想依赖云端 API 时,可通过 Ollama 部署本地模型(如 DeepSeek-R1、Llama 等),LangChain 提供ChatOllama类无缝支持:

from langchain_ollama import ChatOllama

# 1. 定义本地Ollama部署的DeepSeek模型
ollama_model = ChatOllama(
    model="deepseek-r1:1.5b",  # 本地模型名称(需提前通过Ollama拉取)
    base_url="http://127.0.0.1:11434"  # Ollama默认本地地址
)

# 2. 调用模型
result = ollama_model.invoke("你是谁?")
print("本地模型回答:", result.content)

三、关键概念澄清与避坑指南

1. 聊天模型 vs LLM(纯文本模型)

对比维度 聊天模型 LLM(纯文本模型)
输入格式 消息列表(System/Human/AIMessage) 单个字符串提示
输出格式 AIMessage 对象(带元数据) 纯文本字符串
适用场景 对话交互、多轮聊天、工具调用 文本补全、摘要生成、代码生成
LangChain 实现 ChatOpenAI、ChatOllama、init_chat_model OpenAI、DeepSeekLLM

2. 环境变量配置(安全最佳实践)

硬编码 API 密钥存在安全风险,推荐配置系统环境变量,LangChain 会自动读取:

  • Windows:「系统属性→环境变量」添加OPENAI_API_KEY(OpenAI)、DEEPSEEK_API_KEY(DeepSeek);
  • macOS/Linux:终端执行export DEEPSEEK_API_KEY="sk-xxx"
  • 代码中无需手动传入api_key,模型会自动从环境变量读取。

3. 常见错误排查(可结合AI查错)

  • Authentication Error:API 密钥无效或环境变量未配置,检查密钥正确性和环境变量读取;
  • API Connection Errorbase_url错误(DeepSeek 固定为 "https://api.deepseek.com/v1")
  • Token Limit Exceededmax_tokens设置过小,或对话历史过长,需调整参数或使用记忆压缩;
  • INVALID_CHAT_HISTORY:消息列表格式错误(如 AIMessage 的 tool_calls 无对应 ToolMessage),检查消息结构完整性;
  • configurable拼写错误:常见configrableconfigurable,导致动态参数失效。

四、总结

LangChain 聊天模型的核心价值在于「标准化接口 + 灵活扩展能力」,关键要点总结如下:

  1. 本质是「对话优化的 LLM 封装」,输入为消息列表,输出为 AIMessage 对象
  2. 三种基础定义方式:ChatOpenAI(固定模型)、init_chat_model(动态切换)、ChatOllama(本地部署);
  3. 四大进阶能力:结构化输出(数据格式化)、流式 / 批量调用(性能优化)、对话记忆(多轮交互)、工具调用(外部扩展);
  4. 遵循「环境变量存密钥、标准化参数配置、组件化集成」的最佳实践。

掌握聊天模型是 LangChain 开发的基础,后续的智能代理(Agent)、复杂工作流编排等高级功能,均基于此扩展。

下一遍文章单独讲解四大进阶能力:结构化输出(数据格式化)、流式 / 批量调用(性能优化)、对话记忆(多轮交互)、工具调用(外部扩展);

Logo

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

更多推荐