返回

如何从 ChromaDB 中检索特定 PDF 文件的嵌入项 ID 和元数据?

python

在 ChromaDB 中检索特定 PDF 嵌入项的 ID 和元数据

在使用 Langchain 开发聊天应用程序时,您可能会面临这样的难题:如何从 ChromaDB 矢量数据库中检索与特定 PDF 文件关联的嵌入项 ID 和元数据,而不是检索整个集合的数据。

问题根源

在 ChromaDB 中嵌入 PDF 文件时,您会将自定义元数据和 ID 与每个嵌入项一起存储。当需要根据特定 PDF 文件删除其嵌入项时,检索这些特定 ID 和元数据至关重要。

然而,现有的 vectordb.get() 函数会返回所有 ID 和元数据,而不是针对特定 PDF 文件的子集。因此,您需要寻找一种方法来细化检索范围。

解决方法

要检索特定 PDF 文件的嵌入项 ID 和元数据,您可以使用以下步骤:

  1. 连接到 ChromaDB: 使用 ChromaDB PersistentClient 连接到数据库,并选择要查询的集合。
  2. 构建查询: 使用 ChromaDB 的 where() 函数构建查询,指定要匹配的 PDF 文件名称元数据。例如:
query = client.where({"source": pdf_file.filename})
  1. 执行查询: 对集合应用查询以检索匹配的嵌入项。
result = collection.get(query)

代码示例

将上述步骤应用于代码示例中:

import chromadb
import uuid
import datetime

# 连接到 ChromaDB
client = chromadb.PersistentClient(path="./trained_db")
collection = client.get_or_create_collection("PDF_Embeddings", embedding_function=embedding_functions.OpenAIEmbeddingFunction(api_key=config["OPENAI_API_KEY"], model_name=configs.EMBEDDINGS_MODEL))

# 构建查询
query = client.where({"source": pdf_file.filename})

# 执行查询
result = collection.get(query)

# 提取 ID 和元数据
ids = result["ids"]
metadata = result["metadatas"][0]

通过使用此方法,您现在可以检索特定 PDF 文件关联的 ID 和元数据,而无需检索整个集合的数据。这使您能够根据需要删除与该 PDF 文件关联的嵌入项。

常见问题解答

  • 我如何创建自定义元数据? 在存储嵌入项时,您可以使用 collection_metadata 参数指定元数据。有关更多详细信息,请参阅 ChromaDB 文档。
  • 检索到的 ID 和元数据在哪里? ID 存储在 ids 变量中,元数据存储在 metadatas 列表中。
  • 我可以使用这些 ID 删除嵌入项吗? 是的,您可以使用检索到的 ID 通过 vectordb.delete() 函数从集合中删除嵌入项。
  • 如何使用 vectordb.delete() 函数? 有关如何使用此函数的详细信息,请参阅 ChromaDB 文档。
  • 如果我没有检索到任何结果怎么办? 如果查询未返回任何结果,则表示集合中没有与该 PDF 文件关联的嵌入项。在这种情况下,您需要采取替代措施,例如通知用户。