从 PDF 表到见解:在 RAG 中解析 PDF 的另一种方法

2024年11月6日   |   by mebius

作者:来自 ElasticSunile Manjee

%title插图%num

为 RAG 解析 PDF 表的另一种方法,克服了 CSV 和 JSON 等高度规范化格式的限制。

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

这篇文章解释了这种方法背后的原理、整体上的好处以及笔记本的关键部分。

为什么采用这种方法?

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

我没有坚持使用以结构化格式导出表格数据的传统方法,而是选择提取表格,使用 Azure OpenAI 解析它们,然后将表格重新格式化为人类可读的文本。这种方法可以实现更好的上下文嵌入并增强可搜索性,而不会丢失数据的丰富性。

解析挑战:SEC FORM 10-Q 案例研究

tgcode

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

%title插图%num

该表包含关键财务数据,例如股票代码、描述和交易所。然而,解析此类表格面临多重挑战:

表格结构的复杂性

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

上下文丢失

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

处理特殊字符和格式

股票代码和系列名称(例如 “BAC PrE” 和 “BAC PrL”)可能包含缩写或特殊字符,而这些缩写或特殊字符会被传统解析工具误解,从而导致数据提取不准确。

应对挑战

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

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

优势

  • 提高可搜索性:嵌入文本而不是高度结构化的表格数据可确保 RAG 模型能够捕捉内容的关系和更广泛的背景,从而更轻松地检索准确的结果。
  • 保留背景:通过将表格转换为人类可读的描述,我们可以保留原始数据的意图和结构,这对于文档含义至关重要的 RAG 工作流至关重要。
  • 处理非结构化数据:与简单的表格提取相比,此方法可以更好地处理 PDF 的自然非结构化性质,使其在实际应用中更加通用。
  • 可读输出:最终输出的格式更易于人类和机器解释,而不是处理抽象的规范化数据。

%title插图%num

关键代码解释

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

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

import pdfplumber

# Open the PDF and extract pages
with pdfplumber.open('path_to_pdf.pdf') as pdf:
    for page in pdf.pages:
        text = page.extract_text()  # Extract plain text
        tables = page.extract_tables()  # Extract tables

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

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

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

def process_table_with_llm(table):
    # Clean the table for missing values and prepare the input
    cleaned_table = [row for row in table if row]

    # Sending to Azure OpenAI for text generation
    prompt = f"Convert the following table into a readable text:
{cleaned_table}"
    response = azure_openai.generate_text(prompt)
    return resptgcodeonse['generated_text']

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

3. 编写最终输出

一旦从表格中生成文本并提取非表格文本,所有内容都会写入单个输出文件中。这可确保文本和表格数据均可用于搜索和检索等下游任务。

with open('output_text_file.txt', 'w') as output_file:
    output_file.tgcodewrite(text)  # Write non-table text
    output_file.write('nn--- Table Summary ---n')
    output_file.write(table_summary)  # Write table summary from Azure OpenAI

通过将表格摘要嵌入其余文本,我们提供了可供 RAG 应用程序使用的综合输出,确保 PDF 中的所有信息都以人类可读的格式保存。

结论

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

准备好自己尝试一下了吗?开始免费试用

Elasticsearch 集成了 LangChain、Cohere 等工具。加入我们的 Beyond RAG Basics 网络研讨会,构建您的下一个 GenAI 应用程序!

原文:From PDF tables to insights: An alternative approach for parsing PDFs in RAG – Search Labs

文章来源于互联网:从 PDF 表到见解:在 RAG 中解析 PDF 的另一种方法

相关推荐: 将 Logstash 管道转换为 OpenTelemetry Collector 管道

作者:来自 ElasticMirko Bez•Taha Derouiche 本指南通过演示如何将常见的 Logstash 管道转换为等效的 OpenTelemetry Collector 配置,帮助 Logstash 用户过渡到 OpenTelemetry。我…

Tags: , ,