1.LangChain版本说明

LangChain版本说明

一、前置核心概念

1. LangChain 定位

LangChain不是大模型,是胶水框架,作用:统一封装各类大模型厂商调用逻辑,让一套代码兼容多厂商模型。

2. 模型兼容核心标准:OpenAI 协议

海外原生厂商(OpenAI、DeepSeek)原生支持;国内厂商(阿里通义千问、百度文心、字节豆包)均提供OpenAI 兼容接口,这是我们调用国内模型的万能方案。

3. 主流厂商调用入口

  1. DeepSeek:官方独立接口,LangChain 原生识别厂商标识,可免显式传 model_provider
  2. 阿里通义千问:阿里云百炼平台,通过兼容地址调用,必须指定 model_provider="openai"
  3. 本地私有化: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 统一调用)

核心特点

  1. 统一使用 ChatOpenAI 兼容所有 OpenAI 协议模型;
  2. 无统一入口,厂商专用类分散(ChatDeepSeek、ChatGoogle等),记忆成本高;
  3. 三种密钥配置方式,生产禁止硬编码。

三种密钥配置方案

方案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全局配置)

  1. 系统新建环境变量 aliQwen-api,值为你的密钥;
  2. 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 配置文件(工程推荐,本教程主流)

  1. 项目根目录新建 .env 文件,写入:
# .env文件内容
QWEN_API_KEY=阿里云密钥
deepseek-api=DeepSeek官方密钥
  1. 代码加载环境文件,指定编码防止中文乱码
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)

核心升级点

  1. 统一入口 init_chat_model,一套API适配全厂商;
  2. 新增 model_provider 参数,显式指定模型厂商;
  3. 原生支持厂商自动识别:模型名以 deepseek 开头可省略 model_provider
  4. 强制关键字参数传参,避免位置参数报错。

关键字参数规则

函数定义带 ** 后所有参数必须 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)

五、企业级工程化标准代码(日志、异常、流式输出、封装)

企业开发三大要求

  1. 封装初始化函数,复用LLM客户端;
  2. 环境变量非空校验、全量异常捕获;
  3. 使用logging日志替代print,支持流式输出stream;
  4. 标准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()

流式输出核心知识点

  1. model.stream("问题"):分段返回文本,类似打字机实时输出,解决长文本卡顿等待问题;
  2. 循环遍历返回的chunk块,chunk.content 为每一段文字;
  3. 适用场景:网页对话、AI聊天窗口,用户体验更好。

六、版本对比总结

维度 LangChain 0.3 旧版 LangChain 1.0+ 新版(推荐)
入口类 ChatOpenAI、ChatDeepSeek等多类分散 统一 init_chat_model
厂商适配 全部依赖OpenAI兼容接口 原生支持DeepSeek等厂商,自动识别
必传参数 model、api_key、base_url 新增model_provider(国内模型必填)
扩展性 新增厂商需要新增对应类 一套代码兼容所有符合OpenAI协议模型
适用场景 历史遗留老项目维护 新项目、企业开发首选
posted @ 2026-08-17 15:23  _丑小鸭  阅读(8)  评论(0)    收藏  举报