问题出现得很突然,日志倒是留得挺全。llama-index-core 0.11 用 IngestionPipeline 每次服务启动都跑一遍文档目录,Chroma 里的节点数从 1200 涨到 3600,检索结果里同一段文字出现三次,docstore 里却只有 1200 条。
刚开始盯着「docstore_strategy 用的是 UPSERTS,但文档内容里带了时间戳」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。pipeline 没挂 docstore,每次都把所有文档当新文档处理。也可能是TextNode 的 id_ 每次随机生成,哈希去重完全不生效。
不容易想到的是,Chroma 侧按 id upsert,id 变了就等于新增。
上来先核对向量库与 docstore 的条数差
python -c "import chromadb;c=chromadb.PersistentClient('./chroma');print(c.get_collection('docs').count())"
给节点固定一个由文档路径和文本算出的 id
python -c "import hashlib;print(hashlib.md5(b'guide.md#0').hexdigest())"
再往下把 docstore 持久化到磁盘再接进 pipeline
python -c "from llama_index.core.storage.docstore import SimpleDocumentStore;d=SimpleDocumentStore();d.persist('./docstore.json');print(len(d.docs))"
末了清掉重复集合后按固定 id 重跑一次
python -c "import chromadb;c=chromadb.PersistentClient('./chroma');c.delete_collection('docs')"
怎么算真的好了,看的是同一批现象。重跑三次后集合条数稳定在 1200,docstore 与向量库数量一致,检索同一问题不再返回三段重复内容。
增量入库的关键不是流水线本身,而是节点 id 是否稳定;只要 id 跟着内容走,docstore 就能挡住重复,反之每跑一次都是全量新增。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
