使用 Ollama 部署 Deepseek

使用 Ollama 部署 Deepseek 模型

Ollama 与传统部署方法的主要区别

特性 传统部署方法(之前的文章) Ollama 方法
部署复杂度 高(需要手动设置环境、依赖和量化) 低(简化的命令行界面)
技术要求 需要 Python 和机器学习库知识 基本命令行知识即可
灵活性 高度可定制(训练参数、模型结构等) 相对较低,但足够大多数使用场景
资源管理 手动管理(需自行优化内存使用) 自动处理(内置优化)
API 集成 需要自行实现 内置 REST API
易用性 较复杂 简单直观

1. Ollama 安装

Windows

  1. 下载并安装 Ollama for Windows
  2. 安装完成后,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 优势

  1. 极简部署:无需手动设置深度学习环境,一条命令即可部署模型
  2. 内置优化:自动处理量化、内存管理和其他优化工作
  3. 用户友好:简单的 CLI 和 API 接口,适合非专业人士使用
  4. 统一平台:可以轻松切换和管理多种模型
  5. 资源效率:优化的运行时环境,减少资源消耗
  6. 内置 API:免去了手动实现 API 的麻烦

7.2 局限性

  1. 定制化有限:不如直接使用底层库那样灵活可定制
  2. 训练功能受限:Ollama 主要专注于推理,而非训练或微调
  3. 参数调整有限:只能调整预设的参数,不能深度修改模型结构
  4. 高级功能缺失:某些专业功能(如分布式推理)可能不支持
  5. 版本控制:对于特定版本的模型支持可能滞后

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 的所有最新功能和版本,可能仍需考虑一般的方法。

你可能感兴趣的:(大语言模型,人工智能,语言模型)