跑通第一个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 客户端的上层封装。

框架做这个封装的核心目的是:

  1. 适配自身的开发体系,把厂商 SDK 的底层逻辑包装成更贴合 LLM 应用场景、更易集成的接口;
  2. 解耦核心 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

  1. 注册并登录 DeepSeek 开放平台官网:DeepSeek 开放平台
  2. 进入 API 管理页面,创建一个新的 API Key,sk-xxxxxx
  3. 复制这个 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 开放平台充值,或者检查是不是调用太频繁了

🤔 思考一下

  1. temperature参数底层是怎么控制模型回答的随机性的?


💡 结束语

本篇内容就到这里啦~
技术学习重在理解与积累,循序渐进地吃透每一个知识点,才能稳步提升。
如果内容对你有帮助,欢迎点赞、收藏方便后续随时复习。
学习过程中遇到任何疑问,欢迎评论区交流讨论,或是私信提问,我会尽量为你解答。

👉 订阅专栏・持续进阶

本专栏不做零散知识点堆砌,也不只做静态知识罗列。
内容严格遵循人类自然认知顺序,带你走通完整动态思考链路
从为什么、怎么想到、如何推导、如何落地,
让你在学习中自然沉淀出自己的静态知识体系。
全程循序渐进、逻辑闭环、可复现、可落地。
订阅即可第一时间获取更新,跟着体系真正学懂、学透、会用。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐