在LangChain中,ChromaDB的 get() 或query() 在嵌入向量更新后返回空结果

编程语言 2026-07-09

我正在使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章