跑通第一个LLM应用:调用DeepSeek模型
本文提供新手入门LLM开发的保姆级教程,重点介绍如何调用DeepSeek模型。首先解释SDK的作用及OpenAI兼容调用的优势,强调框架封装的价值。接着指导安装Python库、获取API Key并安全配置环境变量。核心部分演示三种调用方式,推荐使用OpenAI SDK兼容模式(代码示例展示如何初始化客户端并生成回答),说明基础URL的作用及SDK自动拼接接口路径的原理。教程包含完整测试代码,输出简
跑通第一个LLM应用:调用DeepSeek模型
📖 阅读须知
📌 前置知识
- 电脑上安装了 Python 3.8 以上版本
- 会用终端(CMD/Terminal)执行简单的命令
- 有一个可用的 DeepSeek API Key
🎯 学习目标
- 搞懂 SDK 是什么
- 学会安全配置 API Key
- 掌握不同调用方式,让 DeepSeek 回答你的问题
- 学会调整 temperature 等参数,控制 AI 的回答风格
- 了解框架(如LangChain)对 SDK 的上层封装逻辑(进阶知识点)
👥 适合人群
- 纯新手,第一次接触 LLM 开发
- 会点 Python 基础,但没碰过 AI
- 非开发岗(产品/运营),想亲手试试怎么调用 AI
- 看了一堆复杂教程,始终没跑通第一个 Demo 的人
📝 引言
很多新手想入门 LLM 开发,却被网络环境、账号注册等问题劝退。
本文全程保姆级讲解,提供 OpenAI 兼容调用、纯 HTTP 原生调用 以及 DeepSeek 风格封装调用 三种方式,跟着一步步实现,轻松跑通你的第一个 LLM 应用。
文章目录
一、先搞懂:SDK 是什么?
1. SDK 是什么?
SDK(软件开发工具包)就是模型厂商封装好的“工具箱”。不用你手写复杂的网络请求、解析底层返回值,只要调用简单的函数,就能让 AI 干活。
更通俗地说:SDK 是厂商为了让开发者更方便地使用其 API,提前封装好的一套工具集合。不用 SDK 也能调用 API(比如自己写 HTTP 请求),但用 SDK 能省掉大量重复工作(比如处理鉴权、参数格式转换、异常捕获)。
2. 为什么推荐用 OpenAI SDK 调用 DeepSeek模型?
OpenAI SDK 的调用格式太流行了,几乎成了行业标准。DeepSeek 为了让大家更容易上手,做了完美兼容——你用 OpenAI SDK 的代码,只要改一下 API 地址和密钥,就能直接调用 DeepSeek 的模型。
这就好比你有一个万能遥控器(OpenAI SDK),本来是控制 A 品牌电视(OpenAI 模型)的,现在 B 品牌电视(DeepSeek 模型)说“我的接口和 A 一样,你用这个遥控器也能控制我”。
3. 扩展:框架(LangChain)对 SDK 的上层封装(进阶知识点)
如果你后续想开发更复杂的 LLM 应用(比如 AI Agent),还会接触到「框架对 SDK 的二次封装」——比如 LangChain 框架里的 ChatOpenAI 类,本质就是对 OpenAI 官方 SDK 中 openai.OpenAI 客户端的上层封装。
框架做这个封装的核心目的是:
- 适配自身的开发体系,把厂商 SDK 的底层逻辑包装成更贴合 LLM 应用场景、更易集成的接口;
- 解耦核心 LLM 应用逻辑和模型厂商:比如你用 LangChain 的 ChatOpenAI 写了 LLM 应用代码,想换成 DeepSeek 模型时,不用重构核心逻辑,只改少量配置即可 —— 毕竟厂商自研 SDK 只会优先适配自家模型的易用性,不会跨厂商做通用兼容。
实用建议:
- 开发时,优先用框架封装的统一接口,不直接写厂商 SDK 代码(框架底层会自动调用厂商 SDK);
- 仅当需要厂商独家功能 / 极致定制时,才混合使用厂商 SDK;
注意边界,LangGraph/LangChain 提供的 “工程化能力” 本质是LLM 流程内部的轻量级工程适配,只覆盖 “调用模型、编排流程” 这个小闭环里的细节问题(比如重试、流程分支、记忆管理),但解决不了 “服务扛高并发”“全链路监控” 这类系统级工程问题—— 这些核心问题必须靠人为编写业务代码 + 基础设施配置来解决,如异步 + 并发控制 + 连接,埋点 + 监控工具,限流,容灾等。
这个知识点不用现在吃透,先记住“框架封装是为了更方便换模型、做复杂应用”即可,等你跑通基础调用后,再回头看会更易理解。
二、前置准备:安装库与 API Key设置
1. 安装必要的库
打开终端(CMD 或 Terminal),输入以下命令:
pip install openai>=1.0.0 requests>=2.31.0 --upgrade
2. 获取 DeepSeek API Key
- 注册并登录 DeepSeek 开放平台官网:DeepSeek 开放平台
- 进入 API 管理页面,创建一个新的 API Key,sk-xxxxxx
- 复制这个 Key(只显示一次,务必保存好)
3. 将API key放入项目级的环境变量
参考:《应用级环境变量配置核心规范》 教程中「二、开发阶段:Windows/Linux 统一的跨平台方案」;
或先不配置,把api-key明文放入代码中硬编码,只可用于临时测试,事后再看规范写法。
三、核心实操:三种调用方式
一般来说可以官方SDK,兼容OpenAI的SDK,原生HTTP这三种实现,但,
DeepSeek 截至目前(2026 年),确实没有推出过独立的、专属的官方 Python SDK(比如命名为 deepseek-official 或官方维护的 deepseek-sdk),最稳妥的方式是使用 OpenAI 兼容模式。
方式一:OpenAI SDK 调用 DeepSeek模型
# -*- coding: utf-8 -*- # 核心:文件编码声明(必须在第一行)
from openai import OpenAI
import os
from config import (
DEEPSEEK_API_KEY
)
# ====================== 基础配置 ======================
# 建议把 API Key 放在项目级别的环境变量里,不要直接写在代码里(防止泄露)
# 也可把上述DEEPSEEK_API_KEY的引入注释,把下面这行注释取消,直接填 Key,只可临时测试用
# DEEPSEEK_API_KEY = "你的DeepSeek API Key"
DEEPSEEK_BASE_URL = "https://api.deepseek.com/v1"
# ============ 方式1:OpenAI SDK 兼容调用(官方推荐,最稳定) ===============
# 初始化客户端(这里用的是 OpenAI 的 SDK,但指向 DeepSeek 的地址)
openai_client = OpenAI(
api_key=DEEPSEEK_API_KEY,
base_url=DEEPSEEK_BASE_URL,
default_headers={"Content-Type": "application/json; charset=utf-8"} # 请求头:指定JSON格式 + UTF-8编码
)
def generate_with_openai_compatible(prompt: str) -> str:
"""OpenAI兼容模式(官方推荐,代码通用、以后换模型也方便)"""
try:
# 调用 SDK 核心方法
response = openai_client.chat.completions.create(
model="deepseek-chat", # 选择模型:deepseek-chat(对话)/ deepseek-coder(代码)
messages=[{"role": "user", "content": prompt}], # prompt为你的问题
temperature=0.7, # 生成随机性:0-1,越小越固定,越大越放飞
max_tokens=500, # 最大生成字数
extra_headers={"Accept-Charset": "utf-8"}
)
# 提取并返回模型的回答
return response.choices[0].message.content
except Exception as e:
return f"OpenAI兼容模式失败:{str(e)}"
# ====================== 测试运行 ======================
if __name__ == "__main__":
test_prompt = "用100字解释什么是AI Agent"
# 测试:OpenAI 兼容模式(官方推荐)
print("=== 方式1:OpenAI SDK 兼容模式结果 ===")
result = generate_with_openai_compatible(test_prompt)
print(result)
输出结果:
=== 方式1:OpenAI SDK 兼容模式结果 ===
AI Agent(智能代理)是一种能够感知环境、自主决策并执行任务的人工智能系统。它通过大模型等核心技术理解信息、规划步骤、使用工具(如搜索、编程),最终达成特定目标。AI Agent能独立或协同完成复杂工作,是迈向通用人工智能(AGI)的关键形态,正应用于客服、科研、办公自动化等领域。
核心代码解释
1. DEEPSEEK_BASE_URL = "https://api.deepseek.com/v1"
并不是具体的 AI 模型,而是代表 DeepSeek 开放平台 API 服务的基础统一资源定位符(URL),可以把它理解成:
- 你要访问 DeepSeek 服务器的「总地址」,所有具体功能(比如文本生成、对话交互)的 API 接口,都是在这个基础地址上拼接出来的。
- 类比生活中的例子:这个基础 URL 就像你家小区的大门地址(比如「XX市XX区XX路88号XX小区」),而不同的模型接口(比如通用对话、代码生成)就像小区里不同的楼栋(大门地址 + 楼栋号 = 完整的访问地址)。
当你调用 DeepSeek 的 API 时,完整的请求地址需要由「基础 URL + 具体接口路径」组成,比如:
- 调用对话接口的完整地址:
https://api.deepseek.com/v1/chat/completions(基础 URL +/chat/completions接口路径) - 调用文本补全接口的完整地址:
https://api.deepseek.com/v1/completions(基础 URL +/completions接口路径)
而这个地址拼接,不用你手动拼接,SDK以类和实例方法名的形式拼接,从而达到接口分类管理、语义化调用的效果 (你今后也可借鉴该思路写自己的设计),如下:
openai_client = OpenAI(api_key=DEEPSEEK_API_KEY) 和 openai_client.chat.completions
1)当你调用 openai_client.chat.completions.create() 这类方法时,客户端知道要访问的接口路径是 /chat/completions;
2)客户端会自动把 base_url(https://api.deepseek.com/v1)和接口路径(/chat/completions)拼接成完整地址:https://api.deepseek.com/v1/chat/completions;
3)整个拼接过程是客户端库(比如 openai 官方 SDK)内置的逻辑,你完全不用手动拼接,只需要正确配置 base_url 即可。
2. openai_client = OpenAI(api_key=DEEPSEEK_API_KEY)
参数拆解:
api_key:API 密钥,用于验证身份,没有这个会调用失败;base_url:把请求导向 DeepSeek 的服务器,而非 OpenAI 官方服务器;default_headers:全局默认请求头,指定内容格式和编码,避免中文乱码。
3. response = openai_client.chat.completions.create()
作用:调用 DeepSeek 的对话接口,发送请求并获取响应。
核心参数拆解:
model:指定使用的模型,deepseek-chat是通用对话模型,deepseek-coder是代码生成模型;messages:对话消息列表,role="user"表示是用户的提问,content是提问内容;temperature:生成随机性,0 是完全固定回答,1 是最大随机性;max_tokens:限制模型生成的最大字符数(避免回答过长);extra_headers:额外请求头,补充指定接收编码为 UTF-8,进一步避免中文乱码。
4. response.choices[0].message.content
作用:从 API 响应中提取模型的回答。
响应结构解析:
response:是 API 返回的完整对象;choices:是一个列表(因为可指定多轮候选回答),[0]取第一个(也是最主要的)回答;message.content:取回答的文本内容。
5. # -*- coding: utf-8 -*-
声明当前 Python 文件的编码格式为 UTF-8,
Python 2 中是必填(否则中文会乱码),Python 3 虽默认 UTF-8,但显式声明能保证跨平台 / 跨编辑器的兼容性,避免中文注释、字符串出现编码错误。
• 注意:必须放在文件第一行 / 第二行(第一行如果是 #! /usr/bin/env python3 的话)。
方式二:DeepSeek 纯 HTTP 原生调用(无 SDK 依赖)
仅作为了解请求底层过程来使用,因缺少成熟的工程化能力(自动重试、参数校验、连接池管理、标准化错误处理等) , 工程中不建议用。
# -*- coding: utf-8 -*- # 核心:文件编码声明(必须在第一行)
import requests
import json
from config import (
DEEPSEEK_API_KEY
)
# ====================== 基础配置 ======================
# 建议把 API Key 放在项目级别的环境变量里,不要直接写在代码里(防止泄露)
# 也可把上述DEEPSEEK_API_KEY的引入注释,把下面这行注释取消,直接填 Key,只可临时测试用
# DEEPSEEK_API_KEY = "你的DeepSeek API Key"
DEEPSEEK_BASE_URL = "https://api.deepseek.com/v1"
# =============== 方式2:DeepSeek 纯 HTTP 原生调用(无 SDK 依赖) ==========
def generate_with_deepseek_native(prompt: str) -> str:
"""DeepSeek原生HTTP调用(仅用requests,不依赖任何第三方SDK)"""
global response
try:
# 构造请求地址和请求头
url = f"{DEEPSEEK_BASE_URL}/chat/completions"
headers = {
"Authorization": f"Bearer {DEEPSEEK_API_KEY}",
"Content-Type": "application/json; charset=utf-8",
"Accept": "application/json; charset=utf-8"
}
# 构造请求体(和 OpenAI 格式完全一样)
request_body = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.7,
"max_tokens": 500
}
# 发送请求
json_body = json.dumps(request_body, ensure_ascii=False).encode("utf-8")
response = requests.post(url=url, headers=headers, data=json_body, timeout=30)
response.raise_for_status()
# 解析并返回结果
response_data = response.content.decode("utf-8")
result = json.loads(response_data)
return result["choices"][0]["message"]["content"]
except requests.exceptions.HTTPError as e:
return f"原生模式HTTP错误:{e} | 响应内容:{response.content.decode('utf-8') if 'response' in locals() else '无'}"
except Exception as e:
return f"原生模式其他错误:{str(e)}"
# ====================== 测试运行 ======================
if __name__ == "__main__":
test_prompt = "用100字解释什么是AI Agent"
# 测试 2:纯 HTTP 原生调用
print("\n=== 方式2:DeepSeek 纯 HTTP 原生模式结果 ===")
result = generate_with_deepseek_native(test_prompt)
print(result)
输出结果:
=== 方式2:DeepSeek 纯 HTTP 原生模式结果 ===
AI Agent(智能体)是能感知环境、自主决策并执行任务的人工智能系统。它通过传感器或数据输入感知信息,基于内部模型或学习能力进行分析决策,最终驱动执行器或输出接口完成特定目标。不同于简单工具,AI Agent具备自主性、反应性和目标导向性,可独立或协同处理复杂任务,如虚拟助手、自动驾驶程序等,正成为AI技术落地的重要形态。
四、做个小实验:调整参数玩一玩
代码里有两个参数很有意思,你可以试着改一改,看看 AI 的回答有什么变化:
1. temperature(温度)
- 改成 0:AI 的回答会非常严谨、固定,几乎每次都一样
- 改成 1.5:AI 的回答会很放飞、有创意,但可能会胡言乱语
- 新手推荐 0.7,平衡在严谨和创意之间
2. max_tokens(最大字数)
- 改成 100:AI 最多说 100 个字就会停下
- 改成 1000:AI 可以说更长的内容
五、新手避坑指南:我报错了怎么办?
1. AuthenticationError(认证错误)
- 原因:API Key 没填对,或者没填
- 解决:检查 Key 是不是复制完整了,有没有多余的空格
2. APIConnectionError(连不上)
- 原因:网络问题,或者 base_url 填错了
- 解决:检查
DEEPSEEK_BASE_URL是不是https://api.deepseek.com/v1
3. RateLimitError(额度不够)
- 原因:账号里的免费额度用完了
- 解决:去 DeepSeek 开放平台充值,或者检查是不是调用太频繁了
🤔 思考一下
- temperature参数底层是怎么控制模型回答的随机性的?
💡 结束语
本篇内容就到这里啦~
技术学习重在理解与积累,循序渐进地吃透每一个知识点,才能稳步提升。
如果内容对你有帮助,欢迎点赞、收藏方便后续随时复习。
学习过程中遇到任何疑问,欢迎评论区交流讨论,或是私信提问,我会尽量为你解答。
👉 订阅专栏・持续进阶
本专栏不做零散知识点堆砌,也不只做静态知识罗列。
内容严格遵循人类自然认知顺序,带你走通完整动态思考链路。
从为什么、怎么想到、如何推导、如何落地,
让你在学习中自然沉淀出自己的静态知识体系。
全程循序渐进、逻辑闭环、可复现、可落地。
订阅即可第一时间获取更新,跟着体系真正学懂、学透、会用。
更多推荐



所有评论(0)