跳到正文

目录

Ollama 本地大模型完全指南

学习目标

读完本文并完成配套练习后,你将能够:

  • 解释 Ollama 的架构定位:它解决了什么问题,以及它的能力边界在哪里
  • 针对你的硬件配置(内存大小、是否有 GPU)选择合适的模型尺寸
  • 理解 Modelfile 里每个参数的实际影响——不只是默认值,而是「调大/调小会发生什么」
  • 判断什么时候用 Ollama 的 API 就够了,什么时候需要换用 vLLM 或云 API
  • 在生产环境中部署 Ollama,包括安全配置、性能监控和故障恢复

阅读导航

  • 想直接跑起来 → 跳到 §2 安装与快速开始
  • 想理解「为什么要在本地跑 LLM」→ 重点看 §1 核心动机
  • 想搞清楚 temperature、top_p 这些参数到底在控制什么 → 重点看 §4 Modelfile 与参数调优
  • 想用 Ollama 做开发(API、LangChain 集成) → 重点看 §5 OpenAI 兼容 API 与开发集成
  • 想判断 Ollama 是否适合你的项目 → 重点看 §8 采用建议

§1 核心动机:为什么要在本地跑 LLM

1.1 云服务的问题

2026 年,大多数开发者第一次接触 LLM 是通过云 API(OpenAI、Anthropic、Google)。云 API 的优点很明显:开箱即用,不需要管基础设施。但它有几个结构性的问题:

数据隐私

你发给云 API 的每一句话,都会经过服务商的服务器。对于企业内部工具、医疗健康应用、法律文书分析等场景,这可能是合规红线。

成本结构

云 API 按 token 收费。对于一个每天要处理 100 万 token 的应用,一个月的 API 费用可能超过 1000 美元。而如果模型能在本地跑,边际成本趋近于零(只考虑电费和硬件摊销)。

可用性依赖

云服务可能宕机、可能限流、可能因政策变化而停止服务。本地模型完全自主。

1.2 Ollama 的定位

Ollama 不是「本地版的 GPT-4」。它的定位是:让开源大模型能在本地跑起来,且尽可能地好用

维度云 API(GPT-4o)Ollama(Qwen3:8b)说明
模型能力最强差一到两代日常任务够用,复杂推理仍有差距
响应延迟低(服务端 GPU 集群)取决于本地硬件7B 级模型在 Apple Silicon、消费级 GPU 上可交互
数据隐私经过服务商完全本地Ollama 不联网也能工作
成本按 token 付费硬件一次性投入高用量下本地更划算
定制化有限(prompt)完全控制可以微调、改架构、加工具

1.3 什么时候不该用 Ollama

说清楚边界和说清楚能力一样重要:

  • 你的应用需要 GPT-4o 级别的多模态能力(图像+视频理解)→ Ollama 的多模态模型(llava 等)能力和 GPT-4o 有差距
  • 你的用户量很大,且需要极低的响应延迟 → 需要考虑 vLLM 或云服务
  • 你没有合适的硬件(< 8GB 内存,没有 GPU)→ 本地跑不起来有意义的模型

§2 安装与快速开始

2.1 硬件需求评估

在安装之前,先搞清楚你的硬件能跑什么量级的模型。这不是精确科学,但是一个实用的估算公式:

所需内存(GB)≈ 参数量(B)× 每个参数的字节数

未量化(FP16)时每参数 2 字节;Ollama 下载的模型默认是 4-bit 量化(GGUF Q4_K_M),每参数约 0.5-0.6 字节。同一个模型,两种口径相差近 4 倍。

模型参数量FP16 理论内存Q4 量化后能不能跑(M 系列芯片)
1B-3B2-6 GB0.6-2 GB✅ M1 都能跑
7B-8B14-16 GB4-5 GB✅ M2 及以后
13B-14B26-28 GB8-9 GB⚠️ 16 GB 内存的 M 芯片建议量化
30B-34B60-68 GB18-21 GB⚠️ 需要 32 GB+ 统一内存
70B+140 GB+40 GB+❌ 消费级硬件不现实

量化能把需求压下来多少?

Ollama 默认用 4-bit 量化跑模型。量化后,内存需求大约是「参数量 × 0.5-0.7」。所以一个 7B 模型,量化后大约占 4-5GB 内存,大多数现代笔记本都能跑。

2.2 安装

macOS:

# 方法 1:官方安装包(推荐)
# 从 https://ollama.com/download 下载 .dmg

# 方法 2:Homebrew
brew install ollama

# 验证安装
ollama --version

Linux:

# 官方安装脚本(会自动检测 CUDA 或 Metal)
curl -fsSL https://ollama.com/install.sh | sh

# 验证
ollama --version
nvidia-smi  # 如果有 NVIDIA GPU,确认驱动正常

Windows:

https://ollama.com/download 下载安装包。WSL2 环境下也可以用 Linux 的安装方式。

2.3 第一个模型:从下载到对话

# 下载并运行 Llama 3.2(默认 3B 版本,适合大多数机器)
ollama run llama3.2

# 在交互式对话里测试
>>> 用一句话解释什么是大模型
大模型是通过学习大量文本数据,掌握语言规律,从而能够生成和理解文本的 AI 系统。

>>> /bye

第一次运行会下载模型。Llama 3.2 3B 大约 2GB,根据网速需要 1-5 分钟。

2.4 GPU 加速验证

安装完成后,确认 Ollama 在用 GPU(而不是纯 CPU,那样会慢 10-50 倍):

# 运行一个模型,然后在另一个终端查看 GPU 使用情况
ollama run llama3.2

# 另一个终端:
ollama ps
# 输出应该显示 PROCESSOR 是 GPU 而不是 CPU
# NAME             ID              SIZE      PROCESSOR    CONTEXT    UNTIL
# llama3.2         xxxxxx          2.0GB     100% GPU     4096       4 minutes from now

如果没有用 GPU:

# NVIDIA: 确认 CUDA 可用
nvidia-smi
# 如果报错,先安装 NVIDIA 驱动

# Apple Silicon: 确认 Metal 可用(macOS 12+ 默认支持)
system_profiler SPDisplaysDataType | grep "Metal"

§3 模型管理

3.1 模型库概览与选择建议

Ollama 支持 100+ 开源模型,但大多数用户只需要了解几个主要系列:

模型系列代表模型规模适合场景备注
Qwenqwen3, qwen3-coder0.6B-235B中文、代码、推理中文能力最强的开源系列之一
Llamallama4-scout, llama3.3, llama3.21B-405B通用对话、AgentScout 为 MoE,超大上下文
DeepSeekdeepseek-r11.5B-671B数学、推理R1 及其蒸馏小模型
Gemmagemma31B-27B轻量、端侧部分版本带视觉
Mistralmistral-small, mixtral7B-8x22B推理、结构化输出擅长 function calling
多模态llama3.2-vision, qwen3-vl2B-90B图像理解已取代老牌 llava
Embeddingnomic-embed-text, bge-m3-RAG 向量化不对话,只产出向量

选择建议:

  • 做中文应用 → 用 Qwen3 系列
  • 做代码助手 → 用 qwen3-coder 或 deepseek-coder-v2
  • 要推理能力(数学、逻辑) → 用 deepseek-r1 或小尺寸蒸馏版
  • 做 RAG 知识库 → 配一个 embedding 模型(如 nomic-embed-text)
  • 硬件有限(< 8GB 内存) → 用 1B-4B 版本的模型

3.2 下载与管理

# 下载指定版本
ollama pull qwen3:8b         # 8B 参数,中文与通用能力均衡
ollama pull qwen3:30b        # 30B 参数(MoE),需要 16GB+ 内存
ollama pull llama3.1:70b     # 70B 参数,需要 40GB+ 内存

# 查看已下载的模型
ollama list

# 查看模型详情(包括 Modelfile 内容)
ollama show qwen3:8b

# 删除模型
ollama rm llama3.1:70b

# 复制模型(用于创建自定义版本的基础)
ollama cp llama3.2 my-llama

3.3 模型存储位置

了解模型存在哪里,有助于管理磁盘空间:

# macOS / Linux
~/.ollama/models/

# Windows
C:\Users\你的用户名\.ollama\models\

每个模型大约占:

  • 1B 参数 ~0.7GB(4-bit 量化后)
  • 7B 参数 ~4.5GB
  • 70B 参数 ~40GB

§4 Modelfile 与参数调优

4.1 Modelfile 是什么

Modelfile 是 Ollama 的模型配置文件,类似于 Dockerfile。它定义了:

  • 基础模型(FROM)
  • 系统提示词(SYSTEM)
  • 模型参数(PARAMETER)
  • 可用的工具(TOOL)

4.2 创建一个自定义模型

# 创建 Modelfile
cat > Modelfile << 'EOF'
FROM qwen2.5:7b

# 系统提示词:定义模型的行为
SYSTEM """
你是一个专注于帮助开发者调试代码的助手。
你的回答风格:简洁、直接、给可运行的代码。
你擅长:Python、JavaScript、Rust。
请用中文回答。
"""

# 参数调优
PARAMETER temperature 0.3        # 低温度 = 更确定性的输出(适合代码生成)
PARAMETER top_p 0.9
PARAMETER num_ctx 8192           # 上下文长度(token 数)
PARAMETER repeat_penalty 1.1    # 防止重复
EOF

# 构建自定义模型
ollama create code-helper -f Modelfile

# 运行
ollama run code-helper

4.3 参数详解:每个参数在控制什么

这部分是大多数教程一笔带过、但实际应用中最重要的内容。

temperature(温度)

控制输出的随机性。

temperature = 0.0  → 每次都选概率最高的词(确定性)
temperature = 0.7  → 标准设置,有随机性但不极端
temperature = 1.5  → 非常随机,可能不连贯

怎么选?

任务类型推荐 temperature原因
代码生成0.1-0.3代码需要准确,不需要创意
翻译0.3-0.5翻译应该一致
创意写作0.7-1.0需要多样性
头脑风暴0.8-1.2需要跳出框架

top_p(核采样)

和 temperature 相关但不同。top_p 控制「累计概率达到多少的词元才会被考虑」。

top_p = 0.9  → 只考虑累计概率前 90% 的词元
top_p = 0.5  → 只考虑累计概率前 50% 的词元(更保守)

实用建议:大多数情况下,调 temperature 就够了。top_p 和 temperature 同时调会导致行为难以预测。建议固定 top_p=0.9,只调 temperature。

num_ctx(上下文长度)

模型一次能「看到」多少 token。Ollama 现在按显存动态设置默认值:显存 < 24 GiB 默认 4096,24-48 GiB 默认 32768,≥ 48 GiB 默认 262144。

  • 处理长文档、跑 Agent 或代码工具时,官方建议至少 64000
  • 通过 OLLAMA_CONTEXT_LENGTH=8192 ollama serve 改全局默认
  • 代价:上下文越长,KV Cache 占用越大,响应越慢;超过模型原生上限无效

repeat_penalty(重复惩罚)

防止模型陷入「重复循环」。

# 没有重复惩罚时,模型可能输出:
"这是一个很好的想法。这是一个很好的想法。这是一个很好的想法。..."

# repeat_penalty = 1.1 时,已经出现过的词元会被惩罚,降低重复概率

推荐值:1.1-1.3。太低(< 1.0)会导致更多重复,太高(> 1.5)会导致模型「词穷」。

4.4 系统提示词模板设计

系统提示词的质量直接决定模型表现。下面是两个常见场景的模板,先照抄,再按自己的任务调整:

代码助手模板:

你是一个 {语言} 代码助手。
规则:
1. 给出可运行的代码,不要给伪代码
2. 如果有多重实现方式,先给最简单的
3. 代码要有必要的注释
4. 如果用户的请求不清楚,先问澄清问题,不要猜

文档写作模板:

你是一个技术文档写作者。
风格要求:
- 用具体的例子说明抽象概念
- 每个代码块都有注释
- 避免「简单来说」「显而易见」这类话
- 中文技术文档,术语首次出现时附英文

§5 OpenAI 兼容 API 与开发集成

5.1 启动 API 服务

# 前台运行(适合开发测试)
ollama serve

# 后台运行
ollama serve &

# 指定监听地址(允许局域网其他设备访问)
OLLAMA_HOST=0.0.0.0:11434 ollama serve

默认端口是 11434。启动后,可以通过以下端点调用:

端点功能对应 OpenAI API
/v1/chat/completions对话生成client.chat.completions.create()
/v1/embeddings文本向量化client.embeddings.create()
/v1/models列出可用模型client.models.list()

5.2 用 OpenAI SDK 调用本地模型

from openai import OpenAI

# 指向本地 Ollama 服务
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"  # 占位符,Ollama 不需要真实 key
)

response = client.chat.completions.create(
    model="qwen2.5:7b",
    messages=[
        {"role": "system", "content": "你是一个 Python 代码助手"},
        {"role": "user", "content": "写一个快速排序"}
    ],
    temperature=0.3,
    stream=True  # 流式输出
)

# 处理流式响应
for chunk in response:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

5.3 与 LangChain 集成

from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate

# 初始化模型
llm = ChatOllama(
    model="qwen2.5:7b",
    temperature=0.7,
    base_url="http://localhost:11434"
)

# 使用 LangChain 的 prompt 模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专门帮助学习 Rust 的助手。"),
    ("human", "{input}")
])

chain = prompt | llm

# 调用
response = chain.invoke({"input": "解释一下 Rust 的所有权系统"})
print(response.content)

5.4 生产环境部署建议

不要用默认的 ollama serve 直接跑生产流量。原因:

  1. 没有认证机制(任何能访问 11434 端口的人都能调用)
  2. 没有速率限制
  3. 没有健康检查

推荐的生产部署架构:

[客户端] → [Nginx 反向代理] → [Ollama serve]
             ↓
          [认证中间件]
          [速率限制]

用 Nginx 做反向代理,在 Nginx 层加 API key 验证:

# /etc/nginx/sites-available/ollama
server {
    listen 80;
    server_name your-domain.com;

    location / {
        # API key 验证
        if ($http_x_api_key != "your-secret-key") {
            return 403;
        }

        proxy_pass http://localhost:11434;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

更稳妥的基线OLLAMA_HOST 只绑内网地址(默认 127.0.0.1:11434),对外统一走反向代理;用 OLLAMA_ORIGINS 限制允许跨域访问的来源。Ollama 没有内置 API Key 机制,认证必须放在反向代理层。


§6 多模态模型

6.1 什么是多模态

多模态模型可以「看懂」图片,然后回答关于图片的问题。Ollama 库里这类模型从早期的 LLaVA,到现在的 llama3.2-vision、qwen3-vl,选择比两年前多得多。

6.2 使用视觉模型

# 按能力和硬件选一个
ollama pull llava              # 老牌轻量视觉模型
ollama pull llama3.2-vision    # 11B 视觉模型
ollama pull qwen3-vl           # 阿里视觉模型,中文更好

通过 API 分析图片:

import base64
from openai import OpenAI

client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

# 读取本地图片并转为 base64
with open("/path/to/image.jpg", "rb") as f:
    image_b64 = base64.b64encode(f.read()).decode()

response = client.chat.completions.create(
    model="llava",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "这张图片里有什么?"},
            {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_b64}"}}
        ]
    }]
)

print(response.choices[0].message.content)

6.3 多模态的边界

LLaVA 的能力边界:

  • ✅ 能描述图片内容、回答关于图片的问题
  • ✅ 能读懂图片里的文字(OCR 能力)
  • ⚠️ 对复杂图表的数据提取不够精确(会「幻觉」数据)
  • ❌ 不能理解视频(需要视频多模态模型)
  • ❌ 能力和 GPT-4o 有差距,特别是对细节的观察

§7 常见问题与解决方案

7.1 内存不足

症状:运行模型时报错 cudaMalloc failed 或系统卡死。

解决方案

# 1. 换用更小的模型
ollama pull qwen2.5:3b   # 而不是 7b 或更大

# 2. 减少上下文长度(进入对话后设置)
ollama run qwen2.5:7b
>>> /set parameter num_ctx 2048

# 3. 查看内存使用情况
ollama ps
free -h     # Linux
# 活动监视器 → 内存 → 搜索 "ollama"  # macOS

7.2 GPU 不被识别

NVIDIA:

# 检查驱动
nvidia-smi
# 如果报错:NVIDIA-SMI has failed... → 重新安装驱动

# 检查 CUDA 可用性
python -c "import torch; print(torch.cuda.is_available())"

Apple Silicon:

# 确认 Metal 可用
system_profiler SPDisplaysDataType

# Ollama 在 macOS 上默认用 Metal,如果没用到 GPU:
# 1. 确认 macOS 版本 ≥ 12.0
# 2. 重装 Ollama
brew reinstall ollama

7.3 API 响应慢

排查步骤

# 1. 确认在用 GPU
ollama ps
# 如果 PROCESSOR 是 CPU → 检查 GPU 配置

# 2. 检查模型大小是否超出内存
ollama show qwen2.5:72b | grep "size"
# 如果 size > 可用内存 → 换小模型

# 3. 检查是否有其他进程占用了 GPU
nvidia-smi          # NVIDIA
sudo powermetrics --samplers gpu  # macOS,需要 sudo

§8 采用建议

8.1 Ollama 适合你,如果:

  • 你在开发需要调用 LLM 的应用,但不想每笔请求都付钱 → Ollama 的本地模型让你在开发阶段零成本迭代
  • 你的应用处理敏感数据(医疗、金融、法律) → 数据完全不出本地,合规友好
  • 你需要离线环境下也能用 LLM → Ollama 不联网也能工作
  • 你想对模型行为有完全控制权 → 可以微调、改系统提示词、换底层模型

8.2 Ollama 不适合你,如果:

  • 你的应用需要最强的多模态能力 → 用 GPT-4o API 或 Claude API
  • 你的流量很大(> 1000 请求/秒) → 需要 vLLM 或自建推理集群
  • 你的用户通过公网访问你的服务 → 你需要在服务器上部署 Ollama,并确保服务器硬件足够(这通常比直接用云 API 更贵,除非用量非常大)
  • 你没有合适的硬件 → 本地跑不起来有意义的模型,直接用云 API

8.3 Ollama vs vLLM:该用哪个

维度OllamavLLM
易用性⭐⭐⭐⭐⭐ 一条命令⭐⭐ 需要写 Python 代码
吞吐量中等极高(PagedAttention)
适用场景开发测试、本地工具、中小规模部署大规模生产部署
模型格式GGUF(GGML)PyTorch/HuggingFace 格式

建议:开发阶段用 Ollama,上线后如果吞吐量不够,再迁移到 vLLM。


§9 自测练习

完成以下练习,检验你的理解程度:

  1. 硬件评估:你的机器有多少内存?根据本文的估算公式,你能跑多大的模型?实际下载一个对应大小的模型,用 ollama ps 验证实际内存占用和估算是否接近。

  2. 参数实验:用同一个模型(比如 qwen2.5:7b),分别用 temperature=0.1 和 temperature=1.5 问同一个问题(「用 Python 写一个快速排序」),观察输出差异。解释为什么某些任务适合低 temperature。

  3. 上下文长度实验:创建一个 num_ctx=2048 的自定义模型和一个 num_ctx=8192 的自定义模型。向两者输入一个超长 prompt(> 3000 个 token),观察哪个能完整处理,哪个会截断。

  4. API 集成:用本文的 LangChain 代码示例,构建一个「给代码加注释」的小工具。输入一段无注释的 Python 代码,输出每段代码上面加了注释的版本。


§10 进阶:生产环境的性能优化

10.1 并发请求处理

Ollama 默认 OLLAMA_NUM_PARALLEL=1,同一模型一次只处理一个请求,其余排队;队列上限由 OLLAMA_MAX_QUEUE(默认 512)控制,满了直接返回 503。

开并发:让一个已加载的模型同时处理多个请求:

# 服务端设置并行数(需重启生效)
OLLAMA_NUM_PARALLEL=4 ollama serve

代价:每个并行槽位都会额外占用 KV Cache 显存。经验上每加一个槽位,7B 模型约多占基础显存的 15-25%。显存有余量再往上加。

如果多个模型经常切换,用 OLLAMA_MAX_LOADED_MODELS 控制同时驻留内存的模型数,避免频繁换入换出。

10.2 模型常驻与上下文延续

每次新请求如果模型已卸载,都要重新加载权重,这是最慢的一步。Ollama 默认把模型在内存里保留 5 分钟(keep_alive),期间后续请求直接复用已加载的模型和 KV Cache,首 token 延迟大幅下降。

# 请求级控制常驻时间(秒):-1 表示常驻不卸载
client.chat.completions.create(
    model="qwen3:8b",
    messages=[{"role": "user", "content": "什么是 Python?"}],
    extra_body={"keep_alive": -1},
)

# 用完改回 0,立即卸载释放内存
client.chat.completions.create(
    model="qwen3:8b",
    messages=[{"role": "user", "content": "结束"}],
    extra_body={"keep_alive": 0},
)

服务端可用 OLLAMA_KEEP_ALIVE 设置全局默认值。ollama psUNTIL 列会显示模型预计驻留到什么时候,据此判断是否需要调大 keep_alive


参考资源:

  • 官网:https://ollama.com
  • 模型库:https://ollama.com/library
  • GitHub:https://github.com/ollama/ollama
  • API 文档:https://github.com/ollama/ollama/blob/main/docs/api.md
  • LangChain + Ollama 集成指南:https://python.langchain.com/docs/integrations/llms/ollama/

每日 GitHub 趋势榜自动分析 | 数据来源:GitHub Trending

参与讨论

使用 GitHub 登录。欢迎补充事实、异议与实践。