DeepSeek R1驱动的PDF解析

PDF 解析是许多应用程序的关键任务,尤其是在检索增强生成 (RAG) 系统中。每个人都想从 PDF 中提取结构化数据,但这非常困难。程序化解析通常会失败,因为它依赖于 PDF 的完美结构——这在现实世界的文档中很少见。非推理 LLM 可以提供帮助,但它们对于像这样的复杂任务并不总是可靠的。

因此我们需要推理模型。这些高级 LLM 承诺提供更好的性能,但它们有一个缺点:它们很昂贵。例如,OpenAI 的 o1 每 100 万个 token 的成本为 60 美元。

另一方面,DeepSeek 的新版本 R1 提供的推理模型每 100 万个 token 的成本仅为 2 美元——这只是成本的一​​小部分。自然,我想看看它们在真实场景中的表现:解析一份混乱、非结构化的测试报告 PDF。

1、数据:测试报告

输入文件是一份测试报告。出于保密性考虑,我审查了几乎所有内容,但你仍然可以理解混乱的布局

2、方法:预处理和推理 LLM

2.1 使用空间分析进行预处理

第一步是使用 pdfplumber 从 PDF 中提取文本块。每个文本块都带有其坐标,这使我能够分析它们的空间关系。

import pdfplumber

with pdfplumber.open("report.pdf") as pdf:
    for page in pdf.pages:
        for block in page.extract_words():
            print(block)

接下来,我在每个文本块周围创建了一个“窗口”来捕获其周围的上下文。对于每对块,我计算了它们之间的距离和角度。角度有助于确定块是水平对齐(可能是同一行的一部分)还是垂直对齐(可能是一列的一部分)。

import math

def calculate_distance_and_angle(block1, block2):
    x1, y1 = block1['x0'], block1['top']
    x2, y2 = block2['x0'], block2['top']
    dx, dy = x2 - x1, y2 - y1
    distance = math.hypot(dx, dy)
    angle = math.degrees(math.atan2(dy, dx)) % 360
    return distance, angle

利用这些信息,我在彼此足够接近的块之间创建了唯一的“链接”。每个链接都包括起始块、终止块、距离和角度。这些链接存储在 markdown 表中,以便于参考。

Start Block End Block Distance Angle
Project No. 2025-001 16 0
Client / Owner Global Company 14 10
Name of Item Example Item 15 5

2.2 用推理LLM获得结构化输出

有了预处理的数据,我为 LLM 编写了一条人工消息。此消息包括:

  • 描述任务的系统提示。
  • 定义所需输出格式的 GraphQL 模式。
  • 链接的 markdown 表。

这是我使用的 GraphQL 模式的示例:

type TestReport {
  projectNo: String
  reportNo: String
  client: String
  itemName: String
  dateOfInspection: Date
  location: String
  ...
}

我将此消息发送给了两个 LLM:DeepSeek-R1 和 OpenAI o1。结果令人惊讶。

3、结束语

DeepSeek 完成了任务。它正确地映射了所有字段,包括 inspectedByreviewedBy等棘手的字段,并产生了干净、结构化的输出。另一方面,OpenAI GPT-4 混淆了一些字段并遗漏了一些细节,尽管价格高出 30 倍。

我从这次经历中得到了两点:

  • 空间分析功能强大。高质量的数据始终至关重要。通过预处理数据和计算空间关系,我能够为 LLM 提供有意义的背景信息。
  • DeepSeek 不是在胡闹。R1 可能会改变这类任务的游戏规则。它的经济性和准确性使其成为任何处理非结构化数据的人的有力选择。

如果你正在努力应对 PDF 解析或类似的挑战,那么值得尝试一下 DeepSeek。你可能会像我一样发现,最好的解决方案并不总是最昂贵的。


原文链接:Yet Another PDF Parsing Article using LLMs (OpenAI o1 vs Deepseek R1)

汇智网翻译整理,转载请标明出处