Ollama核心概念与架构
先别急着装,搞清楚 Ollama 的内部结构
上一篇选定了 Ollama + vLLM 双栈方案,这一篇正式进入 Ollama 的世界。
不过先别急着装。很多人第一次接触 Ollama,都是在网上看到一句话教程:终端里敲 ollama run qwen3,模型就跑起来了,还能聊天。体验很好,几分钟搞定。但接下来你会遇到一连串问题——
关掉终端窗口,模型还在不在?跑着呢还是停了?你的 Java 项目要怎么跟它对接?ollama serve 和 ollama run 到底啥关系?模型文件存哪了?同时跑 Chat 和 Embedding 两个模型会不会互相抢显存?别人文章里写的 OLLAMA_KEEP_ALIVE=-1 又是控制什么的?
这些问题网上教程不会讲,Ollama 的官方文档又散落在 GitHub README、FAQ、API 文档好几个地方,你得来回翻才能拼出全貌。
所以这一篇的定位,不是教你敲命令,而是帮你建立一张 Ollama 的完整认知地图。类比一下:你第一次用 Docker 之前,最好先搞清楚 image、container、Dockerfile、daemon 这些概念是什么关系,而不是上来就 docker run——跑是跑起来了,出了问题完全不知道该查哪里。Ollama 也是同样的道理。
下一篇再动手安装、拉模型、写代码。这一篇把概念打通,下一篇你跟着操作时就不会懵。
Ollama 是什么:一句话定位
上一篇讲过,本地部署中间件分两层:底层是推理引擎,负责算得快;上层是服务框架,负责用得爽。
Ollama 是上层服务框架,不是推理引擎。 它底层的推理引擎是 llama.cpp——那个用纯 C++ 写出来、让大模型能在普通电脑上跑起来的项目(最早是在 MacBook 上验证的,现在已经支持 macOS、Linux、Windows 全平台,CPU、NVIDIA GPU、Apple Silicon、AMD GPU 都能跑)。Ollama 做的事情是把 llama.cpp 的能力包装成一个好用的产品:模型仓库帮你管理模型,一条命令启动服务,REST API 让你的代码能调,CLI 工具让你在终端里交互。
用 Docker 来类比最直观。Docker 底层的容器运行时是 containerd + runc,但你日常打交道的只有 Docker CLI 和 Docker Daemon。你不需要知道 runc 怎么创建 cgroup,你只需要 docker pull 拉镜像、docker run 跑容器。Ollama 跟 Docker 的关系结构几乎一模一样——你不需要操心 llama.cpp 怎么做矩阵乘法,你只需要 ollama pull 拉模型、ollama run 跑推理。
这个类比不是我硬凑的,Ollama 的设计哲学就是对标 Docker。下面这张对照表能帮你快速建立认知锚:
| 维度 | Docker | Ollama |
|---|---|---|
| 后台服务进程 | Docker Daemon(dockerd) | Ollama Server(ollama serve) |
| 客户端工具 | Docker CLI(docker) | Ollama CLI(ollama) |
| 远程仓库 | Docker Hub | Ollama Registry(ollama.com/library) |
| 配置文件 | Dockerfile | Modelfile |
| 拉取命令 | docker pull nginx | ollama pull qwen3 |
| 运行命令 | docker run nginx | ollama run qwen3 |
| 版本标识 | nginx:1.25(image tag) | qwen3:32b(model tag) |
| 本地存储路径 | /var/lib/docker/ | ~/.ollama/models/ |
| 删除命令 | docker rmi nginx | ollama rm qwen3 |
| 查看本地列表 | docker images | ollama list |
记住这张表,后面每讲到一个 Ollama 的概念,你脑子里都能找到一个 Docker 的对应物。
Ollama 的架构:Client-Server 模式
Ollama 的运行架构非常标准:一个后台服务进程 + 多种客户端。理解这个架构是理解后面所有概念的基础。
1. ollama serve:后台服务进程
Ollama 启动后是一个常驻的 HTTP 服务,默认监听在 127.0.0.1:11434。这个进程是整个 Ollama 的核心,它负责四件事:
- 加载模型:把 GGUF 权重文件从磁盘加载到显存(GPU)或内存(CPU)
- 接收请求:通过 REST API 接收推理请求
- 调度推理:调用底层 llama.cpp 执行实际的推理计算
- 返回结果:把生成的文本通过 HTTP 响应返回给客户端
macOS 和 Windows 安装桌面版之后,ollama serve 会随系统自动启动,你在状态栏能看到一个小羊驼图标。Linux 上通过官方安装脚本安装后,会自动配好 systemd 服务并启动;如果你是手动下载二进制文件安装的,则需要自己配 systemd 或手动启动。
不管哪种方式,本质上都是在你的机器上跑了一个 HTTP Server。
2. CLI 命令:客户端调服务端
ollama run、ollama pull、ollama list、ollama rm、ollama show 这些命令看起来像是在直接操作模型,实际上它们每一个都是 HTTP 客户端——往 ollama serve 暴露的 API 发 HTTP 请求,拿到响应后格式化输出到终端。
这意味着什么?意味着你完全可以不用 CLI,直接用 curl、Postman、OkHttp 或者任何 HTTP 客户端去调 Ollama 的 API。CLI 只是官方提供的一个方便的客户端而已,不是唯一的入口。
举个例子,ollama list 这条命令背后做的事情,等价于:
curl http://localhost:11434/api/tags
ollama pull qwen3 背后做的事情,等价于:
curl -X POST http://localhost:11434/api/pull -d '{"name": "qwen3"}'
理解了这一层,你就不会再困惑一个常见的问题:我关掉了 ollama run 的终端窗口,模型是不是就停了?答案是不会——ollama run 只是一个交互式的 REPL 客户端,关掉它只是关掉了聊天窗口。真正在运行模型的是 ollama serve 后台进程,它还活着,模型还在显存里,你的 Java 应用照样能调 API。
3. 一张架构图
下面这张图把 Ollama 的 Client-Server 架构画清楚:
从图里可以看出,不管你是用 CLI、curl 还是 Java 代码,走的都是同一条路:HTTP 请求到 Ollama Server,Server 调度 llama.cpp 引擎在 GPU 或 CPU 上执行推理。
模型管理:拉取、存储、版本
搞清楚了架构,下一个问题是模型怎么管理。Ollama 在这一块的设计思路跟 Docker 管理镜像几乎一样。
1. ollama pull 拉了什么
很多人以为 ollama pull 只是下载了一个权重文件。实际上,拉下来的是一个完整的模型包,包含两部分:
- GGUF 文件:上一篇讲过,GGUF 是 llama.cpp 发明的单文件格式,把权重、tokenizer 词表、模型元数据全 打包在一个文件里。这是模型的核心,体积最大,也是推理时实际加载的文件
- Ollama 配置层:chat template(对话格式模板)、默认推理参数(temperature、num_ctx 等)、默认 system prompt、license 等。这些以独立的 blob 存储,可以覆盖 GGUF 文件内嵌的默认值
Ollama 的存储结构借鉴了 Docker 镜像的分层设计:一个 manifest 文件指向多个 blob,GGUF 权重是最大的那个 blob,模板、参数、system prompt 各自是一个小 blob。ollama pull 把这些全拉下来,所以之后就能直接 ollama run,不需要你自己去配 chat template、调参数。这跟 docker pull 拉下来的镜像包含了运行环境、依赖库、应用代码,docker run 就能直接跑,是同一个逻辑。
对比一下从 Hugging Face 手动下载 GGUF 文件的体验:现在主流的 GGUF 文件已经内嵌了 tokenizer、chat template 和基础元数据,用 llama.cpp 加载时能自动识别。但推理参数(num_ctx 设多大、temperature 设多少、repeat_penalty 要不要开)还得你自己定,想固化 system prompt 也要额外配置。Ollama 把这些选择题全帮你做好了——拉下来就是一套经过调试的默认配置,开箱即用。
2. 模型存储在哪里
ollama pull 下来的模型默认存在这些位置:
| 操作系统 | 默认路径 |
|---|---|
| macOS | ~/.ollama/models |
| Linux(用户安装) | ~/.ollama/models |
| Linux(系统服务安装) | /usr/share/ollama/.ollama/models |
| Windows | %USERPROFILE%\.ollama\models |
模型文件动辄几个 GB 到几十个 GB。一个 7B 的 Q4 量化模型大约 45GB,32B 的 Q4 量化大约 1820GB。如果你拉了好几个模型,磁盘空间会消耗得很快。
遇到磁盘空间紧张、或者想把模型放到一块大容量 SSD 上,可以通过 OLLAMA_MODELS 环境变量自定义存储路径。这个变量下一节讲环境变量时会详细说。