定义聊天模型

大语言模型(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,然后重新进行环境变量配置。


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

模型提供方。支持的 model_provider 值和相应的集成包有:

openai -> langchain-openai

anthropic -> langchain-anthropic

google_genai -> langchain-google-genai

ollama -> langchain-ollama

deepseek -> langchain-deepseek

如果未指定,将尝试从模型推断 model_provider

configurable_fields

设置哪些模型参数是可配置的。若配置为:

1. None: 没有可配置的字段。

2. "any": 所有字段都是可配置的,类似 api_keybase_url 等可以在运行时更改。

3. Union[list[str], Tuple[str, ...]]: 指定的字段是可配置的。

config_prefix

1. 配置为非空字符串,则模型将在运行时通过查找 {"config_prefix"}[param] 字段设置配置项。

2. 设置为空字符串,那么模型将可以通过 config["configurable"]["param"] 字段设置配置项。

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_namemodel_provider 相对应的 BaseChatModel(如 ChatOpenAIChatAnthropic 等)。

注意要是模型可配置,则返回一个聊天模型模拟器,该模拟器在传入配置后,于运行时才会初始化底层模型。【对应上面的 RunnableConfig


示例 1:基本用法

使用不同的模型提供方,需要安装为其各自包,与设置各自的 API Key 环境变量!例如:

OpenAI 环境变量配置为: OPENAI_API_KEY="your_openai_api_key"

安装命令: pip install -U langchain-openai

Anthropic 环境变量配置为: ANTHROPIC_API_KEY="your_anthropic_api_key"

安装命令: pip install -U langchain-anthropic

DeepSeek 环境变量配置为: DEEPSEEK_API_KEY="your_deepseek_api_key"

安装命令: pip install -U langchain-deepseek

Google 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 动态指定模型并覆盖配置整个过程是延迟初始化 + 运行时动态绑定模型的流程。

具体来说:

  1. init_chat_model(temperature=0) 只设置默认参数(如温度 = 0),不指定具体 model,返回的不是一个固定模型实例,而是一个支持运行时配置的 Runnable 模板
  2. 调用 .invoke("问题", config={"configurable": {"model": "gpt-5-mini"}}) 时,LangChain 会读取 config 里的 model动态创建 / 切换到对应模型,并合并默认参数与运行时配置;
  3. 最后用指定的 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 动态覆盖允许修改的参数,整个过程是默认配置 + 运行时安全覆盖的流程。

具体来说:

  1. init_chat_model(...) 先指定默认模型 gpt-5-mini默认温度 0.5,同时通过 configurable_fields 明确只允许运行时修改 modelmodel_providertemperaturemax_tokens 这 4 个参数,并通过 config_prefix="first" 给配置加前缀做隔离,返回的是一个受严格约束、可安全动态配置的 Runnable 模板;
  2. 调用 .invoke(..., config={"configurable": {"first.model": "...", "first.temperature": "...", "first.max_tokens": "..."}}) 时,LangChain 会读取带前缀的配置项只覆盖声明过允许修改的字段,合并默认参数运行时配置
  3. 最后用覆盖后的配置(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_fieldsconfig_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'
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐