← 返回题目列表

RAG 如何处理多跳问题和长文档?父子检索、邻居扩展怎么用?

高频 中等 第 5 / 25 题 更新于 2026/07/25
RAG多跳检索父子检索长文档

简化版

多跳问题需要组合分散在不同片段、甚至不同文档的证据,一次 Top-k 相似度检索往往不够。做法是先分解子问题并迭代检索,再用父子检索、邻居扩展补全局部上下文;每一步都保留来源、控制噪声,避免错误中间结论继续传播。关键——不能简单把 Top-k 调大(大量无关上下文会增成本,还触发「中间遗忘」)。

详细版

常见策略:

  1. 问题分解:拆成多个子问题,按依赖顺序检索;
  2. 迭代检索:从首轮证据抽取实体/线索,再发起下一轮;
  3. 父子检索:小子块匹配、返回较完整父块;
  4. 邻居扩展:命中一个 chunk 后补同文档前后片段;
  5. 层次摘要:为章节/文档建摘要索引,先定位范围再深入原文;
  6. 证据图:把实体、关系、来源组织起来支持跨文档查询。

应根据问题动态选检索轮数、上下文窗口、停止条件。

完整版教学

一、什么是多跳问题(单跳 vs 多跳)

单跳(一段证据直接答):"产品 A 的保修期多久?"
多跳(连接多个事实):"产品 A 的负责人所在部门今年发布了哪些项目?"
  需要:① 找负责人 → ② 找他的部门 → ③ 找该部门项目

如果直接把完整问题编码成一个向量,多个关系被压缩在一起,任何单个文档都不一定与整句高度相似——这是一次 Top-k 检索搞不定多跳的根本原因。

二、问题分解与迭代检索

规划子问题(有依赖):
  1. 产品 A 的负责人是谁?        → 检索得到"张三"
  2. 张三属于哪个部门?           → 用"张三"检索得到"研发部"
  3. 研发部今年发布了哪些项目?   → 用"研发部"检索
每步保存:文档 ID + 原文片段 + 置信信号

关键原则:某一步没有可靠证据时应停止或换查询,而不是让模型猜一个中间答案继续(否则错误逐步传播)。互不依赖的子问题可并行检索降延迟。

三、父子检索解决什么

小块匹配更精确,却可能缺标题、定义、例外条款。父子检索为每个小块记录所属父块

命中【子块】"逾期利率为 0.05%/天"(精确匹配)
→ 返回【父块】"第五条 违约责任:...逾期利率为 0.05%/天...(含前提和例外)"
→ 生成模型拿到完整上下文

适合章节结构明确的手册、合同、技术文档。但父块过大会重新引入噪声,可只返回命中句周围窗口并保留标题路径。

四、邻居扩展的适用场景

若答案跨越相邻段落,可在命中块前后补 1-2 个块。但要校验:必须同文档、同章节、连续位置——不能把索引里相邻但原文无关的块硬拼。

优点:邻居扩展比固定大 overlap 更省索引空间,因为只在查询时按需取上下文,而非建库时就冗余存储。

五、层次检索与停止条件

长文档建「文档摘要 → 章节摘要 → 原始片段」多级索引,先按问题选文档/章节,再在限定范围搜细节。适合「总结整份报告主要风险」这类范围型问题。但摘要会漏细节,最终事实要回到原始片段

迭代检索可能无限扩散,生产系统必须限制:最大跳数、每跳候选数、总 token,并在证据已覆盖问题要点时停止。可缓存子查询结果、并行无依赖步骤、用轻量模型做规划。

六、常见误区与追问

  • 误区:多跳问题把 Top-k 调大就行。 大量无关上下文增成本、触发中间遗忘,反而更差,要分解+迭代。
  • 误区:长上下文能自动解决多跳。 研究表明关键信息在中间时模型利用下降(lost in the middle),仍要先筛选组织证据。
  • 误区:邻居扩展可以随便拼相邻块。 必须校验同文档/同章节/连续位置,否则拼进无关内容。
  • 误区:层次摘要可以当最终事实。 摘要会漏细节,事实要回到原始片段。
  • 追问:为什么一次向量检索搞不定多跳? 多个关系压进一个向量,单个文档不一定与整句相似。
  • 追问:中间步骤没证据怎么办? 停止或换查询,绝不让模型猜中间答案继续(防错误传播)。
  • 追问:父子检索兼顾了什么? 子块精确匹配 + 父块完整上下文,“找得准”和”读得全”兼得。
  • 追问:迭代检索怎么防无限扩散? 限最大跳数/每跳候选/总 token,证据覆盖要点即停,缓存+并行降本。

七、加强记忆

多跳记「沿线索连续找卡」:单跳”找到一张卡就能答”,多跳”分解子问题→迭代检索(每步用上步实体、保留证据、无证据即停)“。补上下文靠父子检索(子块精匹配+父块完整)和邻居扩展(校验同文档连续位置、比大 overlap 省空间),长文档靠层次摘要(先定范围再回原文)。核心认知钉死:别简单调大 Top-k(增噪+中间遗忘)、长上下文不自动解决多跳、每一步都要证据链兜底不让模型猜、迭代要设停止条件