先确保模型本地跑通:加载成功、单条输入有合理输出;若显存不足,优先试device_map="auto"或load_in_4bit=True;DeepSeek-V4必须设trust_remote_code=True;FastAPI仅作HTTP外壳,不解决底层模型问题。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

确认模型已能本地跑通再封装
FastAPI只是个HTTP外壳,它不解决模型加载失败、显存溢出或tokenizer.apply_chat_template()报错的问题。如果model.generate()在脚本里都卡死或返回空字符串,加再多路由也没用。
实操建议:
统一LLM网关 - 一个API对接70+AI模型,使用单一API密钥即可调用GPT、Claude、Gemini、Qwen、Deepseek、Grok等主流模型。
- 先写个最小验证脚本:加载模型 + 单条
messages=[{"role": "user", "content": "你好"}]输入 + 调用generate(),确保有合理输出 - 若报
CUDA out of memory,别急着改FastAPI,先试device_map="auto"或量化(如load_in_4bit=True) - DeepSeek-V4必须设
trust_remote_code=True,否则from_pretrained()会找不到DeepseekV4ForCausalLM类
定义OpenAI兼容的/v1/chat/completions端点
不照搬OpenAI字段名,客户端SDK(比如openai Python包)会直接解析失败,连model参数都传不进后端。
实操建议:
- 请求体必须用
pydantic.BaseModel严格定义,包含model、messages、temperature、max_tokens等字段,不能少也不能拼错 -
messages要转成DeepSeek专用格式:用tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True),不是简单拼接 - 生成时固定加
do_sample=True, top_p=0.95, repetition_penalty=1.1——这是V4官方推荐解码组合,省得调参
流式响应必须用StreamingResponse配生成器
直接在for token in outputs循环里yield字符串不行,前端收不到SSE事件;用JSONResponse返回整个结果更不行,长文本会超时卡死。
实操建议:
- 当
stream=True时,函数必须返回StreamingResponse(generator_func(), media_type="text/event-stream") - 生成器内部每次
yield f"data: {json.dumps(chunk)}\n\n",注意末尾两个换行符,缺一个前端就收不到 - 每个
chunk里必须含"delta": {"content": "xxx"}和"finish_reason"字段,否则LangChain等工具无法识别流式结束
上线前必须加健康检查和GPU绑定
没/health端点,K8s或Nginx健康探针会反复重启服务;不显式指定GPU,多卡机器上模型可能被调度到空闲卡,但tokenizer还在CPU,导致tensor device mismatch错误。
实操建议:
- 加
@app.get("/health")返回{"status": "ok", "model": "deepseek-v4-202604"},并带上X-Model-Version响应头 - 加载模型时强制指定
device_map={"transformer.h.0": "cuda:0", ...}或至少device="cuda:0",别依赖"auto"——它在线上环境可能选错设备 - 启动命令用
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 1 --limit-concurrency 100,--workers设太高反而触发CUDA上下文冲突
data:格式、GPU设备硬绑定、apply_chat_template的调用时机——这三点线上出问题的概率最高,调试时容易绕进去很久。


















