KohakuRAG:从文档树找到证据

如果你曾经在工作中构建过 RAG 管道,你可能知道这种感觉:检索在演示中看起来不错,然后在真实问题上悄悄崩溃……

KohakuRAG:从文档树找到证据
AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo

如果你曾经在工作中构建过 RAG 管道,你可能知道这种感觉:检索在演示中看起来不错,然后在真实问题上悄悄崩溃……

本文之所以有趣,是因为它介绍了一种以非常实用、工程优先的方式解决这一差距的方法。

1、标准 RAG 的问题

对于像 WattBot 2025 挑战赛这样的硬核任务,标准 RAG 往往不够可靠,该挑战赛要求 ±0.1% 的数值精度和精确的来源归属。在实践中,三个问题反复出现:

  • 扁平分块破坏了语义边界和文档结构,使精确的来源追踪变得更加困难,并削弱了对引用质量的信心。
  • 当措辞不一致时,单个查询很容易遗漏相关证据,尤其是当同一概念使用不同术语时。
  • 单次生成过程本质上是不稳定的。答案和引用都可能因运行而异,在某些情况下,由于害怕产生幻觉,系统可能会不必要地弃权(输出空白),尽管证据就隐藏在上下文中。

2、KohakuRAG:从扁平块到可引用的树

KohakuRAG 的核心是一个轻量级 RAG 框架,建立在四级层次化文档索引之上:文档 → 章节 → 段落 → 句子。

它通过自底向上的嵌入聚合保留文档结构,通过基于 LLM 的查询规划加上跨查询重排序来提高检索覆盖率,并在生成过程中通过弃权感知的集成投票来稳定最终输出。

None

2.1 离线层次化文档索引

第一步是文档解析。

每个文档被组织成四级树状结构:文档 → 章节 → 段落 → 句子。图像和表格被视为特殊的段落节点,由 Qwen3-VL 生成标题(文本描述)。图像使用 PyMuPDF 提取,然后传递给 Qwen3-VL 进行标题生成,重点关注技术内容、数值、轴标签等类似细节。

文档解析阶段主要基于规则,使用布局启发式方法从 PDF 和幻灯片中恢复章节和段落结构。PyMuPDF 处理文本和布局信息的基本提取,然后使用基于字体大小、间距、格式和相关线索的规则来识别层次结构。

  • 章节检测规则:字体大小至少为中位数 1.2 倍的文本块被视为候选章节标题。编号模式(如 1.2 或 A.3)用作确认章节边界的附加信号。
  • 段落检测规则:垂直间距小于行高 1.5 倍的连续文本块被合并为一个段落。较大的间距被视为段落边界。
  • 句子分割规则:句子分割基于 NLTK 的 sent_tokenize,并针对技术文档添加了额外规则,以处理如 Fig.、et al. 和 i.e. 等缩写。

下一步是嵌入计算。

嵌入使用长度加权策略自底向上聚合。叶节点(句子)直接嵌入,而父节点使用 token 计数加权平均值从其子节点计算。

KohakuRAG 支持两种嵌入后端:用于文本检索的 Jina v3(768 维,最多 8K 上下文)和用于多模态检索的 Jina v4,支持 128 到 2048 的 Matryoshka 维度,可以直接嵌入文本和图像。向量存储建立在 sqlite-vec 作为轻量级后端之上。

2.2 在线多查询检索

在线阶段从基于 LLM 的查询规划开始。

原始问题被扩展为 n 个语义相关的查询,以覆盖替代措辞、首字母缩略词扩展和子查询分解。

接下来是密集检索。

每个规划的查询用于余弦相似度搜索,仅针对句子和段落节点。

还有一个可选的混合检索步骤。

可以添加基于 BM25 的稀疏检索作为增强,仅应用于段落索引。其结果直接附加在密集检索结果之后。

然后是跨查询重排序。

这里使用三种策略:基于频率、基于分数和组合重排序。被多个查询匹配的节点获得更高的优先级。

None

最后,系统执行索引遍历和层次化上下文扩展。

对于每个匹配的节点,系统使用父节点和兄弟节点扩展上下文。KohakuRAG 还描述了一个可选的树去重步骤,可以移除祖先-后代重叠以节省上下文窗口空间,尽管在比赛提交中未启用。

2.3 回答管道

对于提示词构建,检索到的上下文通过重新排序的布局放置在问题之前。这有助于解决中间丢失问题,同时格式化的引用标记使 LLM 更容易进行归属。

对于结构化输出,LLM 被要求返回 JSON,包括答案、提取的值、引用 ID、解释以及指示结果是否为空白的标志。当证据不足时,模型应明确弃权。

这里的"引用"是在文档 ID 级别进行评估的,而不是页面或跨度级别的归属,这对于理解系统真正优化的内容很重要。

None

如图 3 所示,还引入了重试机制。如果 LLM 返回空白结果,系统会增加检索 top-k 值并再次运行检索,重复此过程直到获得有效答案或达到重试限制。

2.4 多次生成,然后投票

None

一旦检索结果到位,系统不会只向 LLM 请求一个答案。相反,它独立生成多个答案。

最后,通过投票聚合运行结果。如果至少存在一个非空白答案,则在投票前过滤空白输出;如果所有运行都是空白的,系统则弃权。这使答案和引用都更加稳定。

3、评估

KohakuRAG 是为 WattBot 2025 挑战赛开发的,因此实验结果主要基于该基准数据集。

有 32 篇关于 AI 能耗的技术文档,包括研究论文、技术报告和演示幻灯片。完整集合约 500K token,涵盖 AI 模型的功耗、用水量、碳足迹和性能特征等主题。

None

在这项挑战赛中,KohakuRAG 在公开排行榜上获得 0.902,在私有排行榜上获得 0.861。它也是唯一一个在公开和私有排行榜上都保持 №1 位置的方法。

None

一个令人惊讶的发现:提示词排序极其重要。 如图 6 所示,仅仅将问题放在检索到的上下文之后(而不是之前)就获得了 80% 的相对改进,证实了"中间丢失"现象。有时,最大的收益来自最简单的调整。

None

另一个有趣的发现:密集检索可能就足够了。 如图 7 所示,虽然混合搜索(密集 + BM25)通常被视为强大的基线,但 KohakuRAG 表明,结构良好的层次化密集检索本身就具有很强的竞争力。添加 BM25 仅提供了 +3.1% 的边际提升。

4、思考

KohakuRAG 的价值不在于任何单个组件感觉全新。真正的优势在于它如何将四个熟悉的想法——层次化索引、多查询检索、带重试的弃权和集成投票——紧密集成到一个非常具体的目标周围:高度准确的答案、精确的引用,以及在证据不够强时弃权的能力。

它还触及了企业知识问答中最困难的部分之一:可追溯性比仅仅答对问题更重要。从这个意义上说,层次化树结构不仅仅是一种更精细的文档分块方式。它是引用、审计和错误分析的基础设施。

但我有两个担忧。

第一个担忧是系统对文档解析质量敏感,可能也对查询规划质量敏感。在真实的企业环境中,文档通常充满嘈杂的 PDF 和不一致的布局。当这种情况发生时,基于规则的章节解析可能在基础层面出错。

第二个是成本和延迟。集成推理或多或少地线性增加成本,重试机制可能使尾部延迟更糟。因此,这感觉更像是一种高可靠性、低吞吐量的设计,而不是天然适合高并发在线问答的方案。


原文链接:KohakuRAG: Climb the Document Tree, Find the Right Evidence

汇智网翻译整理,转载请标明出处