后台进程长期挂在 3.9GB,可它跑的向量模型参数才 91MB。差了四十倍,显然有东西在偷偷占地方。v0.5.1 把这个「看不见」的问题定位并治住了:实测常驻内存从 3.9GB 降到约 0.6GB,而且绝大多数用户什么都不用改就能直接受益。完整排查过程见同站的工程记录长文,这篇只说版本里到底动了什么。
两个被治住的内存大户
- 本地向量模型白白占着 GPU 显存:macOS 上 MPS 后端会向驱动申请约 1GB 固定显存池,且与模型大小无关、
empty_cache()也收不回,只有释放模型才释放。bge-small 在 CPU 上单条检索 15–20ms,MPS 毫无收益,纯属浪费。新增embedding.device(auto/cpu/mps/cuda,默认auto),重排模型跟随此设置——内存吃紧时改cpu即可彻底释放这 1GB。 - SQLite 每线程页缓存随查询量懒增长:原每连接缓存上限约 62.5MB 且按查询量懒增长,表现就是「跑得越久内存越高」。已降到 8MB,实测 9 连接全表扫描占用从 513MB 降到 115MB,查询耗时无变化——真实查询走索引,全表扫描靠 macOS unified buffer cache。
切 device 不改变维度,无需重建索引
只改 embedding.device 是换计算后端,向量维度不变,知识库索引无需重建;只有换模型或走 API provider 才需要重建。换句话说,这个优化对线上是零成本的。
要不要手动改配置
默认 auto 已能覆盖绝大多数场景。仅当你本机内存长期紧张、或确认用不到 MPS 加速时,才建议在 config.yaml 的 embedding 段显式写 device: cpu。配置项说明已同步进 configuration.md。
升级注意:无破坏性变更,无新增必填配置。新增可选配置embedding.device(默认auto)。SQLite 缓存上限由内部默认值调整,无需用户介入。