浅析RAG系统非结构化数据中的表格处理

“ 之前调研的非结构化数据的表格的处理,在大多数RAG系统召回中,这是个绕不开的场景。所有的调研文章都是引用自互联网,可能有很多来源,之前没打算发出来,所以没存引用地址。

一、基于开源工具包

有很多的包能支持从pdf中抽取表格,比如说tablula、pdfplumber、camelot等等,camelot还可以提取复杂的表格格式。但是一般用于问答,还需要表的摘要信息,才能方便问答的检索,可以把表格+表格前后文本输入大模型,让大模型总结出摘要,后续就可以用RecursiveRetrieval查询得到表的数据了。另一种就是期望向量模型能准确的编码表信息,直接通过向量来检索到相关的表。

在llama index中有以下示例,步骤如下:

  1. 使用 Unstructured 从 10-K 文档中解析出表和“非表”元素。
  2. 使用 LLM 从每个表中提取一个“标题”
  3. 这些标题与其余的文本块一起构建索引。这些标题包含对基础表的引用!

        
          
https://github.com/run-llama/llama_index/blob/main/docs/examples/query_engine/sec_tables/tesla_10q_table.ipynb  

      

这里需要注意的是,Unstructured 使用的输入是html格式,如果丢一个pdf文本进去,会发现抽不到表格。


        
          
elements = extract_elements("./data/test.pdf", table_filters=[filter_table])  
table_elements = get_table_elements(elements)  
text_elements = get_text_elements(elements)  
len(table_elements)  
  
输出为0  

      

所以一个选择是,需要找一个开源工具将pdf转成html格式,如pdf2htmlEX


        
          
import subprocess  
  
def convert_pdf_to_html(pdf_path, html_path):  
    command = f"pdf2htmlEX {pdf\_path} --dest-dir {html\_path}"  
    subprocess.call(command, shell=True)  
  
input_pdf = "./data/test.pdf"  
output_pdf = "./data/test.htm"  
  
convert_pdf_to_html(input_pdf, output_pdf)  

      

二、基于OCR + 版式识别

这个类别下,一个看起来很酷的产品是chatdoc,他的流程图如下:

  1. 文字定位的OCR
  2. 识别物理布局
  3. 找出正确的阅读顺序
  4. 理解逻辑结构picture.image

picture.image

  • 基于规则的方法,如PyPDF,可以识别文本内容,但容易忽略整体结构。这可能导致丢失表格的行列格式。此外,它划分文本的方式可能会非常混乱。它可能会混淆标题和正文,或者意外地将表格行的部分与附近的文本合并在一起。
  • ChatDOC PDF解析器可以看到整个图片。它能准确识别表格和段落,甚至理解表格内部的结构。这意味着它可以将文档划分为定义明确、完整的信息单元,保留文档的预期含义和结构。picture.image

三、基于多模态

微软新发布的模型Table Transformer为在图像中检测表格提供了一个不错的解决方案。

结合Table Transformer以及多模态模型如GPT4-V也可以做到更好的文档问答系统。在多模态模型爆火之后,基于多模态模型的RAG系统,可以分为以下几个选择:

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

方法1的效果比较差,模型难以正确回答问题。

方法2的步骤如下:

  1. 提取并将每个PDF页面分离为图像文档
  2. 让GPT4V识别表格并从每个PDF页面提取表格信息
  3. 将GPT4V的理解建立到到Image Reasoning Vector Store 索引中中
  4. 从这个图像推理向量存储中检索答案 一个简单示例如下:

        
          
openai_mm_llm = OpenAIMultiModal(  
    model="gpt-4-vision-preview", api_key=OPENAI_API_TOKEN, max_new_tokens=1500  
)  
  
image_prompt = """  
    Please load the table data and output in the json format from the image.  
    Please try your best to extract the table data from the image.  
    If you can't extract the table data, please summarize image and return the summary.  
"""  
response = openai_mm_llm.complete(  
    prompt=image_prompt,  
    image_documents=[documents_images_v2[15]],  
)  
  
print(response)  

      

测试发现:

  • GPT4V 在识别表格并从图像中提取表格内容方面并不稳定,特别是当图像中混合了表格、文本和图片时。这在 PDF 格式中很常见。
  • 将 PDF 文件拆分成单个图像,让 GPT4V 理解/总结每个 PDF 页作为单个图像,然后基于 PDF 图像转换为文本索引来构建 RAG。这种方法在这个任务中表现不佳。

方法三基于Table Transformer:


        
          
model = AutoModelForObjectDetection.from_pretrained(  
    "microsoft/table-transformer-detection", revision="no\_timm"  
).to(device)  
  
structure_model = AutoModelForObjectDetection.from_pretrained(  
    "microsoft/table-transformer-structure-recognition-v1.1-all"  
).to(device)  

      

可以很好的回答表格问题

方法四 先使用OCR提取,但是OCR错误太多,导致最终也不能正确回答用户问题。

0
0
0
0
评论
未登录
暂无评论