在 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或 IVFnprobe下,p95 查询延迟、QPS 上限与错误率写入一页纸结论。 - 磁盘与出口:WAL 峰值、索引包体积、快照上传流量有上限与告警;禁止静默写满系统卷。
- 回滚:保留上一版
.usearch/ FAISS / sqlite 文件与清单,切流失败可在网关层一键指回旧路径。
FAQ
能否把三类索引都放在系统盘?可以演示,不建议生产:FAISS 训练与 sqlite WAL 突发写 I/O 会拖垮同一卷的 Spotlight 与 Time Machine 增量。
M4 内存较小优先谁?体量百万内优先 sqlite-vec + 严格 PRAGMA;百万级以上用 USearch 或 FAISS,并把元数据仍放 sqlite。