今天是2026年3月14日,星期六,北京,天气晴
回到RAG这个任务,思路将长文档转化为层级知识树然后做RAG的思路,这种剧本看的很多了,从最早的raptor到后面将文档解析结合RAG的N多种思路,比如什么bookrag、pageindexrag之类【这个可以看我们的文档解析专题】,这个本质就是索引艺术,可以各种雕花做上下文检索。
这里介绍新工作,也是再回顾下这方面的范式的目的以及看看其在竞赛中的获奖方案,一个典型的打榜思路。
工作在《KohakuRAG: A simple RAG framework with hierarchical document indexing》,https://arxiv.org/pdf/2603.07612,代码在:https://github.com/KohakuBlueleaf/KohakuRAG,核心思路是基于四层树形层级文档索引(文档→章节→段落→句子)的轻量级RAG框架,通过自底向上的嵌入聚合保留文档结构、LLM驱动的查询规划+跨查询重排序提升检索覆盖率、感知弃权的集成推理投票稳定答案输出,最终在WattBot 2025 挑战赛中以0.861的最终分数获公共和私有排行榜第一。
多思考,着重看思路,会有收获。
首先,说下这个挑战赛:WattBot 2025挑战赛(https://www.kaggle.com/competitions/WattBot2025),聚焦AI能耗领域的文档-grounded技术问答,要求参赛系统基于指定参考文档回答问题,同时满足严苛的精度【数值答案误差需控制在千分之一以内】、引用【需准确定位答案的源文档,避免“答对数但引错源”的情况】。和弃权要求【需区分“无答案”和“未找到答案”,避免不必要的弃权或幻觉作答】
看三块内容:
输入方面,参考文档:32份AI能耗相关的技术文档(含研究论文、技术报告、演示幻灯片),总规模约500Ktokens,涵盖AI模型的电力消耗、水耗、碳足迹、性能特性等主题;
测试问题:约300道技术问答题,41 道训练题、282 道测试题(公共分区 66%、私有分区 34%),涵盖功耗、水耗、碳足迹等 AI 能耗指标。需从参考文档中提取答案或推断结论。
输出方面,系统需针对每个问题输出三元组(a,R,b),其中:
a(答案) ,可为数值型(如能耗数据)或分类型(如技术方案名称),数值答案需满足±0.1%相对误差tolerance,分类答案需归一化后精确匹配;
R(引用集) ,准确列出答案对应的源文档ID(从32份文档中选取),需与真实引用集保持高相似度;
b(弃权标记),b=1时表示显式弃权(仅当参考文档中无足够证据时使用),b=0时表示输出有效答案,禁止无证据“幻觉”作答。
评分方面,最终分数按三部分加权计算,需同时优化准确性、引用精度和抗幻觉能力:
答案准确率(75%权重):数值答案误差≤0.1%得满分,分类答案精确匹配得满分;
引用精度(15%权重):用杰卡德相似度(|R∩R*|/|R∪R*|)衡量预测引用与真实引用的重合度;
幻觉避免(10%权重):证据不足时弃权得满分,无证据作答或引用错误将受惩罚。
核心是基于四层树形层级文档索引(文档→章节→段落→句子)的轻量级RAG框架,通过自底向上的嵌入聚合保留文档结构、LLM驱动的查询规划+跨查询重排序提升检索覆盖率、感知弃权的集成推理投票稳定答案输出,如下:

1、离线层级文档索引
首先,文档解析方式:将文档构建为四层树形结构(文档→章节→段落→句子),图像/表格作为特殊段落节点,由Qwen3-VL生成标题(使用 PyMuPDF 提取图像,通过 Qwen3-VL 生成标题,聚焦技术内容、数据值、坐标轴标签等);
,解析后含 639 章节、944 段落、24565 句子、280 张图像;
先说一个结论:既然依赖于文档层次结构,但是这个工作依赖规则化启发式解析,最粗暴的解析方式,注定的是通用型很差。
如文中所述,全程通过规则化启发式方法实现,依赖PyMuPDF工具做基础文本/位置信息提取,再通过字体、间距、格式等规则划分层。其中:
章节检测规则:字体大小≥中位数1.2倍的文本块视为潜在章节标题,带编号模式(如1.2、A.3)的进一步确认章节边界;
段落检测规则:垂直间距<1.5倍行高的连续文本块合并为段落,大间距为段落边界;
句子分割规则:基于NLTK的sent_tokenize,结合技术文本定制规则(处理Fig.、etal.、i.e.等缩写)】,
所以,对非标准布局文档鲁棒性差。
其次,嵌入计算方式:自底向上的长度加权嵌入聚合,叶子节点(句子)直接嵌入,父节点继承子节点向量平均值,也就是叶子节点(句子)直接编码,内部节点为子节点嵌入的token数加权平均值;
其中,嵌入模型采用用于检索的Jina v3(纯文本,768 维,支持 8K 上下文)和Jina v4(多模态,128-2048 维 Matryoshka 表示,支持文本 + 直接图像嵌入);向量存储基于sqlite-vec的轻量级存储;
嵌入计算采用自底向上的长度加权聚合策略。
2、在线多查询检索
首先,LLM查询规划:将原问题扩展为n个语义相关查询,覆盖替代表述、缩写展开、子查询分解等;
其次,稠密检索:对每个规划查询做余弦相似度检索,仅针对句子/段落节点;
此外,混合检索:可选BM25稀疏检索增强,仅对段落索引,结果直接拼接在稠密检索后。
然后,跨查询重排序:用频率、分数、组合三种策略,优先检索被多个查询命中的节点;

最后,是索引跳转,做层级上下文扩展:为命中节点补充父节点和兄弟节点,同时做树形去重减少冗余;

3、答案生成pipleline
在答案生成阶段,有些trick,例如:
提示词构建上,将上下文置于问题前(重排序),解决“迷失在中间”问题,格式化引用标记便于LLM归因;
结构化输出上,让LLM输出含答案、提取值、引用ID、解释、是否空白的JSON,证据不足时显式弃权;
引入重试机制,当LLM输出空白时,增大检索k值重新检索,直至得到有效答案或达到重试上限;

引入集成推理,m次独立推理(温度>0),过滤空白响应后进行多策略投票,支持AnswerPriority/Independent/Union等,其中AnswerPriority表现最优;
答案数值归一化,对数值答案解析科学计数法、统一单位,±0.1%内视为等效,因为有准确性要求,标准化是最好的方式。
1、https://arxiv.org/pdf/2603.07612