每用户检索是否支持开源向量存储chromadb?
来自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'})]