目录

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(Llama 3.2 90B)说明
模型能力最强接近但稍有不及对于大多数应用,差距已经很小
响应延迟低(服务端GPU 集群)取决于本地硬件M2 Max 上跑 7B 模型,延迟 ~50ms
数据隐私经过服务商完全本地Ollama 不联网也能工作
成本按 token 付费硬件一次性投入高用量下本地更划算
定制化有限(prompt)完全控制可以微调、改架构、加工具

1.3 什么时候不该用 Ollama

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

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

§2 安装与快速开始

2.1 硬件需求评估

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

所需内存(GB)≈ 参数量(B)× 2

原因是:每个参数需要 ~2 字节(FP16 或 INT8 量化)。

模型参数量最低内存推荐内存能不能跑(M 系列芯片)
1B-3B4GB8GB✅ M1 都能跑
7B-8B16GB16GB✅ M2 及以后
13B-14B28GB32GB⚠️ M1 Max 16GB 会 Swap
30B-34B64GB64GB⚠️ 只有 M2 Ultra 及以后
70B+140GB+不推荐❌ 消费级硬件不现实

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

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    UNTIL
# llama3.2       xxxxxx       2.0GB     100% GPU    2 minutes ago

如果没有用 GPU:

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

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

§3 模型管理

3.1 模型库概览与选择建议

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

模型系列代表模型参数量适合场景中文能力
Llamallama3.2, llama3.11B-405B通用对话、推理有限(训练数据以英文为主)
Qwenqwen2.5, qwen2.5-coder0.5B-72B中文任务、代码生成⭐⭐⭐⭐⭐ 最佳选择
Gemmagemma3, gemma22B-27B轻量高效,适合端侧一般
Mistralmistral, mixtral7B-8x22B推理、代码一般
Codecodellama, deepseek-coder7B-34B专门做代码代码不需要中文
Llavallava, llava-llama37B-34B多模态(图像+文本)取决于基础模型

选择建议:

  • 做中文应用 → 用 Qwen2.5 系列
  • 做代码助手 → 用 qwen2.5-coder 或 codellama
  • 想要最好的通用能力 → 用 llama3.2 或 llama3.1(但中文需要用英文 prompt)
  • 硬件有限(< 8GB 内存)→ 用 1B-3B 版本的模型

3.2 下载与管理

# 下载指定版本
ollama pull llama3.2:3b      # 3B 参数(最快,适合开发测试)
ollama pull llama3.2:11b     # 11B 参数(平衡)
ollama pull llama3.2:70b     # 70B 参数(需要大内存)

# 查看已下载的模型
ollama list

# 查看模型详情(包括 Modelfile 内容)
ollama show llama3.2

# 删除模型
ollama rm llama3.2: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。

  • 默认值是 2048(大约 1500 个中文字)
  • 如果你需要处理长文档,需要调大(4096、8192、16384)
  • 代价:上下文越长,内存占用越大,响应越慢

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;
    }
}

§6 多模态模型

6.1 什么是多模态

多模态模型可以「看懂」图片,然后回答关于图片的问题。Ollama 支持的多模态模型主要是 LLaVA 系列(Large Language and Vision Assistant)。

6.2 使用 LLaVA

# 下载 LLaVA(基于 Llama 3.2)
ollama pull llava

# 运行
ollama run llava

通过 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 --num-ctx 2048  # 默认可能是 8192

# 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 实例,前面加负载均衡:

# 实例 1
OLLAMA_HOST=0.0.0.0:11434 ollama serve &

# 实例 2
OLLAMA_HOST=0.0.0.0:11435 ollama serve &

# Nginx 负载均衡配置
upstream ollama {
    server localhost:11434;
    server localhost:11435;
}

10.2 KV Cache 复用

如果应用场景是「很多用户问类似的问题」,可以复用 KV Cache(键值缓存)来加速:

# Ollama 支持通过 session_id 复用上下文
response1 = client.chat.completions.create(
    model="qwen2.5:7b",
    messages=[{"role": "user", "content": "什么是 Python?"}],
    extra_body={"session_id": "user-123"}  # 复用这个 session 的 KV Cache
)

# 同一个 session_id 的后续请求会更快
response2 = client.chat.completions.create(
    model="qwen2.5:7b",
    messages=[{"role": "user", "content": "它有什么优缺点?"}],
    extra_body={"session_id": "user-123"}  # 复用
)

参考资源:

  • 官网: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