特性 | 传统部署方法(之前的文章) | Ollama 方法 |
---|---|---|
部署复杂度 | 高(需要手动设置环境、依赖和量化) | 低(简化的命令行界面) |
技术要求 | 需要 Python 和机器学习库知识 | 基本命令行知识即可 |
灵活性 | 高度可定制(训练参数、模型结构等) | 相对较低,但足够大多数使用场景 |
资源管理 | 手动管理(需自行优化内存使用) | 自动处理(内置优化) |
API 集成 | 需要自行实现 | 内置 REST API |
易用性 | 较复杂 | 简单直观 |
curl -fsSL https://ollama.ai/install.sh | sh
curl -fsSL https://ollama.ai/install.sh | sh
安装完成后,打开终端(命令行)并运行:
ollama --version
Ollama 简化了模型获取过程,只需一条命令即可下载并准备模型:
ollama pull deepseek:latest
如果需要特定版本的 Deepseek 模型:
ollama pull deepseek:7b # 7B 版本
ollama pull deepseek-coder # 代码版本
拉取完成后,可以直接在命令行中与模型对话:
ollama run deepseek
或指定特定版本:
ollama run deepseek:7b
Ollama 自带 REST API,可以轻松集成到任何应用程序中:
# Ollama 在安装后会自动运行服务
# 如果没有运行,可以手动启动
ollama serve
curl -X POST http://localhost:11434/api/generate -d '{
"model": "deepseek",
"prompt": "写一个简短的 Python 函数来计算斐波那契数列",
"stream": false
}'
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)
如果需要自定义模型参数或行为,可以创建 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
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>
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)
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() # 换行
import requests
import json
response = requests.post(
'http://localhost:11434/api/embeddings',
json={
'model': 'deepseek',
'prompt': '人工智能的未来发展'
}
)
embeddings = response.json()['embedding']
print(f"向量维度: {len(embeddings)}")
ollama run deepseek --temperature 0.5 --top-p 0.9
通过在 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("请给我写一首关于春天的短诗"))
问题: 模型下载失败或速度慢
解决方案:
--insecure
标志:ollama pull deepseek --insecure
问题: OutOfMemory
错误
解决方案:
deepseek:7b
而非更大的版本)问题: 无法连接到 API
解决方案:
ollama serve
curl http://localhost:11434/api/tags
Ollama 支持的 Deepseek 模型可能与官方发布的完整模型有所差异:
如果需要使用 Deepseek 的所有最新功能和版本,可能仍需考虑一般的方法。