推动本地模型落地:追求实用性与开发者体验Pushing Local Models With Focus And Polish
作者强烈希望本地运行的 AI 模型能具备与云端 API 相媲美的实用性,以便在编码助手等场景中直接使用而不需切换服务。他认为过早将实验性开发锁定在封闭的云环境中会阻碍普通开发者的创新参与。尽管目前本地模型仍存在性能瓶颈,但作者呼吁社区聚焦于提升其实用性和稳定性。
Armin Ronacher
写于2026年5月8日
我真心希望本地模型能够真正运行起来。
我希望它们能在非常实际的意义上工作——我可以打开我的编码代理,选择一个本地模型,然后得到一个足够有竞争力的结果,以至于在五分钟之内我不会立刻切换回托管的 API。我有许多想要实现这一点的理由,但坦率地说,最大的原因是我们在这个领域还处于早期阶段,一想到要把所有实验都锁在普通开发者无法触及的地方,我就感到非常不安。
令人沮丧的是,目前要实现这一点仍然比应有的难度高得多,而这并非因为任务本身的复杂性或模型的质量问题。
我们在本地推理方面已经有了大量的活动,这很棒。我们有优秀的项目、高效的内核,而且人们正在做出色的量化工作。许多非常聪明的人正在让这一切变得更好,然而对于那些试图将本地模型与编码代理结合使用的人来说,体验却糟糕得与其应有的水平不符。
在 Pi 中输入 API 密钥并使用托管模型是一个非常无聊的操作:你选择提供商,粘贴密钥,然后就不用再考虑如何获取 token 了。而在本地做同样的事情,即使你使用的是配备大量内存的高端 Mac,体验也完全不同。你需要先选择一个推理引擎,再选一个模型,然后是量化方式、模板、上下文大小,接着还要把一堆 JSON 配置扔进堆栈的不同部分,最后才发现其中某个选择悄悄地把模型搞得更差,或者干脆什么都不工作。
这就是我关心的差距所在。
Runnable 并不是“已完成”
很多本地模型的工作重点在于让模型能够运行,这是必要的,但并不意味着它已经“完成”。这里我举个非常简单的例子来说明这种差距:工具参数流式传输。
无论出于什么原因,大多数本地运行的代码都不支持工具参数流式传输。我无法完全解释这一点,但其后果实际上出人意料地严重。如果你不熟悉这些 API 的工作原理,最简单的理解方式是:它们会在 token 可用时立即发出。对于文本来说这很平常,但对于工具调用来说,尽管完成 API 支持这种机制,却常常并未实现。因此,你只能在模型完成整个工具调用的流式传输后,才能看到对文件的修改内容。
这有很多不好的地方:
让模型吐出 token 并不难,但要让整个端到端的体验做到极致,则需要付出更多努力。
碎片化
本地栈分散在多个引擎和层级中。有 llama.cpp、Ollama、LM Studio、MLX、Transformers、vLLM,以及许多其他组件,具体取决于硬件和个人偏好。这些项目都非常出色!问题不在于它们的存在或数量之多(坦率地说,我甚至感觉有点像是大型 Python 打包生态的翻版),而在于对于某个模型而言,其实际表现取决于一连串用户通常不愿深究的小决策。
聊天模板渲染是否完全正确?推理标记是否按预期处理?工具调用格式是否准确转换?上下文窗口是否真实有效?KV 缓存对编程代理是否真的生效?你从 Hugging Face 选的是否是正确的量化模型?你是否因模型与硬件不匹配而无意中浪费了大量性能?流式输出是否在所有通道上都能正常工作?该模型是否需要保留助手消息中的先前推理内容?编程代理是否为其配置得当?
除了你的编程代理之外,你还必须安装许多不同的东西。
所有这些都很重要。非常重要。
结果是,人们尝试本地模型后得到的既不是对该模型的公平评估,也不是一个成熟的产品体验,这导致两方面的问题:一是人们对本地模型失去信心,二是精力被分散到太多独立项目中,而不是集中打造一个真正出色的端到端解决方案。
这是一种建立信心的糟糕方式。
临界质量不足
延续我们一贯“慢点他妈来”的主张,我想再次强调这个行业跑得多快。
每周都有新模型和新的“ vibe 混合体”出现。注意力立刻转向下一个能运行的东西,而不是专注于在一个框架内把一件事真正、真正地做好。我能理解那种兴奋感和多巴胺的刺激,但这也意味着任何单一模型、硬件、推理引擎或集成组合都积累不了足够的临界质量,从而无法探索当整个栈围绕它构建时,它究竟能变得多好。
托管模型提供商不会只给你一堆权重让你自己搞定其余部分,我们也应该以同样的思路对待本地模型。我希望有人能选定一个模型,搭配一条固定的服务路径,直接集成进一个编程代理中。最初只为一种硬件配置,然后逐步扩展。要坚定地选出赢家——如果工具调用出错,那就是产品 bug,无论失败发生在栈的哪一层都要修复;如果模型的推理流格式错误,那也是产品 bug;如果延迟远高于应有水平,同样是产品 bug。我们也应该开始将这种思维应用到本地模型上。
而且不是为每个模型都这样做!这才是关键。让我们选出一个赢家,把它打磨得尽善尽美。先弄明白如何让这一种配置变得优秀,再把经验应用到下一个配置上。
DS4 赌注
这就是我对 ds4.c 感到兴奋的原因。这是 Salvatore Sanfilippo 为 DeepSeek V4 Flash 专门打造的极窄推理引擎,仅适用于配备 128GB+ RAM 的 Mac。它不是一个通用的 GGUF 运行器,也不是想成为一个通用框架。它是一个针对特定模型的本地引擎,包含 Metal 路径、模型专用加载、提示渲染、KV 缓存处理、服务器 API 封装和测试。
DeepSeek V4 Flash 非常适合此类实验,因为它具备一些在本地使用中不常见的特性组合。它足够大,能明显区别于许多较小的密集模型;同时其稀疏性也使得活跃参数数量在运行上具有可行性。它的上下文窗口非常大。由于 ds4.c 仅针对 Mac 和 Metal 平台优化,因此可以将 KV 缓存移至 SSD,这极大有助于我们从编码代理中期望的工作负载类型。
要运行 ds4.c,你不需要 MLX、Ollama 或其他任何依赖——它就是完整的解决方案。
将嵌入集成到 Pi 中
这让我构建了 pi-ds4,这是一个直接将整个系统嵌入 Pi 自身的 Pi 扩展。我们基于 ds4 的能力,以零配置的方式将其作为编码代理进行深度使用(dogfooding)。问题是:如果 Pi 将其视为一等提供者而非一堆手动配置,本地模型体验能达到多高的水平?
该扩展注册了 ds4/deepseek-v4-flash,按需编译并启动 ds4-server,在需要时下载并构建运行时环境,根据机器选择量化方式,在 Pi 使用期间保持租约,暴露日志,并在无客户端后通过看门狗机制关闭服务器。目前甚至不提供可调参数(knobs),因为我希望先弄清楚如何自动设置这些参数。
这并不是为了掩盖本地推理的复杂性。而是要将复杂性集中在一个可被改进的地方——因为整个栈上有大量环节需要优化才能更好地工作。
我认为在缓存方面还有提升空间,如果我们齐心协力,或许还能挖掘出更多性能潜力。
聚焦与学习
我要进行的实验不是“本地模型能否运行?”——我们已经知道它可以。我想探究的是:对于拥有高性能 Mac 的用户来说,是否能在工具调用性能合理的前提下,尽可能接近托管提供商的易用性?具体包括如何让缓存高效运作、如何改进这些模型的工具暴露方式(harnesses),然后逐步扩展到更多硬件配置和更先进的模型。
我也希望每个人都能访问这项技术。工程师需要锤子,而一把被订阅墙和数据中心的地理距离所限制的锤子显然不合格。我知道能运行此模型的 Mac 价格本身已经高得离谱,但我认为未来价格可能会下降。更糟糕的是,由于内存短缺,苹果现在甚至不再为 Mac Studio 提供足够的 RAM。所以没错,ds4.c 初期确实只会面向一小部分人。
但尽管如此,关键在于越来越多的人开始聚焦于某项事物,动手尝试、持续改进,而不是被锁在封闭环境中,而是公开可用,更重要的是不受超大规模云服务提供商限制。
但如果你拥有合适的硬件,并且关心本地代理,我诚挚邀请你在 Pi 中试用它:
pi install https://github.com/mitsuhiko/pi-ds4我的期望是,这能成为真正打磨一个编码代理体验的有力推动力。但归根结底,重点应放在 ds4.c 本身。
本条目已标记 ai 和 thoughts
copy as / view markdown
需要完整排版与评论请前往来源站点阅读。