一、背景介绍
DeepSeek 作为国内领先的大语言模型提供商,其 API 以高性价比和优秀的推理能力受到开发者青睐。而 LangChain 作为连接大模型与应用的桥梁框架,在 1.0 版本中对模型调用方式进行了重要重构,引入了更加统一的 init_chat_model 接口。
本文将完整演示:从 DeepSeek API Key 的申请,到使用 LangChain 1.0 的新语法调用模型并获取流式响应的全过程。同时会对比 LangChain 0.x 与 1.x 的语法差异,帮助读者平滑迁移。
二、方案分析:API 接入的核心要素
调用外部大模型 API,本质上需要解决三个问题:
- 身份认证:通过 API Key 证明调用者身份;
- 模型配置:指定模型版本、温度、最大 Token 数等参数;
- 响应处理:支持同步返回或流式输出,兼顾延迟与用户体验。
LangChain 1.0 的设计哲学是**"统一入口, provider 透明"**------无论底层是 OpenAI、DeepSeek 还是 Anthropic,开发者都通过 init_chat_model 初始化模型,通过 model_provider 参数区分服务商,从而大幅降低多模型切换的成本。
三、实操步骤
3.1 第一步:申请 DeepSeek API Key
访问 DeepSeek 开放平台,注册并登录账号。
进入 API Keys 管理页面,点击"创建 API Key"按钮。为 Key 命名(如 langchain-demo),系统会生成一串密钥。请务必妥善保存 ,API Key 仅在创建时可见,丢失后需重新创建。

将获取到的 API Key 配置到项目的环境变量中。在项目根目录创建 .env 文件:
bash
DEEPSEEK_API_KEY=your-api-key-here
安全提示 :切勿将 API Key 硬编码在源码中提交到版本控制。使用
.env文件配合python-dotenv加载是业界标准做法。
3.2 第二步:安装依赖
确保已安装 LangChain 1.0 及 DeepSeek 适配包:
bash
# 使用 uv(推荐)
uv add langchain langchain-deepseek python-dotenv
# 或使用 pip
pip install langchain langchain-deepseek python-dotenv
3.3 第三步:编写调用代码
LangChain 1.0 推荐使用 init_chat_model 作为统一入口,相比 0.x 版本的直接导入特定模型类,代码更具通用性和可维护性。
新版代码(LangChain 1.x 推荐写法)
python
"""
使用 DeepSeek 大模型访问 DeepSeek API
LangChain 1.x 统一接口写法
"""
from pathlib import Path
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
# 从项目根目录的 .env 加载环境变量(与当前工作目录无关)
load_dotenv(Path(__file__).resolve().parents[2] / ".env")
# 初始化模型:统一入口,通过 model_provider 指定服务商
model = init_chat_model(
model="deepseek-chat", # 模型名称:deepseek-chat(默认)、deepseek-r1、deepseek-reasoner
model_provider="deepseek", # 指定服务商为 DeepSeek
temperature=0.1, # 温度:控制随机性,0-1 之间,越低越确定
max_tokens=2000, # 最大生成 Token 数
timeout=30, # 请求超时时间(秒)
max_retries=3, # 失败时的最大重试次数
)
# 流式调用:逐块获取响应,降低首字延迟
response = model.stream("来一段毛泽东诗词")
for chunk in response:
print(chunk.content, end="", flush=True)
代码解析:
init_chat_model:LangChain 1.0 引入的统一模型初始化函数,替代了 0.x 版本中各个 provider 独立的模型类(如ChatDeepSeek、ChatOpenAI等);model_provider="deepseek":显式声明服务商,LangChain 会自动路由到对应的适配层;stream()方法:启用流式输出,模型生成过程中逐块返回内容,适合需要实时展示响应的场景(如聊天界面);chunk.content:每个流式块中包含的文本片段,end=""和flush=True确保内容实时输出到终端而不换行。
旧版代码(LangChain 0.x 写法,供对比参考)
python
"""
LangChain 0.x 的语法(已废弃,仅供对比)
"""
from pathlib import Path
from dotenv import load_dotenv
from langchain_deepseek import ChatDeepSeek # 直接导入特定 provider 的模型类
load_dotenv(Path(__file__).resolve().parents[2] / ".env")
model = ChatDeepSeek(
model="deepseek-chat",
temperature=0.1,
max_tokens=2000,
timeout=30,
max_retries=3,
)
response = model.stream("来一段毛泽东诗词")
for chunk in response:
print(chunk.content, end="", flush=True)
四、验证效果:新旧语法对比与选型建议
4.1 语法演进的核心差异
| 维度 | LangChain 0.x | LangChain 1.x |
|---|---|---|
| 模型导入 | 每个 provider 独立的模型类:from langchain_deepseek import ChatDeepSeek |
统一入口:from langchain.chat_models import init_chat_model |
| 服务商声明 | 隐含在类名中 | 显式参数:model_provider="deepseek" |
| 切换成本 | 高:更换 provider 需修改导入语句和类名 | 低:只需修改 model 和 model_provider 两个参数 |
| 可维护性 | 多 provider 场景代码冗余 | 统一抽象,代码更简洁 |
4.2 为什么推荐 1.x 写法?
LangChain 1.0 的统一接口设计带来了三个显著优势:
- 降低心智负担:开发者无需记忆每个 provider 的专属类名,一套 API 走天下;
- 便于 A/B 测试:切换模型只需改两个参数,非常适合需要对比不同模型效果的场景;
- 未来兼容性好:LangChain 社区的新功能和最佳实践会优先在统一接口上迭代。
4.3 模型参数调优建议
| 参数 | 作用 | 建议场景 |
|---|---|---|
temperature |
控制输出随机性,范围 0-2 | 创意写作取 0.7-1.0,代码生成/问答取 0-0.3 |
max_tokens |
限制单次响应的最大长度 | 根据场景预估,避免过长导致等待和费用浪费 |
timeout |
请求超时时间 | 国内 API 建议 30-60 秒,海外 API 适当延长 |
max_retries |
网络波动时的自动重试 | 生产环境建议 3-5 次,开发环境可设为 1 次快速失败 |
五、总结
从 DeepSeek API 的申请到 LangChain 1.0 的流式调用,整个过程可以归纳为四个关键步骤:
- 获取凭证 :在 DeepSeek 开放平台创建 API Key 并配置到
.env; - 安装依赖 :引入
langchain、langchain-deepseek和python-dotenv; - 统一初始化 :使用
init_chat_model创建模型实例,通过model_provider指定 DeepSeek; - 流式消费 :调用
stream()方法逐块获取响应,实现低延迟的实时输出。
LangChain 1.0 的 init_chat_model 设计,标志着框架从" provider 专属 API"向"统一抽象层"的成熟演进。对于新项目和迁移中的旧项目,都建议尽早拥抱这一新范式。