学习笔记 · Obsidian

向量库统一接口与本地基线

LangChainTypeScript

结论

  • 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 是否归一化、越大/越小越好
RetrieverasRetriever()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;
  • 适合单元测试、算法验证和作为召回正确性的参照。

生产契约测试

  1. 同一固定语料验证 top-k、score 顺序、filter、空结果和重复 ID。
  2. 写后立即查、批量写、失败重试、delete 与 delete-all 验证一致性。
  3. 启动时校验 embedding dimension 与索引 schema,不匹配直接失败。
  4. 测量 p50/p95/p99、QPS、召回率、索引构建时长、存储与网络成本。
  5. 保存 index version 和 embedding fingerprint;重建后用双读/影子流量验证再切换。