1.LangChain版本说明
LangChain版本说明
一、前置核心概念
1. LangChain 定位
LangChain不是大模型,是胶水框架,作用:统一封装各类大模型厂商调用逻辑,让一套代码兼容多厂商模型。
2. 模型兼容核心标准:OpenAI 协议
海外原生厂商(OpenAI、DeepSeek)原生支持;国内厂商(阿里通义千问、百度文心、字节豆包)均提供OpenAI 兼容接口,这是我们调用国内模型的万能方案。
3. 主流厂商调用入口
- DeepSeek:官方独立接口,LangChain 原生识别厂商标识,可免显式传
model_provider - 阿里通义千问:阿里云百炼平台,通过兼容地址调用,必须指定
model_provider="openai" - 本地私有化:Ollama,内网离线部署场景使用
4. Python 版本硬性要求
稳定可用:Python 3.12.7 及以下
避坑:3.13 / 3.14 依赖库适配不完善,极易安装报错
5. 安装依赖(国内清华源加速)
# 全局pip切换清华源,解决国外源慢的问题
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 批量安装必备包
pip install langchain langchain-community langchain-openai python-dotenv
二、环境校验代码(查看版本)
import langchain
import langchain_community
import sys
# 打印框架版本、Python版本,排查环境冲突
print("langchainVersion: "+langchain.__version__)
print("langchain_communityVersion: "+langchain_community.__version__)
print("langchain文件路径:"+langchain.__file__)
print("Python版本:", sys.version)
作用:上线前校验环境,区分 0.3 旧版 / 1.0+ 新版 LangChain。
三、LangChain 0.3 旧版本(ChatOpenAI 统一调用)
核心特点
- 统一使用
ChatOpenAI兼容所有 OpenAI 协议模型; - 无统一入口,厂商专用类分散(ChatDeepSeek、ChatGoogle等),记忆成本高;
- 三种密钥配置方式,生产禁止硬编码。
三种密钥配置方案
方案1:硬编码(仅本地测试,线上禁用)
直接把 API Key 写在代码,泄露风险极高,工作中严禁使用
from langchain_openai import ChatOpenAI
# 阿里云通义千问兼容地址
llm = ChatOpenAI(
model="qwen-plus",
api_key="你的阿里云API密钥",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
res = llm.invoke("你是谁")
# response完整对象包含token消耗、元数据;.content只取文本回答
print(res.content)
方案2:系统环境变量(Windows/Mac/Linux全局配置)
- 系统新建环境变量
aliQwen-api,值为你的密钥; os.getenv()读取系统变量,无明文写死。
from langchain_openai import ChatOpenAI
import os
llm = ChatOpenAI(
model="qwen-plus",
api_key=os.getenv("aliQwen-api"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
print(llm.invoke("你是谁").content)
方案3:.env 配置文件(工程推荐,本教程主流)
- 项目根目录新建
.env文件,写入:
# .env文件内容
QWEN_API_KEY=阿里云密钥
deepseek-api=DeepSeek官方密钥
- 代码加载环境文件,指定编码防止中文乱码
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv
# 加载.env配置文件
load_dotenv(encoding='utf-8')
# 示例:阿里云百炼调用DeepSeek模型
llm = ChatOpenAI(
model="deepseek-v3.2",
api_key=os.getenv("QWEN_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
response = llm.invoke("你是谁")
print("完整返回元数据:", response)
print("模型回答文本:", response.content)
关键知识点
llm.invoke("问题"):同步一次性调用,等待模型生成完整内容后返回;- 返回对象
.content:仅提取对话文本;直接打印response会输出token消耗、请求ID等元数据。
四、LangChain 1.0+ 新版本(主流推荐,统一入口 init_chat_model)
核心升级点
- 统一入口
init_chat_model,一套API适配全厂商; - 新增
model_provider参数,显式指定模型厂商; - 原生支持厂商自动识别:模型名以
deepseek开头可省略model_provider; - 强制关键字参数传参,避免位置参数报错。
关键字参数规则
函数定义带 *,* 后所有参数必须 key=value 形式传入,不能靠位置传参,否则直接抛 TypeError。
案例1:阿里云通义千问(必须显式指定 provider=openai)
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
# 加载.env配置
load_dotenv(encoding='utf-8')
# 通义千问不属于LangChain原生支持厂商,必须指定model_provider="openai"
model = init_chat_model(
model="qwen-plus",
model_provider="openai",
api_key=os.getenv("aliQwen-api"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
# 同步调用
print(model.invoke("你是谁").content)
报错说明:若省略 model_provider,会抛出 ValueError: Unable to infer model provider。
案例2:原生DeepSeek(可省略model_provider,自动识别)
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
import os
load_dotenv()
# deepseek-chat 模型名以deepseek开头,框架自动推导厂商,可省略model_provider
model = init_chat_model(
model="deepseek-chat", # DeepSeek V3.2对话模型
api_key=os.getenv("deepseek-api"),
base_url="https://api.deepseek.com"
)
# 主动传入provider也能正常运行,规范写法推荐显式写
# model_provider="deepseek"
print(model.invoke("你是谁").content)
多模型共存
同一项目可同时初始化通义千问、DeepSeek两个模型,根据业务场景切换调用:
# 千问模型
qwen_model = init_chat_model(...)
# DeepSeek模型
ds_model = init_chat_model(...)
# 按需调用
print(qwen_model.invoke("总结文案").content)
print(ds_model.invoke("深度逻辑推理").content)
五、企业级工程化标准代码(日志、异常、流式输出、封装)
企业开发三大要求
- 封装初始化函数,复用LLM客户端;
- 环境变量非空校验、全量异常捕获;
- 使用logging日志替代print,支持流式输出stream;
- 标准Python程序入口
if __name__ == "__main__"。
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv
from langchain_core.exceptions import LangChainException
import logging
# 1. 全局日志配置,生产环境替代print
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# 2. 封装初始化函数,统一管理模型配置
def init_llm_client() -> ChatOpenAI:
load_dotenv(encoding='utf-8')
api_key = os.getenv("QWEN_API_KEY")
# 非空校验,提前拦截配置错误
if not api_key:
raise ValueError("环境变量 QWEN_API_KEY 未配置,请检查.env文件")
llm = ChatOpenAI(
model="deepseek-v3.2",
api_key=api_key,
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0.7, # 随机性:0固定输出,1高创意
max_tokens=2048 # 限制返回文本长度,防止超限
)
return llm
# 3. 主业务逻辑
def main():
try:
llm = init_llm_client()
logger.info("LLM客户端初始化成功")
question = "你是谁"
# 同步一次性输出 invoke
res = llm.invoke(question)
logger.info(f"问题:{question} \n回答:{res.content}")
# 流式输出 stream(打字机效果,前端对话必备)
print("=====流式输出开始=====")
stream_res = llm.stream("介绍LangChain,300字以内")
for chunk in stream_res:
# end="" 不自动换行,逐字打印
print(chunk.content, end="")
# 分层捕获异常,精准定位问题
except ValueError as e:
logger.error(f"配置错误:{str(e)}")
except LangChainException as e:
logger.error(f"模型接口调用失败:{str(e)}")
except Exception as e:
logger.error(f"未知系统错误:{str(e)}")
# Python规范入口,导入模块时不会自动执行
if __name__ == "__main__":
main()
流式输出核心知识点
model.stream("问题"):分段返回文本,类似打字机实时输出,解决长文本卡顿等待问题;- 循环遍历返回的chunk块,
chunk.content为每一段文字; - 适用场景:网页对话、AI聊天窗口,用户体验更好。
六、版本对比总结
| 维度 | LangChain 0.3 旧版 | LangChain 1.0+ 新版(推荐) |
|---|---|---|
| 入口类 | ChatOpenAI、ChatDeepSeek等多类分散 | 统一 init_chat_model |
| 厂商适配 | 全部依赖OpenAI兼容接口 | 原生支持DeepSeek等厂商,自动识别 |
| 必传参数 | model、api_key、base_url | 新增model_provider(国内模型必填) |
| 扩展性 | 新增厂商需要新增对应类 | 一套代码兼容所有符合OpenAI协议模型 |
| 适用场景 | 历史遗留老项目维护 | 新项目、企业开发首选 |

浙公网安备 33010602011771号