快速结论:使用 RAGFlow 的 deepdoc PDF 解析时,如果正文句子恰好以 Table N 开头(例如交叉引用 “Table 1, we present …”),它会被误判为表格标题,并入最近表格的 caption 而不再作为独立段落。应先确认解析结果中表格 caption 是否混入了正文,再按解析器版本排查是否为已修复的判别边界问题。
适用环境:RAGFlow 的 deepdoc PDF 解析(Python 参考实现与 Go 实现均会触发)。Issue 仅确认了问题存在于当前 main 分支,未列出具体操作系统、Python、CUDA、显卡或依赖版本。
最快修复方案:暂无确认的一步修复方案。已修复的只是以 Table N 开头的正文句子被整体吸收的头号场景(由 #21453 处理);DLA 检测器已标注为 table caption、但文本实为正文句子的样本仍会复现,已另开 #21884 跟踪。
注意事项:收紧 caption 判别规则属于有意偏离 Python 参考实现的行为,需要经 parity harness 验证;且并非所有真实 caption 都带冒号(如 Table 2 Performance comparison),不能简单机械修改。
问题场景
在 RAGFlow 中解析含表格的学术论文 PDF 时,deepdoc 的 CaptionKind 分类与 MergeCaptions 合并流程会把一段正文句子当作表格标题。Issue 中复现的三处:KnowAgent 论文 Table 2、27 页 RAG 论文 Table 1 与 Table 9。表现是正文句子从独立段落中消失,表格的 <caption> 混入正文,且该表格分块的 Positions 数量从正常 caption 的 2 个增加到 3–4 个。
报错原文
deepdoc/pdf: a body sentence beginning with "Table N" is absorbed into a table's caption (and, with #20650, into its highlight geometry)
原因分析
CaptionKind 用 (?i)^Table\s+\d+ 这类行首锚定正则判断表格标题,MergeCaptions 再把命中的文本追加到最近表格并删除原段落。以交叉引用开头的正文行(如 Table 1, we present …)与真正的 caption 一样匹配,因此被吞并。这与 Python 参考实现 deepdoc/vision/table_structure_recognizer.py::is_caption 的行为一致,并非 Go 实现的偏差。叠加 #20650 的 caption 框合并后,被误并的正文框也会进入表格分块的 Positions,使高亮区域覆盖不相关页面区域。另有一类残留场景:DLA 检测器已把某框标为 table caption,其文本实为正文句子,但 tableCaptionProse 同样锚定在 ^Table\s+\d+,这类从句子中间开始的框不会进入边界规则,标签仍然生效。
环境排查
- 确认所用的 RAGFlow 版本或提交,是否已包含 #21453 的修复。
- 确认解析的是 Python 参考实现还是 Go 实现,两者在本问题上行为一致。
- 检查出问题表格的
<caption>文本,是否混入了以逗号或小写单词延续的正文。 - 检查该表格段落
len(section.Positions):正常为 2(表格框 + caption 框),3–4 说明有正文框被并入。 - 确认该框是否由 DLA 检测器直接标注为
table caption,这类样本可能不在 #21453 的覆盖范围内。
解决步骤
- 升级到包含 #21453 的版本(可优先尝试),该修复要求
CaptionKind在Table N标记之后必须存在 caption 边界,从而保留以Table 1, we present …这类正文开头的独立段落。 - 升级后重新解析 Issue 中的样本文档,逐项比对表格 caption 文本。
- 若仍有正文混入 caption,判断该框是否由 DLA 检测器标注为 table caption;若是,则属于 #21884 跟踪的残留问题,目前无已确认修复。
- 在修复到位前,可对受影响的表格或句子做后处理校正,例如从
<caption>中剔除正文部分、恢复为独立文本(此为绕过手段,非 Issue 验证方案)。
验证方法
对同一 PDF 重新解析后检查:原被吞并的正文句子是否作为独立段落出现;目标表格的 <caption> 是否只含真实标题;该表格分块的 Positions 是否回到 2 个(未叠加 #20650 时按实际合并逻辑核对)。若 27 页 RAG 论文 Table 1 一行仍在 caption 内出现正文,说明命中 #21884 的残留场景,而非 #21453 未生效。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


