每用户检索是否支持开源向量存储chromadb?

1 投票
2 回答
58 浏览
提问于 2025-04-14 18:30

来自langchain的文档 - 按用户检索

在构建一个检索应用时,通常需要考虑到多个用户。这意味着你可能不仅仅是为一个用户存储数据,而是为许多不同的用户存储数据,并且他们之间不能看到彼此的数据。这就要求你能够配置你的检索链,只获取特定的信息。

文档中有一个使用PineconeVectorStore的示例实现。那么,ChromaDB支持多个用户吗?如果支持的话,有人能提供一个如何使用开源的ChromaDB实现按用户检索的示例吗?

2 个回答

1

针对@chifu lin的回答,我觉得在元数据中无法区分每个文档的拥有者,因为在这里提到过这个问题。

注意:Chroma会尽力自动将数据保存到磁盘,但多个内存中的客户端可能会互相干扰。因此,最佳做法是每次只让一个客户端在同一路径下运行。

我认为你可以在初始化Chroma对象时,通过persist_directory参数指定不同的持久化目录,像这样:

username = 'Joe'
db = Chroma.from_documents(pages, embeddings, persist_directory=f"./chroma_db/{username}")

当你想获取用户Joe的数据时,可以这样从磁盘加载:

vectordb = Chroma(persist_directory=f"chroma_db/{username}", embedding_function=embeddings)

补充

在Langchain中作为检索器使用时,可以直接使用as_retriever()函数。如果你还想过滤源文档,可以在search_kwargs参数中进行过滤:

pdf_paths = ['1.pdf', '2.pdf']
search_kwargs = {
"k": 3,
'fetch_k': 10,
'filter':{'source': {'$in': pdf_paths}},}

vectordb.as_retriever(
    search_type="mmr",
    search_kwargs=search_kwargs)
3

我们可以使用过滤器,让Chromadb支持多个用户。

from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma

persist_directory = 'your_db'

embeddings = OpenAIEmbeddings()
vectordb = Chroma(embedding_function=embeddings,
                  persist_directory=persist_directory)

vectordb.add_texts(["i worked at kensho"], metadatas=[{"user": "harrison"}])
vectordb.add_texts(["i worked at facebook"], metadatas=[{"user": "ankush"}])

# This will only get documents for Ankush
vectordb.as_retriever(search_kwargs={'filter': {'user':'ankush'}}).get_relevant_documents(
    "where did i work?"
)
[Document(page_content='i worked at facebook', metadata={'user': 'ankush'})]

撰写回答