You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ChromaDB中检索特定PDF对应的嵌入ID与元数据

解决ChromaDB无法检索特定PDF嵌入元数据与ID的问题

先排查元数据一致性

  • 先确认存储时source字段的实际值:调用vectordb.get(limit=2)获取少量样本数据,查看source的格式——比如是否带完整路径(如./uploads/test.pdf)而非仅文件名(test.pdf),或者存在大小写差异(如Test.pdf vs test.pdf)。
  • 打印pdf_file.filename的实际值,和存储的source做对比,确保两者完全匹配。

修正查询语法

LangChain封装的Chroma在使用get方法时,需注意查询条件的格式:

  • 精确匹配场景(确认source就是纯文件名):
    target_filename = pdf_file.filename
    results = vectordb.get(where={"source": target_filename})
    
  • 模糊匹配场景(source带路径或存在大小写问题):
    results = vectordb.get(where={"source": {"$contains": target_filename}})
    

验证存储过程正确性

检查嵌入存储代码,确保元数据正确关联到每个文档:

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from datetime import datetime

embeddings = OpenAIEmbeddings()
# docs为PDF解析后的文档对象列表
docs = ... 

# 给每个文档绑定自定义元数据
for doc in docs:
    doc.metadata = {
        "source": pdf_file.filename,
        "user": current_user_id,
        "created_at": datetime.now().isoformat()
    }

# 写入ChromaDB并持久化
vectordb = Chroma.from_documents(
    documents=docs,
    embedding=embeddings,
    persist_directory="./chroma_db",
    collection_name="pdf_embeddings"
)
vectordb.persist()

获取ID并删除对应嵌入

查询到结果后,直接提取ids字段执行删除:

if results["ids"]:
    vectordb.delete(ids=results["ids"])
    print(f"成功删除{len(results['ids'])}条来自{target_filename}的嵌入数据")
else:
    print("未找到对应PDF的嵌入数据")

额外排查点

  • 确认persist_directory路径正确,避免操作了不同的数据库文件。
  • 如果使用了自定义collection_name,查询时要确保指向同一个集合。

内容的提问来源于stack exchange,提问作者usama hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:50:10