ollama:一条命令在本地跑起大模型,Go 写的推理运行时
ollama 用 Go 实现 CLI 与 SDK,一条命令拉取并离线运行 Kimi、GLM、DeepSeek、Qwen、Gemma 等模型,省去环境配置,适配 macOS、Wind
本地跑大模型,最贵的往往不是显卡,是配置。装 Python 环境、编译 CUDA、找 GGUF 文件、对齐量化版本、手写推理脚本——每一环都能劝退一批人。ollama 做的事很朴素:把这一整套流程收进一个 Go 二进制里,让「跑模型」变成和 docker run 同量级的动作。
它现在有 183649 个 star、18364 个 fork,MIT 许可,Go 写的,仓库 2023 年 6 月创建,最近一次推送是 2026 年 10 月。这些数字说明它已经不只是「一个人的小工具」,而是本地推理这条线上事实上的入口层。下面拆开看它凭什么站住这个位置。
一条命令背后,藏了哪几层
README 没有给架构图,但从它的功能边界能清楚划出四层。这不是我编的分层,每一层都对应 README 里真实存在的组件名。
第一层:分发与安装层。 它把「装」这件事做到几乎不需要思考。macOS 和 Linux 都是同一条 shell 管道,Windows 是 PowerShell 的 irm ... | iex,另有 Ollama.dmg 和 OllamaSetup.exe 手动下载入口,Docker 用户直接拉 Docker Hub 上的官方镜像 ollama/ollama。四类平台、五种入口,覆盖了绝大多数人第一次接触它的路径。
第二层:CLI 与启动器层。 裸敲 ollama 会进入一个交互式引导,提示你跑模型,或者把 ollama 接到已有的 agent / 应用上——README 点名的包括 Claude Code、OpenClaw、OpenCode、Codex、Copilot。ollama launch <integration> 是这一层的核心动词:ollama launch claude 起 Claude Code 集成,ollama launch openclaw 把 ollama 变成跨 WhatsApp、Telegram、Slack、Discord 的个人助手。这一层是 ollama 从「推理工具」转向「接入层」的关键。
第三层:模型运行时层。 ollama run gemma4 是它最原始也最核心的动作:拉模型、加载、进对话。模型清单在 ollama.com/library,README 里明确支持的后端只有一家——由 Georgi Gerganov 创立的 llama.cpp。也就是说,ollama 自己不重写推理内核,它把 llama.cpp 包成一个有服务、有生命周期、有模型管理的运行时。这是理解它定位的最重要一条。
第四层:接口层。 默认在 localhost:11434 暴露 REST API,/api/chat 是聊天端点。官方还维护 ollama-python 和 ollama-js 两个 SDK,pip install ollama / npm i ollama 即可。
数据流很直:CLI 或 SDK 发请求 → 本地 11434 端口的 REST 服务 → 运行时按模型名定位已拉取的模型 → 交给 llama.cpp 后端推理 → 结果按 stream 参数决定是流式返回还是一次性返回。模型管理(拉取、导入、Modelfile 定义)也在同一套服务里,所以它既是推理进程,也是模型仓库的本地代理。
| 层 | 核心组件 / 入口 | 职责 |
|---|---|---|
| 分发安装 | install.sh、install.ps1、dmg、exe、ollama/ollama 镜像 | 跨 macOS / Windows / Linux / Docker 落地 |
| CLI 与启动器 | ollama、ollama launch <integration> | 交互引导、拉起 Claude Code / Codex / Copilot CLI / OpenClaw 等集成 |
| 模型运行时 | ollama run、ollama.com/library、llama.cpp 后端 | 模型拉取、加载、推理、对话 |
| 接口 | localhost:11434 REST API、ollama-python、ollama-js | 给应用和 agent 提供统一调用面 |
从零到一次对话,实际敲什么
安装和最小用法都在 README 里,原样摘出来。
macOS / Linux:
shellcurl -fsSL https://ollama.com/install.sh | sh
Windows:
shellirm https://ollama.com/install.ps1 | iex
装完直接跑一个模型:
shellollama run gemma4
想接 coding agent,用启动器:
shellollama launch claude
不想用 CLI、想从代码里调,走 REST。这是 README 里的原始请求:
shellcurl http://localhost:11434/api/chat -d '{ "model": "gemma4", "messages": [{ "role": "user", "content": "Why is the sky blue?" }], "stream": false }'
Python 侧更短:
pythonfrom ollama import chat response = chat(model='gemma4', messages=[ { 'role': 'user', 'content': 'Why is the sky blue?', }, ]) print(response.message.content)
JavaScript 侧同构:
javascriptimport ollama from "ollama"; const response = await ollama.chat({ model: "gemma4", messages: [{ role: "user", content: "Why is the sky blue?" }], }); console.log(response.message.content);
注意 stream: false 这个字段。它说明默认行为是流式的——这一点对做本地 prompt 调试的人很关键,你能看到 token 一个个出来,而不是等整段生成完。
它真正解决的不是「推理」,是「模型的分发与命名」
把 ollama 当成「llama.cpp 的壳」会低估它。llama.cpp 解决的是「给定一个 GGUF 文件,怎么在 CPU/GPU 上高效跑」。ollama 解决的是它上游那一大段:模型从哪来、叫什么名字、怎么版本化、怎么被别的程序发现。
ollama.com/library 就是这套命名体系的中心。gemma4 是一个标识符,不是一个文件路径。用户不需要知道量化等级、不需要知道文件存在哪、不需要知道后端怎么加载——ollama run gemma4 把这些全吞掉。这是它和「自己下 GGUF 再写脚本」最本质的差别。
配套的是 Modelfile。README 的文档索引里单列了 Modelfile reference 和 Importing models,意味着你可以自定义系统提示、参数、模板,把「一个模型 + 一套配置」固化成可复用的定义。这让 ollama 不只是跑官方模型,也能承载团队内部的定制模型。
还有一条容易被忽略:它支持云端。官网标题是「Run AI models locally and in the cloud」,描述里写明「locally or in the cloud on macOS, Windows, and Linux」。所以它的定位不是纯本地工具,而是本地与云共用一套调用面——同一段 chat() 代码,后端可以换。
生态位:它站在 agent 和模型之间
对照素材里的几个同主题项目,ollama 的位置会很清楚。
| 项目 | 语言 | 约星标 | 它解决的那一段 |
|---|---|---|---|
| ollama | Go | 183649 | 本地/云端的模型运行时与统一调用面 |
| ECC | JavaScript | 277276 | 给已有 coding agent 加 skills、记忆与安全层 |
| hermes-agent | Python | 252822 | 把 prompt、工具调用、workflow 串成 agent |
| firecrawl | TypeScript | 190553 | 把网页抓成 Markdown/JSON 喂给 LLM |
| AutoGPT | Python | 187526 | 目标驱动的多步任务 agent 平台 |
| prompts.chat | HTML | 172642 | prompt 的社区分享与自托管 |
这张表里,ECC、hermes-agent、AutoGPT 都在「agent 编排」这一层,firecrawl 在「数据供给」这一层,prompts.chat 在「prompt 资产」这一层。ollama 不在任何一层之上,它在最底下——它是这些层默认会去调用的那个推理端点。
证据在 README 的社区集成清单里:Cline、Continue、Void、Open Interpreter、LangChain、LlamaIndex、LiteLLM、Semantic Kernel、Spring AI、LangChain4j、LangChainGo、OllamaSharp、Haystack……从 VS Code 插件到 Java 企业栈到 Rust SDK,全都在「支持 Ollama」这一栏里。这种广度的集成不是靠营销谈来的,是因为它把接口做成了 localhost:11434 上一个 OpenAI 风格可对齐的 REST 端点,任何框架接它成本都极低。
所以 ollama 的护城河不是推理速度,是成为默认值。当开发者要写一个本地 LLM demo,第一反应是 ollama run;当框架要支持本地模型,第一个适配的是 ollama。这个位置一旦占住,就很难被单点性能优势撬动。
Go 这个选择,不只是「快」
语言选 Go 有几个直接后果,都能从素材里推出来。
单二进制分发。macOS、Windows、Linux 三套安装脚本能做得这么薄,前提是没有运行时依赖要装。对比 Python 生态常见的 venv、CUDA 版本、torch 版本三重地狱,Go 编译出的静态二进制把「装」这一步的不确定性压到最低。
并发模型适合做服务。ollama 本质是一个常驻的本地 HTTP 服务,同时要处理模型加载、请求排队、流式输出。Go 的 goroutine 和标准库 HTTP 栈天然适配这种形态,不需要额外引入框架。
跨平台编译成本低。一套代码出 macOS、Windows、Linux 三个平台的产物,维护负担远小于为每个平台单独处理。
代价也有:推理内核不是 Go 写的,得靠 llama.cpp。README 的「Supported backends」只列了 llama.cpp 一家,说明 ollama 在推理层是深度绑定而非多后端抽象。这带来性能上的确定性,也意味着 llama.cpp 的能力边界就是 ollama 的能力边界。
谁该用它,谁不该
该用的场景:在自己机器上做 prompt 调试,想要离线、数据不出本机;给 coding agent 配一个本地模型后端(ollama launch claude 就是为这个设计的);写 LLM 应用原型,需要最快的从零到一次成功调用;团队内网部署,用 Modelfile 固化定制模型。
不该用的场景:需要极致的推理吞吐或特定硬件优化——那应该直接对 llama.cpp 或更底层的东西做调优;需要多后端自由切换——README 只列了 llama.cpp 一个后端;把 ollama 当成 agent 框架——它不做任务拆解和工具编排,那是 hermes-agent、AutoGPT 那一层的事。
一个务实的判断:ollama 的价值随「你想多快开始」单调递增,随「你想多深控制」单调递减。它优化的是启动成本,不是峰值性能。
上手路径
源码在 github.com/ollama/ollama,官网是 ollama.com。想深入的话,README 指向的几份文档值得按顺序读:quickstart 建立整体印象,cli 和 api 是日常高频,modelfile 和 import 是把官方模型之外的东西接进来的关键,development.md 是二次开发入口。
最短的验证路径只有三步:装、ollama run gemma4、curl localhost:11434/api/chat。三步都通,说明运行时、模型管理、接口三层都活了。剩下的,就是把它接到你自己的 agent 或应用里——那才是它设计上真正想被使用的方式。