快速结论: 该报错发生在 RAGFlow 用 Go 版 PDF 解析器(opendataloader / tcadp / somark)解析 PDF 并走 QA chunker 抽取问答对时:解析本身成功,但 QA 分块结果为 0 对。核心报文是 Go: PDF parsers label table-less text as doc_type_kwd: "table", so the QA chunker silently returns zero pairs 。优先排查解析器写入的 doc_type_kwd 与文本内容是否一致,以及所用分支上的 QA 分派逻辑是读标签还是读行遍历结果。
适用环境: Issue 中确认涉及 RAGFlow 仓库(infiniflow/ragflow),问题定位在 Go 侧 PDF 解析与 QA chunker 链路;提及的相关分支为 main 与 1.0.0-rc2。环境变量中涉及 EnvSOMarkTableFormat,相关文件包括 pdf_parser_opendataloader.go、pdf_parser_tcadp.go、pdf_parser_somark.go、office_table_render.go、pdf_parser_remote_common.go、qa.go。Issue 未提供操作系统、Python、CUDA、显卡、PyTorch 等信息,此处不补写。
最快修复方案: 升级到包含修复的 main 分支提交:生产侧 #20092(516b9cf0f)让三个解析器统一走 pdfTableDocType;消费侧 #20358(9b67a4112)让 extractQAJSON 不再依赖标签、改为按行遍历结果分派。两处修复均在 main 中。
注意事项: 仅做“标签降级”而不渲染真实表格标记,无法恢复丢失的 QA 对——管道符拼接的文本(如 "q1 | a1")走文本路径时,detectDelimiter 只统计 \t 和 ,,仍然解析出零对。此外 #20080 只合入 1.0.0-rc2,在 main 上已被 #20358 取代;若你的分支是 1.0.0-rc2 而非 main,行为可能与上述结论不同,需先确认目标分支。
问题场景
用户在 RAGFlow 中上传包含表格的 PDF 文档,使用 Go 侧 PDF 解析器(opendataloader、tcadp、somark)进行解析,然后进入 QA chunker 抽取问答对。解析过程没有报错、文档成功解析,但最终 QA 分块结果为 0 对,用户看到一个成功却空的结果,且没有任何提示说明输入被错误标注。
触发路径为:这三个解析器对不含任何表格标记的文本设置了 doc_type_kwd: "table",而 QA chunker 据此去查找表格行,找不到行,于是静默返回零个 QA 对。
报错原文
Go: PDF parsers label table-less text as `doc_type_kwd: "table"`, so the QA chunker silently returns zero pairs
Issue 中描述的实际表现:
They set `doc_type_kwd: "table"` on text that contains no `` / ``.
The QA chunker then looks for rows, finds none, and silently returns zero QA pairs —
a successful parse that produced nothing.
原因分析
最可能的原因是生产者与消费者对“表格”的判定不一致:
生产侧 :pdf_parser_opendataloader.go、pdf_parser_tcadp.go、pdf_parser_somark.go 在没有输出 <table> / <tr> 标记的情况下,仍把文本标为 doc_type_kwd: "table"。
消费侧 :QA 路径信任该标签。在 main 上分派仍是基于标签(qa.go 中 if itemDocType(item) == "table"),于是按表格路径处理,找不到可读行,回退失败或直接返回空。
PR #19235 (“fix(chunker): read QA pairs from a JSON item that holds an HTML table” )曾从消费侧处理同类混淆,但被关闭未合并。
PR #20080 在消费侧加入基于遍历器的分派作为兜底,但作者明确说明它不修改这些解析器,生产侧的标签问题仍未解决;且 #20080 只合入 1.0.0-rc2。
需要特别注意的是:即使把标签从 table 降级为 text,也不一定能恢复丢失的 QA 对。这些 payload 并非普通散文,而是管道符拼接的行(如 openDataLoaderCellsText、tcadpTableRowsText 产生的 "q1 | a1"\n"q2 | a2");detectDelimiter 只统计 \t 和 ,,因此管道符分隔的行在文本路径下同样得到零对。
环境排查
确认当前使用的 RAGFlow 分支:修复结论是针对 upstream/main(e0f5fd190)验证的;1.0.0-rc2 与 main 的 QA 分派逻辑不同。
确认是否包含 pdfTableDocType(internal/parser/parser/pdf_parser_remote_common.go:111-119)。
确认是否存在 TestPDFRemoteParsers_TableItemsCarryTableMarkup 测试。
确认 extractQAJSON(internal/ingestion/component/chunker/qa.go:401+)的实现是读标签还是读 isTableHTML + tableRows。
确认涉及的解析器文件:pdf_parser_opendataloader.go、pdf_parser_tcadp.go、pdf_parser_somark.go。
若使用 somark,确认 EnvSOMarkTableFormat 的取值:默认 html 时表格内容已是 HTML;非标记格式时才应将标签降为 text。
Issue 未提供操作系统、Python、CUDA、PyTorch、显卡等版本信息,无法据此判断,不建议在无证据时归因于这些组件。
解决步骤
确认目标分支。 修复后的行为在 main 上已验证;1.0.0-rc2 上 #20080 只做了消费侧兜底,结论不同。
升级到包含生产侧修复的版本。 #20092(提交 516b9cf0f,2026-09-24 合入 main)使三个解析器统一通过 pdfTableDocType 判定,仅当 isTableHTML(text) 为真时才返回 "table":
opendataloader 在打标签前通过 SimpleRowsToHTML 把 cells 渲染为 HTML;
tcadp 渲染 table_data.rows 为 HTML;
somark 表格分支使用 pdfTableDocType。
升级到包含消费侧修复的版本。 #20358(提交 9b67a4112,2026-09-29 合入 main)让 extractQAJSON 不再读取标签:isTableHTML 仅作为廉价候选过滤,实际由 tableRows 决定,无可读行时回退到 extractQAText。这样即使存在错误标注的 payload,也不会再静默产出零对。
保留并运行生产者侧不变量测试。 TestPDFRemoteParsers_TableItemsCarryTableMarkup 绑定“标注为 doc_type_kwd: "table" 的条目必须携带 tableRows 可读取的标记”,防止生产者与消费者再次漂移。
不要仅做标签降级。 如前所述,仅把 table 降为 text 无法恢复缺失的 QA 对;正确做法是把有结构化数据的解析器(tcadp 的 table_data.rows、opendataloader 的带行索引 cells)在生产侧渲染为真实 <table><tr><td> 标记,参照 renderSpreadsheetTable(office_table_render.go)由 #20080 为电子表格确立的先例。
验证方法
在升级后的 main 分支上:
用同样的 PDF 文档重新走解析 + QA chunker 流程,确认 QA 分块不再返回 0 对,或至少能从表格项中抽取到问答对。
检查解析输出的元数据:管道符拼接、不含表格标记的文本,其 doc_type_kwd 应为 text;带有真实 <table> / <tr> / <td> 标记的项才为 table。
运行 TestPDFRemoteParsers_TableItemsCarryTableMarkup,确认生产者侧标签与消费侧期望一致。
如仍在 1.0.0-rc2,注意该分支上的行为由 #20080 决定,与 main 不一致,验证结果不能直接套用。
参考来源
infiniflow/ragflow #20143
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
了解 GamsGo AI
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗? 解决了 还没有
可以继续搜索完整报错,或查看同一工具的其他排查指南。
上一篇:文章
U-Space让大模型不确定性可解释,无需重复生成或训练
下一篇:文章
Sophos 借 OpenAI Daybreak 将威胁调查时间缩短 96%