使用 Ollama 部署 Deepseek
使用Ollama部署Deepseek
·
使用 Ollama 部署 Deepseek 模型
Ollama 与传统部署方法的主要区别
| 特性 | 传统部署方法(之前的文章) | Ollama 方法 |
|---|---|---|
| 部署复杂度 | 高(需要手动设置环境、依赖和量化) | 低(简化的命令行界面) |
| 技术要求 | 需要 Python 和机器学习库知识 | 基本命令行知识即可 |
| 灵活性 | 高度可定制(训练参数、模型结构等) | 相对较低,但足够大多数使用场景 |
| 资源管理 | 手动管理(需自行优化内存使用) | 自动处理(内置优化) |
| API 集成 | 需要自行实现 | 内置 REST API |
| 易用性 | 较复杂 | 简单直观 |
1. Ollama 安装
Windows
- 下载并安装 Ollama for Windows
- 安装完成后,Ollama 会自动在后台运行
macOS
curl -fsSL https://ollama.ai/install.sh | sh
Linux
curl -fsSL https://ollama.ai/install.sh | sh
验证安装
安装完成后,打开终端(命令行)并运行:
ollama --version
2. 使用 Ollama 部署 Deepseek 模型
2.1 拉取 Deepseek 模型
Ollama 简化了模型获取过程,只需一条命令即可下载并准备模型:
ollama pull deepseek:latest
如果需要特定版本的 Deepseek 模型:
ollama pull deepseek:7b # 7B 版本
ollama pull deepseek-coder # 代码版本
2.2 运行 Deepseek 模型
拉取完成后,可以直接在命令行中与模型对话:
ollama run deepseek
或指定特定版本:
ollama run deepseek:7b
3. 使用 Ollama API
Ollama 自带 REST API,可以轻松集成到任何应用程序中:
3.1 启动 Ollama 服务
# Ollama 在安装后会自动运行服务
# 如果没有运行,可以手动启动
ollama serve
3.2 通过 API 与模型交互
curl -X POST http://localhost:11434/api/generate -d '{
"model": "deepseek",
"prompt": "写一个简短的 Python 函数来计算斐波那契数列",
"stream": false
}'
3.3 使用 Python 调用 API
import requests
import json
def generate_response(prompt, model="deepseek"):
response = requests.post('http://localhost:11434/api/generate',
json={
'model': model,
'prompt': prompt,
'stream': False
})
return response.json()['response']
# 使用示例
result = generate_response("解释一下量子计算的基本原理")
print(result)
4. 创建自定义 Deepseek 模型 (Modelfile)
如果需要自定义模型参数或行为,可以创建 Modelfile:
# 创建 Modelfile
cat > Modelfile << EOF
FROM deepseek:7b
# 设置系统提示
SYSTEM """你是一个专业的中文助手,专注于提供准确、有用的回答。"""
# 设置参数
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER top_k 40
EOF
# 创建自定义模型
ollama create my-deepseek -f Modelfile
# 运行自定义模型
ollama run my-deepseek
5. 网站集成
5.1 前端集成示例 (HTML+JavaScript)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Deepseek Ollama 演示</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
.chat-container {
border: 1px solid #ddd;
padding: 20px;
height: 400px;
overflow-y: auto;
margin-bottom: 20px;
border-radius: 8px;
}
.user-message {
background-color: #e6f7ff;
padding: 10px;
border-radius: 8px;
margin-bottom: 10px;
}
.bot-message {
background-color: #f0f0f0;
padding: 10px;
border-radius: 8px;
margin-bottom: 10px;
}
.input-container {
display: flex;
}
#user-input {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
margin-right: 10px;
}
button {
background-color: #1890ff;
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
}
</style>
</head>
<body>
<h1>Deepseek Ollama 对话演示</h1>
<div class="chat-container" id="chat-container"></div>
<div class="input-container">
<input type="text" id="user-input" placeholder="输入您的问题...">
<button id="send-button">发送</button>
</div>
<script>
const chatContainer = document.getElementById('chat-container');
const userInput = document.getElementById('user-input');
const sendButton = document.getElementById('send-button');
function addMessage(text, isUser) {
const messageDiv = document.createElement('div');
messageDiv.className = isUser ? 'user-message' : 'bot-message';
messageDiv.textContent = text;
chatContainer.appendChild(messageDiv);
chatContainer.scrollTop = chatContainer.scrollHeight;
}
async function sendMessage() {
const message = userInput.value.trim();
if (!message) return;
// 添加用户消息到聊天框
addMessage(message, true);
userInput.value = '';
userInput.disabled = true;
sendButton.disabled = true;
try {
// 发送请求到 Ollama API
const response = await fetch('http://localhost:11434/api/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: "deepseek",
prompt: message,
stream: false
}),
});
const data = await response.json();
// 添加模型回复到聊天框
addMessage(data.response, false);
} catch (error) {
console.error('Error:', error);
addMessage('抱歉,连接服务器时出现错误', false);
} finally {
userInput.disabled = false;
sendButton.disabled = false;
userInput.focus();
}
}
sendButton.addEventListener('click', sendMessage);
userInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') sendMessage();
});
// 初始欢迎消息
addMessage('你好!我是基于 Deepseek 的 Ollama 助手,有什么可以帮助你的吗?', false);
</script>
</body>
</html>
5.2 使用 Flask 与 Ollama API 集成
from flask import Flask, render_template, request, jsonify
import requests
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html') # 使用上面的 HTML 模板
@app.route('/api/chat', methods=['POST'])
def chat():
data = request.json
user_message = data.get('message', '')
# 调用 Ollama API
response = requests.post('http://localhost:11434/api/generate',
json={
'model': 'deepseek',
'prompt': user_message,
'stream': False
})
result = response.json()
return jsonify({"response": result.get('response', '')})
if __name__ == '__main__':
app.run(debug=True)
6. 优化与高级功能
6.1 流式输出 (Streaming)
import requests
import json
# 使用流式响应
response = requests.post(
'http://localhost:11434/api/generate',
json={
'model': 'deepseek',
'prompt': '解释一下量子计算',
'stream': True
},
stream=True
)
for line in response.iter_lines():
if line:
data = json.loads(line)
if 'response' in data:
print(data['response'], end='', flush=True)
if data.get('done', False):
print() # 换行
6.2 嵌入向量 (Embeddings)
import requests
import json
response = requests.post(
'http://localhost:11434/api/embeddings',
json={
'model': 'deepseek',
'prompt': '人工智能的未来发展'
}
)
embeddings = response.json()['embedding']
print(f"向量维度: {len(embeddings)}")
6.3 调整生成参数
ollama run deepseek --temperature 0.5 --top-p 0.9
6.4 多轮对话
通过在 API 调用中保持对话历史来实现多轮对话:
import requests
history = []
def chat(user_input):
global history
# 构建完整的提示,包含历史对话
full_prompt = ""
for entry in history:
full_prompt += f"User: {entry['user']}\n"
full_prompt += f"Assistant: {entry['assistant']}\n"
full_prompt += f"User: {user_input}\nAssistant: "
# 调用 API
response = requests.post(
'http://localhost:11434/api/generate',
json={
'model': 'deepseek',
'prompt': full_prompt,
'stream': False
}
)
assistant_response = response.json()['response']
# 更新历史
history.append({
'user': user_input,
'assistant': assistant_response
})
return assistant_response
# 使用示例
print(chat("你是谁?"))
print(chat("请给我写一首关于春天的短诗"))
7. Ollama 与传统部署对比
7.1 优势
- 极简部署:无需手动设置深度学习环境,一条命令即可部署模型
- 内置优化:自动处理量化、内存管理和其他优化工作
- 用户友好:简单的 CLI 和 API 接口,适合非专业人士使用
- 统一平台:可以轻松切换和管理多种模型
- 资源效率:优化的运行时环境,减少资源消耗
- 内置 API:免去了手动实现 API 的麻烦
7.2 局限性
- 定制化有限:不如直接使用底层库那样灵活可定制
- 训练功能受限:Ollama 主要专注于推理,而非训练或微调
- 参数调整有限:只能调整预设的参数,不能深度修改模型结构
- 高级功能缺失:某些专业功能(如分布式推理)可能不支持
- 版本控制:对于特定版本的模型支持可能滞后
8. 故障排除
8.1 模型下载问题
问题: 模型下载失败或速度慢
解决方案:
- 检查网络连接
- 使用
--insecure标志:ollama pull deepseek --insecure - 设置代理(如果需要)
8.2 内存问题
问题: OutOfMemory 错误
解决方案:
- 使用较小的模型版本(如
deepseek:7b而非更大的版本) - 关闭其他占用 GPU 内存的应用
- 在没有足够 GPU 的机器上,Ollama 会自动使用 CPU(但会很慢)
8.3 API 连接问题
问题: 无法连接到 API
解决方案:
- 确保 Ollama 服务正在运行:
ollama serve - 检查防火墙设置,确保端口 11434 开放
- 测试 API 是否响应:
curl http://localhost:11434/api/tags
9. 与 Deepseek 官方模型的兼容性
Ollama 支持的 Deepseek 模型可能与官方发布的完整模型有所差异:
- 模型可能经过优化以适应 Ollama 平台
- 某些最新的 Deepseek 版本可能存在延迟支持
- 功能集可能有所减少
如果需要使用 Deepseek 的所有最新功能和版本,可能仍需考虑一般的方法。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)