如何使用开源模型,在本地开发搭建开发工作流

2025年6月9日

作者:Kiran Gangadharan

我一直在探索如何将开源模型融入本地开发流程,让日常工作更高效。

亲手搭建一个轻量、响应迅速且完全运行在本地机器上的系统,这种满足感是无与伦比的。

本文将为你提供一份实用指南,教你如何利用这些小巧的模型,并搭配必要的工具,在本地轻松运行,实现更智能的工作方式,同时又不增加复杂度。

虽然现在最前沿的模型备受瞩目,但我更感兴趣的是探索那些能在我的 MacBook M2 Pro(10 核 CPU,16GB 内存)上运行的开源模型。

在本地使用开源模型有几个令人兴奋的理由:

  1. 隐私性:数据完全归你所有。
  2. 控制权:模型在你的硬件上运行,尽在掌控。
  3. 学习机会:深入理解模型运行的机制和其中的权衡取舍。
  4. 微调潜力:利用充足资源对小型模型进行微调,使其在特定场景下达到甚至超越最先进模型的水平。
  5. 离线可用:所有模型知识无需网络连接即可随时调用。
  6. 乐趣:体验过程本身就是一种享受!

我尝试在工作流的不同环节使用大型语言模型(LLM),从终端命令行到集成开发环境(IDE)助手,甚至作为人工智能辅助的结对程序员。本指南将帮助你探索这些小型语言模型,并学习如何将它们融入你的日常工作流程。

本地模型入门

开始使用本地模型最简单的两种方法是利用 llamafilesOllama

Llamafile

要运行 llamafile 模型,只需从 HuggingFace 下载一个带有 llamafile 标签的模型,然后执行以下命令:

$ chmod +x <model>.llamafile
$ ./<model>.llamafile

这样就能启动一个聊天会话,非常方便。简直不能再简单了。

Ollama

Ollama 提供了一种更有条理的模型管理方式,类似于 Docker 对容器的管理(实际上两者有很多相似之处)。

要开始使用,请为你的平台下载 Ollama,然后按照以下方式从其模型库中运行模型:

如果你只想提供一个提示而不进入聊天模式,可以这样做:

$ ollama run llama3.2:3b "为什么天空是蓝色的?"

你也可以使用以下命令列出所有已下载的模型:

$ ollama list

模型选择建议

一旦你安装了运行模型的工具,下一步就是下载模型。但模型种类繁多,如何选择呢?我建议从以下几个开始,因为我发现它们在日常使用中表现良好:

如果你正在寻找在代码方面训练更充分的模型,可以考虑探索:

对于图像推理模型,推荐:

我尝试过一些推理模型,但还没有深入到可以推荐的程度。不过,以下是一些值得你考虑的模型:

理解模型的权衡

选择本地模型时,有两个关键指标会同时影响模型的大小和性能:

参数数量:参数数量(例如 8B 或 16B)指的是模型训练后学习到的数十亿个值。参数越多,通常意味着模型拥有更丰富的知识和更强的推理能力。

量化:量化是一种优化技术,通过使用更少的比特(降低浮点精度)来表示模型权重,从而减小模型体积。它通常以 Q4_K_M (4 比特)、Q8_0 (8 比特)、FP32 (原始精度) 等形式表示,旨在平衡内存占用和输出质量。量化程度越高(例如 Q4 优于 Q8),模型的加载和推理速度越快,但输出质量可能会有所下降。

寻找最佳平衡点

在我的 M2 Pro 上,我发现 7B/8B 模型搭配 Q8 量化,以及 12B-14B 模型搭配 Q5 甚至 Q6 量化,在性能和质量之间取得了不错的平衡。

我建议你根据自己的硬件进行试验,找到最适合你的配置。

寻找这种最高性价比配置的过程既富有教育意义又充满乐趣!

你可以通过创建 Modelfile 进一步自定义模型,例如调整上下文大小、温度,甚至在系统提示中添加内容。

更多详细信息请参阅Modelfile 文档:https://github.com/ollama/ollama/blob/main/docs/modelfile.md。

更好的工具

尽管 Ollama 提供了简单易用的模型交互界面,但它主要设计用于开源模型。

如果你想以统一的界面与各种模型(包括闭源模型)进行交互,可以考虑以下两种替代方案:

编辑器集成

将本地模型集成到编辑器工作流中是一个非常实用的应用场景。这包括无需离开编辑器即可提问、生成、审查和解释代码,以及生成文档和脚本等任务。

每个人都有自己偏好的编辑器工作流和配置。接下来,我将介绍我的个人设置。

Emacs

我使用 Sergey Kostyaev 的 ellama 已有一段时间,它的表现非常出色。此外,llamafile 的作者 Justine Tunney 也开发了 jart/emacs-copilot,它提供了类似 Copilot 的代码补全功能,并支持 llamafile 模型。我尝试时遇到了一些问题,但看起来它值得一试。

这是我的 ellama 配置:

(use-package llm
  :straight (:host github :repo "ahyatt/llm"))

(use-package ellama
  :straight (:host github :repo "s-kostyaev/ellama")
  :init
  ;; setup key bindings
  (setopt ellama-keymap-prefix "C-c e")
  (require 'llm-ollama)
  (setopt ellama-provider
          (make-llm-ollama :chat-model "codestral:latest")))

在探索其他设置时,我偶然发现了 copilot.el——一个用于 GitHub Copilot 的 Emacs 插件。

出于好奇,我想了解它是如何实现的,于是在 Robert Krahn 的博客文章中找到了以下内容:

尽管 Copilot 主要是一个 VSCode 实用程序,但让它在 Emacs 中工作却相当简单。本质上,它与语言服务器并没有太大区别。VSCode 扩展并非开源,但由于它是用 JavaScript 实现的,你可以将 .vsix 包解压成 zip 文件并获取其中的 JS 文件。据我所知,copilot.vim 插件是第一个采用这种方法的非 VSCode 集成。作为 .vsix 扩展一部分的 worker.js 文件可以作为 Node.js 进程启动,它会从标准输入读取 JSON-RPC 数据。……像 Emacs 或 VIM 这样的编辑器可以在子进程中启动 worker,然后通过标准输入发送 JSON 消息,并通过标准输出读取 JSON 响应,从而与之交互。

以下是相关配置:

(use-package copilot
  :straight (:host github :repo "copilot-emacs/copilot.el"
             :files ("*.el"))
  :config
  ;; (add-to-list 'copilot-major-mode-alist '("enh-ruby" . "ruby"))
  (add-hook 'prog-mode-hook 'copilot-mode)
  (define-key copilot-completion-map (kbd "<tab>") 'copilot-accept-completion)
  (define-key copilot-completion-map (kbd "TAB") 'copilot-accept-completion))

(defvar kg/no-copilot-modes
  '(shell-mode inferior-python-mode eshell-mode term-mode vterm-mode comint-mode
    compilation-mode debugger-mode dired-mode-hook compilation-mode-hook
    flutter-mode-hook minibuffer-mode-hook shell-script-modes)
  "Modes in which copilot is inconvenient.")

(defun kg/copilot-disable-predicate ()
  "When copilot should not automatically show completions."
  (or (member major-mode kg/no-copilot-modes)
      (company--active-p)))

(add-to-list 'copilot-disable-predicates #'kg/copilot-disable-predicate)

我还尝试将 Aider 集成到 Emacs 中,使用了 aidermacs,但目前还没有深入到可以撰写文章的程度。

等我有了更多进展,会更新这篇博文。

Visual Studio Code

我在这里的首选工具是 Cline。Cline 是一款智能的代码助手,能够进行推理并执行各种任务,例如创建/编辑文件、运行测试等命令,以及在运行测试后自动修复 bug。它能推断完成任务所需的上下文。

更棒的是,它还会显示每次查询的输入/输出 token 数量和成本。虽然它与本地模型配合得相当好,但搭配像 Claude 这样的最先进模型使用,简直是颠覆性的体验。

IntelliJ Idea

我使用的是 Continue.dev 的插件,它提供了一个聊天界面和代码补全功能。聊天模型和代码补全模型可以独立配置。

我用 llama3.1:8b 作为聊天模型,用 starcoder2:3b 进行代码补全。

模型评估

有时,你可能会想比较不同模型对同一个提示的响应。

你可能会好奇它们在内容上有什么不同,或者解释方式上有何差异——比如是否捕捉到了细微之处、是否提到了注意事项,或者是否使用了示例进行说明。

我发现一个非常有用的工具是 promptfoo。它被设计成一个测试框架,你可以定义测试用例,其中包含提示、要评估的模型列表和测试条件,然后执行并生成报告。这是一个简单的配置示例:

description: "通用指令评估"

prompts:
  - "用一个例子说明如何使用依赖注入框架 Dagger。"

providers:
  - "ollama:chat:llama3.1:8b-instruct-q6_K"
  - "ollama:chat:qwen2.5:14b"
  - "ollama:chat:hf.co/unsloth/gemma-3-12b-it-GGUF:Q4_K_M"

tests:
  - vars:
      topic: Dagger 中的依赖注入
  - vars:
      topic: 零工经济

指定配置后,运行 promptfoo eval 即可对模型执行测试。生成的报告以表格形式清晰地展示了提示和模型的响应,界面如下所示:

然而,如果你想跨越多种用例来对比和评估模型的优缺点,这个工具就不是最合适的了。对于更深入的评估,建议使用 lm-evaluation-harnessdeepeval

公开基准测试

HuggingFace 维护了一个开放模型排行榜,它不断评估平台上托管的模型。但它加载速度较慢,有时还会出现 bug。我建议你参考以下几个资源:

  • LLM-stats:提供模型基准和比较的全面概述。它有针对特定参数比较开放模型的筛选器,可视化效果也很不错。
  • Aider 基准:专门针对代码编辑和重构能力的评估。
  • StackEval:评估模型作为编程助手的表现能力。

请注意,不要盲目相信这些基准测试的结果。它们仅仅是筛选出一些入门模型进行实验的参考。

模型可能会针对基准测试数据进行训练以提高分数,因此你需要根据实际用途在日常工作中进行尝试。如果你有自己的评估数据集来测试模型,那就更好了。

最终思考

还有很多我没有尝试——包括更新的模型、更多的 IDE 工具和新的想法。但这正是乐趣所在。

尽管这套设置并没有彻底改变我的工作流程,但它确实为我的工具箱增添了一些新伙伴——这些工具轻巧、本地化,而且功能出奇地强大。

它只是一个起点,用于探索小型模型在开发者日常环境中能发挥多大作用,我非常期待看到它们能走多远。

原文:https://blog.nilenso.com/blog/2025/05/06/local-llm-setup/