生产级PDF RAG流水线:关系型解析、目录检索、类型化答案

生产级PDF RAG流水线:关系型解析、目录检索、类型化答案

生产级PDF RAG流水线:关系型解析、目录检索、类型化答案

📰 来源:Towards Data Science | 📅 翻译日期:2026年7月8日
🔗 原文查看原文
🤖 翻译:DeepSeek AI · 仅供参考

本文开启《企业文档智能》系列的第三部分,该系列从四个基本构件构建企业级RAG系统:文档解析、问题解析、检索和生成。

这是关于升级流水线的两部分中的第一部分:本部分在相同的论文和相同的问题(最小RAG)上,一次一个契约地升级每个构件。第二部分《将四个RAG构件组合成一个流水线》(链接待发布)将它们连接成一个调用,并在多个真实文档上运行。

📓 配套的可运行笔记本在GitHub上:doc-intel/notebooks-vol1。

百余行Python代码将四个函数连接在一起:解析PDF、解析问题、检索几页、询问模型。

在带有内置目录的论文上,该流水线对干净问题返回正确答案。但在真实语料上,当用户第一次输入带有两个拼写错误的“positonal encodig”时,当文档是没有PDF大纲的200页合同时,当问题要求列出所有排除项而非单个时,当下游代码需要类型化对象而非字符串时,它就会失败。在流水线交付之前,每个构件都需要升级。

文档解析现在返回的不再是平坦的line_df:而是一个关系型集合,包括目录(TOC)、页面级元数据,以及一个携带文档类型、语言和一段内容摘要的类型化parsing_summary

问题解析将嘈杂的用户输入转化为结构化简报,根据语料自身词汇纠正关键词,并推断答案形状(单个值、列表、表格)。

检索像专家一样读取目录:将整个目录交给一个小型LLM,由其按语义相关性选择章节,然后与关键词页面合并。

生成返回一个类型化答案,每个项目附带一个可引用的文本跨度,外加四个上下文质量指标,流水线据此决定是输出答案还是运行另一轮。

运行的论文是公开的15页arXiv提交《Attention Is All You Need》。问题“位置编码的选项有哪些?”带有两个拼写错误,以使问题解析构件有事可做。输出是企业用户所需的:类型化答案,附带绑定到行范围的逐字引用,以及从问题到引用的完整审计轨迹。

基线RAG的断裂点

选择一个干净PDF上的干净问题,通过最简单的RAG流水线运行它:解析PDF、从问题中提取关键词、检索几页、询问LLM。在《Attention》论文上,对于问题“位置编码的选项有哪些?”,该流水线返回“正弦位置编码和学习位置嵌入”,并附带一个连续的页面引用范围。它在干净问题、干净论文上工作良好。

但将同一流水线投入企业环境,四个弱点迅速显现,每个构件一个:

  • 文档解析:文档被扁平化。最小RAG将PDF解析为单一的行列表,足以计算关键词,但仅此而已。页面、章节、表格——下游构件可限定的所有结构——在第一步就被丢弃。
  • 问题解析:用户输入的问题很少干净。“位置编码的选项有哪些?”(原文有拼写错误optioinsposiitional)包含两个拼写错误。基线关键词提取器从未见过positional这个词,它看到的是posiitional,因此检索错过了答案所在的页面。
  • 检索:基线从未查看结构。《Attention》论文带有清晰的目录,命名章节带有页码,三级深度。整个文档中最精确的检索信号被忽略。
  • 生成:答案以原始字符串形式返回。列表问题(选项)需要每个选项一个项目,每个项目有自己的证据。自由形式的散文迫使调用者重新解析答案以找到项目;带有每个项目证据跨度的类型化模式消除了这一步骤。

以下四个构件解决了上述四个弱点。同一篇论文,同一个问题,真实的LLM调用。输出是一个类型化列表,带有逐字引用、行范围以及产生它的完整决策链。

升级的四个构件

升级后的形态与最小RAG介绍的四个构件相同。改变的是每个构件的契约:每个构件消耗什么、产生什么,以及下一个构件如何消耗它。下图是完整的契约:每个构件、其产生的输出以及下游构件消耗哪些(包括parsing_summary侧通道同时进入问题解析和生成)。每个构件的子节随后深入每个框。

四个构件各自在其自己的文章中升级,值得阅读完整契约:

  • 文档解析:文章5A(PDF中读取什么)和文章5B(关系数据模型)
  • 问题解析:文章6A(论点)、文章6B(提取)和文章6C(分发)
  • 检索:文章7A(检索作为过滤)、文章7B(锚点检测)和文章7C(LLM仲裁器)
  • 生成:答案契约、提示组装和验证(文章8A至8C,链接待发布)

2.1 文档解析:小型关系集

解析运行一次,将PDF转换为所有后续构件重用的小型表集合。

输入:pdf_path,磁盘上的PDF。输出:line_dfpage_dftoc_dfparsing_summary

文档解析:parse_pdf读取一次PDF并返回每个下游构件重用的小型关系集。

2.2 问题解析:从噪声到结构化简报

问题解析运行一次,将用户输入(通常是嘈杂的字符串)转换为结构化对象,后续的检索和生成将使用该对象。

输入:question(字符串)和parsing_summary(来自文档解析)。输出:question_brief(类型化对象,包含校正后的关键词和推断的答案形状)。

2.3 检索:先目录后关键词

检索运行一次,使用目录查找语义相关章节,然后使用关键词查找页面。

输入:toc_dfquestion_brief以及可选的page_df。输出:context_pages(用于生成的页面列表)。

2.4 生成:类型化答案与可引用跨度

生成运行一次,将检索到的页面与问题简报结合,调用LLM,并返回类型化答案。

输入:context_pagesquestion_briefparsing_summary。输出:typed_answer(类型化对象,包含答案项、每个项的引用跨度和上下文质量指标)。

参考资料

  • GitHub仓库:doc-intel/notebooks-vol1
  • 《Attention Is All You Need》arXiv论文
  • 相关文章:5A, 5B, 6A, 6B, 6C, 7A, 7B, 7C, 8A, 8B, 8C

📌 *本文由 DeepSeek AI 自动翻译排版,如有不准确之处欢迎指正* 🏠 [返回首页](https://www.suiyuanlu.cn) · 📖 [查看原文](https://towardsdatascience.com/a-production-rag-pipeline-for-pdfs-relational-parsing-toc-retrieval-typed-answers/)
©版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

评论已关闭