当前位置: 首页 > news >正文

Langchain中的表格解析:RAG 和表格的爱恨情仇

实现 RAG(Retrieval-Augmented Generation)是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时。这在处理扫描文档或图像格式的文档时尤为困难。这些挑战至少包括以下三个方面:

  • 1.表格的“叛逆期”:不准确的解析可能会破坏表格结构
    表格在文档里就像个叛逆的青少年,结构复杂、格式多变,手写和打印混在一起,还时不时带点非文本元素(比如图片、公式)。想要准确解析它们?难上加难!一不小心,表格结构就被破坏得七零八落,RAG 的结果也跟着遭殃。

  • 2.表格标题的“捉迷藏”:如何提取表格标题并有效地将其与相应的表格关联起来。
    表格标题就像个调皮的小精灵,总是藏在表格旁边,但就是不肯乖乖现身。如何找到它并把它和表格“配对”?这可是个技术活儿!

  • 3.索引结构的“拼图游戏”如何设计索引结构以有效存储表格的语义信息。
    表格的语义信息怎么存?是存成图像、纯文本、LaTeX,还是只存个摘要?这就像在玩拼图,得找到最合适的拼法,才能让 RAG 系统跑得顺畅。

本文首先介绍了在 RAG 中管理表格的关键技术,然后回顾了一些现有的开源解决方案,最后提出并实现了一个新的解决方案。
在这里插入图片描述

工具大比拼

表格解析

该模块的主要功能是从非结构化文档或图像中准确提取表格结构。

附加功能:最好能提取相应的表格标题,并方便开发者将表格标题与表格关联起来。

根据我目前的理解,有几种方法,如图 1 所示:
在这里插入图片描述
图 1:表格解析器。

(a). 利用多模态 LLM,如 GPT-4V,来识别表格并从每个 PDF 页面中提取信息。

  • 输入:图像格式的 PDF 页面
  • 输出:JSON 或其他格式的表格。如果多模态 LLM 无法提取表格数据,它应该对图像进行总结并返回总结。

(b). 利用专业的表格检测模型,如 Table Transformer,来识别表格结构。

  • 输入:图像格式的 PDF 页面
  • 输出:图像格式的表格

©. 使用开源框架,如 unstructured 等,这些框架也使用对象检测模型(unstructured 的表格检测过程在这篇文章中有详细说明)。这些框架允许对整个文档进行全面的解析,并从解析结果中提取与表格相关的内容。

  • 输入:PDF 或图像格式的文档
  • 输出:从整个文档的解析结果中获得的纯文本或 HTML 格式的表格

(d). 使用端到端模型,如 Nougat、Donut 等,来解析整个文档并提取与表格相关的内容。这种方法不需要 OCR 模型。

  • 输入:PDF 或图像格式的文档
  • 输出:从整个文档的解析结果中获得的 LaTeX 或 JSON 格式的表格

值得一提的是,无论使用哪种方法提取表格信息,都应包含表格标题。因为在大多数情况下,表格标题是文档或论文作者对表格的简要描述,可以在很大程度上概括整个表格。

在上述四种方法中,方法 (d) 可以轻松获取表格标题。这对开发者来说非常有利,因为它允许他们将表格标题与表格关联起来。这将在接下来的实验中进行进一步解释。

索引结构

根据索引的结构,解决方案大致可以分为以下几类:

(e). 仅索引图像格式的表格。

(f). 仅索引纯文本或 JSON 格式的表格。

(g). 仅索引 LaTeX 格式的表格。

(h). 仅索引表格的摘要。

(i). 小到大或文档摘要索引结构,如图 2 所示。

  • 小块的内容可以是表格每一行的信息或表格的摘要。
  • 大块的内容可以是图像格式、纯文本格式或 LaTeX 格式的表格。
    在这里插入图片描述

图 2:小到大索引结构(上部)和文档摘要索引结构(中部和下部)。作者提供的图片。

如上所述,表格摘要通常使用 LLM 生成:

  • 输入:图像格式、文本格式或 LaTeX 格式的表格
  • 输出:表格摘要

不需要表格解析、索引或 RAG 的算法

有些算法不需要表格解析。

(j). 将相关图像(PDF 页面)和用户的查询发送到 VQA 模型(如 DAN 等)或多模态 LLM,并返回答案。

  • 需要索引的内容:图像格式的文档
  • 发送到 VQA 模型或多模态 LLM 的内容:查询 + 对应的页面(图像形式

(k).相关文本格式的 PDF 页面和用户的查询发送到 LLM,然后返回答案。

  • 需要索引的内容:文本格式的文档
  • 发送到 LLM 的内容:查询 + 对应的页面(文本格式

(l).相关图像(PDF 页面)、文本块和用户的查询发送到多模态 LLM(如 GPT-4V 等),并直接返回答案

  • 需要索引的内容:图像格式的文档和文本格式的文档块
  • 发送到多模态 LLM 的内容:查询 + 对应的图像格式文档 + 对应的文本块

此外,以下是一些不需要索引的方法,如图 3 和图 4 所示:
在这里插入图片描述

图 3:类别 (m)

(m). 首先,应用类别 (a) 到 (d) 中的一种方法,将文档中的所有表格解析为图像格式。然后直接将所有表格图像和用户的查询发送到多模态 LLM(如 GPT-4V 等),并返回答案。

  • 需要索引的内容:无
  • 发送到多模态 LLM 的内容:查询 + 所有解析后的表格(图像格式)在这里插入图片描述
    图 4:类别 (n)。

(n). 使用 (m) 中提取的图像格式的表格,然后使用 OCR 模型识别表格中的所有文本,然后直接将表格中的所有文本和用户的查询发送到 LLM,并直接返回答案。

  • 需要索引的内容:无
  • 发送到 LLM 的内容:用户的查询 + 所有表格内容(文本格式)

值得注意的是,有些方法不依赖于 RAG 过程:

  • 第一种方法不使用 LLM,而是在特定数据集上进行训练,使模型(如 BERT 类 Transformer)更好地支持表格理解任务,例如 TAPAS。
  • 第二种方法使用 LLM,采用预训练、微调方法或提示,使 LLM 能够执行表格理解任务,如 GPT4Table。

现有的开源解决方案

LlamaIndex 提出了四种方法,其中前三种使用多模态模型。

  1. 检索相关图像(PDF 页面)并将其发送到 GPT-4V 以响应查询。
  2. 将每个 PDF 页面视为图像,让 GPT-4V 对每个页面进行图像推理。为图像推理构建文本向量存储索引。查询答案时,针对图像推理向量存储进行查询。
  3. 使用 Table Transformer 从检索到的图像中裁剪表格信息,然后将这些裁剪后的图像发送到 GPT-4V 以响应查询。
  4. 对裁剪后的表格图像应用 OCR,并将数据发送到 GPT4/ GPT-3.5 以回答查询。

根据本文的分类:

  • 第一种方法类似于本文的类别 (j),不需要表格解析。然而,结果显示,即使答案在图像中,也无法生成正确答案。
  • 第二种方法涉及表格解析,对应于类别 (a)。索引的内容是表格内容或摘要,基于 GPT-4V 返回的结果,可能对应于类别 (f) 或 (h)。这种方法的缺点是 GPT-4V 从图像中识别表格并提取其内容的能力不稳定,特别是当图像包含表格、文本和其他图像的混合时,这在 PDF 格式中很常见。
  • 第三种方法类似于类别 (m),不需要索引。
  • 第四种方法类似于类别 (n),也不需要索引。其结果表明,由于无法从图像中提取表格信息,导致生成错误答案。

通过测试,发现第三种方法的整体效果最好。然而,根据我的测试,第三种方法在检测表格方面存在困难,更不用说正确地将表格标题与表格合并了。

Langchain 也提出了一些解决方案,半结构化 RAG 的关键技术包括:

  • 表格解析使用 unstructured,属于类别 ©
  • 索引方法是文档摘要索引,属于类别 (i),小块内容:表格摘要,大块内容:原始表格内容(文本格式)。

如图 5 所示:在这里插入图片描述
图 5:Langchain 的半结构化 RAG。来源:半结构化 RAG

半结构化和多模态 RAG 提出了三种解决方案, 架构如图 6 所示。在这里插入图片描述

图 6:Langchain 的半结构化和多模态 RAG。来源:半结构化和多模态 RAG。

选项 1 类似于本文的类别 (l)。它涉及使用多模态嵌入(如 CLIP)来嵌入图像和文本,使用相似性搜索检索两者,并将原始图像和块传递给多模态 LLM 以进行答案合成。

选项 2 利用多模态 LLM,如 GPT-4V、LLaVA、FUYU-8b,从图像生成文本摘要。然后,嵌入并检索文本,并将文本块传递给 LLM 以进行答案合成。

  • 表格解析使用 unstructured,属于类别 (d)
  • 索引结构是文档摘要索引(类别 (i)),小块内容:表格摘要,大块内容:文本格式的表格

选项 3 使用多模态 LLM(如 GPT-4V、LLaVA、FUYU-8b)从图像生成文本摘要,然后嵌入并检索图像摘要,并引用原始图像(类别 (i)),然后将原始图像和文本块传递给多模态 LLM 以进行答案合成。

提出的解决方案

本文提出的解决方案:在这里插入图片描述

  • 表格解析:使用 Nougat(类别 (d))。根据我的测试,它的表格检测比 unstructured(类别 ©)更有效。此外,Nougat 可以很好地提取表格标题,非常方便与表格关联。
  • 文档摘要索引结构(类别 (i)):小块的内容包括表格摘要,大块的内容包括相应的 LaTeX 格式的表格和文本格式的表格标题。我们使用 multi-vector retriever 实现它。
  • 表格摘要获取方法:将表格和表格标题发送到 LLM 进行摘要。

这种方法的优点是它高效地解析表格,同时全面考虑了表格摘要与表格之间的关系。它还消除了对多模态 LLM 的需求,从而节省了成本。

Nougat 的原理

Nougat 是基于 Donut 架构开发的。它通过网络隐式识别文本,不需要任何 OCR 相关的输入或模块,如图 8 所示。在这里插入图片描述
图 8:基于 Donut 的端到端架构。Swin Transformer 编码器将文档图像转换为潜在嵌入,随后以自回归方式转换为标记序列。来源:Nougat: Neural Optical Understanding for Academic Documents。

Nougat 解析公式的能力令人印象深刻。它在解析表格方面也表现出色。方便的是,它可以关联表格标题,如图 9 所示:
在这里插入图片描述图 9:运行 Nougat 的结果,结果文件为 Mathpix Markdown 格式(通过 vscode 插件打开),表格为 LaTeX 格式。

我测试发现表格标题总是固定在表格的下一行。这种一致性表明这不是偶然的。 Nougat 是如何实现这种效果的?

鉴于它是一个端到端模型,缺乏中间结果,它很可能严重依赖于其训练数据。

根据格式化训练数据的代码,对于表格,紧跟在 \end{table} 之后的行是 caption_parts,这似乎与提供的训练数据的格式一致:

def format_element(element: Element, keep_refs: bool = False, latex_env: bool = False
) -> List[str]:"""将给定的元素格式化为格式化字符串列表。参数:element (Element): 要格式化的元素。keep_refs (bool, 可选): 是否在格式化中保留引用。默认为 False。latex_env (bool, 可选): 是否使用 LaTeX 环境格式化。默认为 False。返回:List[str]: 表示格式化元素的格式化字符串列表。""".

http://www.mrgr.cn/news/95859.html

相关文章:

  • 深入 SVG:矢量图形、滤镜与动态交互开发指南
  • Python进阶编程总结
  • 定长内存池原理及实现
  • 【Linux知识】RPM软件包安装命令行详细说明
  • MoManipVLA:将视觉-语言-动作模型迁移到通用移动操作
  • Rust从入门到精通之精通篇:21.高级内存管理
  • Tasklet_等待队列_工作队列
  • ngx_http_core_location
  • SVN常用命令
  • 团体协作项目总结Git
  • 基于Ebay拍卖网站成交价格的影响因素分析
  • python工厂模式
  • 2025前端面试题(vue、react、uniapp、微信小程序、JS、CSS、其他)
  • 吾爱出品,文件分类助手,高效管理您的 PC 资源库
  • 内核编程十二:打印task_struct中的数据
  • 单片机和微控制器知识汇总——《器件手册--单片机、数字信号处理器和可编程逻辑器件》
  • Mycat安装验证流程整理
  • 【Pandas】pandas Series to_csv
  • Vue 3 组件高级语法
  • 【c++入门系列】:引用以及内联函数详解