更新 faiss 索引中的元素

Update an element in faiss index

我正在使用 faiss indexflatIP 来存储与某些词相关的向量。我还使用另一个列表来存储单词(列表中第 n 个元素的向量是 faiss 索引中的第 n 个向量)。我有两个问题:

  1. 是否有更好的方法将单词与其向量相关联?
  2. 我可以更新 faiss 中的第 n 个元素吗?

faiss只是ann算法库,不能用于数据持久化和管理

github 上有一些开源的矢量数据库,它们也许能帮到你。比如 milvus、vespa 等等

milvus 是 star 最多的

https://milvus.io

https://github.com/milvus-io/milvus

您可以使用 add_with_ids 方法添加具有整数 ID 值的向量,我相信这也可以让您更新特定向量 - 但您需要构建某种添加层 vector-ID Faiss 之外的映射和管理,因为它不被其他方式支持。我以前做过这个,但不是很有趣。

如果您对 Faiss 替代品持开放态度,我建议您研究一下 Pinecone。它为您管理一切,因此您只需使用它们的 upsert 方法插入您的 (id, vector) 对,然后更新向量您只需 upsert 具有相同 ID 的新向量。设置可能需要 5-10 分钟,这 guide explains how.

两者都可以。

  1. Is there a better way to relate words to their vectors?

致电index.add_with_ids(vectors, ids)

有些索引类型支持 add_with_ids 方法,但平面索引不支持。

如果您在平面索引上调用该方法,您将收到错误 add_with_ids not implemented for this type of index

如果要使用扁平索引的ID,必须使用index2 = faiss.IndexIDMap(index)

  1. Can I update the nth element in the faiss?

如果你想更新一些编码,先删除它们,然后用add_with_ids

重新添加它们

如果不先删除原始 ID,就会出现重复 ID,搜索结果也会一团糟。

要删除 ID 数组,请调用 index.remove_ids(ids_to_replace)

注意事项:ID 必须是 np.int64 类型。