在哪里存储用于相似性搜索的嵌入?

数据挖掘 词嵌入 数据库 伯特 语义相似性
2022-02-11 12:18:30

我已经问过 stackoverflow (here),但我认为将嵌入存储在普通 postgres 数据库中的方法可能从一开始就存在缺陷。我将很快再次蚀刻出应用程序:

  • 文本语料库(几十万个文档,包含几段)
  • 使用 BERT 创建的嵌入(对于每个段落)
  • 应用:相似度​​搜索(检索相似的段落和参考文档)

我看过有关使用 BERT 等创建嵌入的教程,并且一切正常。我的关键是如何管理拥有几百万个嵌入并搜索类似的嵌入。将它们存储在哪里,以及附加信息(与嵌入相关的原始文本和包含该文本的文档)。
所以问题是:
如何在不使用云环境(数据隐私原因)的情况下以一种高效且可搜索的方式存储几百万个嵌入(768 维 numpy 数组)?
TensorFlow Records 是正确的答案吗?
到底是不是关系型数据库?
有什么不同吗?这是我的第一个 NLP 任务,我可能根本不知道明显的答案。但是,在 stackexchange 和 google 上搜索并没有提供解决方案。

3个回答

Milvus搜索引擎利用了几个著名的Approximate KNN 库,例如 FAISS、ANNOY 和 HNSW。它还处理一些您可能不想自己处理的簿记、集群、数据完整性和其他任务。一切都是为了性能价格,但如果你不想付钱,你总是可以选择一个“准系统”库。

为什么不将相似的嵌入聚类并存储,然后使用散列来更快地搜索。然后,您可以将它们存储在任何地方,也许在大数据 hdfs 分布式系统中以便更快地检索,或者如果您处于研究或 POC 环境中,则可以在数据库中简单地散列集群。

我还看到了一些其他信息检索技术,在这些技术中,您可以应用 TF IDF 或更简单的搜索技术来首先过滤掉感兴趣的文本,然后处理 768 个模糊嵌入。如果搜索是您的主要目标,这种方式会更快。

我的回答是这取决于你的创造力。我见过人们在 numpy 文件、pickle 文件、图形数据库等中讲述它们。

所以我会说你将它们存储在哪里并不重要,你的代码需要适应存储的文件。

对于相似性搜索,您可以使用索引算法使其更快。FAISS是一个解决方案。