LangChain 聊天模型核心能力 [ 1 ]

张开发
2026/4/4 18:38:43 15 分钟阅读
LangChain 聊天模型核心能力 [ 1 ]
定义聊天模型大语言模型LLM在各种与语言相关的任务例如文本生成、翻译、摘要、问答等中表现出色。现代 LLM 通常通过聊天模型接口访问该接口将消息列表作为输入并返回消息作为输出而不是使用纯文本。这里需要注意LLM 与 LangChain 中 聊天模型 的关系在 LangChain 的官方文档中认为 LLM 大多数是纯文本补全模型。这些纯文本模型封装的 API 接受一个字符串提示作为输入并输出一个字符串补全结果实际上 LLM 还包括多模态输入。OpenAI 的 GPT-5 就是作为 LLM 来实现的。LangChain 中的聊天模型通常由 LLM 提供支持但经过专门调整以用于对话。关键在于它们不是接受单个字符串作为输入而是接受聊天消息列表【message [...]】并返回一条 AI 消息作为输出。通过 API 定义聊天模型方式 1ChatOpenAIChatOpenAI定义聊天模型在快速上手模块中已经涉及。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_keyOpenAI API 密钥。如果未传入将从环境变量中读取OPENAI_API_KEY。base_urlAPI 请求的基本 URL。organizationOpenAI 组织 ID。如果未传入将从 env varOPENAI_ORG_ID中读取。............示例:from langchain_openai import ChatOpenAI model ChatOpenAI( modelgpt-5-mini, temperature0, max_tokensNone, timeoutNone, max_retries2, # 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_urlhttps://api.deepseek.com/v1, openai_api_keyOPENAI_API_KEY, modeldeepseek-chat, # ... )参数说明:base_url出于与 OpenAI 兼容考虑要将base_url设置为https://api.deepseek.com/v1来使用但注意此处v1与模型版本无关。openai_api_key需要单独申请 DeepSeek 的 API Key然后重新进行环境变量配置。DeepSeek API Key 申请地址: https://platform.deepseek.com/api_keys。invoke () 调用介绍 方式 2 之前需要先来了解一下关于 Runnable 接口中的.invoke()调用。该方法是将单个输入转换为对应的输出。例如对于聊天模型来说就是根据用户的问题输入输出相应的答案。invoke()方法定义:# 导入抽象方法装饰器用于定义必须被子类实现的抽象方法 from abc import abstractmethod # 导入 Any 类型注解表示任意类型 from typing import Any # ------------------------------ # 抽象方法invoke # 作用定义一个**必须由子类实现**的核心执行入口 # 常用于 LangChain / Runnable / 工作流引擎 等框架 # ------------------------------ abstractmethod # 装饰器标记该方法为抽象方法子类必须重写否则实例化报错 def invoke( # 参数1运行时配置 # RunnableConfig | None类型可以是 RunnableConfig 或 NoneUnion 类型 # None默认值为 None调用时可省略该参数 config: RunnableConfig | None None, # 参数2可变关键字参数 # **kwargs接收任意数量的关键字参数keyvalue # : 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_modelChatOpenAI用于明确创建 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_provideropenai) *, # 可选参数模型提供商比如 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-openaianthropic-langchain-anthropicgoogle_genai-langchain-google-genaiollama-langchain-ollamadeepseek-langchain-deepseek如果未指定将尝试从模型推断model_provider。configurable_fields设置哪些模型参数是可配置的。若配置为:1. None: 没有可配置的字段。2. any: 所有字段都是可配置的类似api_key、base_url等可以在运行时更改。3. Union[list[str], Tuple[str, ...]]: 指定的字段是可配置的。config_prefix1. 配置为非空字符串则模型将在运行时通过查找{config_prefix}[param]字段设置配置项。2. 设置为空字符串那么模型将可以通过config[configurable][param]字段设置配置项。temperature采样温度温度值越高AI 回答越天马行空温度越低回答越保守靠谱。max_tokens要生成的最大令牌数timeout请求超时时间max_retries最大重试次数openai_api_key / api_keyOpenAI API 密钥。如果未传入将从环境变量中读取OPENAI_API_KEY。base_urlAPI 请求的基本 URL。............init_chat_model()函数返回一个与指定的model_name和model_provider相对应的BaseChatModel如ChatOpenAIChatAnthropic等。注意要是模型可配置则返回一个聊天模型模拟器该模拟器在传入配置后于运行时才会初始化底层模型。【对应上面的RunnableConfig】示例 1基本用法使用不同的模型提供方需要安装为其各自包与设置各自的 API Key 环境变量例如:OpenAI 环境变量配置为:OPENAI_API_KEYyour_openai_api_key安装命令:pip install -U langchain-openaiAnthropic 环境变量配置为:ANTHROPIC_API_KEYyour_anthropic_api_key安装命令:pip install -U langchain-anthropicDeepSeek 环境变量配置为:DEEPSEEK_API_KEYyour_deepseek_api_key安装命令:pip install -U langchain-deepseekGoogle VertexAI 环境变量配置为:GOOGLE_API_KEYyour_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_provideropenai, temperature0) # deepseek_model: deepseek-chatmodel 实例 deepseek_model init_chat_model(deepseek-chat, model_providerdeepseek, temperature0) # 由于所有模型集成都实现了ChatModel接口因此可以以相同的方式使用它们。 print(gpt-5-mini: model.invoke(whats your name).content \n) print(deepseek-chat: deepseek_model.invoke(whats your name).content \n)输出:gpt-5-mini: Im called ChatGPT. How can I assist you today? deepseek-chat: Im DeepSeek chat! You can call me DeepSeek or just Chat if youd like. Im 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(temperature0) # 动态修改配置初始化模型并调用 configurable_result_1 configurable_model_1.invoke( whats your name!, config{configurable: {model: gpt-5-mini}} ) print(configurable1: configurable_result_1.content \n)这段代码的核心是先创建一个「未绑定具体模型、仅带默认参数的可配置模板」在真正调用invoke时才通过config动态指定模型并覆盖配置整个过程是延迟初始化 运行时动态绑定模型的流程。具体来说init_chat_model(temperature0)只设置默认参数如温度 0不指定具体 model返回的不是一个固定模型实例而是一个支持运行时配置的 Runnable 模板调用.invoke(问题, config{configurable: {model: gpt-5-mini}})时LangChain 会读取config里的model动态创建 / 切换到对应模型并合并默认参数与运行时配置最后用指定的gpt-5-mini执行推理返回结果实现同一个模板对象每次调用可换不同模型的效果。输出:configurable1: Im called ChatGPT. How can I assist you today?示例 3具有默认值的可配置模型# 可配置模型模拟器 2 configurable_model_2 init_chat_model( modelgpt-5-mini, temperature0.5, configurable_fields(model, model_provider, temperature, max_tokens), config_prefixfirst, ) # 动态修改配置初始化模型并调用 configurable_result_2 configurable_model_2.invoke( whats 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 动态覆盖允许修改的参数整个过程是默认配置 运行时安全覆盖的流程。具体来说init_chat_model(...)先指定默认模型 gpt-5-mini、默认温度 0.5同时通过configurable_fields明确只允许运行时修改model、model_provider、temperature、max_tokens这 4 个参数并通过config_prefixfirst给配置加前缀做隔离返回的是一个受严格约束、可安全动态配置的 Runnable 模板调用.invoke(..., config{configurable: {first.model: ..., first.temperature: ..., first.max_tokens: ...}})时LangChain 会读取带前缀的配置项只覆盖声明过允许修改的字段合并默认参数与运行时配置最后用覆盖后的配置deepseek-chat、温度 0.0、max_tokens100执行推理返回结果实现同一个模板对象、安全可控地动态修改参数的效果。输出:configurable2: My name is DeepSeek chat! Im here to help you with any questions or topics youre curious about. How can I assist you today?第一个写法configurable_model_1是极简、无预设、自动全开的动态模型你只给了默认temperature0没有指定configurable_fields和config_prefix所以它默认允许你在 invoke 时直接覆盖 model 等核心参数且不需要加前缀直接用{model: xxx}就能改而第二个写法configurable_model_2是完整、严格、带前缀、手动限定的动态模型你不仅提前指定了默认模型gpt-5-mini、默认温度0.5还通过configurable_fields明确只允许覆盖指定的 4 个参数并通过config_prefixfirst强制覆盖时必须使用带前缀的键如first.model目的是实现参数隔离、避免多模型配置冲突比第一种更规范、更安全、更适合正式项目使用。通过本地部署的 LLM 定义聊天模型ChatOllama若想使用 ChatOllama需要先安装 Ollama 包pip install -U langchain-ollamaclass langchain_ollama.chat_models.base.ChatOllama是 LangChain 为通过 Ollama 部署的聊天模型提供的具体实现类。ChatOllama同样也实现了标准的 Runnable 接口。ChatOllama 常用初始化参数说明参数名参数描述model要使用的 Ollama 模型的名称temperature采样温度温度值越高AI 回答越天马行空温度越低回答越保守靠谱。timeout请求超时时间base_urlAPI 请求的基本 URL。num_ctx设置用于生成下一个令牌的上下文窗口的大小。默认值2048num_gpu要使用的 GPU 数量。在 macOS 上默认为 1 表示启用金属支持默认为 0 表示禁用。............示例:from langchain_ollama import ChatOllama ollama_uchat ChatOllama(modeldeepseek-r1:70b, base_urlhttp://192.168.100.212:11434) result ollama_uchat.invoke(whats 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}} idrun-7f3467a07dc9a17e-0

更多文章