学习笔记 · Obsidian
向量库统一接口与本地基线
结论
- LangChain 统一
addDocuments、delete、similaritySearch与asRetriever,但过滤、ID、删除、索引、分数方向和一致性语义仍由具体后端决定。 - Embedding model、维度、预处理、distance metric 和索引算法必须作为同一版本契约;不能在一个索引中混用。
MemoryVectorStore是 exact linear search 的易用基线,只适合测试/小数据,不支持 ID 或删除,不能作为生产持久库。
路由去重
/vectorstores 与 /vectorstores/index 返回同一正文,两条原始路由都保留。本组覆盖 3 条路由。
统一接口与不可统一部分
| 能力 | 统一入口 | 后端差异 |
|---|---|---|
| 写入 | addDocuments() | ID/upsert、批量、可见延迟、事务 |
| 删除 | delete() | 按 ID、filter、全删或不支持 |
| 检索 | similaritySearch(query, k, filter?) | filter DSL、距离与分数方向 |
| 带分数 | similaritySearchWithScore() | score 是否归一化、越大/越小越好 |
| Retriever | asRetriever() | MMR、filter、search kwargs 支持不同 |
切换实现前必须用契约测试验证这些差异,不能因为 TypeScript 接口相同就直接替换。
相似度与索引
常见度量为 cosine、Euclidean/L2、dot product;ANN 常用 HNSW,也可能是 IVF 或后端专有算法。选择原则:
- distance 与 embedding 模型建议匹配;
- exact search 适合小集合与召回基线;
- ANN 用延迟换近似召回,需联合调
m、construction/search ef、probe 等; - metadata 预过滤必须有字段索引,否则可能先扫后滤或显著拖慢查询。
MemoryVectorStore
它把 embedding 保存在进程内,以 cosine 为默认 metric,逐个做 exact linear search;可传自定义 ml-distance similarity。能力包括 predicate filter、带 score 查询、asRetriever() 与 MMR。
明确边界:
- 进程重启数据消失,实例间不共享;
- O(n) 扫描,数据量和并发上升后延迟线性增长;
- 当前不支持 ID 和 deletion;
- 适合单元测试、算法验证和作为召回正确性的参照。
生产契约测试
- 同一固定语料验证 top-k、score 顺序、filter、空结果和重复 ID。
- 写后立即查、批量写、失败重试、delete 与 delete-all 验证一致性。
- 启动时校验 embedding dimension 与索引 schema,不匹配直接失败。
- 测量 p50/p95/p99、QPS、召回率、索引构建时长、存储与网络成本。
- 保存 index version 和 embedding fingerprint;重建后用双读/影子流量验证再切换。