在LangChain中,ChromaDB的 get() 或query() 在嵌入向量更新后返回空结果
我正在使用LangChain、ChromaDB和本地嵌入模型构建一个本地的RAG流水线。文档导入流程没有报错,向量存储也正确初始化。然而,当我在更新或添加新文档后,立即查询向量存储时,相似性搜索返回空列表 [],或无法检索到新添加的分块。
以下是一个最小可复现的示例,展示我是如何初始化存储并添加文档的:
import uuid
from langchain_community.vectorstores import Chroma
from langchain_core.documents import Document
from langchain_huggingface import HuggingFaceEmbeddings
# Initialize local embedding model
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
# Initialize persistent Chroma client
vector_store = Chroma(
collection_name="research_docs",
embedding_function=embeddings,
persist_directory="./chroma_db"
)
# Sample document chunks to add dynamically
new_docs = [
Document(page_content="Forward aggregation prevents data leakage in spatiotemporal forecasting by ensuring only historical data is utilized.", metadata={"source": "thesis_methodology"}),
Document(page_content="SHAP values explain ensemble model predictions by allocating credit to each feature based on Shapley values.", metadata={"source": "interpretability_report"})
]
# Generating unique IDs for the chunks
uuids = [str(uuid.uuid4()) for _ in range(len(new_docs))]
# Adding documents to the existing store
vector_store.add_documents(documents=new_docs, ids=uuids)
# Immediate query attempt
retriever = vector_store.as_retriever(search_kwargs={"k": 1})
results = retriever.invoke("How is data leakage controlled?")
print("Retrieved results:", results)
# Outputs: Retrieved results: []
我尝试了以下方法:
我已验证add_documents能成功返回UUID列表,这意味着写入操作在没有显式异常的情况下完成。
如果我重新启动整个Python脚本,只使用.load() 初始化向量存储,或者指向同一个persist_directory而不再次运行写入步骤,查询有时会工作,但在同一运行时会话中的动态更新始终无法返回数据。
我检查了是否存在重复的UUID,但每个批次我都会生成新的UUID。
环境: langchain:0.3.x(或你当前的版本)
chromadb:0.5.x
操作系统:Windows / Linux
为什么在LangChain的 Chroma包装器中,同一会话实例化后,动态添加的文档不能立即用于查询?添加文档后是否需要显式的同步或缓存清除方法?
解决方案
这个问题主要是由于较旧版本的LangChain Chroma包装器在 add_documents() 之后保持了过时的集合状态。
而不是:
from langchain_community.vectorstores import Chroma
请使用:
from langchain_chroma import Chroma
随着较新版本的 chromadb,新添加的嵌入有时不会立即在活动的检索会话中体现。
在 add_documents() 之后重新初始化向量存储通常可以解决它:
vector_store.add_documents(docs, ids=ids)
vector_store = Chroma(
collection_name="research_docs",
embedding_function=embeddings,
persist_directory="./chroma_db"
)
还要确保:
- 旧的集合不要用不同的嵌入模型创建
- 集合计数在增加:
print(vector_store._collection.count())
这主要是新版 chromadb 与已弃用的 langchain_community 包装器之间的兼容性/状态刷新问题。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。