Skip to main content

Ollama核心概念与架构

先别急着装,搞清楚 Ollama 的内部结构

上一篇选定了 Ollama + vLLM 双栈方案,这一篇正式进入 Ollama 的世界。

不过先别急着装。很多人第一次接触 Ollama,都是在网上看到一句话教程:终端里敲 ollama run qwen3,模型就跑起来了,还能聊天。体验很好,几分钟搞定。但接下来你会遇到一连串问题——

关掉终端窗口,模型还在不在?跑着呢还是停了?你的 Java 项目要怎么跟它对接?ollama serveollama 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。下面这张对照表能帮你快速建立认知锚:

维度DockerOllama
后台服务进程Docker Daemon(dockerdOllama Server(ollama serve
客户端工具Docker CLI(dockerOllama CLI(ollama
远程仓库Docker HubOllama Registry(ollama.com/library)
配置文件DockerfileModelfile
拉取命令docker pull nginxollama pull qwen3
运行命令docker run nginxollama run qwen3
版本标识nginx:1.25(image tag)qwen3:32b(model tag)
本地存储路径/var/lib/docker/~/.ollama/models/
删除命令docker rmi nginxollama rm qwen3
查看本地列表docker imagesollama list

记住这张表,后面每讲到一个 Ollama 的概念,你脑子里都能找到一个 Docker 的对应物。

Ollama 的架构:Client-Server 模式

Ollama 的运行架构非常标准:一个后台服务进程 + 多种客户端。理解这个架构是理解后面所有概念的基础。

1. ollama serve:后台服务进程

Ollama 启动后是一个常驻的 HTTP 服务,默认监听在 127.0.0.1:11434。这个进程是整个 Ollama 的核心,它负责四件事:

  1. 加载模型:把 GGUF 权重文件从磁盘加载到显存(GPU)或内存(CPU)
  2. 接收请求:通过 REST API 接收推理请求
  3. 调度推理:调用底层 llama.cpp 执行实际的推理计算
  4. 返回结果:把生成的文本通过 HTTP 响应返回给客户端

macOS 和 Windows 安装桌面版之后,ollama serve 会随系统自动启动,你在状态栏能看到一个小羊驼图标。Linux 上通过官方安装脚本安装后,会自动配好 systemd 服务并启动;如果你是手动下载二进制文件安装的,则需要自己配 systemd 或手动启动。

不管哪种方式,本质上都是在你的机器上跑了一个 HTTP Server。

2. CLI 命令:客户端调服务端

ollama runollama pullollama listollama rmollama 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 环境变量自定义存储路径。这个变量下一节讲环境变量时会详细说。

3. tag 机制:同一个模型的多个变体

解锁付费内容,👉 戳