模型创建3种方式
1.使用特定的Model Class(最直接,但不好用)
LangChain为一些大模型供应商提供了专门的Model类,导入对应的具体类(如ChatOpenAI、ChatAnthropic、ChatDeepSeek、ChatOllama、ChatHunyuan、ChatTongyi、ChatZhipuAI)并进行实例化。
官网链接:chat-models | langchain_community | LangChain Reference
用哪个大模型提供商就调哪个Model类,但是支持的Model类有限,有的提供商不支持,比如:硅基流动、CloseAI这两个平台就没有对应的Model类。
示例1:调用DeepSeek官网的DeepSeek模型
import os from dotenv import load_dotenv from langchain_deepseek import ChatDeepSeek # 1、读取.env配置文件中的信息。相关的环境变量以.env文件中的优先 load_dotenv(override=True) # 当 .env 文件中的变量与系统现有环境变量重合时,启动覆盖 DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY") DEEPSEEK_BASE_URL = os.getenv("DEEPSEEK_BASE_URL") # 2、模型的初始化 llm_deepseek = ChatDeepSeek( model="deepseek-v4-flash", api_key=DEEPSEEK_API_KEY, # 若未传入,系统将自动从环境变量 DEEPSEEK_API_KEY 中读取 api_base=DEEPSEEK_BASE_URL, # 若未传入,系统将自动从环境变量 DEEPSEEK_BASE_URL 中读取 ) # 3、模型的调用 response= llm_deepseek.invoke("请用一句话介绍你自己") print(response)2. langchain_openai.ChatOpenAI 通用
一方面,LangChain没有为所有大模型厂商提供专用接口,见Langchain大模型集成列表。如果选用的平台没有专用接口,可以通过兼容接口调用。
另一方面,专用接口的对接方式五花八门,如腾讯混元的ChatHunyuan需要单独的 APP_ID + SecretId + SecretKey ,配置繁琐,用户不友好。
为此,大多数API平台都支持OpenAI API接口规范,所以基本都可以通过 ChatOpenAI 集成。(注意:具体api_key、base_url、model还是要设置具体提供商的,具体请求参数见对应提供商官网)
示例2:使用ChatOpenAI类调硅基流动平台的模型
import os from langchain_openai import ChatOpenAI from dotenv import load_dotenv # 1、读取.env配置文件中的信息。相关的环境变量以.env文件中的优先 load_dotenv(override=True) # 硅基流动的 API Key,通常在 .env 文件中配置为 SILICONFLOW_API_KEY SILICONFLOW_API_KEY = os.getenv("SILICONFLOW_API_KEY") SILICONFLOW_BASE_URL = os.getenv("SILICONFLOW_BASE_URL") # 2、模型的初始化 llm_silicon = ChatOpenAI( # 指定硅基流动的官方 API 转发地址 base_url=SILICONFLOW_BASE_URL, # 传入硅基流动的 API Key api_key=SILICONFLOW_API_KEY, # 填入硅基流动支持的模型名称(例如 DeepSeek-V3 或 DeepSeek-R1) model="deepseek-ai/DeepSeek-V4-Flash", ) # 3、模型的调用 response = llm_silicon.invoke("请用一句话介绍你自己") print(response.content) # 使用 .content 只打印文本内容3.init_chat_model() 统一封装
基本语法:
from langchain.chat_models import init_chat_model model = init_chat_model( "provider:model_name", # 提供商:模型名称 api_key="your-api-key", # API 密钥(可选,可从环境变量读取) temperature=0.7, # 温度参数(可选) max_tokens=1000, # 最大 token 数(可选) **kwargs # 其他模型特定参数 )问题1:model_provider支持哪些provider?
model_provider 表示模型的提供者,支持的providers有:anthropic, anthropic_bedrock,
azure_ai, azure_openai, bedrockbedrock_converse, cohere,deepseek, fireworks,
google_anthropic_vertex, google_genai, google_vertexaigrog, huggingface, ibm, mistralai, nvidia,
ollama,openai,openrouter, perplexity, together, upstage, xai。
- 如果 model_provider="openai" ,会自动加载 langchain-openai 的依赖包,底层调用的是ChatOpenAI 类。
- 如果 model_provider="deepseek" ,会自动加载 langchain-deepseek 的依赖包,底层调用的是 ChatDeepSeek 类。
- 像阿里的 dashscope 尚未被LangChain官方纳入模型的统一注册体系,暂时不知道"dashscope"的提供者是谁。此时可以将model_provider设置为openai,底层将会用openai的规范处理请求,这就要求我们调用的模型服务是OpenAI Compatible的。
官方文档:Chat model integrations - Docs by LangChain
问题2:如果在model参数中没有指明模型提供者,必须在model_provider中指明?
可以在model参数中通过前缀指定模型供应商,和模型名称之间用 冒号分割 ,等价于通过
model_provider参数指定供应商。如果两个位置都没有指明供应商,LangChain底层会按照内置规则自动推断。但是,并非所有的模型都支持自动推断,如model名称 qwen-plus 不支持自动推断,没有指明供应商会报错。
示例3:使用init_chat_model()去调用DS平台的模型
from langchain.chat_models import init_chat_model import os from dotenv import load_dotenv # 加载配置文件 load_dotenv(override=True) DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY") DEEPSEEK_BASE_URL = os.getenv("DEEPSEEK_BASE_URL") # 获取大模型 model = init_chat_model( # model="deepseek-v4-flash", # model_provider="deepseek", # 或者 model="deepseek:deepseek-v4-flash", api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL, ) print(model.invoke("一句话介绍下你自己"))示例4:使用init_chat_model()去调用阿里云百炼平台的模型
from langchain.chat_models import init_chat_model import os from dotenv import load_dotenv # 加载配置文件 load_dotenv(override=True) DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY") DASHSCOPE_BASE_URL = os.getenv("DASHSCOPE_BASE_URL") # 获取大模型 model = init_chat_model( # model="tongyi:deepseek-v4-flash", model="openai:deepseek-v4-flash", # 提供者换成openai就行了,兼用 api_key=DASHSCOPE_API_KEY, base_url=DASHSCOPE_BASE_URL, ) print(model.invoke("一句话介绍下你自己"))问题:init_chat_model 和直接使用 ChatTongyi、ChatOpenAI、ChatDeepSeek有什么区别?
回答:init_chat_model 是 LangChain 1.0 的统一接口,优势包括:
统一接口:无需记住每个提供商的不同初始化方式(以一致的方式初始化)
易于切换:简化了智能体系统中模型切换策略(只需修改模型字符串)
简洁明了:更简洁的语法,减少样板代码
自动适配:内部根据模型标识自动选择对应的驱动类(ChatOpenAI、ChatDeepSeek)
图示:
在LangChain中,Model Class和init_chat_model初始化模型共同的参数及解释,常用参数:
API文档:https://docs.langchain.org.cn/oss/python/langchain/models#parameters
模型调用3种同步调用+3种异步调用方式
invoke() :阻塞式,一次性返回完整结果问答、批处理任务、无需实时反馈的场景。
ainvoke() :非阻塞式,提高系统吞吐量高并发Web应用、IO密集型任务。
stream() :流式输出,实时返回每个token聊天机器人、长文本生成、需要提升用户体验的交互
应用。
asteam() :非阻塞式,提高系统吞吐量高并发Web应用、IO密集型任务。
batch() :批量处理多个输入高并发场景,需要同时处理大量请求。
abatch() :非阻塞式,提高系统吞吐量高并发Web应用、IO密集型任务。
1、invoke()
invoke 方法的作用就是:
1. 接收你的输入(问题、指令、对话历史等)
2. 发送给 LLM 模型(如 GPT-4、Llama、Claude 等)
3. 返回模型的响应(文本回复 + 元数据信息)
输入参数详解
输入参数支持三种形式的输入: 文本输入 、 字典列表 、 消息对象列表 。
其中字典列表(推荐,最灵活)
创建字典列表组成消息。一条消息通常包含 role(角色) 、 content(内容) 等信息。
消息对象列表,使用内置的消息类(如 SystemMessage, HumanMessage, AIMessage),将消息对象列表输入模型。
返回值详解
invoke 返回一个 AIMessage对象 ,源码如下:
def invoke( self, input: LanguageModelInput, config: RunnableConfig | None = None, *, stop: list[str] | None = None, **kwargs: Any, ) -> AIMessage:AIMessage中包含丰富的信息,为例说明如下:
1. 核心内容与基本信息
- content : 模型生成的文本回答。这是你最关心的核心输出。
- id : 本次运行在 LangChain 内部生成的唯一标识符(Run ID)。
- additional_kwargs : 包含特定供应商的额外参数。
- refusal : 如果模型拒绝回答(涉及敏感政策),此处会显示拒绝原因。
2. 消耗统计 (Token Usage)
这部分决定了你这一行输入操作花了多少钱:
- prompt_tokens / input_tokens : 输入 Token 数。你发送给模型的问题长度。
- completion_tokens / output_tokens : 输出 Token 数。模型回答生成的长度。
- total_tokens : 总消耗。 两者之和。
- reasoning_tokens : 推理 Token 数。 如果是 O1/O3 等推理模型,这里会显示它在“思考”时消耗的 Token。
- cached_tokens : 缓存命中的 Token 数。重复提问时,如果命中了模型商的缓存,这部分费用通常更低。
3. 响应元数据 (Response Metadata)
这部分是 API 返回的原始详细信息:
- model_name : 实际调用的模型具体版本(如 gpt-5.4-mini )。
- model_provider : 模型供应商(如 openai )。
- finish_reason : 生成停止的原因。
- stop : 正常回答结束。
- length : 达到最大 Token 限制被截断。
- system_fingerprint : 系统指纹,用于追踪模型后端的配置变更。
4. 性能与延迟 (Latency Checkpoint)
这是针对 API 响应速度的深度拆解(单位通常为毫秒 ms):
- total_duration_ms : 总耗时。从请求发出到完全收到的总时间(259ms)。
- user_visible_ttft_ms : 首字到达时间。用户看到第一个字跳出来等待的时间(194ms),这是体感快慢的关键。
- engine_ttft_ms : 引擎层面的首字到达时间(36ms)。
- engine_ttlt_ms : 引擎生成最后一个字的时间(100ms)。
- pre_inference_ms : 推理前处理耗时。包括安全审核、Token 化等预处理(86ms)。
- service_tbt_ms : Time Between Tokens。字与字之间生成的间隔时间,决定了打字机效果是否丝滑。
5. 工具调用信息
- tool_calls : 结构化工具调用列表。如果模型决定调用某个 Python 函数或搜索工具,参数会在这里。
- invalid_tool_calls : 格式错误的工具调用尝试。
2、stream()
invoke 和 stream 有什么区别?
- invoke() :同步调用,在模型输出完成后一次性获取响应,对于输出文本很长的场景,用户体验不好。
- stream() :流式调用,实时返回响应片段。调用后,返回一个 迭代器(iterator) ,可以通过循环来实时处理每一个新生成的chunk内容块。
注意:流式输出依赖于模型供应商对于流式输出的支持
3、batch()
batch() 方法允许你一次性 发送一组请求 (含多条独立请求),模型会在后台 并行处理 ,然后返回所有结果的列表 。与逐个顺序调用(invoke)相比,能大幅 减少网络往返开销 和 等待时间 ,显著提升性能、降低成本。默认一次性接收所有的响应(不按照顺序)
batch_as_completed()允许应用在收到第一个结果后立即返回响应,而不会等待批次内所有任务完成才响应。即batch_as_completed() 每个请求完成后立即 yield 结果, 结果可能乱序 。
但是,每个返回的响应都被放在一个 元组 中,元组的第一个元素是原始输入的 index 索引,可根据索引重新排序。
异步调用ainvoke()、astream()、abatch()
异步调用复习见:Python异步编程入门案例-CSDN博客
在LangChain框架中,异步方法(ainvoke、astream、abatch)与它们的同步版本(invoke、
stream、batch)相比,具备如下特点:
- 避免阻塞主线程 :同步调用会阻塞程序执行,而异步方法让应用程序在等待API响应时保持响应性。
- 优化资源利用 :异步操作可以更高效地利用系统资源,减少空闲等待时间
扩展内容
1、模型配置信息profile
LangChain1.1及更高版本可以通过profile属性查看模型的配置信息。这是LangChain针对模型的能力画像,但是否存在,取决于LangChain在集成模型厂商的服务时是否声明了能力画像。
2、模型初始化参数
官方文档和源码注释没有给出完整的参数列表。以ChatDeepSeek类为例,其参数可以由 自身定义 或 从父类BaseChatModel继承 。直接查看源码也很难拼凑完整列表。这里通过查ChatDeepSeek的类属性model_fields来获得完整参数列表。
from langchain_deepseek import ChatDeepSeek print(ChatDeepSeek.model_fields.keys())3、模型类的参数构成
以ChatDeepSeek为例,完整参数列表由如下几部分构成:
1、客户端与连接参数 (Networking)
这类参数决定了代码“怎么连到服务端”,而不是“让模型怎么生成”。
2、模型推理参数 (Model Inference)
这些是直接传递给 DeepSeek 模型 API 的参数,决定了 生成内容 的质量和风格。
3、LangChain 框架通用参数
由 LangChain 的 BaseChatModel 定义,所有其子类ChatXxx 都具备的,用于管理 LangChain 内部的逻辑(如日志、回调、元数据),仅在内部生效
4、高级与特定扩展参数
这类参数通常用于特定场景,或为了保持与 OpenAI 协议的兼容性而存在。
- 底层客户端访问: client , async_client , root_client (这些通常是内部生成的 SDK 实例,不建议在初始化时手动传参)。
- 透传参数:model_kwargs,extra_body(如果你想传递 DeepSeek API 支持但 LangChain 还没定义的参数,可以写在这里)。
- 功能开关: disable_streaming , include_response_headers (决定是否在输出中包含Header)。
- 兼容性参数: openai_organization , service_tier , store (这些多为 OpenAI 遗留参数,DeepSeek 实际使用较少)。
参数:model_kwargs
这里用于存放那些OpenAI Compatible API支持,但LangChain没有直接列出的字段,如用于支持
Function Call的 tools 字段。
参数:extra_body
这里用于存放模型厂商基于OpenAI API协议扩展的字段。
记住常见参数及用法即可,如果需要精细控制模型输出,可以查阅OpenAI和特定模型供应商的官方文档,通过 model_kwargs 或 extra_body 传递。
4、模型调用中config参数
在调用模型时(如使用 invoke(), ainvoke(), stream(),batch()等方法时),我们可以传入config参数。
def invoke( self, input: LanguageModelInput, config: RunnableConfig | None = None, *, stop: list[str] | None = None, **kwargs: Any, ) -> AIMessageconfig参数:允许在调用模型时,动态地配置和控制模型的行为,而无需在初始化时就固定所有参数,这为应用带来了极大的灵活性和可维护性。
config中支持配置的参数如下: