查看: 55|回复: 54

[相关教程] 用LlamaIndex搭多文档RAG:父子分块加混合检索的踩坑手记

[复制链接]

96

主题

5

回帖

951

积分

UID
2
贡献
9 点
钻石
7 个
C币
993 个
发表于 2026-2-14 14:22:33 | 显示全部楼层 |阅读模式
为什么不是朴素RAG

朴素RAG(一个chunk一个向量,top-k检索)跑了一周就发现三个问题:长文档被切碎上下文丢失,多个文档之间引用错乱,准确率不到60%。改用父子分块加混合检索后,准确率拉到85%,记录一下踩过的坑。

父子分块怎么搞

核心思路:检索用小块(200字),返回用大块(父块2000字)。LlamaIndex里用SentenceWindowNodeParser或者HierarchicalNodeParser都行。我用的是后者,配AutoMergingRetriever,相邻小块命中超过3个自动合并成父块,上下文不丢。


  • 分块:父块2000字,子块2000字再切200字,父子用关系链关联。
  • 索引:子块建向量索引,父块用docstore存原始文本。
  • 检索:query子块索引top-10,命中的子块去重取父,合并后塞给LLM。


混合检索的坑

只跑向量检索精度不够,加BM25关键词检索,做融合。LlamaIndex有QueryFusionRetriever,把vector加bm25两个检索器结果做RRF融合。权重默认各0.5,但我的文档专业词多,BM25提到0.6准确率高5个点。

坑在Embedding模型。我一开始用OpenAI text-embedding-3,中文文档准确率70%。换成BGE-M3中文专模型后到84%。BGE-M3同时支持稠密加稀疏加ColBERT三种向量,一个模型顶三个检索器,省事。

部署代码骨架
  1. from llama_index.core import VectorStoreIndex, StorageContext, load_index_from_storage
  2. from llama_index.core.node_parser import HierarchicalNodeParser
  3. from llama_index.retrievers import AutoMergingRetriever
  4. from llama_index.core.query_engine import RetrieverQueryEngine
  5. parser = HierarchicalNodeParser.from_defaults(chunk_sizes=[2000, 200])
  6. nodes = parser.get_nodes_from_documents(docs)
  7. auto_retriever = AutoMergingRetriever.from_defaults(retriever, storage_context)
  8. engine = RetrieverQueryEngine.from_args(auto_retriever)
  9. response = engine.query("xxx条款怎么规定的")
复制代码

最大成本坑是重排。top-10召回塞给LLM太多,加个bge-reranker-v2重排取top-3,token量砍60%,准确率不降反升。reranker跑CPU也行,单次重排200ms,能接受。

温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
6、网络世界也请遵守我国的法律法规!一旦发现违法行为,将立即封存相关信息并报警处理!
回复

使用道具 举报

0

主题

360

回帖

40

积分

UID
110965
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-2-15 15:06:24 | 显示全部楼层
有个坑提醒一下,接口一变整套流程都得跟着改,最好提前做抽象层。
回复

使用道具 举报

0

主题

354

回帖

44

积分

UID
839461
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-2-15 18:34:01 | 显示全部楼层
说实话这个投入产出比确实得看行业,我们做传统制造的,算下来还不如人工。
回复

使用道具 举报

0

主题

387

回帖

0

积分

UID
314575
贡献
0 点
钻石
0 个
C币
0 个
发表于 2026-2-16 01:29:15 | 显示全部楼层
这个结论我保留意见,至少在我们行业不太成立,可能跟样本有关。
回复

使用道具 举报

0

主题

391

回帖

42

积分

UID
928478
贡献
0 点
钻石
0 个
C币
0 个
发表于 2026-2-16 11:52:07 | 显示全部楼层
帖子里那个数字挺关键的,不过不同规模的团队差异会很大,不能直接套。
回复

使用道具 举报

0

主题

382

回帖

46

积分

UID
793579
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-2-17 01:42:36 | 显示全部楼层
这个成本账算得很实在,我这边也是类似情况,量小的时候真没必要自己折腾。
回复

使用道具 举报

0

主题

385

回帖

41

积分

UID
404479
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-2-17 19:00:42 | 显示全部楼层
写得挺到位的,不过我觉得还是要区分"能用"和"好用",中间差着一大截。
回复

使用道具 举报

0

主题

362

回帖

0

积分

UID
968202
贡献
0 点
钻石
0 个
C币
0 个
发表于 2026-2-18 15:46:26 | 显示全部楼层
用过类似的,前期调优确实费人,但稳定跑了之后省心不少,值得。
回复

使用道具 举报

0

主题

373

回帖

51

积分

UID
686264
贡献
0 点
钻石
0 个
C币
0 个
发表于 2026-2-19 15:59:47 | 显示全部楼层
我之前也研究过这个方向,最后放弃了,主要是我这边数据量根本不够。
回复

使用道具 举报

0

主题

382

回帖

46

积分

UID
798830
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-2-20 19:40:45 | 显示全部楼层
成本这块还可以再拆细一点,隐性的人力投入其实占大头。
回复

使用道具 举报

温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
6、网络世界也请遵守我国的法律法规!一旦发现违法行为,将立即封存相关信息并报警处理!
您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

QQ客服返回顶部