news 2026/10/12 2:02:58

Langchain01_框架之模型的创建与调用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Langchain01_框架之模型的创建与调用

模型创建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, ) -> AIMessage

config参数:允许在调用模型时,动态地配置和控制模型的行为,而无需在初始化时就固定所有参数,这为应用带来了极大的灵活性和可维护性。

config中支持配置的参数如下:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 2:00:42

PyQt5嵌入matplotlib实现三维曲面图:从环境搭建到交互优化全指南

简介:一份基于Python PyQt5的三维曲面图绘制项目源码,面向从事科学可视化或桌面GUI开发的Python工程师,解决在PyQt5应用中集成三维渲染与用户交互的核心问题。压缩包共36个文件,包含4个Python脚本、2个UI界面文件、2组C头文件与实…

作者头像 李华
网站建设 2026/10/12 1:58:51

P2PKH 交易详解:比特币公钥哈希支付的技术原理与实战

示例工程区块链 【免费下载链接】Dapp-Learning Dapp learning project for developers at all stages. Becoming and cultivating sovereign individuals. Nonprofit organization. 项目地址: https://gitcode.com/gh_mirrors/da/Dapp-Learning 点击查看 免费下载 …

作者头像 李华
网站建设 2026/10/12 1:58:31

UFS 3.1 UniPro协议精讲:传输层、网络层与错误恢复机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/12 1:58:22

Page Assist:让本地大模型成为你的浏览器阅读助手

简介:Page Assist是一款面向Chrome浏览器的本地化AI辅助插件,适合需要在浏览器中快速调用大模型、管理对话与侧边栏操作的用户。压缩包内含完整可部署的插件源码与资源,安装时开启开发者模式后拖拽即可加载。包体共95个文件、约6MB&#xff0…

作者头像 李华