前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >利用大语言模型提升PDF表格解析:增强RAG工作流的全新方法

利用大语言模型提升PDF表格解析:增强RAG工作流的全新方法

原创
作者头像
点火三周
发布2024-10-28 18:07:12
发布2024-10-28 18:07:12
36400
代码可运行
举报
文章被收录于专栏:Elastic Stack专栏Elastic Stack专栏
运行总次数:0
代码可运行

在使用检索增强生成(RAG)管道处理PDF文件时,如何高效地提取和处理表格是一大挑战。传统方法通常将表格转换为高度规范化的格式,如CSV或JSON,这些格式无法捕捉到有效搜索和检索所需的上下文丰富性。这些表示方式将数据分解为行和列,失去了元素之间的广泛关系。为了应对这一问题,我开发了一种利用大语言模型(LLM)的方法,将表格转换为可读文本,同时保留上下文,从而增强数据在RAG工作流中的可用性。

本文将解释这种方法的背后原理、高层次的好处,以及笔记本的关键部分。

为什么选择这种方法?

标准的表格解析技术在RAG中常常失效,因为它们生成高度规范化的输出。虽然CSV和JSON格式对特定数据分析有用,但在需要更多上下文的场景下,它们往往不够用。检索增强生成模型依赖于丰富、内容密集的数据,而只有单行或最小数据点会阻碍有效搜索。

与其坚持将表格数据导出为结构化格式,我选择提取表格,通过Azure OpenAI解析,并将其重新格式化为人类可读的文本。这种方法可以更好地嵌入上下文,增强搜索性,同时不失去数据的丰富性。

解析挑战:以SEC FORM 10-Q为例

在实际应用中,从PDF中提取结构化信息通常涉及复杂的表格,例如美国银行的SEC FORM 10-Q中的表格。

从PDF中提取结构化信息时的复杂表格示例
从PDF中提取结构化信息时的复杂表格示例

这个表格包含了关键的财务数据,如股票符号、描述和交易所。然而,解析这样的表格面临多个挑战:

表格结构的复杂性

表格包含合并单元格、多行文本和不同格式的数据类型,如数字和文本。这增加了解析过程的复杂性,因为工具通常难以识别数据元素之间的正确关系。

上下文的丢失

当表格转换为CSV或JSON等格式时,表格行和列之间的很多关系上下文会丢失。例如,每个类别的标题与其对应的交易符号之间的关系可能无法保留,影响提取数据的完整性。

处理特殊字符和格式

股票符号和系列名称如 "BAC PrE" 和 "BAC PrL" 可能包含缩写或特殊字符,传统解析工具容易误解这些字符,导致数据提取不准确。

应对挑战

使用大语言模型(LLM)方法,可以将表格转换为可读文本,保留行和列之间的关系上下文。这确保了在解析过程中不会丢失关键财务信息,并且在检索增强生成(RAG)工作流中是完全可检索的。

例如,应用此方法于上述表格会输出以下文本:

代码语言:javascript
代码运行次数:0
复制
Table 1 (Page 1) Text Representation:
以下股票在纽约证券交易所上市:
普通股:
面值:每股 $0.01
符号:BAC
每份代表1/1,000份浮动利率非累积优先股E系列的存托股份:
符号:BAC PrE
每份代表1/1,000份6.000%非累积优先股GG系列的存托股份:
符号:BAC PrB
每份代表1/1,000份5.875%非累积优先股HH系列的存托股份:
符号:BAC PrK
7.25% 非累积永久可转换优先股L系列:
符号:BAC PrL
每份代表1/1,200份美国银行公司浮动利率非累积优先股1系列的存托股份:
符号:BML PrG

益处

  1. 提高搜索性:嵌入文本而不是高度结构化的表格数据,确保RAG模型可以捕捉内容的关系和广泛上下文,更容易检索到准确结果。
  2. 保留上下文:通过将表格转换为人类可读的描述,保留了原始数据的意图和结构,这对于文档意义至关重要的RAG工作流尤为重要。
  3. 处理非结构化数据:这种方法更好地处理PDF的自然非结构化特性,比简单的表格提取更具实用性。
  4. 可读输出:最终输出格式更易于人类和机器理解,而不是抽象的规范化数据。
PDF表格架构检测
PDF表格架构检测

关键代码解释

1. 从PDF中提取文本和表格

过程的第一步使用 pdfplumber 库从PDF的每一页提取文本和表格。

代码语言:javascript
代码运行次数:0
复制
import pdfplumber

# 打开PDF并提取页面
with pdfplumber.open('path_to_pdf.pdf') as pdf:
    for page in pdf.pages:
        text = page.extract_text()  # 提取纯文本
        tables = page.extract_tables()  # 提取表格

这里,pdfplumber 被用来从每一页PDF中提取纯文本和表格。它提供了一种灵活的方式来处理PDF及其内部结构。

2. 清理并发送表格到Azure OpenAI

在提取表格后,脚本会将清理后的表格数据发送到Azure OpenAI进行转换为可读文本。这允许LLM创建表格的自然语言摘要。

代码语言:javascript
代码运行次数:0
复制
def process_table_with_llm(table):
    # 清理表格中的缺失值并准备输入
    cleaned_table = [row for row in table if row]
    # 发送到Azure OpenAI进行文本生成
    prompt = f"将以下表格转换为可读文本:{cleaned_table}"
    response = azure_openai.generate_text(prompt)
    return response['generated_text']

表格被清理以处理缺失或 None 值,然后传递给Azure OpenAI,生成表格内容的文本描述。这有助于在最终输出中保留表格的上下文。

3. 写入最终输出

一旦从表格生成了文本并提取了非表格文本,所有内容都会写入一个输出文件。这确保了文本和表格数据都可以用于后续任务,如搜索和检索。

代码语言:javascript
代码运行次数:0
复制
with open('output_text_file.txt', 'w') as output_file:
    output_file.write(text)  # 写入非表格文本
    output_file.write('\n\n--- 表格摘要 ---\n')
    output_file.write(table_summary)  # 写入来自Azure OpenAI的表格摘要

通过将表格摘要嵌入其他文本旁边,我们提供了一个综合的输出,适用于RAG应用程序,确保所有PDF信息以人类可读的格式保留。

结论

通过使用LLM将表格转换为可读文本,并将该文本嵌入到原始内容中,这种方法显著增强了PDF表格在检索增强生成工作流中的可用性。它保留了上下文,改善了搜索性,并确保在规范化过程中不会丢失有价值的信息。这种方法为那些在RAG应用中处理基于PDF的数据提供了更全面的解决方案。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么选择这种方法?
  • 解析挑战:以SEC FORM 10-Q为例
    • 表格结构的复杂性
    • 上下文的丢失
    • 处理特殊字符和格式
  • 应对挑战
  • 益处
  • 关键代码解释
    • 1. 从PDF中提取文本和表格
    • 2. 清理并发送表格到Azure OpenAI
    • 3. 写入最终输出
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档