DeepSeek-R1-Distill-Qwen-1.5B入门指南:如何用API方式调用Streamlit后端推理服务
DeepSeek-R1-Distill-Qwen-1.5B入门指南:如何用API方式调用Streamlit后端推理服务
想在自己的应用里集成一个智能对话助手,但又担心数据隐私和云端成本?今天给大家介绍一个超轻量、全本地部署的解决方案——DeepSeek-R1-Distill-Qwen-1.5B模型。这个模型只有1.5B参数,却融合了DeepSeek的逻辑推理能力和Qwen的成熟架构,经过蒸馏优化后,在普通电脑上就能流畅运行。
更重要的是,我们不仅会部署一个可视化的聊天界面,还会教你如何通过API方式调用这个服务,让你可以轻松地把AI能力集成到自己的项目中。无论你是想做个智能客服、代码助手,还是个人知识库,这套方案都能帮你快速实现。
1. 项目核心优势:为什么选择这个方案?
在开始动手之前,我们先看看这个方案有哪些吸引人的地方。了解清楚这些优势,你就能明白为什么值得花时间部署它。
1.1 全本地化运行,数据绝对安全
所有数据都在你的本地机器上处理,完全不经过任何云端服务器。这意味着:
- 隐私零风险:你的对话内容、问题、答案都不会离开你的电脑
- 网络不依赖:断网环境下照样能用,不受网络波动影响
- 成本可控制:没有API调用费用,用多少次都不花钱
模型文件就放在本地的/root/ds_1.5b路径下,推理过程完全在本地完成。对于处理敏感信息或者需要高度保密的应用场景,这个特性特别重要。
1.2 超轻量设计,硬件要求亲民
1.5B的参数规模听起来可能不小,但经过蒸馏优化后,实际运行需求大大降低:
- 低显存需求:4GB显存的GPU就能流畅运行
- CPU也能跑:没有独立显卡?用CPU模式照样可以工作
- 响应速度快:本地推理,没有网络延迟,回答秒级返回
我测试过,在一台普通的游戏笔记本上,这个模型就能很好地运行,完全不需要专业的服务器硬件。
1.3 专业推理能力,不只是聊天
这个模型最厉害的地方在于它的逻辑推理能力。它不只是简单地生成文本,而是真的会“思考”:
- 思维链推理:解题时会展示完整的思考过程
- 代码生成:写出的代码逻辑清晰,注释完整
- 数学解题:能解方程、做证明,步骤详细
- 逻辑分析:复杂问题能拆解成简单步骤
你可以把它想象成一个随时待命的私人助教,不仅给答案,还教你怎么得到答案。
2. 环境准备与快速部署
好了,心动不如行动,我们来看看怎么把这个服务跑起来。整个过程比你想的要简单得多。
2.1 基础环境检查
首先确认你的环境是否满足基本要求:
# 检查Python版本
python --version
# 需要Python 3.8或更高版本
# 检查PyTorch是否安装
python -c "import torch; print(torch.__version__)"
# 建议使用PyTorch 2.0+
# 检查CUDA(如果有GPU)
python -c "import torch; print(torch.cuda.is_available())"
如果你的环境里还没有这些,别担心,我们可以一步步来。
2.2 一键安装依赖
创建一个新的项目目录,然后安装所有需要的包:
# 创建项目目录
mkdir deepseek-chatbot
cd deepseek-chatbot
# 创建requirements.txt文件
cat > requirements.txt << 'EOF'
streamlit>=1.28.0
torch>=2.0.0
transformers>=4.35.0
accelerate>=0.24.0
sentencepiece>=0.1.99
protobuf>=3.20.0
EOF
# 安装依赖
pip install -r requirements.txt
这些包都是必需的:
streamlit:用来构建Web界面torch:深度学习框架transformers:加载和使用模型accelerate:优化模型加载和推理sentencepiece:分词器需要protobuf:模型文件解析需要
2.3 下载模型文件
模型文件比较大,我们直接从魔塔平台获取。如果你已经有下载好的模型,可以跳过这一步。
# download_model.py
import os
from huggingface_hub import snapshot_download
# 创建模型保存目录
model_dir = "/root/ds_1.5b"
os.makedirs(model_dir, exist_ok=True)
# 下载模型(这里需要你有魔塔的访问权限)
# 如果没有,可以从其他镜像源下载
print("开始下载模型文件...")
snapshot_download(
repo_id="deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B",
local_dir=model_dir,
local_dir_use_symlinks=False
)
print("模型下载完成!")
运行这个脚本,模型就会下载到本地。下载时间取决于你的网速,模型大小约3GB左右。
3. 构建Streamlit聊天界面
现在我们来创建主要的应用文件。这个界面会让你感觉像是在用专业的聊天工具。
3.1 创建主应用文件
创建一个名为app.py的文件,这是我们的核心应用:
# app.py
import streamlit as st
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
import time
# 设置页面配置
st.set_page_config(
page_title="DeepSeek R1 智能助手",
page_icon="🤖",
layout="wide"
)
# 在侧边栏添加说明
with st.sidebar:
st.title("🧠 DeepSeek R1 助手")
st.markdown("""
### 功能特点
- 🏠 **全本地运行**:数据不出本地
- ⚡ **快速响应**:秒级回答
- 🔒 **隐私安全**:零云端传输
- 🧩 **多场景适用**:代码、数学、逻辑推理
### 使用提示
1. 输入问题后按回车
2. 模型会展示思考过程
3. 点击清空按钮重置对话
""")
# 清空对话按钮
if st.button("🧹 清空对话", use_container_width=True):
st.session_state.messages = []
st.session_state.chat_history = []
torch.cuda.empty_cache() if torch.cuda.is_available() else None
st.rerun()
# 初始化对话历史
if "messages" not in st.session_state:
st.session_state.messages = []
if "chat_history" not in st.session_state:
st.session_state.chat_history = []
# 缓存加载模型和分词器
@st.cache_resource
def load_model():
"""加载模型和分词器,只执行一次"""
model_path = "/root/ds_1.5b"
st.info(f"🚀 正在加载模型: {model_path}")
start_time = time.time()
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
device_map="auto",
trust_remote_code=True
)
# 设置为评估模式
model.eval()
end_time = time.time()
st.success(f"✅ 模型加载完成!耗时: {end_time - start_time:.2f}秒")
return tokenizer, model
# 加载模型
tokenizer, model = load_model()
# 显示聊天消息
st.title("💬 DeepSeek R1 智能对话助手")
# 显示历史消息
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# 聊天输入框
if prompt := st.chat_input("考考 DeepSeek R1..."):
# 添加用户消息
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
# 生成AI回复
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""
# 构建对话历史
chat_history = st.session_state.chat_history + [{"role": "user", "content": prompt}]
# 应用聊天模板
inputs = tokenizer.apply_chat_template(
chat_history,
add_generation_prompt=True,
return_tensors="pt"
)
# 移动输入到正确的设备
if torch.cuda.is_available():
inputs = inputs.to("cuda")
# 生成回复
with torch.no_grad(): # 节省显存
outputs = model.generate(
inputs,
max_new_tokens=2048,
temperature=0.6,
top_p=0.95,
do_sample=True,
pad_token_id=tokenizer.eos_token_id
)
# 解码回复
response = tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokens=True)
# 格式化回复(处理思考过程标签)
formatted_response = response.replace("<|begin_of_thought|>", "**思考过程:**\n\n").replace("<|end_of_thought|>", "\n\n**最终回答:**\n\n")
# 流式显示回复
for chunk in formatted_response:
full_response += chunk
message_placeholder.markdown(full_response + "▌")
time.sleep(0.01) # 控制显示速度
message_placeholder.markdown(full_response)
# 更新对话历史
st.session_state.messages.append({"role": "assistant", "content": full_response})
st.session_state.chat_history = chat_history + [{"role": "assistant", "content": response}]
3.2 启动聊天服务
保存好app.py文件后,启动服务非常简单:
# 启动Streamlit服务
streamlit run app.py --server.port 8501 --server.address 0.0.0.0
看到终端输出类似下面的信息,就说明服务启动成功了:
You can now view your Streamlit app in your browser.
Local URL: http://localhost:8501
Network URL: http://192.168.1.100:8501
打开浏览器访问http://localhost:8501,就能看到聊天界面了。
4. 添加API接口功能
现在到了最关键的部分——如何通过API调用这个服务。这样你就能在其他程序里使用这个AI能力了。
4.1 创建API服务文件
我们创建一个新的文件api_server.py,专门提供API接口:
# api_server.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
import uvicorn
import time
# 创建FastAPI应用
app = FastAPI(title="DeepSeek R1 API服务", version="1.0.0")
# 定义请求和响应模型
class ChatMessage(BaseModel):
role: str # "user" 或 "assistant"
content: str
class ChatRequest(BaseModel):
messages: List[ChatMessage]
max_tokens: Optional[int] = 2048
temperature: Optional[float] = 0.6
top_p: Optional[float] = 0.95
class ChatResponse(BaseModel):
response: str
thinking_process: Optional[str] = None
final_answer: Optional[str] = None
usage: dict
# 全局变量存储模型和分词器
tokenizer = None
model = None
def load_models():
"""加载模型和分词器"""
global tokenizer, model
if tokenizer is None or model is None:
model_path = "/root/ds_1.5b"
print(f"正在加载模型: {model_path}")
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
device_map="auto",
trust_remote_code=True
)
# 设置为评估模式
model.eval()
print("模型加载完成!")
# 启动时加载模型
@app.on_event("startup")
async def startup_event():
load_models()
# API端点:健康检查
@app.get("/health")
async def health_check():
return {"status": "healthy", "model_loaded": model is not None}
# API端点:聊天接口
@app.post("/chat", response_model=ChatResponse)
async def chat_completion(request: ChatRequest):
"""处理聊天请求"""
try:
start_time = time.time()
# 准备输入
chat_history = [{"role": msg.role, "content": msg.content} for msg in request.messages]
# 应用聊天模板
inputs = tokenizer.apply_chat_template(
chat_history,
add_generation_prompt=True,
return_tensors="pt"
)
# 移动输入到正确的设备
if torch.cuda.is_available():
inputs = inputs.to("cuda")
# 生成回复
with torch.no_grad():
outputs = model.generate(
inputs,
max_new_tokens=request.max_tokens,
temperature=request.temperature,
top_p=request.top_p,
do_sample=True,
pad_token_id=tokenizer.eos_token_id
)
# 解码回复
response = tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokens=True)
# 处理思考过程
thinking_process = None
final_answer = None
if "<|begin_of_thought|>" in response and "<|end_of_thought|>" in response:
parts = response.split("<|end_of_thought|>")
thinking_part = parts[0].replace("<|begin_of_thought|>", "").strip()
answer_part = parts[1].strip() if len(parts) > 1 else ""
thinking_process = thinking_part
final_answer = answer_part
else:
final_answer = response
end_time = time.time()
# 计算使用情况
input_tokens = inputs.shape[1]
output_tokens = outputs.shape[1] - input_tokens
return ChatResponse(
response=response,
thinking_process=thinking_process,
final_answer=final_answer,
usage={
"input_tokens": int(input_tokens),
"output_tokens": int(output_tokens),
"total_tokens": int(input_tokens + output_tokens),
"processing_time": f"{end_time - start_time:.2f}s"
}
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"生成失败: {str(e)}")
# API端点:流式聊天接口
@app.post("/chat/stream")
async def chat_stream(request: ChatRequest):
"""流式聊天接口"""
# 这里可以实现流式输出,为了简洁先返回普通响应
response = await chat_completion(request)
return response
if __name__ == "__main__":
# 启动API服务
uvicorn.run(
app,
host="0.0.0.0",
port=8000,
log_level="info"
)
4.2 安装FastAPI依赖
运行API服务需要安装额外的包:
# 安装FastAPI和相关依赖
pip install fastapi uvicorn python-multipart
# 或者添加到requirements.txt
echo "fastapi>=0.104.0" >> requirements.txt
echo "uvicorn[standard]>=0.24.0" >> requirements.txt
echo "python-multipart>=0.0.6" >> requirements.txt
4.3 启动API服务
启动API服务也很简单:
# 启动API服务
python api_server.py
你会看到类似这样的输出:
INFO: Started server process [12345]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
现在API服务就在http://localhost:8000运行了。
5. 调用API的几种方式
API服务启动后,我们可以用多种方式调用它。下面我展示几种最常用的方法。
5.1 使用Python调用API
这是最直接的方式,适合在Python项目中使用:
# test_api.py
import requests
import json
# API地址
API_URL = "http://localhost:8000/chat"
# 准备请求数据
chat_data = {
"messages": [
{"role": "user", "content": "请用Python写一个快速排序算法"}
],
"max_tokens": 1024,
"temperature": 0.6,
"top_p": 0.95
}
# 发送请求
try:
response = requests.post(
API_URL,
json=chat_data,
headers={"Content-Type": "application/json"},
timeout=60 # 60秒超时
)
if response.status_code == 200:
result = response.json()
print("=== 思考过程 ===")
if result.get("thinking_process"):
print(result["thinking_process"])
print("\n=== 最终回答 ===")
print(result["final_answer"])
print("\n=== 使用统计 ===")
print(f"输入token数: {result['usage']['input_tokens']}")
print(f"输出token数: {result['usage']['output_tokens']}")
print(f"总token数: {result['usage']['total_tokens']}")
print(f"处理时间: {result['usage']['processing_time']}")
else:
print(f"请求失败: {response.status_code}")
print(response.text)
except requests.exceptions.RequestException as e:
print(f"请求错误: {e}")
except Exception as e:
print(f"其他错误: {e}")
5.2 使用cURL命令行调用
如果你喜欢用命令行,或者需要在脚本中调用:
# 简单的单次调用
curl -X POST "http://localhost:8000/chat" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "解释一下什么是机器学习"}
],
"max_tokens": 500
}'
# 带有多轮对话历史的调用
curl -X POST "http://localhost:8000/chat" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "什么是Python的装饰器?"},
{"role": "assistant", "content": "装饰器是Python中一种特殊的语法,用于修改或增强函数的行为..."},
{"role": "user", "content": "能给我一个具体的例子吗?"}
],
"temperature": 0.7
}'
5.3 创建简单的Web前端
如果你想做个简单的网页来调用API,可以创建一个HTML文件:
<!-- chat_frontend.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DeepSeek R1 聊天前端</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.chat-container {
background: white;
border-radius: 10px;
padding: 20px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.message {
margin: 10px 0;
padding: 10px;
border-radius: 5px;
}
.user-message {
background-color: #e3f2fd;
text-align: right;
}
.assistant-message {
background-color: #f5f5f5;
}
.thinking {
background-color: #fff3e0;
font-style: italic;
color: #666;
}
#input-area {
margin-top: 20px;
display: flex;
gap: 10px;
}
#user-input {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
}
button {
padding: 10px 20px;
background-color: #007bff;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
</style>
</head>
<body>
<div class="chat-container">
<h2>🤖 DeepSeek R1 聊天助手</h2>
<div id="chat-history"></div>
<div id="input-area">
<input type="text" id="user-input" placeholder="输入你的问题...">
<button onclick="sendMessage()">发送</button>
</div>
</div>
<script>
const API_URL = "http://localhost:8000/chat";
let chatHistory = [];
function addMessage(role, content, isThinking = false) {
const chatHistoryDiv = document.getElementById('chat-history');
const messageDiv = document.createElement('div');
messageDiv.className = `message ${role}-message ${isThinking ? 'thinking' : ''}`;
messageDiv.innerHTML = `<strong>${role === 'user' ? '你' : 'AI'}:</strong><br>${content}`;
chatHistoryDiv.appendChild(messageDiv);
chatHistoryDiv.scrollTop = chatHistoryDiv.scrollHeight;
}
async function sendMessage() {
const input = document.getElementById('user-input');
const message = input.value.trim();
if (!message) return;
// 添加用户消息
addMessage('user', message);
chatHistory.push({ role: 'user', content: message });
// 清空输入框
input.value = '';
try {
// 发送请求
const response = await fetch(API_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
messages: chatHistory,
max_tokens: 1024,
temperature: 0.6
})
});
if (!response.ok) {
throw new Error(`HTTP错误: ${response.status}`);
}
const data = await response.json();
// 显示思考过程
if (data.thinking_process) {
addMessage('assistant', data.thinking_process, true);
}
// 显示最终回答
if (data.final_answer) {
addMessage('assistant', data.final_answer);
}
// 更新对话历史
chatHistory.push({ role: 'assistant', content: data.response });
// 显示使用统计
const usageInfo = `[Tokens: 输入${data.usage.input_tokens} / 输出${data.usage.output_tokens} / 时间${data.usage.processing_time}]`;
addMessage('system', usageInfo);
} catch (error) {
addMessage('system', `错误: ${error.message}`);
}
}
// 支持回车发送
document.getElementById('user-input').addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
sendMessage();
}
});
</script>
</body>
</html>
把这个HTML文件保存下来,用浏览器打开就能直接用了。
6. 实际应用场景示例
了解了怎么调用API,我们来看看在实际项目中怎么用。这里有几个具体的例子。
6.1 集成到Flask Web应用
如果你有一个现有的Flask应用,可以这样集成:
# flask_integration.py
from flask import Flask, request, jsonify, render_template
import requests
import json
app = Flask(__name__)
# DeepSeek API配置
DEEPSEEK_API = "http://localhost:8000/chat"
@app.route('/')
def index():
"""渲染聊天页面"""
return render_template('chat.html')
@app.route('/api/chat', methods=['POST'])
def chat():
"""处理聊天请求"""
try:
data = request.json
user_message = data.get('message', '')
# 调用DeepSeek API
response = requests.post(
DEEPSEEK_API,
json={
"messages": [{"role": "user", "content": user_message}],
"max_tokens": 1024,
"temperature": 0.6
},
timeout=30
)
if response.status_code == 200:
result = response.json()
return jsonify({
"success": True,
"thinking": result.get("thinking_process", ""),
"answer": result.get("final_answer", ""),
"usage": result.get("usage", {})
})
else:
return jsonify({
"success": False,
"error": "API调用失败"
}), 500
except Exception as e:
return jsonify({
"success": False,
"error": str(e)
}), 500
@app.route('/api/code-review', methods=['POST'])
def code_review():
"""代码审查功能"""
data = request.json
code = data.get('code', '')
language = data.get('language', 'python')
prompt = f"""请审查以下{language}代码:
{code}
请提供:
1. 代码逻辑分析
2. 潜在问题
3. 改进建议
4. 优化后的代码示例"""
# 调用API进行代码审查
response = requests.post(
DEEPSEEK_API,
json={
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 2048,
"temperature": 0.3 # 代码审查需要更确定性的输出
}
)
if response.status_code == 200:
result = response.json()
return jsonify({
"review": result.get("final_answer", ""),
"thinking": result.get("thinking_process", "")
})
return jsonify({"error": "审查失败"}), 500
if __name__ == '__main__':
app.run(debug=True, port=5000)
6.2 创建命令行工具
如果你喜欢用命令行,可以创建一个简单的CLI工具:
# deepseek_cli.py
import argparse
import requests
import json
import sys
class DeepSeekCLI:
def __init__(self, api_url="http://localhost:8000"):
self.api_url = api_url
self.chat_history = []
def chat(self, message, stream=False):
"""发送聊天消息"""
self.chat_history.append({"role": "user", "content": message})
try:
endpoint = f"{self.api_url}/chat/stream" if stream else f"{self.api_url}/chat"
response = requests.post(
endpoint,
json={
"messages": self.chat_history,
"max_tokens": 1024,
"temperature": 0.6
},
timeout=60
)
if response.status_code == 200:
result = response.json()
# 显示思考过程
if result.get("thinking_process"):
print("\n🤔 思考过程:")
print("-" * 50)
print(result["thinking_process"])
print("-" * 50)
# 显示最终回答
if result.get("final_answer"):
print("\n💡 回答:")
print(result["final_answer"])
# 更新对话历史
self.chat_history.append({
"role": "assistant",
"content": result["response"]
})
# 显示使用统计
usage = result.get("usage", {})
print(f"\n📊 使用统计: {usage.get('input_tokens', 0)}输入 + {usage.get('output_tokens', 0)}输出 = {usage.get('total_tokens', 0)}tokens")
else:
print(f"错误: {response.status_code}")
print(response.text)
except Exception as e:
print(f"请求失败: {e}")
def clear_history(self):
"""清空对话历史"""
self.chat_history = []
print("对话历史已清空")
def interactive_mode(self):
"""交互式聊天模式"""
print("DeepSeek R1 命令行聊天工具")
print("输入 'quit' 退出,'clear' 清空历史")
print("-" * 50)
while True:
try:
user_input = input("\n你: ").strip()
if user_input.lower() == 'quit':
print("再见!")
break
elif user_input.lower() == 'clear':
self.clear_history()
continue
elif user_input:
self.chat(user_input)
except KeyboardInterrupt:
print("\n\n再见!")
break
except Exception as e:
print(f"错误: {e}")
def main():
parser = argparse.ArgumentParser(description="DeepSeek R1 命令行工具")
parser.add_argument("--api", default="http://localhost:8000", help="API地址")
parser.add_argument("--message", "-m", help="直接发送消息")
parser.add_argument("--interactive", "-i", action="store_true", help="交互模式")
args = parser.parse_args()
cli = DeepSeekCLI(args.api)
if args.message:
cli.chat(args.message)
elif args.interactive:
cli.interactive_mode()
else:
parser.print_help()
if __name__ == "__main__":
main()
使用方式:
# 交互模式
python deepseek_cli.py -i
# 单次提问
python deepseek_cli.py -m "Python中的列表和元组有什么区别?"
6.3 集成到Jupyter Notebook
如果你在Jupyter中做数据分析或机器学习,可以这样集成:
# 在Jupyter Notebook中使用
import requests
import json
from IPython.display import display, Markdown
class DeepSeekNotebook:
def __init__(self, api_url="http://localhost:8000"):
self.api_url = api_url
self.history = []
def ask(self, question, show_thinking=True):
"""提问并显示回答"""
print(f"🧑💻 问题: {question}")
print("-" * 50)
# 准备请求
self.history.append({"role": "user", "content": question})
try:
response = requests.post(
f"{self.api_url}/chat",
json={
"messages": self.history,
"max_tokens": 1024,
"temperature": 0.6
},
timeout=30
)
if response.status_code == 200:
result = response.json()
# 显示思考过程
if show_thinking and result.get("thinking_process"):
print("🤔 思考过程:")
print(result["thinking_process"])
print("-" * 50)
# 显示最终回答
answer = result.get("final_answer", "")
display(Markdown(f"**💡 回答:**\n\n{answer}"))
# 更新历史
self.history.append({
"role": "assistant",
"content": result["response"]
})
# 返回结果
return {
"thinking": result.get("thinking_process"),
"answer": answer,
"usage": result.get("usage", {})
}
else:
print(f"错误: {response.status_code}")
return None
except Exception as e:
print(f"请求失败: {e}")
return None
def clear(self):
"""清空对话历史"""
self.history = []
print("对话历史已清空")
# 在Notebook中使用
ds = DeepSeekNotebook()
# 提问
result = ds.ask("请解释梯度下降算法的原理")
# 继续提问(保持上下文)
result2 = ds.ask("那随机梯度下降和批量梯度下降有什么区别?")
7. 总结
通过今天的学习,你应该已经掌握了如何部署和使用DeepSeek-R1-Distill-Qwen-1.5B这个超轻量的本地AI助手。我们来回顾一下重点:
7.1 核心收获
-
全本地部署:你学会了如何在自己的机器上部署这个AI模型,完全不需要依赖云端服务,数据隐私有保障。
-
双模式使用:不仅可以通过Streamlit的Web界面直接聊天,还能通过API接口在其他项目中调用AI能力。
-
灵活集成:我展示了多种集成方式——Python脚本、命令行工具、Web应用、Jupyter Notebook,你可以根据需求选择最适合的方式。
-
实际应用:这个模型特别适合需要逻辑推理的场景,比如代码审查、数学解题、逻辑分析等,而且它的思考过程可视化功能让AI的“思考”变得透明。
7.2 使用建议
根据我的使用经验,给你几个实用建议:
-
硬件选择:如果有GPU,尽量用GPU运行,速度会快很多。没有GPU的话,CPU也能用,只是稍微慢一点。
-
参数调整:如果你需要更确定的回答(比如代码生成),可以把temperature调低到0.3-0.5;如果需要更多创意,可以调到0.7-0.9。
-
对话管理:长时间对话后,记得点击清空按钮或者调用清空接口,避免显存占用过多。
-
错误处理:在实际应用中,记得添加适当的错误处理和超时机制,确保服务稳定性。
7.3 下一步探索
如果你对这个方案感兴趣,还可以尝试:
- 性能优化:尝试量化模型,进一步降低显存占用
- 功能扩展:添加文件上传、图片理解等更多功能
- 部署优化:用Docker容器化部署,方便迁移和扩展
- 监控集成:添加使用统计、性能监控等功能
这个项目的最大优势就是灵活——你可以在自己的电脑上快速搭建一个私有AI助手,然后通过各种方式调用它。无论是个人学习、项目开发,还是企业内部工具,都能找到用武之地。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐
所有评论(0)