我正在 Chroma 中使用一些文档的矢量存储,并使用 LangChain 包实现了所有内容。这是我正在使用的包:
from langchain_chroma import Chroma
我需要通过文档的元数据检查我的矢量存储中是否存在文档。这是我使用的代码:
existing_metadata = vector_store_paper.similarity_search(query="", filter={'id': doc_id}, k=1)
但是,当这部分代码运行时,我遇到了奇怪的错误。我正在使用 API 进行嵌入,我从提供商处收到的错误消息是:
The engine is currently overloaded, please try again later.
该服务非常适合该数据库上的其他相似性搜索任务,因此我怀疑我的代码可能存在问题。
有没有更好的方法来检查矢量存储中是否存在文档?我将不胜感激任何指导!
免责声明
我假设您正在使用提到的 Python 包的最新版本。在撰写本文时,这些是:
langchain
版本0.3.14
langchain-chroma
版本0.2.0
如果不是这种情况,请明确包含您正在使用的版本,以便我们提供更准确的帮助。
要根据元数据检查文档是否存在于矢量存储中,
.get()
功能是您的最佳选择。
以下是其工作原理的摘要:
设置限制 (
k
):指定要检索的最大结果数。
使用
where
查询:利用Chroma提供的元数据过滤功能。如本文档中所述:
“可以提供可选的
过滤器字典,以按与每个文档关联的元数据进行过滤。”where
有关配置
where
过滤器的详细信息请参见此处。
配置完成后,一切就绪。例如,以下代码片段演示了该功能:
existing_metadata = db.get(
limit=1,
where={"id": {"$eq": "ABC123"}}
)["metadatas"]
此代码返回一个列表(仅限一个元素),其中包含与
where
条件匹配的文档的元数据。
下面是一个完整的代码示例来说明其工作原理:
import os
from langchain_chroma import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai.embeddings import AzureOpenAIEmbeddings
from dotenv import load_dotenv, find_dotenv
# Load environment variables
load_dotenv(find_dotenv(".env"), override=True)
# Prepare embeddings and the vector store
embeddings = AzureOpenAIEmbeddings(
api_key=os.environ.get("AZURE_OPENAI_EMBEDDINGS_API_KEY"),
api_version=os.environ.get("AZURE_OPENAI_EMBEDDINGS_VERSION"),
azure_deployment=os.environ.get("AZURE_OPENAI_EMBEDDINGS_MODEL"),
azure_endpoint=os.environ.get("AZURE_OPENAI_EMBEDDINGS_ENDPOINT")
)
db = Chroma(
persist_directory=os.environ.get("CHROMA_PATH"),
embedding_function=embeddings,
collection_name="stackoverflow-help",
)
# Add documents to the vector store
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=int(os.environ["CHROMA_EMBEDDINGS_CHUNK_SIZE"]),
chunk_overlap=int(os.environ["CHROMA_EMBEDDINGS_CHUNK_OVERLAP"])
)
documents = text_splitter.create_documents(["This is a test document for the Chroma database."])
for doc in documents:
doc.metadata = {"id": "ABC123"}
db.add_documents(documents)
# Check if the document is in the vector store
existing_metadata = db.get(
limit=1,
where={"id": {"$eq": "ABC123"}}
)["metadatas"]
print(existing_metadata)
# Check for a document that is not in the vector store
non_existing_metadata = db.get(
limit=1,
where={"id": {"$eq": "XYZ123"}}
)["metadatas"]
print(non_existing_metadata)
当您运行此代码时,结果将如下所示:
[{'id': 'ABC123'}] # Output of print(existing_metadata)
[] # Output of print(non_existing_metadata)