本地部署大模型完全指南②:Ollama一键部署DeepSeek与Qwen

看完硬件篇,环境搭好了。现在我们来实战部署国内最火的两款大模型——DeepSeek和通义千问,从下载到API调用全流程。

前言:为什么选DeepSeek和Qwen?

国内开源大模型在2026年已经非常成熟,其中最值得关注的两个:

对比项 DeepSeek R1 Qwen 2.5 (通义千问)
开发者 深度求索 阿里巴巴
参数量 671B(蒸馏版7B~70B) 0.5B~72B
中文能力 极强 极强
推理能力 顶级 优秀
代码能力 优秀 极强
上下文 128K tokens 128K tokens
开源协议 MIT Apache 2.0
生态集成 广泛 极其广泛

选择建议

  • 编程和数学推理 → DeepSeek(思维链能力强)
  • 综合任务与函数调用 → Qwen(工具调用生态好)
  • 多模型互补 → 两个都装,根据任务切换

一、Ollama核心操作实战

1.1 模型管理全命令

# 列出所有已下载的模型
ollama list

# 搜索Ollama Hub上的模型
ollama search deepseek

# 拉取模型(下载)
ollama pull deepseek-r1:7b

# 运行模型(如果没有会自动下载)
ollama run deepseek-r1:7b

# 停止运行中的模型
ollama stop deepseek-r1:7b

# 复制模型(创建副本)
ollama cp deepseek-r1:7b my-deepseek

# 删除模型
ollama rm deepseek-r1:7b

# 查看模型详细信息
ollama show deepseek-r1:7b

1.2 模型文件在哪?

# 默认存储位置
# Windows: C:\Users\用户名\.ollama\models
# Linux: ~/.ollama/models
# macOS: ~/.ollama/models

# 修改存储位置(见第①篇)
# 设置环境变量:OLLAMA_MODELS

1.3 模型选择策略

不同硬件配置下的推荐模型组合:

硬件配置 推荐模型 备注
4GB显存 deepseek-r1:1.5b / qwen2.5:1.5b 小模型,日常问答够用
8GB显存 deepseek-r1:7b / qwen2.5:7b 最佳入门配置
12GB显存 deepseek-r1:14b / qwen2.5:14b 能力明显提升
24GB显存 deepseek-r1:32b / qwen2.5:32b 接近GPT-4水平
多卡/服务器 deepseek-r1:70b+ / qwen2.5:72b 企业级

二、DeepSeek系列部署实战

2.1 一次性搞定:下载+运行

DeepSeek R1提供了多个蒸馏版本,从轻量到全量覆盖:

# 最推荐的入门版本(7B)
ollama run deepseek-r1:7b

# 如果你想看模型思考过程
ollama run deepseek-r1:7b:qwen_distill

# 升级到14B(需要12GB显存以上)
ollama pull deepseek-r1:14b
ollama run deepseek-r1:14b

2.2 测试DeepSeek的推理能力

DeepSeek的最大特色是思维链推理。运行后输入:

请计算:一个水池,甲管单独注满需要4小时,乙管单独注满需要6小时,
如果甲乙两管同时开,需要多久才能注满水池?

你会看到DeepSeek先展示思考过程(用中文或英文),再给出答案:

<think>
我需要计算两管同时开的工作效率。
甲管1小时注水:1/4
乙管1小时注水:1/6
两管同时开1小时注水:1/4 + 1/6 = 3/12 + 2/12 = 5/12
所以需要 1 ÷ (5/12) = 12/5 = 2.4 小时
</think>

甲乙两管同时开,需要2.4小时(即2小时24分钟)才能注满水池。

2.3 在代码中使用DeepSeek

Python调用:

import requests
import json

def ask_deepseek(prompt: str, model: str = "deepseek-r1:7b") -> str:
    """本地DeepSeek API调用"""
    url = "http://localhost:11434/api/generate"
    
    payload = {
        "model": model,
        "prompt": prompt,
        "stream": False,
        "options": {
            "temperature": 0.7,
            "top_p": 0.9
        }
    }
    
    response = requests.post(url, json=payload)
    if response.status_code == 200:
        return response.json()["response"]
    else:
        return f"Error: {response.status_code}"

# 使用示例
result = ask_deepseek("用Python写一个二分查找算法")
print(result)

Node.js调用:

const fetch = require('node-fetch');

async function askDeepSeek(prompt, model = 'deepseek-r1:7b') {
  const response = await fetch('http://localhost:11434/api/generate', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      model,
      prompt,
      stream: false,
      options: { temperature: 0.7 }
    })
  });
  
  const data = await response.json();
  return data.response;
}

// 使用
askDeepSeek('解释什么是RESTful API').then(console.log);

三、通义千问(Qwen)系列部署实战

3.1 下载运行Qwen

# Qwen 2.5 7B(推荐,综合能力强)
ollama run qwen2.5:7b

# Qwen 2.5 14B(需要12GB+显存)
ollama pull qwen2.5:14b
ollama run qwen2.5:14b

# Qwen 2.5 Coder(代码专用版)
ollama run qwen2.5-coder:7b

# Qwen 2.5 32B(接近GPT-4水平,需要24GB+)
ollama pull qwen2.5:32b

2 测试Qwen的函数调用能力

Qwen 2.5原生支持工具调用/函数调用,这是企业应用的关键能力:

import json
import requests

def qwen_with_tools():
    """测试Qwen的工具调用能力"""
    
    # 定义工具
    tools = [
        {
            "type": "function",
            "function": {
                "name": "get_weather",
                "description": "获取城市天气预报",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "city": {
                            "type": "string",
                            "description": "城市名称"
                        }
                    },
                    "required": ["city"]
                }
            }
        },
        {
            "type": "function",
            "function": {
                "name": "calculate",
                "description": "执行数学计算",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "expression": {
                            "type": "string",
                            "description": "数学表达式"
                        }
                    },
                    "required": ["expression"]
                }
            }
        }
    ]
    
    # Ollama Qwen API调用
    response = requests.post("http://localhost:11434/api/chat", json={
        "model": "qwen2.5:7b",
        "messages": [
            {"role": "user", "content": "帮我查一下北京的天气,然后计算3.14乘以2.5的结果"}
        ],
        "tools": tools,
        "stream": False
    })
    
    return response.json()

result = qwen_with_tools()
print(json.dumps(result, indent=2, ensure_ascii=False))

四、双模型并行部署方案

4.1 同时运行两个模型

# 终端1:运行DeepSeek
ollama run deepseek-r1:7b

# 终端2:运行Qwen(新开一个窗口)
ollama run qwen2.5:7b

两个模型会在后台作为独立服务运行,分别监听Ollama的API。

4.2 按任务切换模型

def smart_model_select(task: str) -> str:
    """根据任务类型自动选择最优模型"""
    
    programming_tasks = ["写代码", "debug", "算法", "架构设计"]
    reasoning_tasks = ["数学", "逻辑推理", "分析"]
    general_tasks = ["写作", "翻译", "问答", "总结"]
    
    if any(kw in task for kw in programming_tasks):
        return "qwen2.5-coder:7b"
    elif any(kw in task for kw in reasoning_tasks):
        return "deepseek-r1:7b"
    else:
        return "qwen2.5:7b"

# 使用
task = "帮我写一个Python的装饰器"
model = smart_model_select(task)
print(f"选择模型:{model}")

prompt = "帮我写一个Python装饰器,用于计算函数执行时间"
response = requests.post("http://localhost:11434/api/generate", json={
    "model": model,
    "prompt": prompt,
    "stream": False
})
print(response.json()["response"])

4.3 模型性能监控脚本

import subprocess
import json
import time

def monitor_model_performance(model_name: str, test_prompt: str) -> dict:
    """测试模型性能"""
    
    start = time.time()
    
    # 发送请求
    response = requests.post("http://localhost:11434/api/generate", json={
        "model": model_name,
        "prompt": test_prompt,
        "stream": False
    })
    
    elapsed = time.time() - start
    data = response.json()
    
    # 计算指标
    total_tokens = data.get("eval_count", 0)
    tokens_per_second = total_tokens / elapsed if elapsed > 0 else 0
    
    return {
        "model": model_name,
        "total_time_s": round(elapsed, 2),
        "tokens_generated": total_tokens,
        "speed_token_s": round(tokens_per_second, 2),
        "response_length": len(data.get("response", ""))
    }

# 对比测试
test_prompt = "请用Python写一个快速排序算法,包含详细注释"

results = []
for model in ["deepseek-r1:7b", "qwen2.5:7b", "llama3.1:8b"]:
    print(f"测试模型:{model}")
    perf = monitor_model_performance(model, test_prompt)
    results.append(perf)
    print(f"  速度:{perf['speed_token_s']} token/s")
    print(f"  耗时:{perf['total_time_s']}s")
    print()

# 输出对比表
print(f"{'模型':20} {'速度(tok/s)':15} {'耗时(s)':10}")
print("-" * 45)
for r in results:
    print(f"{r['model']:20} {r['speed_token_s']:<15} {r['total_time_s']:<10}")

五、模型管理与切换优化

5.1 设置别名和默认模型

# 创建特定用途的模型副本
ollama cp deepseek-r1:7b my-default

# 用Modelfile设置参数
cat > Modelfile << 'EOF'
FROM deepseek-r1:7b

# 降低随机性,适合代码生成
PARAMETER temperature 0.3
PARAMETER top_p 0.8
PARAMETER num_ctx 8192

# 设置系统角色
SYSTEM You are an expert Python developer assistant. Always provide complete, working code examples.
EOF

ollama create code-assistant -f Modelfile

5.2 批量测试多个模型

#!/bin/bash
# batch_test.sh - 批量测试模型

models=("deepseek-r1:7b" "qwen2.5:7b" "llama3.1:8b")
prompt="用Python写一个二分查找算法"

for model in "${models[@]}"; do
  echo "=== Testing: $model ==="
  time curl -X POST http://localhost:11434/api/generate \
    -d "{\"model\": \"$model\", \"prompt\": \"$prompt\", \"stream\": false}" \
    -o /dev/null -w "\nTime: %{time_total}s\n"
  echo ""
done

六、常见问题

Q1: 下载太慢怎么办?

# 设置国内镜像源
export OLLAMA_HOST=http://localhost:11434
# 手动下载模型文件(从ModelScope等国内源)
# 然后放到 ~/.ollama/models/blobs/ 目录

Q2: 显存不够跑大模型?

# 强制使用CPU运行
ollama run deepseek-r1:7b --num-gpu 0

Q3: 如何让模型记住对话历史?

# 维护消息列表来实现多轮对话
messages = [
    {"role": "system", "content": "你是一个友好的AI助手"},
    {"role": "user", "content": "我叫张三"},
    {"role": "assistant", "content": "你好张三!很高兴认识你。"},
    {"role": "user", "content": "我叫什么名字?"}  # 模型会根据历史回答
]

response = requests.post("http://localhost:11434/api/chat", json={
    "model": "deepseek-r1:7b",
    "messages": messages,
    "stream": False
})

总结

现在你的电脑上已经部署好了DeepSeek和通义千问,可以通过命令行或API随时调用。双模型并行让你能针对不同任务选择最合适的工具。

下一篇预告:第③篇《私有知识库搭建(Ollama + Dify)》—— 让你的本地模型能读懂自己的文档,构建真正的私有RAG知识库。


需要完整脚本和配置文件的同学,可以看我主页的付费资源专栏。

有问题欢迎评论区留言,大家一起讨论!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐