DeepSeek API 实战:从接入到搭建你自己的 AI 助手

最近做项目需要接入大模型 API,对比了一圈最终选了 DeepSeek。原因很简单:便宜、中文效果好、兼容 OpenAI 协议

这篇文章记录我从零接入到搭建一个可用 AI 助手的全过程,踩过的坑和最终方案都写出来了。


一、为什么要选 DeepSeek

选模型之前我列了几个硬性需求:

  • 中文理解能力要强(做的是面向国内用户的产品)
  • API 调用成本要低(前期不想烧钱)
  • 兼容 OpenAI 协议(方便后续切换)
  • 上下文窗口要够大(需要处理长文档)

对比了几个主流模型后,DeepSeek 是最符合的。

模型             输入价格         输出价格         上下文
DeepSeek        ¥1/百万token    ¥2/百万token    64K
GPT-4o          ¥15/百万token   ¥60/百万token   128K
Claude 3.5      ¥18/百万token   ¥90/百万token   200K

价格差距不是一点半点。对于大多数实际场景,DeepSeek 的能力完全够用。


二、接入过程

DeepSeek 的 API 兼容 OpenAI 格式,所以用起来和 OpenAI 几乎一样。

1. 获取 API Key

去 platform.deepseek.com 注册账号 → 创建 API Key。Key 的格式以 sk- 开头。

2. 基础调用

from openai import OpenAI

client = OpenAI(
    api_key="sk-your-key-here",
    base_url="https://api.deepseek.com/v1"
)

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "你是一个帮助用户解决问题的助手。"},
        {"role": "user", "content": "用 Python 写一个快速排序"}
    ]
)

print(response.choices[0].message.content)

就这么简单。如果你之前用过 OpenAI 的 API,只需要把 base_urlapi_key 换掉就行。

3. 流式输出

实际产品中不可能等完整响应再展示,流式输出是标配:

stream = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "讲一个技术笑话"}],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

这样用户能看到文字一个字一个字出来,体验好很多。


三、搭建自己的 AI 助手

有了 API 后,我用 FastAPI 搭了一个简单的 AI 助手后端,支持对话历史和流式输出。

项目结构:

ai-assistant/
├── main.py          # FastAPI 服务
├── chat.py          # 对话逻辑
├── config.py        # 配置
└── requirements.txt

config.py:

import os
from dotenv import load_dotenv

load_dotenv()

DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY")
DEEPSEEK_BASE_URL = "https://api.deepseek.com/v1"
MODEL_NAME = "deepseek-chat"

chat.py——核心对话逻辑:

from openai import OpenAI
from config import DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL, MODEL_NAME

client = OpenAI(api_key=DEEPSEEK_API_KEY, base_url=DEEPSEEK_BASE_URL)

class ChatSession:
    def __init__(self, system_prompt=None):
        self.messages = []
        if system_prompt:
            self.messages.append({"role": "system", "content": system_prompt})
    
    def add_message(self, role, content):
        self.messages.append({"role": role, "content": content})
    
    def get_response(self):
        response = client.chat.completions.create(
            model=MODEL_NAME,
            messages=self.messages,
            temperature=0.7,
            max_tokens=2000
        )
        reply = response.choices[0].message.content
        self.add_message("assistant", reply)
        return reply
    
    def get_stream_response(self):
        stream = client.chat.completions.create(
            model=MODEL_NAME,
            messages=self.messages,
            stream=True,
            temperature=0.7
        )
        full_response = ""
        for chunk in stream:
            delta = chunk.choices[0].delta.content or ""
            full_response += delta
            yield delta
        self.add_message("assistant", full_response)

main.py——FastAPI 服务:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
from chat import ChatSession

app = FastAPI()

class ChatRequest(BaseModel):
    message: str
    session_id: str = "default"

sessions = {}

@app.post("/chat")
async def chat(request: ChatRequest):
    if request.session_id not in sessions:
        sessions[request.session_id] = ChatSession(
            system_prompt="你是一个有用的AI助手。请用中文回答。"
        )
    
    session = sessions[request.session_id]
    session.add_message("user", request.message)
    reply = session.get_response()
    
    return {"reply": reply, "session_id": request.session_id}

@app.post("/chat/stream")
async def chat_stream(request: ChatRequest):
    if request.session_id not in sessions:
        sessions[request.session_id] = ChatSession(
            system_prompt="你是一个有用的AI助手。请用中文回答。"
        )
    
    session = sessions[request.session_id]
    session.add_message("user", request.message)
    
    return StreamingResponse(
        session.get_stream_response(),
        media_type="text/event-stream"
    )

四、几个实战踩坑记录

1. 上下文管理

一开始我没限制对话历史长度,结果聊了几十轮后 token 数爆炸,每次请求都又慢又贵。

解决方案:限制 messages 列表长度,超出后丢弃最早的对话。

MAX_HISTORY = 20

def trim_messages(self):
    if len(self.messages) > MAX_HISTORY:
        # 保留 system prompt,丢弃最早的对话
        system = [m for m in self.messages if m["role"] == "system"]
        history = [m for m in self.messages if m["role"] != "system"]
        self.messages = system + history[-MAX_HISTORY:]

2. 超时处理

DeepSeek API 在高峰期偶尔会响应较慢,客户端需要设置超时:

client = OpenAI(
    api_key=DEEPSEEK_API_KEY,
    base_url=DEEPSEEK_BASE_URL,
    timeout=30,  # 30秒超时
    max_retries=2  # 自动重试2次
)

3. 错误处理

API 调用可能因为各种原因失败,需要做好容错:

try:
    response = client.chat.completions.create(...)
except Exception as e:
    print(f"API 调用失败: {e}")
    return "抱歉,我现在有点忙,请稍后再试。"

用户不关心技术细节,给他们一个友好的错误提示就够了。


五、成本估算

我用这个方案跑了两个月,来算算账:

日均请求:约 500 次
平均每次:约 800 tokens(输入+输出)
日均消耗:约 400K tokens
月均消耗:约 12M tokens
月均成本:约 ¥12(按 ¥1/百万token 计算)

12 块钱一个月,能跑一个完整的 AI 助手后端。对比 GPT-4o 同样用量要接近 200 块,差距是十几倍。


写在最后

DeepSeek 是目前性价比最高的中文大模型 API,没有之一。如果你在做 AI 相关的产品,特别是面向中文用户的场景,非常值得一试。

接入成本极低——改一行 base_url 就能从 OpenAI 切过来。先跑起来,等规模大了再考虑要不要换更贵的模型。

你对 DeepSeek 有什么想了解的?欢迎在评论区交流。

(文章中的代码已脱敏,完整项目代码可以在 GitHub 上找到)

更多推荐