基于 FastAPI 和 Azure 部署 Deepseek R1 的聊天服务 API proxy
- 🧠 强大的推理能力和思维链输出
- 🚀 支持流式响应和普通响应
- 🛡️ 完整的错误处理和日志记录
- 🌍 CORS 跨域支持
- 💡 健康检查接口
- 🔄 OpenAI 兼容接口
- 🎨 集成 OpenWebUI 提供友好的用户界面
DeepSeek-R1 是一个专注于推理任务的大型语言模型:
- 总参数量: 671B (37B 活跃参数)
- 上下文长度: 128K tokens 比官网多 2x
- 思维链输出: 支持通过 标签输出推理过程
- 最大输出: 8K tokens (不含思维链输出)
- 采用步进式训练过程
- 擅长语言、科学推理和编程任务
- 结合强化学习和精选数据集微调
- 在推理基准测试中达到领先性能
- 不要添加系统提示词,所有指令应包含在用户提示中
- 对于数学问题,建议在提示中包含:"Please reason step by step, and put your final answer within \boxed{}"
- 评估模型性能时,建议进行多次测试并取平均值
- 注意: 思维链输出(包含在 标签中)可能包含比最终响应更敏感的内容,在生产环境中可能需要考虑是否展示
cp .example.env .env编辑 .env 文件:
AZURE_INFERENCE_CREDENTIAL=<你的Azure密钥>
AZURE_INFERENCE_ENDPOINT=<你的Azure端点>docker compose up --build服务启动后:
- API 服务访问地址:http://localhost:8000
- OpenWebUI 访问地址:http://localhost:3000
-
API 服务配置:
- 资源限制: CPU 最大 2 核,内存 4G
- 资源预留: CPU 最小 1 核,内存 2G
- 健康检查: 每 30 秒检查一次/health 接口
- 日志配置: 单文件最大 20M,保留 5 个文件
- 自动重启: 容器异常退出时自动重启
- 优雅停止: 等待 30 秒完成清理
-
OpenWebUI 配置:
- 默认端口:3000
- 数据持久化:使用 Docker volume 存储
- 自动更新:使用最新的 main 分支镜像
POST /v1/chat/completions
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": "你好"
}
],
"stream": false,
"max_tokens": 1000,
"temperature": 0.7,
"top_p": 1.0
}from openai import OpenAI
# 创建客户端实例
client = OpenAI(api_key="fake-key", base_url="http://localhost:8000/v1")
# 发送普通请求
response = client.chat.completions.create(
model="DeepSeek-R1",
messages=[{"role": "user", "content": "你好,请介绍下自己"}]
)
# 分别打印推理过程和最终答案
message = response.choices[0].message
# type: ignore[attr-defined]
message_dict = message.model_dump() if hasattr(message, "model_dump") else vars(message)
reasoning_content = message_dict.get("reasoning_content", "") # 获取推理过程
content = message_dict.get("content", "") # 获取最终答案
print(f"推理过程: {reasoning_content}")
print(f"最终回答: {content}")
# 发送流式请求
stream = client.chat.completions.create(
model="DeepSeek-R1",
messages=[{"role": "user", "content": "给我讲个故事"}],
stream=True,
)
# 分别收集推理过程和最终答案
reasoning_content = ""
content = ""
for chunk in stream:
delta = chunk.choices[0].delta
# type: ignore[attr-defined]
delta_dict = delta.model_dump() if hasattr(delta, "model_dump") else vars(delta)
if "reasoning_content" in delta_dict: # 收集推理过程
delta_reasoning = delta_dict["reasoning_content"]
if isinstance(delta_reasoning, str):
reasoning_content += delta_reasoning
elif "content" in delta_dict: # 收集最终答案
delta_content = delta_dict["content"]
if isinstance(delta_content, str):
content += delta_content
print(f"\n推理过程: {reasoning_content}")
print(f"最终回答: {content}")POST /chat/completions
Content-Type: application/json
{
"messages": [
{
"role": "user",
"content": "你好"
}
],
"stream": false,
"temperature": 0.7,
"top_p": 1.0,
"frequency_penalty": 0.0,
"presence_penalty": 0.0
}| 接口 | 方法 | 描述 |
|---|---|---|
| /health | GET | 健康检查 |
| /info | GET | 获取模型信息 |
| 参数 | 类型 | 描述 | 必填 | 默认值 | 范围 |
|---|---|---|---|---|---|
| messages | array | 对话消息列表 | 是 | - | - |
| stream | boolean | 是否使用流式响应 | 否 | false | true/false |
| max_tokens | integer | 最大生成 token 数 | 否 | - | 0-8192 |
| model | string | 模型名称 | 否 | "DeepSeek-R1" | - |
注意:响应中会包含额外的 reasoning_content 字段,用于获取模型的推理过程。
| 参数 | 类型 | 描述 | 必填 | 默认值 | 范围 |
|---|---|---|---|---|---|
| messages | array | 对话消息列表 | 是 | - | - |
| stream | boolean | 是否使用流式响应 | 否 | false | true/false |
| max_tokens | integer | 最大生成 token 数 | 否 | - | 0-8192 |
| temperature | number | 采样温度 | 否 | - | 0.0-2.0 |
| top_p | number | 核采样概率 | 否 | - | 0.0-1.0 |
| frequency_penalty | number | 频率惩罚 | 否 | - | -2.0-2.0 |
| presence_penalty | number | 存在惩罚 | 否 | - | -2.0-2.0 |
| stop | string/array | 停止生成的标记 | 否 | - | - |
| seed | integer | 随机数种子 | 否 | - | - |
| response_format | object | 响应格式配置 | 否 | - | - |
| tools | array | 可用工具列表 | 否 | - | - |
| tool_choice | string/object | 工具选择配置 | 否 | - | - |
- Python 3.13+
- FastAPI
- Docker & Docker Compose
- Loguru
- Azure AI SDK
- OpenWebUI
欢迎所有形式的贡献,无论是新功能、文档改进还是问题反馈!
- Fork 本仓库
- 创建你的特性分支 (
git checkout -b feature/AmazingFeature) - 提交你的改动 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启一个 Pull Request
本项目采用 MIT 协议开源 - 查看 LICENSE 文件了解更多细节