老胡茶室
老胡茶室

本地优先的 AI 应用开发简明纪要

胡键

最近专注于本地优先的 AI 应用开发。主要原因当然不是为了省钱:相比云端服务,本地部署受限于资源和算力,能力要大打折扣。真正的原因在于:

  • 隐私保护:某些行业受合规要求限制,业务资料不允许联网。
  • 无审核的内容生成和处理:原因无需多言。
  • 响应速度:在某些场景下,速度大于一切,且需求变化有限,此时微调后的本地模型足以满足业务需要。

除了以上三类典型原因,更重要的是开源模型能力的不断增强,使本地部署成为可能。由此还能演变出“云 + 端”的架构:能在本地处理的就本地处理,处理不了的再求助云端。

技术栈

以我目前研发的项目为例,典型的技术栈如下:

开发

  • 前端:next
  • agent:eve
  • sandbox(内存):just-bash
  • gen-ui:json-render
  • 文档处理:docling + python
  • 数据库:pgvector + drizzle

测试

  • unit:node:test
  • e2e:playwright
  • eval:eve
  • linter:i18n-check + biome

本地模型

  • embedder:Qwen/Qwen3-Embedding-0.6B
  • reranker:Alibaba-NLP/gte-multilingual-reranker-base
  • llm:Qwen/Qwen3.6-35B-A3B-FP8

Serving

  • embedding + reranking:HF TEI
  • llm:vllm
  • 硬件:Nvidia DGX Spark

答疑时间

  • 为何使用 eve?

因为好用,且出自 vercel,加上前端用的也是 vercel 的 next,自然就选择了它。此外,它的开发体验很好,直接支持 eval,省事。更强的理由在于它提供了一站式的 agent 开发方案,比如 sandbox 和 gen-ui。优势如此明显,不选它选谁。

附:开源 AI Harness 的三大流派

  • sandbox 为何选择 just-bash?

首先,既然是本地优先,各类云端 sandbox provider 自然就被排除在外,剩下的就是 docker 之类支持本地部署的方案。但我目前并不需要那么复杂的功能,选择基于内存的 just-bash 是自然之选。即使后续有需要,换成 docker 也不复杂。

btw,它同样出自 vercel。

  • gen-ui 为何选择 json-render?

同样出自 vercel,并且它还支持我需要的 mcp-app。

  • 模型的选择理由是什么?

首先,我需要支持 CJK,embedder 和 reranker 的选择也就不言而喻了。

关于 reranker 多说一句:之前曾选过 Qwen Reranker,但效果总不如人意。后来深入查看并与 AI 讨论之后,才发现它压根不是我想当然的 BERT-style cross-encoder,完全不适合我的场景。又一番调研之后,选择了现在这个,因为它比 bge 性能更优(当然,这也是和 AI 讨论的结果)。

至于 llm,也是调研之后的自然之选。为何没选最近的 27B?因为成本。目前这台 Spark 上同时跑着 vllm + Qwen,以及 TEI + embedder + reranker,未来还打算引入 image model。跟 AI 讨论之后,决定暂不升级。而且实测下来,响应速度和质量都还能接受。

  • 为何不选择 ollama?

更正一下,我并非没有用 ollama:eval 的 judge 用的就是 ollama + Qwen(没找到好用的本地类 jev 模型,故而用 Qwen 顶上)。但作为服务器,ollama 并不是好的选择,vllm 和 sglang 的口碑反而更好。至于 vllm 和 sglang 之间的权衡,当时其实没想太多,发现 ollama 不适合生产环境之后,就直接选了 vllm。

简单一句话:开发可以用 ollama,生产服务器则在 vllm 和 sglang 之间选择。更复杂的,找 AI 讨论吧,反正写多了现在也没人看了 😄。

注意事项

  • 踩了若干坑之后,我们选择的 docker 镜像:
    • vllm:timothystewart6/vllm-gb10
    • tei:ghcr.io/huggingface/text-embeddings-inference:121-latest

这两个镜像都针对 Spark 做过优化或修正。

注:安装距今已有一段时间(3 个月以上),现在或许已经不需要了,权当最后的救命稻草吧。

  • thinking 有成本,且并非银弹。

thinking 一词颇具迷惑性,仿佛打开开关,模型就开了智。其实不然:使用不当的话,它会在一大堆废话之后才输出实际内容,让用户觉得系统很慢,而且输出的内容甚至可能是错的!此乃过犹不及。

对于大多数本地场景,如 RAG、图片理解与识别、文档生成与处理,这个选项其实没有必要开启。加上如今 agent harness 不断增强,它在多数情况下更显多余。

将其 budget 设为 0 之后,不仅速度大幅改善,内容质量也明显提高。

  • 本地运营同样有成本。

本地 AI 并非没有成本,简单盘算一下就有:硬件投入、访问安全、电力以及稳定性保障,需要综合考虑。

结语

以上是凭记忆罗列的、这几个月开发本地 AI 应用的相关事项和避坑说明。若有遗漏,会在后续文章里补上,哈哈。

精品内容