带有元数据过滤的 chromadb 检索非常慢

问题描述 投票:0回答:1

我有一个包含大约 300k 块的集合。我不认为这是一个巨大的数量,但是当应用元数据过滤器时,检索过程非常慢。有时检索 10 个文档需要长达 180 秒,而没有过滤器只需要 2 秒。

我使用 BGElarge 作为我的嵌入模型,使用 langchain returneder.invoke() 作为我的检索函数。

有人遇到同样的情况吗?我想知道是否可以加快过滤过程,例如设置索引,就像我们在 MongoDB 中可以做的那样。

我在网上查了一下,虽然有些人确实抱怨 ChromaDB 很慢,但到目前为止还没有人像我一样慢。

下面是我设置检索器的代码

def set_retriever(self, search_type='mmr', search_kwargs={'k':3}):
  """
  used for document retrieval
  search type is defaulted as 'mmr'
  use retriever.invoke(query) to retrieve documents
  """
  self.retriever = self.langchain_chroma.as_retriever(search_type=search_type, search_kwargs=search_kwargs)
    
  return self.retriever

下面是我的检索代码

retriever = db.set_retriever(search_kwargs={
  "filter":{
    "publishDate":{'$gte':start_date.timestamp()}
    }
  }
)
    
t1 = time.perf_counter()
results = retriever.invoke("some question")
t2 = time.perf_counter()
print(f"total time taken: ", round(t2-t1,3))
print(results)

我还使用了 chromadb.collection.query(where={"some filter"}) 但没有帮助。

information-retrieval chromadb vector-database retrieval-augmented-generation
1个回答
0
投票

Chroma DB 目前不创建元数据索引。据我所知,这在他们的仓库中仍然是一个悬而未决的问题。解决方法是在执行矢量搜索后手动应用过滤。我在只有约 50K 文档时也遇到了类似的性能问题。就我个人而言,我建议使用 Milvus 或 Pinecone 来处理非平凡大小的集合。

参见主题公开 PR

© www.soinside.com 2019 - 2024. All rights reserved.