真正拖慢本地 RAG 的往往不是「选 HNSW 还是 IVF」,而是离线建索引统一内存是否对齐:批大小BLAS 线程、以及 TMPDIR 是否落在快盘上。下面用一张表收齐 USearch、FAISS-CPU 与 sqlite-vec,并附可贴在 launchd 与 CI 上的验收清单。

在 M4 上三类方案都能跑通,但写入形态不同:USearch 偏向连续向量追加与 mmap 友好;FAISS-CPU 在聚类、倒排训练阶段会出现短时内存尖峰;sqlite-vec 把向量放进事务型文件,适合中小规模与强一致元数据共存。分块与 embedding 批参数请继续对齐《本地 RAG 分块与向量配额矩阵》;若检索前还要经 OpenAI 兼容网关做多模型路由,可对照《多模型路由与并发池矩阵》把「索引进程」与「推理进程」拆开限额。更多 OpenClaw 与编排类文章见技术博客索引

对比矩阵(M4 / 离线导入视角)

维度 USearch FAISS-CPU sqlite-vec
典型定位 进程内 ANN、低依赖、 mmap 索引分发。 大规模 CPU 索引、IVF/HNSW/PQ 组合丰富。 单文件交付、事务与 ACL、小到中型集合。
导入批大小起点 8192–65536 维向量/批试扫,按 RSS 回调。 4096–16384 起;训练阶段单独降压。 512–4096;过大事务拉长写锁时间。
线程建议 add 多为单 writer;查询可多读。 OMP_NUM_THREADS物理核×0.75–1,避免超线程假象。 单写多读;大导入时并发读降到 0–2
内存形态 常驻索引 + 批量缓冲,尖峰相对平滑。 训练/量化尖峰明显,需预留 1.3–2× 向量本体作护栏。 页缓存 + WAL;注意 mmap 与 cache_size 和。
磁盘热点 持久化 .usearch 与可选外置日志。 临时聚类中心、倒排表构建写 TMPDIR .sqlite.sqlite-wal.sqlite-shm 同目录监控。

可执行项:批大小、线程与缓存路径

把下面变量写进 plist EnvironmentVariables 或 CI Secret 旁边的明文占位(密钥勿进仓库)。路径请换成你机器上的快盘根;外接盘注意断电与 APFS 区分大小写卷。

# 向量维度与度量(三库对齐) export VECTOR_DIM=1024 export VECTOR_METRIC=ip # 统一导入批与线程(先扫再收紧) export VECTOR_IMPORT_BATCH=8192 export OMP_NUM_THREADS=8 export MKL_NUM_THREADS=8 export OPENBLAS_NUM_THREADS=8 # 磁盘:临时构建与持久索引根 export TMPDIR=/Volumes/FastSSD/llmmac-index-tmp export VECTOR_INDEX_TMP_ROOT=/Volumes/FastSSD/llmmac-index-tmp export VECTOR_INDEX_ROOT=/Volumes/FastSSD/llmmac-indexes # USearch 产物示例 export USEARCH_INDEX_PATH="${VECTOR_INDEX_ROOT}/prod.usearch" # FAISS 产物示例(按你的 Index 类型换后缀) export FAISS_INDEX_PATH="${VECTOR_INDEX_ROOT}/prod_ivf_pq.faissindex" # sqlite-vec(WAL 与缓存;cache_size 单位为 KB,负号表示 KB) export SQLITE_VEC_PATH="${VECTOR_INDEX_ROOT}/metadata_vectors.sqlite" export SQLITE_PRAGMA_CACHE_KB=-200000 export SQLITE_PRAGMA_JOURNAL_MODE=WAL

操作建议:TMPDIR 指到 NVMe,VECTOR_IMPORT_BATCH=4096 做阶梯倍增;一旦出现交换或音频卡顿,回退上一档并记录峰值 RSS。FAISS 若与 embedding 同机并行,给两侧各留一条线程预算,避免 OpenMP 过度订阅。

USearch 侧若采用 mmap 服务化,记得在验收里写清冷启动 mmap 延迟热页驻留:第一次查询会触发缺页,浸泡阶段应包含「进程重启后首分钟」曲线。sqlite-vec 导入完成后可做一次 VACUUM 或离线 ANALYZE(视版本支持而定),把查询计划与主键/元数据索引一并固化进报告,避免上线后才暴露全表扫。

远程节点成本验收清单(检索服务)

  • 镜像一致:芯片代际、内存容量、macOS 小版本与索引构建机一致;VECTOR_INDEX_ROOT 校验和与本地构建日志同哈希。
  • 墙钟与机时:连续浸泡 ≥ 4 小时,记录小时租金、空闲分钟与索引冷启动一次耗时。
  • SLA 数字:固定 efSearch 或 IVF nprobe 下,p95 查询延迟、QPS 上限与错误率写入一页纸结论。
  • 磁盘与出口:WAL 峰值、索引包体积、快照上传流量有上限与告警;禁止静默写满系统卷。
  • 回滚:保留上一版 .usearch / FAISS / sqlite 文件与清单,切流失败可在网关层一键指回旧路径。

FAQ

能否把三类索引都放在系统盘?可以演示,不建议生产:FAISS 训练与 sqlite WAL 突发写 I/O 会拖垮同一卷的 Spotlight 与 Time Machine 增量。

M4 内存较小优先谁?体量百万内优先 sqlite-vec + 严格 PRAGMA;百万级以上用 USearch 或 FAISS,并把元数据仍放 sqlite。

公开页(无需登录):购买定价帮助中心技术博客