LLM之RAG实战(三十三)| 探索RAG在Table的应用

       实现RAG是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时,对于扫描的文档或图像格式的文档来说尤其困难。这些挑战至少有三个方面:

  • 扫描文档或图像文档的复杂性,如其多元化的结构、非文本元素以及手写和打印内容的组合,这给自动化准确提取表格信息带来了挑战。解析不准确会破坏表的结构,使用不完整的表进行嵌入不仅无法捕获表的语义信息,而且很容易破坏RAG结果;
  • 如何提取表格标题并将其有效地链接到各自的表格;
  • 如何设计索引结构来有效地存储表的语义信息。

       本文将介绍RAG中管理表格数据的关键技术,然后回顾一些现有的开源解决方案,最后实现一个解决方案。

一、关键技术

1.1 表格分析

       该模块的主要功能是从非结构化文档或图像中准确提取表结构。最好可以提取出相应的表标题,这样方便开发人员将表标题与表关联起来。

       根据我目前的理解,有几种方法,如图1所示:

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

输入:图像格式的PDF页面

输出:JSON或其他格式的表。如果多模态LLM无法提取表格数据,则应总结图像并返回摘要。

(b)利用专业的表格检测模型(如Table Transformer[2]),来辨别表格结构

输入:PDF页面作为图像

输出:表格作为图像

(c)使用开源框架(如unstructured[3]或者目标检测模型[4]。这些框架可以对整个文档进行全面的解析,并从解析的结果中提取与表相关的内容

输入:PDF或图像格式的文档

输出:纯文本或HTML格式的表,从整个文档的解析结果中获得

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

输入:PDF或图像格式的文档

输出:LaTeX或JSON格式的表,从整个文档的解析结果中获得

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

       在上述四种方法中,方法(d)允许容易地检索表标题,这将在下面的实验中进一步解释。

1.2 索引结构

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

(e)仅使用图像格式的索引表;

(f)仅使用纯文本或JSON格式的索引表;

(g)仅使用LaTeX格式的索引表;

(h)仅为表的摘要编制索引;

(i)“从小到大”或“文档摘要索引”结构,如图2所示:

  • 小块的内容可以是来自表的每一行的信息或表的摘要。
  • 大块的内容可以是图像格式、纯文本格式或LaTeX格式的表。

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

输入:图像格式、文本格式或LaTeX格式的表格

输出:表格摘要

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

下面介绍一些不需要表解析的算法:

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

要索引的内容:图像格式的文档

发送到VQA模型或多模态LLM的内容:查询+图像形式的相应页面

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

要索引的内容:文本格式的文档

发送到LLM的内容:查询+文本格式的相应页面

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

要索引的内容:图像格式的文档和文本格式的文档块

发送到多模态LLM的内容:查询+文档的相应图像形式+相应的文本块

以下是一些不需要索引的方法,如图3和图4所示:

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

要索引的内容:无

发送到多模态LLM的内容:查询+所有解析的表(图像格式)

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

要索引的内容:无

发送到LLM的内容:用户查询+所有表内容(文本格式)

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

       第一种方法不使用LLM,在特定的数据集上进行训练,并使模型(如类似BERT的transformer)能够更好地支持表理解任务,如TAPAS[7]。

       第二种方法使用LLM,采用预训练、微调方法或提示,使LLM能够执行表理解任务,如GPT4Table[8]。

二、现有的开源解决方案

       上一节总结并对RAG中表格关键技术进行了分类。在提出本文实现的解决方案之前,让我们探索一些开源解决方案。

LlamaIndex支持四种方法[9],前三种都是使用多模态模型:

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

根据本文提出方法进行分类总结:

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

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

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

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

如图5所示:

半结构化和多模态RAG[11]提出了三种解决方案,其架构如图6所示。

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

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

  • 表解析使用非结构化,即类别(d);
  • 索引结构为文档摘要索引(catogery(i)),小块内容:表摘要,大块内容:文本格式的表。

      可选方案3:使用多模态LLM(

### LangChain RAG 检索增强生成数据库集成 #### 实现方法概述 为了使检索增强生成(Retrieval-Augmented Generation, RAG)技术更好地服务于应用需求,将其同数据库相连接成为一种有效的方式。这种做法不仅能够利用结构化数据来提升文本生成的质量,还能确保所使用的资料是最新的并经过验证的[^1]。 当涉及到具体实现时,通常会采用如下策略: - **环境准备**:安装必要的软件包以及配置运行环境; - **数据预处理**:将来自数据库的信息转化为适合用于机器学习的形式;这一步骤可能涉及清洗、转换和标准化操作; - **向量化表示**:对于要被纳入考虑范围内的条目执行编码过程,使之能作为特征参到后续计算当中去; - **相似度匹配算法的选择**:挑选合适的机制来进行查询请求已有记录之间的比较工作; - **结果融合**:把找到的最佳候选对象融入最终输出里头,以提高回答的真实性和可靠性[^3]。 下面给出一段Python代码片段展示如何基于LangChain框架完成上述目标之一——即从关系型数据库读取信息并通过RAG模式辅助对话系统的响应构建: ```python from langchain import RagRetriever, ConversationalRetrievalChain import sqlite3 def fetch_data_from_db(query): connection = sqlite3.connect('example.db') cursor = connection.cursor() try: cursor.execute(query) rows = cursor.fetchall() documents = [] for row in rows: document_content = ' '.join([str(item) for item in row]) documents.append(document_content) return documents finally: cursor.close() connection.close() retriever = RagRetriever.from_documents( documents=fetch_data_from_db("SELECT * FROM table_name"), retriever_type="dense", embedding_model="sentence-transformers/all-MiniLM-L6-v2" ) qa_chain = ConversationalRetrievalChain.from_llm(llm='distilbert-base-cased-distilled-bert', retriever=retriever) response = qa_chain({"question": "What is the capital of France?", "chat_history": []}) print(response['answer']) ``` 这段脚本首先定义了一个函数`fetch_data_from_db()`用来获取指定表中的所有行,并把这些行组合成字符串列表形式返回给调用者。接着实例化了一个名为`retriever`的对象负责管理文档集合及其对应的稠密向量表达方式。最后创建问答链路(`qa_chain`)并将两者结合起来形成完整的交互逻辑[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wshzd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值