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

创建并存储Embedding时遇IDs为空错误的解决求助

解决方案:ChromaDB添加Embedding时提示ID为空列表错误

错误原因分析

出现ValueError: Expected IDs to be a non-empty list, got 0 IDs错误,核心是ChromaDB执行add_texts时无法获取有效非空的ID列表,常见触发场景:

  • split_texts本身是空列表:文本拆分后无有效片段,生成的ID列表自然为空
  • 生成的ID未传入add_texts方法:即使手动生成ID,但若未通过ids参数传递,ChromaDB自动生成ID的逻辑仍会因split_texts为空报错
  • 元数据/Embedding列表长度不匹配:metadatas或embeddings的长度与split_texts不一致,会触发ID验证逻辑异常

分步解决步骤

1. 先验证split_texts是否为空

调用add_texts前,先检查拆分后的文本数量:

print(f"拆分后的文本数量:{len(split_texts)}")

如果输出为0,说明文本拆分逻辑有问题,需排查文档加载、拆分规则(比如文档未正确读取、拆分阈值设置过高导致无片段生成)。

2. 确保ID列表正确传入add_texts

手动生成ID后,必须将其作为ids参数传递给add_texts方法,修改代码如下:

chroma = Chroma(embedding_function=hf_embeddings, persist_directory=chroma_db_path)

# 先确认有可添加的文本
if len(split_texts) > 0:
    # 为每个文本片段生成唯一ID
    ids = [f"doc_{i}" for i in range(len(split_texts))]
    # 校验元数据和Embedding长度是否匹配
    assert len(metadatas) == len(split_texts), "元数据长度与文本片段数量不匹配"
    assert len(embeddings) == len(split_texts), "Embedding长度与文本片段数量不匹配"
    
    # 传入所有参数,包括ids
    chroma.add_texts(
        texts=split_texts,
        embeddings=embeddings,
        metadatas=[{'source': doc['source']} for doc in documents],
        ids=ids
    )
    chroma.persist()
else:
    print("无有效文本片段可添加,请检查文本拆分逻辑")

3. 修正元数据列表长度(若有需要)

如果split_texts是从多个文档拆分而来,每个文档拆分成多个片段,需为每个片段单独设置来源元数据,确保长度与split_texts一致:

# 生成与split_texts长度匹配的元数据列表
metadatas = []
for doc in documents:
    # 获取当前文档拆分出的片段数量,替换为你的实际拆分逻辑
    doc_split_count = len(get_document_splits(doc))
    metadatas.extend([{'source': doc['source']}] * doc_split_count)

# 确认长度匹配
assert len(metadatas) == len(split_texts)

额外注意事项

  • 确保embeddings的长度与split_texts完全一致,每个文本片段对应一个Embedding向量
  • 首次创建ChromaDB时,确认persist_directory路径有写入权限

内容的提问来源于stack exchange,提问作者Yusuf AI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:07:34