【用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)