LlamaIndex 介绍用 LayoutPDFReader 提取 PDF 的章节、标题、段落和表格
Mastering PDFs: Extracting Sections, Headings, Paragraphs, and Tables with Cutting-Edge Parser
LlamaIndex 发布教程,介绍 LayoutPDFReader 如何结合层级布局信息解析 PDF,实现章节识别、段落合并、表格与列表处理等内容感知分块。文章给出接入 llmsherpa API 和构建 LlamaIndex 向量查询引擎的示例代码,并说明该工具仅支持带文本层的 PDF,暂不支持 OCR。
文章解释了 PDF 解析难点并给出 LayoutPDFReader 的层级解析与智能分块方法,含可直接复用的代码。
尽管最近人们有动力将 NLP 用于更广泛的现实世界应用,但大多数 NLP 论文、任务和流程都假设处理的是原始、干净的文本。然而,我们在现实中遇到的许多文本,包括绝大多数法律文件(例如合同和法典),并不那么干净,其中许多是视觉结构化文档(VSD),如 PDF。PDF 用途广泛,能保留文档的视觉完整性,但在提取和操作其内容时,往往带来重大挑战。
立即探索我们的免费和付费方案。
在本次讨论中,我们将主要关注纯文本分层 PDF,这一类别常被许多人视为已解决的问题。
解析 PDF 的复杂性
- 布局复杂性:PDF 可能包含复杂的布局,例如多栏文本、表格、图像和复杂的格式。这种布局多样性使结构化数据的提取变得复杂。
- 字体编码问题:PDF 使用多种字体编码系统,其中一些系统并不直接映射到 Unicode。这可能导致难以准确提取文本。
- 非线性文本存储:PDF 不按文本在页面上出现的顺序存储文本。相反,它们将文本存储在可以放置在页面上任何位置的对象中。这意味着底层代码中的文本顺序可能与视觉上出现的文本顺序不匹配。
- 空格使用不一致:在某些 PDF 中,单词之间的空格使用不一致或根本没有使用。这甚至可能使识别单词边界变得困难。
我们需要一个高效的解析器吗?
在 LLM 时代,当 LLM 能够处理整个 PDF 时,高效的解析器仍然必不可少吗?
如果下一个问题的答案是“是”,那么这个问题就变得相关了。
我们需要检索增强生成(RAG)吗?
虽然 LLM 功能强大,但它们在一次可处理的文本量和可参考的信息范围方面存在某些限制。最近的进一步研究表明,当相关信息出现在输入上下文的开头或结尾时,LLM 的性能通常最高,而当模型必须访问长上下文中间的相关信息时,性能会显著下降。像 RAG 这样的技术有助于克服这些限制,实现对大型文档和更广泛信息检索的更有效、更高效的处理。
仍然怀疑?让我们询问 LLM 来确认。
既然我们已经确立了高效解析器的重要性,它在构建有效的检索增强生成(RAG)流程以解决 LLM 的局限性方面就变得至关重要。让我们探索我们今天是如何实现这一点的。至关重要的是要记住,提供给 LLM 的上下文质量是有效 RAG 的基石,正如俗话所说,‘垃圾进——垃圾出。’
在构建与 LLM 相关的应用程序的背景下,分块是将大块文本分解成较小片段的过程。这是一项 essential 技术,有助于在我们使用 LLM 嵌入内容后,优化从数据库返回内容的相关性。涉及的一些策略包括
- 固定大小分块。这是最常见且直接的分块方法:我们只需决定块中的标记数量,以及它们之间是否需要重叠。易于实现且最常用,但从未进入生产环境,因为在概念验证(POC)设置中输出令人满意,但随着我们进行进一步测试,其准确性会下降。
- “内容感知”分块。利用我们分块内容的性质并对其应用更复杂分块的一组方法。由于上述原因,实现起来具有挑战性,但如果处理得当,它可能是生产级信息检索(IR)引擎最理想的构建块。
这篇文章到底要讲什么?
当然,让我们结束历史和背景细节,好吗?
介绍 LayoutPDFReader 用于“上下文感知”分块。 LayoutPDFReader 可以作为您 RAG 工具库中最重要的工具,通过解析 PDF 以及分层布局信息,例如:
- 识别章节和小节,以及它们各自的层级。
- 将行合并为连贯的段落。
- 建立章节和段落之间的连接。
- 识别表格并将其与相应的章节关联。
- 精确处理列表和嵌套列表结构。
使用 LayoutPDFReader 的第一步是向其提供 URL 或文件路径(假设它已经安装),并返回一个文档对象。
from llmsherpa.readers import LayoutPDFReaderllmsherpa_api_url = "https://readers.llmsherpa.com/api/document/developer/parseDocument?renderFormat=all"
pdf_url = "https://arxiv.org/pdf/1910.13461.pdf" # also allowed is a file path e.g. /home/downloads/xyz.pdf
pdf_reader = LayoutPDFReader(llmsherpa_api_url)
doc = pdf_reader.read_pdf(pdf_url)
使用智能分块的向量搜索和 RAG
LayoutPDFReader 采用智能分块来保持相关文本的连贯性:
- 它将所有列表项与前一段落分组在一起。
- 表格中的项目被分块在一起。
- 它结合了来自章节标题和嵌套章节标题的上下文信息。
作为一个快速示例,以下代码片段从 LayoutPDFReader 生成的文档块中生成一个 LlamaIndex 查询引擎。
from llama_index.readers.schema.base import Document
from llama_index import VectorStoreIndexindex = VectorStoreIndex([])
for chunk in doc.chunks():
index.insert(Document(text=chunk.to_context_text(), extra_info={}))
query_engine = index.as_query_engine()
# Let's run one query
response = query_engine.query("list all the tasks that work with bart")
print(response)
我们得到以下响应:
BART works well for text generation, comprehension tasks, abstractive dialogue, question answering, and summarization tasks.关键考虑因素:
- LLMSherpa 利用一个免费且开放的 API 服务器。您的 PDF 在解析过程中仅临时存储,不会被保留。
- LayoutPDFReader 已经过各种 PDF 的广泛测试。然而,为每个 PDF 实现完美解析仍然是一项具有挑战性的任务。
- 请注意,OCR(光学字符识别)功能目前不可用。该工具仅支持带有文本层的 PDF。
- 如有关于私有托管选项、OCR 支持或针对特定 PDF 相关问题的定制帮助的疑问,请随时联系 contact@nlmatics.com 或直接联系 我。
如果您有任何问题,请在评论区留言,我会尽快回复。
联系?
如果您想联系我,请随时通过 LinkedIn 或 电子邮件给我发消息。
参考文献
https://github.com/nlmatics/llmsherpa
Capturing Logical Structure of Visually Structured Documents with Multimodal Transition Parser
来源:LlamaIndex:产品、工程与评测 · llamaindex.ai