本文是「本地大模型之路」系列文章的第三篇,前序文章见:

在前两篇文章发表之后的一段时间内,开源大模型领域又迎来了非常大的变化。尤其是 DeepSeek-R1 的出现,可以说标志着开源模型第一次追上了闭源模型1。另外消息称 Apple 将选择阿里作为国区的 Apple Intelligence 合作伙伴, 巧的是这俩都是去年开源顶流模型的提供方,在笔者看来 DeepSeek 和 Qwen 的脱颖而出绝非偶然,它们都是开源反哺商业生态的绝佳案例。

回到本地大模型这个话题——前面两篇文章我们简单介绍了一些大语言模型和推理相关的基础知识,并且对于硬件选择也有了一定的认知。本文我们将介绍更为实用的推理框架和上层应用。无论你是本地大模型玩家还是 API 用户,本文内容都会对你有所帮助。

自下而上的 LLM 推理生态

如果我们已经选定了模型,怎么在机器上跑起一个大模型呢?从计算最底层开始,我们可以画出这样一张图:

  • 最底层硬件的加速算子:不像 CPU,GPU 各家都有自己的架构设计,一般需要通过厂家提供加速算子更高效的执行计算。比如 NVIDIA 的「护城河」CUDA、Apple Silicon 上的 Metal 等。
  • 推理引擎:LLM 推理的核心部分,加载模型权重、高效编排计算、提供上层应用需要的接口。比较知名的开源项目有 llama.cpp、vLLM 和 SGLang。
  • 引擎 Wrapper:如果直接使用推理引擎,通常需要通过命令行指令,而且启动参数比较复杂、要查文档。因此类似 Ollama、LM Studio 做了一层封装,可以在更友好的界面中下载模型、启动以及进行对话。
  • LLM 应用:推理引擎和引擎 Wrapper 都能提供接口被最上层的应用调用,这个接口的事实标准即 OpenAI 兼容 API。所以在 DeepSeek 的官方 API 文档里面看到 import openai 不要紧张,因为 OpenAI 最早提出,各家都会遵循这样的接口定义。

对于大多数用户来说,底层加速算子可能过于抽象。我们不妨通过 llama.cpp 这个项目来串联起上下游的认识。

llama.cpp 的前世今生

如果之前有过本地部署的经验,想必你一定听说过 llama.cpp 这个项目。名字也是言简意赅,前面部分来自 Llama(Large Language Model Meta AI,现在不常用 LLaMA 的缩写),算是最早的开源大语言模型,随着开源社区的蓬勃发展它几乎支持所有的主流模型,甚至包括多模态大模型;后面的部分则表明其主要采用 C/C++ 语言,以达到更广泛的硬件支持。

项目的作者 Georgi Gerganov 在此之前开发过 whisper.cpp,用来支持 OpenAI 的 Whisper 语音识别模型的推理。这两个项目都依赖其另一个张量计算库 ggml

跟其他在大模型时代流行的开源项目一样(得益于某些公司持续的闭源策略),llama.cpp 一经发布就广受关注,GitHub 上获得的 stars 数量已经来到了恐怖的 75.1k。这个项目最大的两个亮点,我觉得一是大而精的硬件后端支持,二是丰富的量化策略:

  • 它不仅能跑在各个品牌的 CPU 上,对 Apple Silicon 的优化也非常好;NVIDIA 的 GPU 不必说,AMD、Intel 的卡都能跑,甚至还支持摩尔线程和华为昇腾。
  • 从 1.5-bit 到 8-bit 丰富的量化策略,可满足各种苛刻的显存限制条件。

值得一提的是,这是一个符合我心目中理想的「开源精神」定义的项目。开发者 ikawrakow 在 k-quants(llama.cpp 使用的量化策略)的 PR 里面这样回复用户为什么这个功能没有把 k-quants 和 i-quants 写成论文:

没有把 k-quants 和 i-quants 写成论文是因为不喜欢写论文。加上我喜欢不需要在我的简历里面增加新论文的感觉,也没有在找工作或者投资,也没有理由在 arXiv 上宣传。

另一方面,不发文章让其他研究人员可以忽略这两种量化策略,尽管 HuggingFace 上有很多这两种量化的模型。使得他们的新的量化方法显得比实际要更好。有助于维持炒作。

总的来说,这是一种双赢 😃。

DeepSeek-V3 的训练中也利用了 k-quants 这样按分片量化的方式,来稳定 FP8 的训练,并且在开源周活动中直接放出了优化过的 CUDA 算子

GGUF 的命名规则

llama.cpp 提供命令行工具来启动模型,比如启动对话模式:

llama-cli -m model.gguf

等等,这个 .gguf 是什么?

一般来说,模型提供者在上传 Hugging Face 的时候会上传 .safetensors 的原始模型权重。而 GGUF 则是 llama.cpp 的特有格式,用来支持其各种特性。Hugging Face 有一个详细的页面来介绍这个格式,大致的存储结构如下:

不过感谢各位社区伙伴,各种新模型一经推出就会被转换成各种 GGUF 文件上传到 Hugging Face,我们下载之后就可以直接通过命令行使用。比如 unsloth 转换的 DeepSeek-R1-GGUF,我们可以看到有非常多的格式。

以其中一个举例:

  • 原始模型名:DeepSeek-R1
  • Q5_K:大致的量化等级为 5-bit
  • M:不同量化策略,一些层的权重量化等级会更高,从模型大小的结果上看 S < M < L

除此之外,unsloth 提供了更特制的量化模型,比如 UD-IQ1_M,MoE 层为 1.56bit,其中的 down_proj 为 2.06bit。

通过 Ollama 和 Open WebUI 更轻松地使用大模型

如果上面的介绍读得头疼也很正常,一些 to C 的大模型产品的命名就很令人迷惑,更别说开源世界的缤纷选择了。如果你不想关心这些细节,只想使用一些常用的模型、并且已经为你选择好合适的量化策略,Ollama 或者 LM Studio 这些 llama.cpp 的封装会更好用。

LM Studio 出现在 Apple 的宣传页中可以说小小出圈了一下。它提供了一个很不错的 UI 界面用来浏览和下载模型,方便启动和调试。

然而它是一个闭源应用。尽管说它可以运行 Apple 的 MLX 格式的模型,但在一个快速迭代、野蛮生长的大模型时代,本地大模型用闭源应用启动并不够灵活,而开源的 Ollama 则可以使用 Hugging Face GGUF 格式的模型,也提供了命令行工具下载和管理模型。

如果想要获得和 LM Studio 类似甚至更强的体验,可以通过另一个项目 Open WebUI,来连接 Ollama 实例,实现可视化操作。两者安装完之后,仅需要各自启动就能得到类似一个增强版的 ChatGPT 的本地模型。你不仅可以细粒度的控制生成参数,也可以进行联网搜索、本地 RAG 知识库增强的操作。

安装和启动

安装 ollama 非常简单,通过命令行 ollama serve 即启动一个本地实例。Open WebUI 的安装则有一定门槛,需要有点 docker 或者 Python 基础,可以参照官方文档

如果是通过 Python 安装,同样通过命令行 open-webui serve 就可以启动实例,然后通过 http://localhost:8080/ 访问。

下载和使用模型

启动之后 Open WebUI 就自动连接到了 ollama 实例。

我们可以通过管理员设置-模型-管理模型直接下载和管理 ollama 的模型。注意 ollama 官方提供的模型版本和其官网上的模型名是一一对应的。比如 qwqQ4_K_M 量化的,qwen2.5-coder 默认指向 7B 版本,其他的需要指定为 qwen2.5-coder:14b 之类的名称。

基础功能:联网搜索、代码执行

可以看到 OpenWeb UI 整个界面和主流的一些大模型产品网页入口基本一致。我们在管理员设置里面设置搜索引擎,也可以打开联网搜索。

打开联网搜索能够比较好缓解本地一些小模型在知识上的幻觉问题。但是类似图中的问题也没有完全答对。

使用 OpenWeb UI 另一个好处是我们能知道进入模型的实际文本是怎样的。比如上面的例子中检索了 Apple 官方,但是只提及了 24GB 和 32GB,尽管第二个链接中有 16GB 的选项,但是由于经过量化的 7B 模型的长文本能力有限,最终还是答错了。

同样 OpenWeb UI 内置了代码解释器,可以用来渲染 SVG 或者体验 Python 画图等功能。

本地 RAG

在管理员设置-文档中,我们可以设置 Embedding 模型、提示模板来构建本地 RAG 流程——RAG、Retrieval-Augmented Generation 即检索增强生成,基本知识可以参考这个链接。从效果上看,RAG 可以帮助模型根据本地知识库完善问答,对于召回效果来说,Embedding 模型的质量比较关键,可以通过 Hugging Face 的排行榜进行筛选。

另外如果想要更简单的方式通过 Ollama 使用 RAG,可以看看 RLAMA

其他高级功能

除了一些基础功能之外,OpenWeb UI 社区还提供了各种 Prompt 模板、工具(让模型使用工具)、函数等高级功能。

比如导入了工具并在请求时打开时,模型能调用工具通过 API 处理和访问数据、执行代码……一个典型的案例就是能调用计算器,这样就永远不会算错了。

而函数功能相当于插件,通过它能进一步增强模型的定制化能力,实现复杂的流水线、构建一个真正的工作流而不是仅仅通过对话请求。

更多 LLM 应用

无论用 llama.cpp 或者其他推理引擎,最终我们能够得到一个本地的 OpenAI 兼容的 API endpoint,这样就能够方便地接入各种上层应用。这里可以参考 DeepSeek 维护的 Awesome DeepSeek Integrations。从使用场景上,这些应用大致分为以下几类:

  1. 通用对话机器人:比如 Chatbox、Open WebUI 等等,这些客户端现在基本都支持了闭源模型产品的一些特性,比如 RAG、代码预览、联网检索等等功能。一些效率软件,比如 Raycast 也有很多插件可以接入自建模型。
  2. 翻译软件:比如 MacOS 上流行的 Bob,浏览器插件沉浸式翻译等等。
  3. 辅助编程:Continue、Cline 这种插件或者 Cursor、Windsurf 这样的 IDE。
  4. 笔记软件:Obsidian、思源笔记都能接入本地 LLM 来私有化处理文档。
  5. Agent 框架:通过 LLM 编排自动化任务,比如 n8n。

其中最有意思的应该就是 Agent 框架了,比如 n8n 官网提供了这样一个例子,相当于一个可视化的 AI 工作流:访问网页,抽取最新的论文名、下载论文,通过大模型进行总结整理。图中的 GPT 完全可以换成本地部署的模型,结合 OpenWeb UI 各种强大的插件,实现更定制化、可靠、便宜的 Agent。

> 关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀