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

从磁盘加载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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:53:27