# 12 - Ollama 本地部署与调用

---

**本章课程目标：**

- 理解 **Ollama** 是什么、解决什么问题，以及它在整套 LangChain / Agent 学习路线里的位置。
- 掌握 Ollama 的**安装、模型目录配置、常用命令、模型拉取与验证**，并建立“本地模型运行”这条完整思路。
- 学会使用 **LangChain** 里的 `ChatOllama` 调用本机 Ollama 服务，理解它与 [第 11 章 Model I/O 与模型接入](11-Model-I-O与模型接入.md) 中云端模型调用的异同。

**学习建议：** Ollama 的重点不是多背几个命令，而是亲手确认“本地模型能被服务化调用”。先装好 Ollama，拉取一个小模型，用命令行验证能回答，再接到 LangChain 的 `ChatOllama`。读代码时顺手记下模型名称、模型存放位置和机器资源限制，这些才是本地部署最常见的排障入口。

**官方文档与资源**：详见 [工具导航与参考资料索引 - 模型接入与本地运行](工具导航与参考资料索引.md#模型接入与本地运行)。

---

## 1、Ollama 简介

### 1.1 定义

**Ollama** 是一个用于**在本地运行开源大模型**的工具，本质是把模型下载、管理、加载、运行、暴露 API 这几件事封装起来的本地大模型运行环境。

一句话总结：

> **Ollama = 让你用很少的命令，在自己电脑上把开源大模型跑起来。**

安装好之后，你通常只需要像下面这样输入一条命令：

```bash
ollama run qwen:4b
```

如果本地还没有这个模型，Ollama 会先下载；下载完成后，它会直接启动并进入交互模式。从入门视角看，这比自己去处理模型权重、推理框架、启动服务、配置推理端口，要简单得多。

![Ollama 官方标志：羊驼线稿风格图标（品牌识别，常见于安装包与文档）](images/12/12-1-1-1.png)

### 1.2 Ollama 解决了什么问题

如果你已经学过前两章的云端模型调用，应该已经知道：通过阿里百炼、DeepSeek、OpenAI 这类平台调用模型，优点是简单、稳定、开箱即用；但它也有明显局限：需要联网；需要 API Key；会产生调用费用；某些场景下，数据不能离开本地机器或企业内网。

Ollama 对应的，正好是另一条路：**把模型放到你自己的电脑上跑。**

因此它最直接解决的是：

- **想离线使用模型**
- **想减少对云端 API 的依赖**
- **想做本地开发、本地测试**
- **想让敏感数据尽量不出本机**
- **想学习开源模型和本地推理的基本流程**

可以把它和云端 API 调用看作两种“模型接入方式”：

- **云端 API**：模型在别人服务器上，你通过网络调用
- **Ollama 本地运行**：模型在你机器上，你通过本机服务调用

### 1.3 Ollama 和云端 API 的区别

这里要先分清楚：很多同学学 Ollama 时会下意识地把它当成“另一个模型平台”，其实它更像是**本地运行层**。

| 维度                 | 云端 API（如阿里百炼、DeepSeek）     | Ollama                                                    |
| -------------------- | ------------------------------------ | --------------------------------------------------------- |
| **模型在哪**         | 厂商服务器上                         | 你自己的电脑上                                            |
| **是否需要 API Key** | 通常需要                             | 本地运行通常不需要                                        |
| **是否依赖联网**     | 是                                   | 本地调用可不依赖外网，但首次拉模型一般需要联网            |
| **成本**             | 按调用计费                           | 模型本地推理不按 token 计费，但会消耗本机算力、内存、磁盘 |
| **适合什么**         | 快速接入、稳定服务、无需本地硬件负担 | 本地开发、隐私敏感场景、离线测试、学习开源模型            |

从真实项目角度看，这两者不是非此即彼，而是经常配合使用：

- 本地开发阶段，用 Ollama 跑小模型验证逻辑
- 上线阶段，再切换到更强、更稳定的云端模型
- 或者企业内网环境中，本地 / 私有化模型与云端模型混合使用

### 1.4 使用场景

从项目角度给一个比较稳的建议：

- **本地开发 / 课程练习**：适合用 Ollama
- **企业内网原型 / 隐私敏感验证**：也很适合
- **对性能、稳定性、并发要求很高的正式推理服务**：要根据业务再评估是否继续用 Ollama，还是切向更专业的推理部署方案

但也要有合理预期：

- 它不等于“任何模型都能在你的电脑上丝滑跑起来”
- 它也不等于“本地跑一定比云端便宜或更强”
- 它更像一个**本地推理入口**，适合开发、实验、教学和一些轻中量应用

### 1.5 优势与局限

学习时，最好同时看到它的优点和边界。

**优势：**

- 安装和使用门槛低
- 命令简单，适合入门
- 模型管理方便，`pull / run / list / rm` 一套命令就够用
- 本地调用通常不需要 API Key
- 与 LangChain 的 `ChatOllama` 集成成熟

**局限：**

- 是否跑得动，强烈依赖你的机器配置
- 模型体积大，会占内存和磁盘
- 本地模型能力通常取决于你能跑多大的模型
- 高并发、企业级推理服务场景，不一定优先选 Ollama

所以，对这章最准确的定位应该是：

> **Ollama 很适合学习本地模型、开发调试和轻量本地服务，但不是所有生产场景的唯一方案。**

---

## 2、安装与配置

### 2.1 安装前先知道两件事

在真正安装之前，最容易忽略两件事：

1. **Ollama 程序本身不大，真正占空间的是模型**
2. **你未来可能会下载多个模型，因此模型目录最好一开始就想清楚**

这也是为什么很多教程安装完很快就会讲 `OLLAMA_MODELS`。  
因为模型文件一旦大起来，很容易把系统盘吃满。

### 2.2 下载方式

你可以从 Ollama 官网下载对应平台版本：

- **下载总入口**：https://ollama.com/download
- **Windows 下载页**：https://ollama.com/download/windows
- **macOS 下载页**：https://ollama.com/download/mac
- **Linux 下载页**：https://ollama.com/download/linux

Linux 下载页也提供非常常见的一键安装方式：

```bash
curl -fsSL https://ollama.com/install.sh | sh
```

Windows 和 macOS 则更常见的是图形安装包。  
另外，LangChain 官方 ChatOllama 文档还提到：

- macOS 用户也可以通过 Homebrew 安装：`brew install ollama`
- 并通过 `brew services start ollama` 启动服务

安装方式可以按系统来选：

- **Windows**：安装包最常见
- **macOS**：安装包或 Homebrew
- **Linux**：安装脚本 / 手动安装 / systemd 服务

### 2.3 运行环境与硬件预期

这里先把硬件预期说清楚，因为“能不能运行”不只是软件安装问题，更是硬件问题。

Ollama 跑得是否顺畅，主要受三件事影响：

- **模型大小**
- **系统内存 / 显存**
- **是否有可用 GPU 加速**

你可以先记一个粗略但实用的结论：

- **模型越大，占用的内存 / 显存越高**
- **小模型更适合本地学习**
- **不是所有电脑都适合一上来就跑 14B、32B、70B 级模型**

从经验上看，更适合先从体量较小的模型开始，例如：

- `qwen:4b`
- 类似 7B / 8B 量级模型

而不是一开始就追求更大的模型。这也是为什么本项目案例里使用了更适合本地体验的标签，例如 `qwen:4b`。

这里的模型名和 tag 都是教学示例。Ollama 模型库更新较快，实际可拉取的名称、参数规模和能力标签，请以 [Ollama 模型搜索页](https://ollama.com/search) 当前结果为准。

**1）内存（RAM）**

参数越多，通常越吃内存。常见量级可粗记为：

- **约 7B（70 亿参数）**：建议至少 **8GB 可用内存**再跑 7B 级别模型（系统与其它软件还会占一部分，留余量更稳）。
- **约 13B**：建议约 **16GB** 内存级别。
- **约 33B**：建议约 **32GB** 内存级别。

若内存不够，容易出现加载失败、极慢或频繁换页卡顿。

**2）磁盘空间**

模型文件体积往往不小，除程序本体外，建议整体为 Ollama 与模型**至少预留约 50GB** 可用空间（多装几个模型时还要再加）。

**3）CPU**

性能较好、**多核**的 CPU 更有利于推理与并行，在纯 CPU 跑模型时体验差异会更明显。

**4）显卡（GPU）**

Ollama **可以只用 CPU 跑**。在 **NVIDIA GPU** 且驱动/CUDA 环境正常时，通常会走 GPU 加速，速度一般明显好于纯 CPU；在 **Apple Silicon（M 系列）** 上，Ollama 通常会利用 **Metal** 做加速，同样不必手动配置训练框架。具体是否走加速、占用哪块设备，以本机运行日志与活动监视器为准。

### 2.4 自定义安装路径与模型目录

如果你希望把 Ollama 或模型文件安装到非默认路径，例如 D 盘、大容量盘或专门的数据盘，那么建议尽早规划模型目录。

**Windows 下尤其建议不要把大模型长期堆在系统盘。**

你可以先准备一个目录，例如：

```text
D:\devSoft\Ollama\models
```

然后再通过环境变量或图形设置告诉 Ollama：以后模型存这里。

![Windows 安装向导中自定义 Ollama 程序安装路径的操作步骤（动图）](images/12/12-2-4-1.gif)

### 2.5 修改模型存储目录

如果你想把模型存到默认目录之外，可以设置环境变量：

- **变量名**：`OLLAMA_MODELS`
- **变量值**：你希望存放模型的目录路径

例如：

```text
OLLAMA_MODELS=D:\devSoft\Ollama\models
```

![Windows「环境变量」对话框中新建用户变量 OLLAMA_MODELS 并指向自定义 models 目录](images/12/12-2-5-1.jpeg)

根据 Ollama 官方 FAQ，默认模型目录通常是：

- **macOS**：`~/.ollama/models`
- **Linux**：`/usr/share/ollama/.ollama/models`
- **Windows**：`C:\Users\%username%\.ollama\models`

如果你要改路径，官方同样建议用 `OLLAMA_MODELS`。另外要注意：

- **Windows**：Ollama 会继承系统 / 用户环境变量
- **Linux（标准安装）**：如果使用 systemd 服务，通常要通过 systemd 配置环境变量
- **macOS（应用形式运行）**：官方 FAQ 推荐使用 `launchctl setenv`

这些平台差异在 Ollama 官方 FAQ 中都有说明：

- https://docs.ollama.com/faq

### 2.6 迁移或复用已有模型目录

如果你之前已经在其他目录下载过模型，可以直接把已有模型目录迁移过去，避免重复下载。

![将已有 blobs、manifests 等模型目录内容复制到 OLLAMA_MODELS 指定路径以复用下载](images/12/12-2-6-1.jpeg)

这在实际开发里非常有用，比如：

- 换电脑盘符
- 重装系统后恢复模型
- 在多个课程目录之间复用同一批模型

### 2.7 图形界面修改模型目录

部分 Ollama 桌面应用版本支持通过设置界面修改模型存储位置。如果你使用的是桌面客户端，可以在设置中查看是否存在 **Model location** 或类似选项。

![Ollama 桌面客户端菜单中打开 Settings（设置）的入口位置](images/12/12-2-7-1.png)

![在 Settings 中将 Model location 改为课程资料或自定义的 models 文件夹](images/12/12-2-7-2.png)

改完后，建议：

1. 重启 Ollama
2. 新开终端
3. 运行 `ollama list` 确认模型是否被正确识别

### 2.8 各平台环境变量设置差异

这部分主要解决一个常见排障点：明明改了路径却不生效，往往是环境变量设置方式不对。

根据 Ollama 官方 FAQ：

**Windows：**

1. 先退出 Ollama
2. 打开系统环境变量设置
3. 为用户或系统创建 / 修改 `OLLAMA_MODELS`
4. 保存后重新启动 Ollama

**macOS：**

如果 Ollama 以应用形式运行，官方更推荐通过 `launchctl` 设置，例如：

```bash
launchctl setenv OLLAMA_HOST "0.0.0.0:11434"
```

同理，`OLLAMA_MODELS` 也可用相同方式设置，然后重启应用。

**Linux：**

如果 Ollama 以 systemd 服务运行，官方 FAQ 建议使用：

```bash
systemctl edit ollama.service
```

然后在 `[Service]` 下为每个变量增加一行，例如 `Environment="OLLAMA_MODELS=/path/to/models"`（可多条 `Environment=`），最后执行：

```bash
systemctl daemon-reload
systemctl restart ollama
```

所以你可以记住一个实用结论：

> **Windows 改系统环境变量，macOS 应用模式常用 `launchctl`，Linux 服务模式常用 `systemd`。**

---

## 3、常用命令

### 3.1 最常用的一组命令

安装完成后，你最常用到的其实就下面这些命令：

| 命令                                  | 说明                          |
| ------------------------------------- | ----------------------------- |
| `ollama pull llama3`                  | 下载指定模型                  |
| `ollama run llama3`                   | 运行模型并进入交互对话        |
| `ollama list`                         | 查看本机已下载模型            |
| `ollama rm llama3`                    | 删除模型                      |
| `ollama show llama3`                  | 查看模型详情                  |
| `ollama ps`                           | 查看当前加载中的模型          |
| `ollama stop llama3`                  | 停止正在运行的模型            |
| `ollama serve`                        | 启动 Ollama 本地服务          |
| `ollama create my-model -f Modelfile` | 基于 Modelfile 创建自定义模型 |

**退出 `ollama run` 交互对话**

用 `ollama run <模型名>` 进入聊天后，若要回到普通终端提示符：

- 在对话里输入 `/bye`（Ollama 提供的退出指令）；
- 或使用快捷键 **Ctrl+D**（向终端发送「结束输入」，在 macOS / Linux 上很常见；Windows 新终端多也支持，若无效可再试 **Ctrl+Z** 后回车，或直接关闭该终端标签页）。

### 3.2 ollama ps 命令说明

这条命令在真实项目里非常实用，因为它不只是告诉你“模型有没有运行”，还经常能帮助你判断：

- 模型是否真的加载了
- 是在 CPU 还是 GPU 上运行
- 当前有哪些模型驻留在内存中

Ollama 官方 FAQ 里也明确提到，`ollama ps` 可以帮助你看模型是否加载到了 GPU：

- `100% GPU`
- `100% CPU`
- 或 CPU / GPU 混合比例

这对排查“为什么本地这么慢”特别有帮助。

### 3.3 create 和 Modelfile 是什么

这属于进阶知识，但建议你先知道。Ollama 支持通过 **Modelfile** 创建自定义模型。可以把 Modelfile 理解为：

> **Ollama 中“如何基于一个已有模型，定义系统提示、参数、模板等规则”的配置蓝图。**

本章不会展开自定义模型构建细节，但你至少要知道：`ollama create my-model -f Modelfile` **不是**重新训练模型，而更像是**基于已有模型做运行时封装**（系统提示、参数、模板等）。

---

## 4、安装与验证模型

### 4.1 验证 Ollama 是否安装成功

建议安装完成后，先做两个最基础的验证：1. 命令是否可用；2. 本地服务是否真的在监听

#### 4.1.1 看版本号

在终端执行：

```bash
ollama --version
```

如果命令可用，会输出类似：

```text
ollama version is 0.x.x
```

这至少说明两件事：

- Ollama 已经安装
- 终端里能找到 `ollama` 命令

#### 4.1.2 看默认端口是否监听

Ollama 本地 API 默认端口是 **11434**。  
如果服务正常启动，通常会在这个端口监听。

Windows 下常见验证方式：

```bash
netstat -ano | findstr 11434
```

如果看到类似：

```text
TCP    127.0.0.1:11434        0.0.0.0:0              LISTENING
```

说明 Ollama 服务已经在本机监听。

根据 Ollama 官方 API 文档，本地 API 默认地址是：

```text
http://localhost:11434/api
```

但要注意一点：

- **直接调 Ollama 原生 API** 时，通常会看到 `/api/...`
- **LangChain 的 `ChatOllama`** 一般只需要写根地址，例如 `http://localhost:11434`

这个区别很关键，后面写 LangChain 代码时会再次用到。

默认情况下，Ollama 只监听 **127.0.0.1**（本机回环）。若需要局域网内其他设备访问本机 Ollama，需在启动前通过环境变量 **OLLAMA_HOST** 绑定地址（如 `0.0.0.0:11434`），具体写法见 [Ollama FAQ](https://docs.ollama.com/faq) 中 “How do I configure Ollama server?” 一节。

### 4.2 模型从哪里找

如果你想知道 Ollama 里有哪些模型，最直接的方式是去官方模型库：

- **模型搜索 / 模型库**：https://ollama.com/search

这里你可以看到：

- 模型名称
- 标签（tag）
- 参数规模
- 是否支持 vision / tools / thinking 等特性

Ollama 调用模型时，模型名和标签需要写完整。
比如：

- `qwen:4b`
- `qwen3:8b`
- `deepseek-r1:14b`

这些标签都是“模型名 + 规格”。

### 4.3 以通义千问为例运行模型

执行 `ollama run <模型名>` 时，**若本地还没有该模型，Ollama 会先自动拉取（pull）再启动对话**，无需先单独执行 `ollama pull`；若已拉取过则直接进入交互模式。下载完成后会进入交互式对话。

常见示例命令：

```bash
ollama run qwen:4b
ollama run qwen3:8b
```

如果你看到官方模型库里已经推荐了更新的 Qwen tag，可以优先使用当前页面里适合自己机器配置的轻量版本。

这里要提醒一句：

> **模型标签是否可用，要以当时官网模型库里的实际名称为准。**

不要死记教程里某个标签，最好学会自己去模型库里查。

### 4.4 使用课程资料中的离线模型

如果课程资料或你自己的磁盘里已经有现成的 `models` 目录，也可以直接通过：

- `OLLAMA_MODELS`
- 或图形界面里的 **Model location**

把 Ollama 指向那个目录，再执行：

```bash
ollama list
```

这样往往可以避免重复下载。

### 4.5 如何判断模型有没有真的跑起来

从学习和排障角度，最常用的判断方式有三种：

1. `ollama run <模型名>` 能正常进入对话
2. `ollama list` 能看到模型已下载
3. `ollama ps` 能看到模型正在内存中

在入门阶段，这三条基本足够。

---

## 5、LangChain 整合 Ollama

### 5.1 从命令行到项目接入

因为只会在终端里 `ollama run`，还不等于能把它接到自己的项目中。

真正的开发目标通常是：

- 在 Python 代码里调用本地模型
- 让本地模型也能接 Prompt、Parser、LCEL、Agent
- 让本地模型和云端模型一样，进入统一的 LangChain 生态

这也是本节的核心目的：

> **把 Ollama 从“命令行能聊天的工具”升级成“项目里能调用的模型端点”。**

![本地 LangChain 应用连接 Ollama 服务：代码发送请求，本地服务加载模型文件并返回 AI 回复](images/12/12-5-1-1.png)

### 5.2 ChatOllama 是什么

`ChatOllama` 是 LangChain 中用于连接本地 Ollama 聊天模型的类，它负责：

> **本地模型版本的 Chat Model 客户端。**

这意味着，它在使用体验上会和你前面学过的：

- `ChatOpenAI`
- `init_chat_model(...)`

有很多共通点：

- 都可以 `invoke()`
- 都会返回 `AIMessage`
- 都能继续接 Prompt、LCEL、Agent

区别只在于：

- 前面那些大多连接的是云端模型
- `ChatOllama` 连接的是本机 Ollama 服务

可以把两条模型接入路线这样对照：

| 路线 | 模型在哪里跑 | 主要优点 | 主要限制 |
| ---- | ------------ | -------- | -------- |
| 云端 API | 服务商服务器 | 省本机资源、模型能力强、维护少 | 数据会出本机，依赖网络、额度和平台稳定性 |
| Ollama | 本机或自管服务器 | 控制力强、适合本地实验和私有环境 | 受本机显存 / 内存限制，速度和并发要自己承担 |

所以 Ollama 不是“取代云端模型”，而是给你多了一条本地可控的模型接入路线。

### 5.3 最小用法：直接传字符串

最简单的写法可以这样：

```python
from langchain_ollama import ChatOllama

model = ChatOllama(
    model="qwen:4b",
    base_url="http://localhost:11434",
)

print(model.invoke("什么是 LangChain，100 字以内").content)
```

这和你在前面章节里学的“字符串 `invoke()`”几乎是一样的，只是端点从云端换成了本地。

### 5.4 消息列表写法：更贴近后续章节

如果你希望和 [第 13 章 提示词与消息模板](13-提示词与消息模板.md) 保持一致，也可以传消息列表：

```python
from langchain_core.messages import HumanMessage
from langchain_ollama import ChatOllama

ollama_llm = ChatOllama(model="qwen3:8b")
messages = [HumanMessage(content="你好，请介绍一下你自己")]
resp = ollama_llm.invoke(messages)
print(resp.content)
```

这种写法的价值在于：  
后面你学 Prompt、Messages、多轮历史、Agent 时，思路是连续的。

### 5.5 显式写 base_url 原因

很多人会好奇：为什么有时代码里写 `base_url="http://localhost:11434"`，有时不写？

这里可以按下面的规则处理：

- **不写**：默认走本机默认地址
- **写了**：更显式、更清楚，也方便你以后切到远程 Ollama 或不同端口

比如：

```python
ChatOllama(
    model="qwen3:8b",
    base_url="http://localhost:11434",
)
```

这在教学上也更直观，因为你能明确知道自己连的是哪个服务地址。

### 5.6 基本案例

【案例源码】`案例与源码-2-LangChain框架/03-ollama/LangChain_Ollama.py`

[LangChain_Ollama.py](案例与源码-2-LangChain框架/03-ollama/LangChain_Ollama.py ":include :type=code")

这个案例是本章最核心的代码落地点。  
它对应的是：

- 使用 `ChatOllama`
- 指向本机 `http://localhost:11434`
- 直接 `invoke()` 一个问题
- 观察返回结果

虽然它很短，但意义很大，因为它完成了下面这件事：

> **把 Ollama 从“终端中的本地模型”变成“LangChain 代码中的模型对象”。**

---

**章节思考题：**

1. Ollama 跑在本地，和调用云端 API 相比，真正改变了哪些事情？

   **参考思路：** 模型权重、推理计算和数据流主要在本机，隐私和控制力更强，但也要承担本机资源、模型下载、性能和运维问题。云端 API 更省资源，但数据会离开本机。

2. 如果 `ollama run` 可以回答，但 LangChain 代码调用失败，你会怎么查？

   **参考思路：** 先确认 Ollama 服务是否在 `11434` 端口运行，再查模型名是否一致、`ChatOllama` 配置是否正确、依赖版本是否安装、代码能否访问本机地址。命令行能跑不代表代码侧配置一定对。

3. 本地模型效果不好时，你会先换模型，还是先检查任务和提示词？

   **参考思路：** 先看任务是否适合当前模型规模，Prompt 是否清楚，输入是否过长或缺上下文。小模型能力有限，直接换大模型可能有效，但也要确认不是任务设计的问题。

4. 为什么本地部署时要关心模型大小、内存、显存和并发？

   **参考思路：** 本地机器资源有限，模型越大，占用越高，响应越慢，并发越容易卡。能不能用于个人实验和能不能支撑多人服务，是两回事。

**本章小结：**

- **Ollama** 是一个本地开源大模型运行环境，核心价值是让你可以在自己的电脑上下载、管理、运行模型，并通过本地 API 对外提供服务。它和前两章中的云端 API 调用不是替代关系，而是另一条“模型接入路线”：**云端模型在别人服务器上，本地模型在你自己机器上。**
- 本章的实践主线有两条：第一条是 **安装与模型管理**，包括下载 Ollama、规划模型目录、理解 `OLLAMA_MODELS`、掌握 `pull / run / list / rm / ps` 等常用命令；第二条是 **LangChain 接入**，也就是用 `ChatOllama` 把本地模型纳入与云端模型一致的编程方式中，继续使用 `invoke()`、消息列表和 `AIMessage` 这套统一抽象。
- 本章更重要的不是死记所有命令，而是建立一个完整认知：**Ollama 负责把模型跑在本地，LangChain 负责把本地模型接进代码和应用流程里。** 理解这一点之后，后面的 Prompt、LCEL、Agent、RAG 都可以继续在本地模型上练习。

**建议下一步：** 先亲手完成这条最小链路：安装 Ollama → `ollama run qwen:4b` 跑通一次本地模型 → 用 `案例与源码-2-LangChain框架/03-ollama/LangChain_Ollama.py` 在 Python 里调通本机模型。跑通之后，再进入 [第 13 章 提示词与消息模板](13-提示词与消息模板.md)、[第 14 章 输出解析器](14-输出解析器.md)、[第 15 章 LCEL 与链式调用](15-LCEL与链式调用.md)，把本地模型也串进完整的 LangChain 工作流里。
