LLM 是怎么预测下一个 token 的 把推理的链路拆开讲过:tokenizer 把文字切成 token,查 embedding 表变成向量,几十层注意力算出一个概率分布,按概率抽签选出下一个 token,算过的 、 存进 KV cache 供后面复用。
那篇讲的是模型内部发生了什么,这篇讲谁来执行这些计算。
干这个活的程序叫推理引擎:它读取模型文件、把权重加载进内存、切 token、跑完上面那一整套计算、维护 KV cache,最后把生成的 token 拼成文本返回。我们平时用 ChatGPT 或者调 DeepSeek 的 API,推理引擎跑在厂商的服务器上,隔着网络够不着。
推理引擎有很多种。vLLM、SGLang 主要部署在服务器上扛高并发;个人电脑这边绕不开开源项目 llama.cpp,是它先啃下了「让大模型在普通 CPU 和消费级显卡上跑起来」这块硬骨头,Ollama、LM Studio 这类工具都建立在它的成果之上,把安装、模型管理和界面包得更省事。
本文拿 Ollama 举例,因为它终端、桌面 App 和 HTTP 接口都有,能把本地跑模型的几种用法一次演示完;换成别的工具,挑模型和调用的思路是相通的。
下面我们把开源小模型 qwen3:0.6b 下载到自己电脑上,走完挑模型、下载、对话、调用、管理的整个流程,再看看本地 API 和云端 API 是什么关系,以及怎样把本地模型接入 Claude Code 这类 Agent 工具。
安装 Ollama
Ollama 装好之后还干不了活,得再下载模型。两者有点像播放器和视频文件:只有模型文件,电脑不知道如何高效执行它;只有 Ollama,没有模型参数,也生成不了文本。
进入 Ollama 下载页面,选择 macOS、Windows 或 Linux 版本并按页面提示安装。安装完成后打开终端,检查命令是否可用:
ollama --version我在 Apple Silicon Mac 上实测得到:
ollama version is 0.32.7你的版本号可能更新,只要能正常显示版本即可。
挑一个跑得动的模型
去哪里找模型
打开 Ollama 模型搜索页,输入模型名称或用途。搜索结果卡片会显示模型简介、更新时间和可用标签;页面上方还可以按 Tools、Thinking、Vision 等能力筛选。

上图搜索的是 qwen3。结果中既有通用文本模型 qwen3,也有 qwen3-coder、qwen3-embedding 等特定用途的系列。
qwen3 卡片下面的 0.6b、1.7b、4b、8b 等是可选标签。Ollama 的模型 ID 就是「模型名:标签」的写法:
qwen3:0.6b其中 qwen3 是模型系列,0.6b 是标签。标签可以区分参数规模、量化版本或用途,这里的 0.6b 说的是参数规模,B 表示 billion,也就是十亿参数;4b 说的是约 40 亿参数,不是 4GB。
省略标签时,Ollama 通常会使用该模型页面标记的默认标签 latest,但初学时最好写完整 ID,这样才能明确知道自己下载了哪个版本。
点进 qwen3,再选择 0.6b 标签,就能看到完整的运行命令和这个版本的详细信息:

上方 CLI 区域给出了可以直接复制的命令。下方 Details 表格中的 model 一行依次显示架构、参数量和量化类型,右上角的 523MB 是模型包大小。页面上的 tools 和 thinking 是能力标签。
以后挑模型时,至少先看参数规模、文件大小、量化类型、能力标签和许可证。
小模型和大模型怎么选
在同一代、同一训练路线的模型中,参数更多通常意味着更强的知识容量、语言理解、指令跟随、代码能力和复杂推理能力。所以 4B 或 8B 的 Qwen3 往往会比 0.6B 回答得更稳定,代价是更大的下载文件、更高的内存占用和更慢的生成速度。
不过参数量管的主要是「聪明程度」;支不支持图片理解、工具调用、思考模式和超长上下文,要看模型架构、训练方法以及 Ollama 是否提供对应模板。
例如 qwen3.5:0.8b 虽然也很小,但它是更新的多模态模型,页面声明了 vision、tools 和 thinking;一个更大的纯文本模型反而不一定能看图。
可以按这个顺序做决定:
- 先确认任务需要文本、图片、代码、工具调用还是长上下文。
- 在 Ollama 搜索页用能力标签缩小范围,再检查候选模型的许可证和语言支持。
- 在同一模型系列中,从较小标签开始试,效果不够再升级到 1.7B、4B 或 8B。
- 用后面会讲到的
ollama ps观察实际运行占用,给系统和其他程序保留足够内存。 - 用自己的真实提示词比较质量和速度,不要只看排行榜或参数量。
比较实用的原则是:选择「电脑能够从容运行的最大模型」,而不是勉强能加载、却让整台电脑频繁换页或卡顿的最大模型。
按这个思路,本文选的是 qwen3:0.6b:Qwen 是较知名的开源模型系列,官方使用 Apache-2.0 许可证;Qwen3 覆盖 100 多种语言和方言,适合直接测试自己的实际提示词;这个 Ollama 模型包约为 523MB,普通电脑也能低成本跑通流程;页面还声明了文本生成、工具调用和思考模式,后面介绍模型能力时正好有具体例子。
0.6B 不是效果最好的 Qwen,而是下载体积、运行门槛和演示价值之间的折中。它适合用来学习本地推理链路;真要当日常助手,还得靠更大的模型。
把模型跑起来
挑好模型,接下来就是下载、运行,然后用起来。用法有几种:终端里直接对话、桌面 App 里聊天,或者通过本地 HTTP 接口调用,Claude Code 这类 Agent 工具走的就是最后这条路。
下载并在终端里对话
第一次运行时,可以先把「下载」和「运行」分开,方便看清每一步:
ollama pull qwen3:0.6b
ollama run qwen3:0.6bpull 把模型下载到本机,run 加载模型并进入交互界面。你也可以直接执行 ollama run qwen3:0.6b,模型不存在时 Ollama 会先自动下载。
进入交互界面后,可以直接输入问题:
>>> 请用一句话解释什么是大语言模型。
Thinking...
好的,用户让我用一句话解释什么是大语言模型。首先,我需要明确大语言模型的定义……
...done thinking.
大语言模型是一种能够处理大量文本、生成文本或执行任务的大型人工智能模型,通过大量数据训练而成,具备语言理解和生成的能力。qwen3 默认开着思考模式,所以正式回答之前会先刷一段自言自语,夹在 Thinking... 和 ...done thinking. 之间。嫌它啰嗦就在交互界面里输入 /set nothink 关掉。
回答是一个词一个词往外蹦的,这就是推理引擎在一轮一轮地预测下一个 token,每算出一个就立刻显示出来。
按 Ctrl+D 或输入 /bye 可以退出交互界面。模型已经保存在本机的 ~/.ollama/models 目录,下一次运行不需要重新下载。
顺带说说模型是从哪下载的。pull 拉的是 Ollama 自己的模型库,和网页上的模型搜索页是同一个来源。模型的原始权重一般由作者发布在 Hugging Face 上,Ollama 库里放的是转换、量化之后的版本,所以体积会小很多。
这套东西跟 Docker 很像:模型 ID 写成「名字:标签」,就像镜像的 name 和 tag;pull 从远端仓库拉到本地,list 看本地有哪些,rm 删掉不用的。存储方式也是一个路子,本地放的是一份 manifest 加上若干个按内容哈希命名的文件块,对应 Docker 的镜像层。
如果 Ollama 库里没收录你想要的模型,也可以直接从 Hugging Face 拉,把模型 ID 写成 hf.co/用户名/仓库名:量化标签:
ollama pull hf.co/bartowski/SmolLM2-135M-Instruct-GGUF:Q4_K_M前提是那个仓库提供了 GGUF 格式的文件,这是本地推理工具通用的模型文件格式。GGUF 和量化具体是怎么回事,看懂 Hugging Face 和模型文件会讲清楚。
在 App 窗口里聊天
新版 Ollama 桌面 App 已经自带聊天界面。打开 New Chat,右下角的模型按钮会列出可以使用的模型:

上图中带云朵图标的 glm-5.2:cloud 和 minimax-m3:cloud 会调用云端;qwen3:0.6b、smollm:135m、deepseek-r1:14b 已经下载到本机;gemma4:26b 旁边的下载图标表示还没有下载。
模型 ID 和终端中的写法完全相同,所以在网页模型库找到 ID 后,也能在 App 里确认自己正在使用哪个版本。
选择 qwen3:0.6b 后,可以像使用普通聊天产品一样输入问题。我实际问的是「请只用一句话解释:为什么本地运行大模型不需要 API Key?」:

截图右下角显示当前模型是 qwen3:0.6b,回答上方的 Thought for a moment 表示这次对话用到了模型的思考能力。
只要选的是本地模型,且没开 Web search 之类的联网功能,请求就完全在本机处理;选择带 :cloud 的模型时,数据仍然会走网络。
用 curl 调用本地模型
Ollama 不只提供终端聊天界面,还会在本机启动 HTTP 服务。它有一套自己的原生 API,也兼容 OpenAI 的接口格式,后者已经是行业通用标准,我们直接用它。地址是:
http://localhost:11434/v1先查看本机 API 当前能使用哪些模型:
curl --silent http://localhost:11434/v1/models | jq '.data[].id'这条命令需要系统已经安装 jq。我这台机器上返回:
"qwen3:0.6b"
"smollm:135m"
"deepseek-r1:14b"这个接口列的是本机已经下载的模型;如果要搜索新的模型,仍然去 Ollama 模型搜索页。
下面发起一次真实的对话请求。如何调用 LLM 接口 里发给 DeepSeek 的那套 JSON,原样发给本机也认:
curl --silent http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3:0.6b",
"messages": [
{"role": "user", "content": "请用一句话解释什么是大语言模型。"}
],
"reasoning_effort": "none",
"stream": false
}' \
| jq '{model, answer: .choices[0].message.content, finish_reason: .choices[0].finish_reason, usage}'本机实测得到:
{
"model": "qwen3:0.6b",
"answer": "大语言模型是能够理解、生成和执行任务的大规模人工智能系统,能够处理大量文本数据,并进行语言转换等复杂任务的智能系统。",
"finish_reason": "stop",
"usage": {
"prompt_tokens": 25,
"completion_tokens": 33,
"total_tokens": 58
}
}请求里的 stream: false 让 Ollama 等整段回答生成完再返回,reasoning_effort: "none" 关掉这一次请求的思考输出,也就是前面在终端里 /set nothink 干的事。
请求里的 model、messages,响应里的 choices[0].message.content、finish_reason 和 usage,跟云端 DeepSeek 的字段一模一样。所以用 OpenAI SDK 写的对话代码,一般换掉 base_url、api_key 和 model 就能改调本地模型。
真正的差别不在接口,而在推理跑在谁的机器上:DeepSeek 的模型跑在服务商的数据中心,要带 API Key、按 token 计费,模型也比本地能跑的大得多;本地模型跑在你自己的 CPU 和内存上,不用 Key 也不花钱,数据不出电脑,但是模型能力受限于你的硬件。
本机 Ollama API 默认不验证身份,是因为 localhost 只面向本机使用。不要在没有鉴权和网络隔离的情况下把 11434 端口直接暴露到局域网或公网。
第一次下载模型需要联网。下载完成后,Ollama 服务和上面的推理请求都可以在本机完成,所以断网也能继续调用已经缓存的模型。
接入 Coding Agent
Ollama App 左侧的 Launch 页面列出了常见的 Coding Agent 工具,包括 Claude Code、Codex 等。点击任意一个工具,App 会生成对应的 ollama launch ... 命令,复制到终端运行即可完成接入:

以 Claude Code 为例,Claude Code 把模型请求按 Anthropic Messages 格式发出去,至于对面是谁它并不关心,任何实现了这套接口的服务都能给它当后端。Ollama 正好提供了兼容 Anthropic Messages 的接口,所以把 Claude Code 的请求地址指向本机的 Ollama,它就会改用你选的本地模型来干活。
注意这并不是把 Anthropic 的 Claude 模型下载到本地,而是让 Claude Code 这个 Coding Agent 换用 Ollama 提供的模型。
不过,接口通了只是第一步,模型本身还得能胜任 Coding Agent 的任务。Coding Agent 需要模型阅读长提示词、理解整个代码库、在多轮操作中稳定调用工具,qwen3:0.6b 这样的小模型完全达不到要求。
Ollama 的 Claude Code 文档 建议模型上下文至少 64K,而 qwen3:0.6b 的上下文容量只有 40960(后面用 ollama show 就能查到),连门槛都够不到。
所以选模型时,先在 Ollama 搜索页勾选 Tools 筛选出支持工具调用的模型,还要确认它的上下文足够长。
但是上下文越长占用内存越多,一般笔记本电脑能跑起来的模型都是小模型,智能程度很难驾驭得了 Coding Agent,没办法使用本地模型来跑复杂的开发任务。
管理本机模型
模型跑起来之后,还有几个命令用来查看本机模型的状态和占用。
查看已经下载的模型:
ollama list我实测得到的 Qwen3 记录:
NAME ID SIZE MODIFIED
qwen3:0.6b 7df6b6e09427 522 MB 2 minutes ago查看模型的结构和能力:
ollama show qwen3:0.6b核心输出是:
Model
architecture qwen3
parameters 751.63M
context length 40960
embedding length 1024
quantization Q4_K_M
Capabilities
completion
tools
thinking
Parameters
repeat_penalty 1
stop "<|im_start|>"
stop "<|im_end|>"
temperature 0.6
top_k 20
top_p 0.95这里能看到模型的架构、量化类型(Q4_K_M)和上下文容量(40960),Capabilities 则说明它除了生成文本,还支持工具调用和思考模式。
最下面的 Parameters 是模型自带的默认运行参数,其中 temperature、top_k、top_p 决定了推理时怎么从概率分布里抽出下一个 token。
注意 parameters 那行的 751.63M 说的是参数个数,也就是模型里有 7.5 亿个数字,不是文件大小;文件大小是前面 ollama list 显示的 522MB。7.5 亿个参数能塞进 522MB,靠的就是 Q4_K_M 量化,平均每个参数只占 5.6 bit 左右。
查看当前真正加载在内存中的模型:
ollama ps我在发起一次请求后看到:
NAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen3:0.6b 7df6b6e09427 4.4 GB 100% GPU 32768 4 minutes from now这里的 SIZE 变成了 4.4GB,远大于磁盘上 522MB 的模型文件,因为它统计的是运行时占用,除了权重还有上下文缓存等开销。
这块缓存就是 LLM 是怎么预测下一个 token 的 里讲的 KV cache,那篇文章算过:32768 的上下文要吃掉约 3.7GB 的 KV cache,加上 522MB 的权重,再算上一些临时计算的开销,就是这里 4.4GB 的来历。
CONTEXT 是本次运行实际分配的上下文长度,跟 ollama show 显示的模型容量是两个数。所以选本地模型别只看下载大小,运行时的内存占用才是大头。
用完后可以主动卸载模型,释放运行内存:
ollama stop qwen3:0.6bollama stop 只停止运行,不会删除下载到磁盘的模型,下次仍然可以直接运行,不需要重新下载。
如果你想了解 checkpoint、BF16、Q4_K_M、Safetensors、GGUF,以及 Hugging Face 仓库里的每个文件分别做什么,可以继续阅读看懂 Hugging Face 和模型文件。