RAG-01数据切分-Hierarchical-Chunking-RAG

本文属于 RAG 工程框架中的「1 数据接入与文档切分」环节,聚焦「Hierarchical Chunking(层级切分)」方法。可先阅读 RAG-00.方法概述 再进入本篇。

原理

同时构建父 Chunk(章节级)与子 Chunk(段落级),查询时先粗召回父 Chunk,再细召回子 Chunk,兼顾覆盖度与精度。

关键技术/实现路径

  • 章节树构建与父子 ID 关联。
  • 多粒度索引(父/子分开建索引)。
  • 检索时父子融合与去重。

优缺点

  • 优点:减少语义截断,复杂问题召回更稳。
  • 缺点:索引与检索链路更复杂。

性能与资源

  • 离线成本:中。
  • 在线时延:中(双层召回)。

应用场景

  • 长文档、规章体系、技术手册。

统一合成数据示例

输入数据片段

1
{"doc_id":"D21","sections":[{"id":"S1","title":"报销标准","paras":["机票上限2000元","30天内提交"]}]}

中间结果(父子 Chunk + 检索路径)

1
2
3
4
5
{
"parent":[{"chunk_id":"P-S1","text":"第三章 报销标准:含机票额度与提交时限。"}],
"child":[{"chunk_id":"C-S1-1","text":"机票上限2000元"},{"chunk_id":"C-S1-2","text":"30天内提交"}],
"retrieve_path": "parent_hit(P-S1) -> child_rerank -> pick C-S1-1,C-S1-2"
}

要点:父块先覆盖章节语义,子块再精确到条款,对应「粗到细」两层检索。

最终生成示例(含引用)

1
2
3
4
{
"answer":"规则包含“机票上限 2000 元”和“30 天内提交”。",
"citations":[{"doc_id":"D21","evidence_span":"机票上限2000元;30天内提交"}]
}

原始发表与工程实现

  • 代表性原始发表:RAPTOR (Sarthi et al., 2024)。
  • 核心解决问题:解决多粒度检索与长文组织。
  • 成熟实现工具:llama-index recursive retriever, langchain parent retriever。

详细原理拆解

  • 父子 Chunk 双层检索,先父级覆盖再子级精确,典型融合分数 score=alpha*parent+(1-alpha)*child。
  • 典型实现可拆为:输入预处理 -> 方法核心计算 -> 候选/证据构建 -> 生成与引用。
  • 工程调优重点:质量(准确率/引用率)与成本(时延/token)的联合优化。
1
2
3
4
5
flowchart LR
In[输入 Query 与知识] --> Core[方法核心计算]
Core --> Rank[匹配/路由/排序]
Rank --> Build[证据组装]
Build --> Out[答案与引用]

工程落地扩展示例

伪代码

1
2
3
4
5
6
7
def hierarchical_retrieve(query, parent_index, child_index, alpha=0.4):
p_scores = parent_index.search(query, top_k=3)
children = []
for pid, sp in p_scores:
for cid, sc in child_index.search_in_parent(query, pid, top_k=6):
children.append((cid, alpha * sp + (1 - alpha) * sc))
return sorted(children, key=lambda x: -x[1])[:8]

参数示例

1
2
3
4
5
6
parent_chunk_level: section
child_chunk_level: paragraph
parent_top_k: 3
child_per_parent: 6
fusion_alpha: 0.4
dedupe_child_spans: true

常见失败案例

  • 失败模式 1:父块过粗,embedding 与查询相似度低,子块根本没被展开,长章漏检。
  • 失败模式 2:子块过碎,同一事实被拆成多条命中,证据重复、上下文噪声大
  • 失败模式 3:alpha 固定,不同查询类型(定义类 vs 数值类)最优融合权重不同,一刀切失效。

Demo 数据带入计算示例

1
2
3
问句 q 与父块 P-S1 相似度 sp=0.72;与子块 C-S1-1 相似度 sc=0.91。
融合 score = 0.4*0.72 + 0.6*0.91 = 0.834。
若仅用父块排序可能输给另一文档的父块 0.78;加入子块后本路径胜出,体现层级检索优势。
-------------本文结束感谢您的阅读-------------