DeepSeek API 实战:从接入到搭建你自己的 AI 助手
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_url 和 api_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 上找到)
更多推荐

所有评论(0)