如何使用LangChain检查Chroma Vectorstore中是否存在文档?

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

我正在 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.
该服务非常适合该数据库上的其他相似性搜索任务,因此我怀疑我的代码可能存在问题。

有没有更好的方法来检查矢量存储中是否存在文档?我将不胜感激任何指导!

langchain py-langchain chromadb vectorstore
1个回答
0
投票

免责声明
我假设您正在使用提到的 Python 包的最新版本。在撰写本文时,这些是:

  • langchain
    版本
    0.3.14
  • langchain-chroma
    版本
    0.2.0

如果不是这种情况,请明确包含您正在使用的版本,以便我们提供更准确的帮助。


要根据元数据检查文档是否存在于矢量存储中,

.get()
功能是您的最佳选择。

以下是其工作原理的摘要:

  1. 设置限制 (

    k
    ):指定要检索的最大结果数。

  2. 使用

    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)
© www.soinside.com 2019 - 2024. All rights reserved.