从磁盘加载Chroma向量存储时集合为空的问题求助
问题
我用Chroma和Langchain创建了包含三个集合的向量存储,保存到持久化目录的代码如下:
def create_embeddings_vectorstorage(splitted): embeddings = HuggingFaceEmbeddings() persist_directory = './chroma' vectorstores = {} for key, value in splitted.items(): #splitted是包含三个键的字典,值为Langchain Document类的列表组成的列表 collection_name = key.lower() for documents in value: vectorstore = Chroma.from_documents(documents=documents, embedding=embeddings, persist_directory=persist_directory, collection_name=collection_name, collection_metadata={'animal': collection_name}) vectorstore.persist() #持久化数据库以便后续使用(我觉得只在Jupyter Notebook需要) vectorstores[collection_name] = vectorstore return vectorstores
创建完成后,通过print(vectorstore['bat']._collection.count())验证,bat集合的嵌入数据已正确保存,输出为1200。
现在我在同目录的新脚本中尝试从持久化目录加载该向量存储,代码如下:
embeddings = HuggingFaceEmbeddings() persist_directory = './chroma' bat = Chroma(collection_name='bat', persist_directory=persist_directory, embedding_function=embeddings)
但遇到问题:搜索无结果,执行print(bat._collection.count())输出为0。已确认成功加载Chroma对象(输出为<langchain.vectorstores.chroma.Chroma object at 0x000001900281AED0>),但集合为空,需要找出问题原因及解决方法。
问题原因及解决方法
1. 循环重复创建集合覆盖数据
原因:创建集合时,对每个documents子列表都调用Chroma.from_documents且使用相同collection_name。这会导致每次调用都重新初始化该集合,覆盖之前存入的数据。即使最后一次循环的documents非空,内存中的对象是最后一批数据,但持久化时的重复操作可能导致磁盘上的集合数据异常,加载后显示为空。
解决方法:先初始化集合,再批量添加所有文档:
def create_embeddings_vectorstorage(splitted): embeddings = HuggingFaceEmbeddings() persist_directory = './chroma' vectorstores = {} for key, value in splitted.items(): collection_name = key.lower() # 初始化集合(不存在则创建) vectorstore = Chroma(collection_name=collection_name, persist_directory=persist_directory, embedding_function=embeddings) # 合并所有子列表的文档 all_documents = [] for documents in value: all_documents.extend(documents) # 批量添加并持久化 vectorstore.add_documents(all_documents) vectorstore.persist() vectorstores[collection_name] = vectorstore return vectorstores
2. 嵌入函数参数不匹配
原因:创建集合时使用的HuggingFaceEmbeddings参数(如模型名称、维度、归一化设置等)与加载时不一致,Chroma无法正确映射已存储的嵌入数据,导致加载后集合显示为空。
解决方法:确保创建和加载时的嵌入函数参数完全一致。例如创建时指定了模型:
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
加载时必须使用相同的参数初始化嵌入函数。
3. 持久化目录路径存在歧义
原因:脚本运行的工作目录与./chroma所在目录不一致,导致加载时找不到正确的持久化文件,Chroma会创建一个新的空集合。
解决方法:使用绝对路径指定持久化目录,避免工作目录差异影响:
import os persist_directory = os.path.abspath('./chroma')
内容的提问来源于stack exchange,提问作者Cristi Fernandez

