LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型

【用langchain_openai库调用大模型】

以下所有学习笔记示例都是在 Windows10\11平台 及 Python3.12 或以上 版本中运行验证。

LangChain 1.x 导入通义大模型,有以下几种方式,推荐优先使用 OpenAI 兼容模式,这是目前最主流且最稳定的做法。

|------------|----------------------|-------------------------------------|
| 特性 | OpenAI 兼容模式(推荐) | langchain-community |
| 废弃警告 | | |
| 额外依赖 | langchain-openai | langchain-community + dashscope |
| LCEL支持 | 完整支持 | 支持 |
| 维护状态 | 活跃 | 不再主动维护 |

若出现【mportError: cannot import name 'ContextOverflowError' from 'langchain_core.exceptions' ...)】报错:

**是因 langchain 和 langchain-core 的版本不匹配。langchain-core 版本过低,还没有包含这个类,所以导入失败。**ContextOverflowError 是 langchain-core 在较新版本【1.x】中新增的异常类,用于表示"模型上下文窗口溢出"

(即输入 token 超过模型最大限制)。升级:langchain-openai 包至1.x以上即可。

一、 方式一:OpenAI 兼容模式(强烈推荐)

通义千问兼容 OpenAI 的接口协议,可以直接用 langchain-openai 包中的 ChatOpenAI 来调用,只需修改 base_url 指向阿里云的兼容端点即可。无需安装 langchain-community,不会出现废弃警告,且完全兼容 LCEL 管道符、流式输出、异步调用等新特性。

【安装依赖】 (同时安装:langchain、langchain-openai两个相关包)

pip install langchain==1.4.0

pip install langchain-openai==1.6.1

bash 复制代码
pip install langchain==1.4.0
pip install langchain-openai==1.6.1

【*】新版 langchain-openai(≥0.3.x)对 OpenAI SDK 的参数做了更严格的映射:

extra_body 已被提升为 ChatOpenAI 的一级参数,用于向 API 透传非标准字段。

reasoning_effort 也被识别为已知参数(因为 OpenAI o1/o3 系列已支持该字段)。

【**】API 连接与认证常用参数:这些参数决定了如何连接到大模型服务。

|-----------------|-----------|----------------------------------------|
| 参数 | 类型 | 说明 |
| model | str | 模型名称 |
| api_key | str | API 密钥。也可通过环境变量 OPENAI_API_KEY 设置。 |
| base_url | str | 大模型地址。也可用于代理地址或本地部署的地址。 |
| timeout | float | 请求超时时间(秒)。默认为 600 秒。 |
| max_retries | int | API 调用失败时的最大重试次数。默认为 2。 |

【**】模型推理控制常用参数:
这些参数直接影响模型的生成行为和质量。它们通常对应 OpenAI API 的请求体字段。

|---------------------|-----------|-----------|-----------------------------------------------------|
| 参数 | 类型 | 默认值 | 说明 |
| temperature | float | 0.7 | 采样温度 (0-2)。越高越随机/有创意,越低越确定/保守。注意:o1 系列模型不支持此参数。 |
| top_p | float | 1.0 | 核采样概率阈值。与 temperature 二选一调整即可。 |
| max_tokens | int | None | 生成的最大 token 数。。 |
| n | int | 1 | 为每条 prompt 生成的候选回复数量。 |
| streaming | bool | False | 是否启用流式输出。LangChain 推荐用 .stream() 方法代替此参数。 |
| response_format | dict | None | 指定输出格式,如 {"type": "json_object"} 强制 JSON 输出。 |
| extra_body | dict | None | 传入所调用大模型API所支持的独有参数 |

【提示】:也可以通过 model_kwargs 字典传入任何上述未列出的,所调用大模型 API 却支持的参数。例如DeepSeek独有的"web_search_options"参数:

python 复制代码
# model_kwargs用于传递LangChain未能识别的其他模型参
# 这些参数会直接传递给底层API
model_kwargs={
        # 设置网络搜索选项
        "web_search_options": {
            # 设置搜索上下文大小为中等,平衡搜索广度和深度
            "search_context_size": "medium"
        }

langchain-openai 调用千问大模型--示例1:示例里面有更详细的讲解,且可直接复制运行。

python 复制代码
# 导入 os 模块,用于读取系统环境变量
import os

# 从 python-dotenv 库导入 load_dotenv 函数
# 该函数的作用是将项目根目录下 .env 文件中定义的键值对加载到系统环境变量中
from dotenv import load_dotenv

# 从 langchain_openai 库导入 ChatOpenAI 类
# 这是 LangChain 对 OpenAI 兼容 API 的封装,提供了统一的聊天模型接口
# 它内部仍然依赖 openai 库来发送实际的 HTTP 请求
from langchain_openai import ChatOpenAI

# 执行加载操作,将 .env 文件中的变量(如 API_KEY)注入到当前进程的环境变量中
# 如果 .env 文件不存在或没有对应变量,后续 os.getenv() 将返回 None
load_dotenv()

# 从环境变量中安全地获取名为 "API_KEY" 的值
# 这种写法避免了在代码中硬编码密钥,是生产环境推荐的安全实践
key = os.getenv("API_KEY")

# 定义阿里云百炼平台提供的 OpenAI 兼容接口地址
# 通义千问系列模型通过这个端点对外提供服务
url = os.getenv("ALI_URL")

# 创建 ChatOpenAI 实例,这是 LangChain 中代表一个聊天模型的核心对象
llm = ChatOpenAI(
    # 指定要使用的模型名称,这里选择通义千问的旗舰模型 qwen-max
    model="qwen3.8-max",
    
    # 传入 API 密钥,用于身份认证
    api_key=key,
    
    # 覆盖默认的 OpenAI 官方地址,将请求重定向到阿里云的兼容接口
    # 这是使用非 OpenAI 原生模型时的关键配置
    base_url=url,
    
    # 设置生成温度参数,取值范围通常为 0~2
    # 0.7 是一个平衡创造性和稳定性的常用值
    # 值越高输出越随机多样,值越低输出越确定保守
    temperature=0.7,
)

# 调用模型的 invoke 方法发送请求并获取完整响应
# invoke 是 LangChain 的统一调用接口,内部自动处理了消息格式转换、API 调用等细节
# 传入字符串时,LangChain 会自动将其包装为 HumanMessage 对象
# 与 stream=True 不同,invoke 会等待模型生成完毕后一次性返回完整结果
response = llm.invoke("你好,请简单介绍一下你自己")

# 打印响应对象的 content 属性
# response 是一个 AIMessage 对象,其 content 属性包含模型生成的文本内容
# 注意:这里直接打印的是最终回复,不包含思考过程(reasoning_content)
# 如需获取思考过程,需要使用 llm.stream() 配合 extra_body 参数
print(response.content)

二、 方式二:langchain-community(传统方式,有废弃警告)

通过 langchain-community 包导入,需要额外安装 dashscope SDK。

注意:这种方式会触发 DeprecationWarning,因为 langchain-community 已被官方标记为 sunset,不再主动维护。

【安装依赖】****(同时安装:langchain、langchain-community、dashscope三个相关包)

pip install langchain==0.3.30

pip install "langchain-community==0.3.27" #【因包里面有"-"这符号,所以包名要加冒号。】
pip install dashscope==1.27.4 # 【用通义大模型(LLM)时须安装。】

bash 复制代码
pip install langchain==0.3.30
pip install "langchain-community==0.3.27"
pip install dashscope==1.27.4

【注意事项】:若不想触发弃用警告或报错,安装的 langchain-community 要低于0.4.0版本。

【1】【通用参数 (继承自 BaseChatModel)】:

这些参数是所有聊天模型共有的,用于控制模型的基本行为。

|------------------------|-----------|-------------------------------------------------|
| 参数 | 类型 | 说明 |
| model_name / model | str | 要使用的模型名称。 |
| api_key | str | 调用模型的 API 密钥。 |
| temperature | float | 控制生成结果的随机性。值越低(如 0.1)输出越确定,值越高(如 1.0)输出越随机。 |
| max_tokens | int | 限制模型生成的最大 token 数量。 |
| top_p | float | 核采样参数。从累积概率超过 top_p 的 token 中进行选择。 |
| timeout | int | 请求超时时间。 |
| max_retries | int | 请求失败时的最大重试次数。 |
| verbose | bool | 是否打印详细的运行信息。 |

【2】【涉及调用的千问大模型相关参数】

【ChatTongyi:核心参数】

|--------------------|-----------|------------------|----------------------------------------|
| 参数 | 类型 | 默认值 | 说明 |
| api_key | str | None | 【必填】阿里云API密钥 |
| model | str | "qwen-turbo" | 【必填】模型名称(如 "qwen-plus"、"qwen-max") |
| temperature | float | 0.7 | 【可选随机性或称温度(0~1,值越低越确定) |
| max_tokens | int | 2000 | 【可选最大生成token数 |
| streaming | bool | False | 【可选是否启用流式输出 |
| timeout | int | 60 | 【可选请求超时时间(秒) |
| message_format | str | 'text' | 【可选返回文本格式 |
| verbose | bool | False | 【可选是否打印详细的运行信息。 |

【注】 ChatTongyi 类的初始化参数主要分为两类:一类是其父类 BaseChatModel 定义的通用参数,另一类是其自身特有的参数。

【3】【特有参数 (ChatTongyi 自身)】:

ChatTongyi 类特有的参数,主要用于与通义千问 API 进行认证和配置。

# # 1. dashscope_api_key: str, 可选

通义千问(DashScope)的 API Key。如果未提供,会自动从环境变量 DASHSCOPE_API_KEY 中读取。

# # 2. model_kwargs: Dictstr, Any, 可选

**一个字典,用于存放传递给通义千问 API 的其他参数。**如果你需要开启某些特定功能(如 enable_search),应该在这里进行配置,而不是使用 extra_body。

【4】为什么用 name 能跑通,用 model 却报错?

这是一个非常典型的 LangChain 框架参数映射机制引发的"隐蔽 Bug"。出现这种奇怪现象的核心原因,在于 LangChain 的 ChatTongyi 类在初始化时,对 name 和 model 这两个参数的处理逻辑完全不同。

**当使用 name='qwen3.7-plus' 时,ChatTongyi 的底层基类(BaseChatModel)会将 name 参数识别为"给这个模型实例起的别名/标识符"(用于日志追踪或区分多模型场景),而不会把它当作底层的 API 模型 ID。此时,由于你没有提供有效的模型 ID,ChatTongyi 内部会自动回退使用默认模型(通常是 qwen-turbo 或 qwen-plus 等纯文本模型)。**这些默认模型能够完美兼容你传入的 enable_search=True 等参数,所以代码运行正常。

当你使用 model='qwen3.7-plus' 时,ChatTongyi 会明确地将底层的 API 模型 ID 设置为 qwen3.7-plus。qwen3.7-plus 是一个多模态模型。当你向一个多模态模型发送请求时,如果 SDK 或底层 API 的路由处理不当,或者该模型对纯文本请求的某些参数(如 enable_search 的传递方式)有极其严格的校验,就会触发阿里云服务端的参数校验错误,从而抛出 InvalidParameter: url error。

【5】解决方案:

方案一:换回纯文本模型(推荐)

如果你不需要处理图片或视频等多模态输入,直接使用纯文本模型是最稳定、性价比最高的选择。将 model 改回 qwen-plus 或 qwen-max 或 qwen3.7-max等纯文本模型。

方案二:使用 OpenAI 兼容模式调用(如果必须用 qwen3.7-plus)

**如果你必须使用 qwen3.7-plus,建议通过 LangChain 的 init_chat_model 配合 OpenAI 兼容接口来调用,**这种方式对多模态模型的参数路由处理更加标准。

langchain_community****调用千问大模型--** **示例2****:

示例里面有更详细的讲解,且可直接复制运行。

python 复制代码
from langchain_community.chat_models import ChatTongyi
import os
from dotenv import load_dotenv
# 加载 .env 文件中的环境变量
load_dotenv()
# 读取 .env 文件中变量"API_KEY"的值
key=os.getenv("API_KEY")
# # 创建通义千问调用实例
llm = ChatTongyi(
    model = 'qwen3.8-max',      # 可选qwen-turbo/qwen-plus/qwen-max
    api_key = key,              # 使用 'api_key' 参数传入API Key
    temperature = 0.5,          # 保持原有温度参数
    message_format = 'text',     # 返回文本格式
    model_kwargs = {
        "enable_thinking": True,  # 开启深度思考过程输出
        "enable_search": True     # 开启联网搜索能力。并非所有模型都支持 enable_thinking 
                                # 或enable_search。通常 qwen-max、qwen-plus 支持联网搜索。
        }, )

# 调用模型的 invoke 方法发送请求并获取完整响应
# invoke 是 LangChain 的统一调用接口,内部自动处理了消息格式转换、API 调用等细节
# 传入字符串时,LangChain 会自动将其包装为 HumanMessage 对象
# 与 stream=True 不同,invoke 会等待模型生成完毕后一次性返回完整结果
response = llm.invoke("你好,请简单介绍一下你自己")

# 打印响应对象的 content 属性
# response 是一个 AIMessage 对象,其 content 属性包含模型生成的文本内容
# 注意:这里直接打印的是最终回复,不包含思考过程(reasoning_content)
# 如需获取思考过程,需要使用 llm.stream() 配合 extra_body 参数
print(response.content)

三、方式三:使用 init_chat_model 调用

LangChain 1.x 提供了 init_chat_model 函数,可以通过指定 model_provider 来统一初始化模型。

init_chat_model 调用千问大模型--示例3****:

示例里面有更详细的讲解,且可直接复制运行。

python 复制代码
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model

# 1. 加载环境变量
load_dotenv()
key = os.getenv("API_KEY")
url = os.getenv("ALI_URL")
# 2. 初始化模型(通过 OpenAI 兼容模式调用通义千问)
llm = init_chat_model(
    model="qwen-max",
    model_provider="openai",  # 关键:指定为 openai 兼容模式
    base_url=url,
    api_key=key,
    temperature=0.7,
)

# ===== 基础调用 =====
print("===== 基础调用 =====")
response = llm.invoke("你好,请简单介绍一下你自己")
print(response.content)

四、【使用langchain_openai库调用DeepSeek大模型】

DeepSeek大模型的调用地址 及 API - Key 获得的方法与前面介绍的获取方法相关不大。

可细看 DeepSeek 官网的官方文档说明和每步提示进行操作。

新版 langchain-openai(≥0.3.x)对 OpenAI SDK 的参数做了更严格的映射:

extra_body 已被提升为 ChatOpenAI 的一级参数,用于向 API 透传非标准字段。

|------------------------|------------------|------------------------------------|
| 参数 | 正确位置 | 说明 |
| extra_body | 一级参数 | 透传给 API 的非标准字段容器 |
| reasoning_effort | 一级参数 | LangChain ≥0.3.x 已识别为已知参数 |
| temperature | 一级参数 | 标准 OpenAI 参数 |
| streaming | 一级参数 | LangChain 命名(对应 SDK 的 stream ) |
| web_search_options | model_kwargs | DeepSeek 特有、LangChain 未识别的参数 |
| thinking | extra_body | DeepSeek 思考模式开关,属于非标准 API 字段 |

【langchain-openai **调用DeepSeek大模型--**示例4】:

示例里面有更详细的讲解,且可直接复制运行。

python 复制代码
# 导入操作系统接口模块,用于访问环境变量等操作系统功能
import os
# 从dotenv库导入load_dotenv函数,用于加载.env文件中的环境变量
from dotenv import load_dotenv
# 从langchain_openai库导入ChatOpenAI类,这是LangChain框架中用于调用OpenAI兼容API的聊天模型类
from langchain_openai import ChatOpenAI

# 加载.env文件中的环境变量到系统环境中
# 这通常包括API密钥等敏感信息,避免硬编码在代码中
load_dotenv()

# 创建ChatOpenAI实例,用于调用DeepSeek的API
llm = ChatOpenAI(
    # 从环境变量中获取DeepSeek的API密钥
    # os.getenv("DEEPSEEK_KEY")会读取名为DEEPSEEK_KEY的环境变量
    api_key=os.getenv("DEEPSEEK_KEY"),
    # 设置API的基础URL,指向DeepSeek的API端点
    # 这里使用DeepSeek的API而不是OpenAI的
    base_url="https://api.deepseek.com",
    
    # 指定使用的模型名称
    # deepseek-v4-pro是DeepSeek的旗舰模型
    model="deepseek-v4-pro",
    
    # 设置温度参数为1,控制输出的随机性
    # 温度范围通常为0-2,值越高输出越随机和创造性,值越低输出越确定和保守
    temperature=1,
    
    # 设置是否使用流式输出
    # False表示不使用流式输出,等待完整响应后一次性返回
    streaming=False,
    
    # ✅ 显式传递extra_body参数(作为ChatOpenAI的一级参数)
    # extra_body用于传递额外的请求体参数给API
    # 这里启用思考模式,让模型在回答前进行深度思考
    extra_body={
        "thinking": {"type": "enabled"}  # 启用思考模式,提高推理质量
    },
    
    # ✅ 显式传递reasoning_effort参数(作为ChatOpenAI的一级参数)
    # reasoning_effort控制模型推理的深度和努力程度
    # "high"表示使用高强度的推理,会消耗更多计算资源但结果更准确
    reasoning_effort="high",
    
    # model_kwargs用于传递LangChain未能识别的其他模型参数
    # 这些参数会直接传递给底层API
    model_kwargs={
        # 设置网络搜索选项
        "web_search_options": {
            # 设置搜索上下文大小为中等,平衡搜索广度和深度
            "search_context_size": "medium"
        }
    }
)

# 定义要发送给模型的提示消息
# 用途:供大模型使用
messages = '请你扮演一位证券分析师根据最新的信息分析一下当前A股市场。'
    
# 调用LLM生成响应
# invoke方法会发送消息并等待完整响应
# 由于streaming=False,会一次性返回完整结果
response = llm.invoke(messages)

# 打印模型生成的响应内容
# response是AIMessage对象,.content属性包含实际的文本内容
print(response.content)
相关推荐
2401_873479401 小时前
IP属地为什么有时显示外省?用IP查询工具核查动态分配、运营商出口与GeoIP库
python·tcp/ip·ip
从零开始的嵌入式之旅2 小时前
day44
arm开发·经验分享·笔记·嵌入式硬件
OKkankan3 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
山哥ol4 小时前
【Geany 环境配置与中文乱码解决参考】
python
会飞锦鲤5 小时前
基于 Mask R-CNN 的药片缺陷检测系统
人工智能·pytorch·python·神经网络·resnet-50
默 语5 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
商业白皮书5 小时前
杭州企业做 GEO 怎么选服务商?B2B 制造、外贸出海与品牌连锁选型指南
笔记
清水白石0085 小时前
Python 异步编程深度解析:Cancellation 到底是异常还是控制信号?从 asyncio 取消机制到企业级事务设计最佳实践
开发语言·python
商业白皮书6 小时前
密不透风的瑕疵防线:东集SEV400视觉传感器,定义“轻量化”精准检测
笔记