发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

75次阅读
没有评论

从非结构化文档(如 PDF 和图像)中提取结构化数据很快就会变得棘手。

随着基础模型和专用 API 的兴起,现在只需几行代码就可以将混乱的发票转换为干净的 JSON。

因此,我将比较三种不同的解析文档的方法:使用 OpenAI 的 GPT-4o、Anthropic 的 Claude 3.5 Sonnet 和 Invofox API。

我选择 Invofox 是因为它是一家 YC 支持的初创公司,专门为文档解析而构建。它使用专门针对发票和其他文档进行调整的模型(专有模型和 LLM 最佳模型),而 GPT/Claude 则是通用的 LLM 模型。

您将看到真实的 Python 代码、实际输出以及每种工具的适用场景(优缺点)的分析。最后,还会提供一份详细的功能和基准测试对比表。

您可以在 GitHub 存储库 中找到完整的代码。


🎯 使用 GPT-4o (ChatGPT) API

让我们从 OpenAI 的 GPT-4o 开始。它能够理解文本并在正确提示下提取结构化信息。但与 Invofox 不同,它不能直接读取 PDF 文件。

因此,我们首先需要使用 OCR(如 Tesseract、pdfplumber 或在线工具)提取文本,然后通过 API 提示将该文本发送到 GPT。

GPT-4o,尤其是通过 ChatGPT 网页界面和某些 API 端点(尤其是在 Azure OpenAI 服务中)可以接受 PDF 和图像作为输入,并提取结构化数据。但由于我们使用的是 API,因此这实际上是不可能的。

您将需要一个 OpenAI API 密钥。创建一个.env 文件并将其附加到此约定中。

OPENAI_API_KEY=your_api_key
发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程
OpenAI API 密钥

我们将使用 Python 来实现。以下是您可以一步步尝试的方法。

步骤 1:设置 Python 环境

创建虚拟环境意味着为你的 Python 项目搭建一个独立的空间,所有依赖项都安装在本地(而不是系统范围)。这可以避免版本冲突,并保持全局 Python 安装的整洁。那就让我们创建一个吧。

# macOS / Linux:
python3 -m venv env  # creates a folder called 'env' with a local Python setup
source env/bin/activate  # activates that environment

# Windows:
python -m venv env    # same as above
.\env\Scripts\activate  # activates it (Windows PowerShell / CMD)

(env)当您在终端提示符的开头看到时,您就会知道它处于活动状态。

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

第 2 步:安装所需的软件包

我们需要两个主要库:

  • pdfplumber:从 PDF 发票中提取文本
  • openai:使用 GPT-4o API
  • python-dotenv:将文件中的环境变量加载 .env 到 Python 中,对于管理 API 密钥和机密很有用。
pip install pdfplumber openai python-dotenv

我安装了 python-dotenv 后者,所以它在命令中不可见。

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

安装依赖项后,运行:

pip freeze > requirements.txt

这会将虚拟环境中所有已安装的软件包(包含版本)写入requirements.txt。之后,您可以使用以下命令使用此文件:

pip install -r requirements.txt

作为参考,请在根目录中添加 .gitignore 以避免推送虚拟环境目录。

步骤 3:提取文本并使用 GPT-4o 进行解析

这是我用于示例的 示例发票 PDF。我附上了一张快照,以便您了解我们将要提取的字段。

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

我们来写完整的代码,文件名为openai-main.py

import pdfplumber
import openai
from dotenv import load_dotenv
import os

load_dotenv()
client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def extract_text_from_pdf(pdf_path):
    text = ""
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            page_text = page.extract_text()
            if page_text:
                text += page_text + "\n"
    return text

def parse_invoice_with_openai(invoice_text):
    prompt = (
        "Extract the following fields from this invoice text and return as a JSON object:\n"
        "- Invoice Number\n"
        "- Invoice Date\n"
        "- Due Date\n"
        "- Invoice Status (e.g. unpaid/paid)\n"
        "- Sender Name and Email\n"
        "- Recipient Name and Email\n"
        "- Items (description, quantity, rate)\n"
        "- Total Amount\n"
        "- Memo\n\n"
        "Invoice Text:\n"
        f"{invoice_text}"
    )

    response = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": prompt},
        ],
        max_tokens=500,
        temperature=0,
    )
    return response.choices[0].message.content

if __name__ == "__main__":
    pdf_path = "invoice_sample.pdf"
    invoice_text = extract_text_from_pdf(pdf_path)
    parsed_data = parse_invoice_with_openai(invoice_text)
    print(parsed_data)

以下是一个简单的解释:

  • extract_text_from_pdfpdfplumber读取 PDF 的每一页,并连接提取出的文本。这将以字符串形式返回原始的非结构化发票内容。
  • parse_invoice_with_openai:通过端点向 GPT-4o 模型发送此提示ChatCompletion,要求 GPT-4o 提取五个关键字段。
  • 然后模型处理提示并返回 JSON 格式的响应。

步骤 4:输出

这是使用 运行脚本后的 JSON 响应python openai-main.py

{
  "Invoice Number": "2-7-25",
  "Invoice Date": "July 2, 2025",       
  "Due Date": "Upon receipt",
  "Invoice Status": "UNPAID",
  "Sender Name and Email": {
    "Name": "Anmol Baranwal",
    "Email": "[email protected]"     
  },
  "Recipient Name and Email": {
    "Name": "Anmol Baranwal",
    "Email": "[email protected]"
  },
  "Line Items": [
    {
      "Description": "Testing",
      "Quantity": 1,
      "Rate": "$50.00",
      "Total": "$50.00"
    },
    {
      "Description": "Development",
      "Quantity": 1,
      "Rate": "$100.00",
      "Total": "$100.00"
    },
    {
      "Description": "Blog",
      "Quantity": 1,
      "Rate": "$50.00",
      "Total": "$50.00"
    }
  ],
  "Subtotal": "$200.00",
  "Total Amount": "$200.00",
  "Memo or Notes": "Thank you! This is a sample invoice for testing document parsing with AI models."
}

GPT-4o (ChatGPT) 输出的发票明细项目并非始终标记为“行”。有时,它会被标记为“明细项目”或其他不太标准化的名称,而其他工具(例如 Invofox)则始终对这些条目使用统一的名称,例如“行”。

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程
终端输出

这里我们通过系统提示符指示 GPT-4o 解析文本。由于 API 现在足够强大(与之前的 OpenAI 模型相比),因此效果还不错。

✅ 优点:易于尝试,灵活。GPT-4 擅长逻辑和结构化数据提取,因此可以正确识别发票字段并计算总计。

⚠️缺点:

  • 我看到的问题是,我们仍然必须设计提示并验证输出(这对每个人来说都是不可能的)。
  • JSON 可能格式错误或缺少字段(可能会出现幻觉)。
  • 没有内置验证或置信度分数。
  • GPT 要求在提示中发送所有文本(这对于大型文档来说成本很高),并且输出因提示样式而异。

GPT-4o 按令牌计费。1-2 页发票提取的预计费用在 0.005 美元到 0.018 美元之间,具体取决于您的提示和输出的详细程度。您也可以根据用例使用此 定价计算器。

它可以在 1-30 秒内做出响应,但容易出现负载峰值,尤其是对于大型提示。


🎯 使用 Claude 3.5 Sonnet API

Anthropic 的 Claude 3.5 Sonnet模型在正确提示的情况下也能够从文本中解析结构化数据。与 GPT-4o 一样,它无法直接通过 API 读取 PDF 文件,因此我们将首先从发票 PDF 中提取文本,然后将其传递给 Claude 进行结构化解析。

您将需要一个 Anthropic API 密钥。创建一个.env 文件并按照以下约定附加它:

ANTHROPIC_API_KEY=your_api_key
发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

我们将再次使用 Python 进行此设置并遵循上一节中使用的相同说明。

步骤 1:设置环境并安装包

就像以前一样,让我们​​在虚拟环境中隔离我们的依赖关系。

# macOS / Linux:
python3 -m venv env
source env/bin/activate

# Windows:
python -m venv env
.\env\Scripts\activate

一旦激活,您的终端将显示一个 (env) 前缀。

我们需要以下库:

  • pdfplumber:从 PDF 中提取文本
  • anthropic:与 Claude 3.5 交互的官方 SDK
  • python-dotenv.env:从文件加载 API 密钥
pip install pdfplumber anthropic python-dotenv

如果您遵循上一个示例,我们只需要安装 anthropic 包。

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

然后将你的环境导出到一个 requirements.txt 文件。确保包含 .gitignore 以避免提交虚拟环境。

pip freeze > requirements.txt

第 2 步:提取文本并使用 Claude 3.5 Sonnet 进行解析

随着 Anthropic 推出更安全、功能更强大的模型,他们会定期淘汰旧模型。因此,您可以查看 模型状态 ,了解哪些模型已弃用、已淘汰,以及哪些模型仍在使用中。我将以使用claude-3-5-sonnet-20240620 中版本为例。

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

让我们将文件名写为,并编写完整的代码 anthropic-main.py。它与上一节非常相似,我使用的是相同的 示例发票 PDF

import pdfplumber
import anthropic
import os
from dotenv import load_dotenv

load_dotenv()
api_key = os.getenv("ANTHROPIC_API_KEY")
client = anthropic.Anthropic(api_key=api_key)

print("API Key loaded:", api_key[:12], "...")

def extract_text_from_pdf(pdf_path):
    text = ""
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            text += page.extract_text() + "\n"
    return text

def parse_invoice_with_claude(invoice_text):

    prompt = (
        "Extract the following fields from this invoice text and return as a JSON object:\n"
        "- Invoice Number\n"
        "- Invoice Date\n"
        "- Due Date\n"
        "- Invoice Status (e.g. unpaid/paid)\n"
        "- Sender Name and Email\n"
        "- Recipient Name and Email\n"
        "- Items (description, quantity, rate)\n"
        "- Total Amount\n"
        "- Memo\n\n"
        "Invoice Text:\n"
        f"{invoice_text}"
    )

    response = client.messages.create(
        model="claude-3-5-sonnet-20240620",
        max_tokens=500,
        temperature=0,
        messages=[{"role": "user", "content": prompt}],
    )

    return response.content[0].text

if __name__ == "__main__":
    pdf_path = "invoice_sample.pdf"
    invoice_text = extract_text_from_pdf(pdf_path)
    parsed_data = parse_invoice_with_claude(invoice_text)
    print(parsed_data)

以下是一个简单的解释:

  • extract_text_from_pdf:用于 pdfplumber 从 PDF 的每一页中提取纯文本。
  • parse_invoice_with_claude:将文本发送给 Claude Sonnet 3.5,并附带一个要求 JSON 输出的特定提示。
  • Claude 返回一个包含所请求字段的字符串化 JSON 块。

步骤 3:输出

python anthropic-main.py您可以在终端中运行该脚本。以下是 JSON 响应:

{
  "invoiceNumber": "2-7-25",
  "invoiceDate": "July 2, 2025",
  "dueDate": "Upon receipt",
  "invoiceStatus": "UNPAID",
  "senderName": "Anmol Baranwal",
  "senderEmail": "[email protected]",        
  "recipientName": "Anmol Baranwal",
  "recipientEmail": "[email protected]",
  "items": [
    {
      "description": "Testing",
      "quantity": 1,
      "rate": 50.00
    },
    {
      "description": "Development",
      "quantity": 1,
      "rate": 100.00
    },
    {
      "description": "Blog",
      "quantity": 1,
      "rate": 50.00
    }
  ],
  "totalAmount": 200.00,
  "memo": "Thank you! This is a sample invoice for testing document parsing with AI models."
}
发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程
发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

✅优点:

  • Claude 3.5 非常擅长理解长文本并对其进行清晰的格式化。
  • Claude Sonnet 可以在提示中处理文本(甚至可以通过嵌入处理图像)
  • 在某些情况下,它处理不寻常或长文档的效果比 GPT-4 稍好一些。

⚠️缺点:

  • 与 GPT 一样,Claude 也需要及时的工程设计。
  • 与 GPT 一样,Claude 有时也会错过字段或编造数值(产生幻觉)。
  • 它仍然返回未经验证的原始 JSON 文本,因此您必须解析 / 验证它。
  • 您仍然需要自己提取文本,它不会解析原始 PDF。

Claude 3.5 Sonnet 也按令牌计费。1-2 页发票提取的预计费用在 0.005 美元到 0.018 美元之间,具体取决于您的提示和输出的详细程度。您也可以根据用例使用此 定价计算器。

对于小提示(200-300 毫秒)来说,它的速度非常快,但更大或更复杂的刺激可能会将延迟时间延长至 10 秒或更长。


🎯 使用 Invofox API

因此,我一直在寻找一种更好的解决方案,它不同于需要快速工程的基于代码(OpenAI 和 Anthropic)的方法,我发现了许多好的工具,如 Invofox、Google Document AI、Amazon Textract。

Invofox 的 突出之处在于它由 Y Combinator 支持,并且具备我需要的所有功能。这给了我深入研究和尝试的信心。

它提供了一个即插即用的人工智能文档解析 API,可以非常轻松地从发票、收据、工资单、银行对账单、贷款 / 抵押文件和账单等自定义文档类型中提取数据。

它们具有一些有用的内置功能,例如:

  • ✅ 分离器

它会自动分离单个 PDF 中包含的多个文档(例如混合发票或报表),将页面分组为逻辑子文档,以便更好地提取和自动化。

它可以在上传过程中通过 API 进行配置,并与分类器协同工作,以实现更清洁的下游处理

  • 分类器

预训练的 AI 模型,可检测文档类型(发票、收据等),以便使用正确的架构处理每个文档。该模型为选配,可根据环境或请求启用。

他们还使用先进的人工智能模型和专有算法来验证和自动完成您的数据。请查看API 文档

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

步骤 1:注册仪表板

您可以注册仪表板来生成 API 密钥。

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

您也可以手动上传文档,但我们将使用 API,因为它更简单且体验更好。

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

步骤 2:在 Postman 中创建请求

一旦您有了 API 密钥,您就可以使用 Postman 发送文档,以便使用 Invofox 的 /uploads 端点进行解析。

设置方法如下:

✅ 1. 创建新请求

  • 打开 Postman 桌面应用程序
  • 创建集合并添加请求
发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程
  • 将方法设置为POST
  • 我们需要请求这个端点:https://api.invofox.com/v1/ingest/uploads
发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

✅ 2. 设置标题

转到 Headers 选项卡并添加:

  • 键:accept,值:application/json
  • 键:x-api-key,值:your_invofox_api_key

您无需手动设置Content-Type,因为 Postman 会在使用 form-data 时自动处理它。它会告诉服务器请求体中的数据是什么格式:

  • application/json→ 您正在发送原始 JSON
  • multipart/form-data→ 您正在发送文件 + 表单字段
  • application/x-www-form-urlencoded→ 您正在发送类似表单的文本字段(如 HTML 表单)

当您使用 Postman 的 form-data 选项发送文件时,Postman 会自动设置正确的 Content-Type 和边界值(这是必需的multipart/form-data)。

如果您手动设置如下:

Content-Type: multipart/form-data

您缺少边界部分,它是这样的:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxyz

让我们添加正文字段。

✅ 3. 添加正文(表单数据)

切换到 Body 选项卡,选择 form-data 并添加以下两个字段:

  • 键:files,类型:file,值:上传您的发票(invoice_sample.pdf
发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程
  • 键:info,类型:text,值:粘贴下面的 JSON
{
  "type": "6840c4511cbcc77119347248",
  // data field is optional
  "data": {"companyActsLike": "issuer"}
}

该  data  字段在这里是可选的,因为只有当您想传递自定义元数据或额外指令(例如影响解析、验证首选项或为自定义文档类型注册边缘情况的信息)时才需要它。

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

除了标准类型(发票、工资单、银行对账单)之外,您还可以在 Invofox 仪表板中注册自定义文档类型。这些自定义类型会获得一个唯一的 ID,例如6840c4511cbcc77119347248(在示例中使用),我们现在会将其传递给 API。

通过指定类型 ID,您可以确保根据您设置的精确模式来解析文件:

  • 您的自定义 JSON 结构
  • 您定义的字段名称
  • 自定义验证规则和人工审核工作流程

✅ 4. 发送请求

点击“发送”。如果所有设置正确,您将收到包含 documentID 详细信息的回复。

  • importID是本次上传的批次 ID(用于跟踪同时上传的多个文件)
  • documentID是已解析文档的 ID
{
    "accountId": "683edb9d7ded4695232c4979",
    "environmentId": "683edb9d7ded4695232c497b",
    "importId": "68662d83c3a0849a86a6aa30",
    "files": [
        {
            "id": "68662d83c3a0849a86a6aa33",
            "filename": "invoice_sample.pdf",
            "documentId": "68662d83c3a0849a86a6aa34"
        }
    ]
}
发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

步骤 3:获取解析后的文档

有两种方法:一种是检查 Invofox 仪表板以查找新解析的文档。您可以注意到,明细项目和明细以表格形式显示。GUI 还提供了许多选项,包括筛选提取的数据。

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

根据工作流程的设置方式,可能需要将其标记为已完成,因为让人类参与循环可确保最高的准确性并赋予我们更多的控制权。

另一种方法(推荐)是使用以下标头发出 GET 请求:https://api.invofox.com/documents/{documentID}

  • 键:accept,值:application/json
  • 键:x-api-key,值:your_invofox_api_key
发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

以下是经过修剪的 JSON 响应,保留了原始格式。与 GPT-4o 和 Claude 之前的响应相比,它还提供了原始发票的图像以及许多额外的字段。

{
  "hasClientRequest": false,
  "canLock": false,
  "canSkip": false,
  ...
  "canEdit": false,
  "result": {
    "_id": "68662d83c3a0849a86a6aa34",
    "account": "683edb9d7ded4695232c4979",
    "environment": "683edb9d7ded4695232c497b",
    "creator": "683edbcbee083d02af5bf7cf",
    "clientData": {},
    "type": "6840c4511cbcc77119347248",
    "name": "invoice_sample.pdf",
    "creation": "2025-07-03T07:13:08.950Z",
    "images": [
      "https://...-1.png"
    ],
    "original": "https://.../invoice_sample.pdf",
    "mimetype": "application/pdf",
    "data": {
      "documentNumber": {"value": "2-7-25"},
      "issueDate": {"value": "2025-07-02"},
      "language": {"value": "en"},
      "breakdowns": [
        {"taxRate": { "value": 0},
          "taxBaseAmount": {"value": 200},
          "taxAmount": {"value": 0},
          ...
          "totalAmount": {"value": 200},
          "grossAmount": {"value": 200}
        }
      ],
      "lines": [
        {"description": { "value": "Testing"},
          "quantity": {"value": 1},
          ...
          "totalAmount": {"value": 50},
          "grossAmount": {"value": 50}
        },
        {"description": { "value": "Development"},
          "quantity": {"value": 1},
          ...
          "totalAmount": {"value": 100},
          "grossAmount": {"value": 100}
        },
        {"description": { "value": "Blog"},
          "quantity": {"value": 1},
          ...
          "totalAmount": {"value": 50},
          "grossAmount": {"value": 50}
        }
      ],
      "totalTaxBaseAmount": {"value": 200},
      "totalTaxAmount": {"value": 0},
      "totalAmount": {"value": 200}
    },
    "publicState": "approved",
    "confidence": "low",
    "import": {
      "ref": "68662d83c3a0849a86a6aa30",
      "file": "68662d83c3a0849a86a6aa33",
      "filename": "invoice_sample.pdf",
      ...
    },
    ...
  }
}

价格尚未公开,因此潜在用户必须联系其团队获取商业报价,但该产品针对生产速度和可靠性进行了专门调校。博客中报告的实际测试响应时间始终低于 5 秒。

🎯 使用 Invofox API 的 Python 代码

许多开发人员喜欢用代码提取文档,所以让我们使用 Python 的 Invofox API 来演示相同的过程。我们将尽量简洁,只包含代码和 JSON 响应。

整个过程与前面部分相同,因此我不再赘述。如果您有兴趣自行探索,可以阅读 文档。

我们需要安装 请求,这是一个 Python 库,可以轻松发送 HTTP 请求(例如 GET、POST)并使用 Web API。

pip install requests

我们还将使用 time 每个标准 Python 安装中预装的内置 Python 模块。该  time  模块提供各种与时间相关的函数,例如延迟 ( time.sleep())、时间戳等等。在我们的例子中,我们将使用它来暂停执行,以便文档有足够的时间在仪表板上进行处理。

我们来写完整的代码,文件名为invofox-main.py

import requests
import os
import json
from dotenv import load_dotenv
import time

load_dotenv()

API_BASE = "https://api.invofox.com"
API_KEY = os.getenv("INVOFOX_API_KEY")
PDF_PATH = "invoice_sample.pdf"

headers = {"accept": "application/json", "x-api-key": API_KEY}

with open(PDF_PATH, "rb") as f:
    files = {"files": f}
    info = {"type": "6840c4511cbcc77119347248", "data": {"companyActsLike": "issuer"}}
    data = {"info": json.dumps(info)}
    resp_upload = requests.post(f"{API_BASE}/v1/ingest/uploads", headers=headers, files=files, data=data
    )

upload_result = resp_upload.json()
print("Upload response:", upload_result)

import_id = upload_result.get("importId")
if not import_id:
    raise ValueError("Import ID not found in upload response.")

# wait a moment for processing
time.sleep(2)

resp_import = requests.get(f"{API_BASE}/v1/ingest/imports/{import_id}", headers=headers)
import_info = resp_import.json()
print("Import info:", import_info)

files_info = import_info.get("files", [])
if not files_info or not files_info[0].get("documentIds"):
    raise ValueError("Document IDs not found in import info.")

document_id = files_info[0]["documentIds"][0]
print("Document ID:", document_id)

time.sleep(20)

resp_get = requests.get(f"{API_BASE}/documents/{document_id}", headers=headers)
parsed_doc = resp_get.json()
print("Parsed Document Data:")
print(json.dumps(parsed_doc, indent=2))

以下是所有使用的 Invofox API 端点:

  1. POST /v1/ingest/uploads→ 上传包含元数据(类型和发行人信息)的 PDF 发票。返回importId
  2. GET /v1/ingest/imports/{importId}→ 检索包括 documentIds 生成的详细信息importId
  3. GET /documents/{documentId}→ 从中检索完全解析的发票数据documentId

这是使用 运行脚本后的 JSON 响应python invofox-main.py

发票与 PDF 文档解析对比:GPT-4o vs Claude 3.5 Sonnet vs Invofox API 教程

JSON 响应与我们使用 Postman 发出请求后得到的类似。它还在响应中提供了原始发票的图像以及许多有用的字段。


结果与比较

我们来简单比较一下他们的方法。

  • API 调用
    • GPT-4o/Claude → 发送带有提示的文本
    • Invofox → 使用 API 或批量上传文件(图像 /PDF)
  • 设置
    • GPT/Claude → 需要编写提示工程代码
    • Invofox → 最少代码,无提示
  • 验证
    • GPT/Claude → 您需要手动验证
    • Invofox → 内置验证和置信度分数
  • 表现
    • GPT/Claude → 受令牌 / 窗口大小限制
    • Invofox → 通过后端 OCR 和 AI 处理多页文档

在分析发票时,我意识到了以下几点:

  • ChatGPT (GPT-4o):如果提示清晰,则擅长解析已知字段。虽然会得到 JSON 字符串,但必须自行解析 / 清理。如果提示不明确,可能会出现错误。
  • Claude 3.5 (Sonnet):它与 GPT-4 非常相似。在快照中,您可以看到 Sonnet 处理发票字段的效果与 GPT-4 差不多,有时在识别不熟悉的术语方面表现更好。但我们仍然需要对提示进行一些调整。
  • Invofox API:它开箱即用地返回了完整解析的发票 JSON。所有字段均已正确提取并验证。输出的架构正是我们所需的,无需额外编码。

比较表

现在我们已经了解了每个选项,让我们来逐一比较一下。估算基于典型的发票长度:简单发票长度为 1-2 页,总计 1000-2000 个代币。

Feature Invofox GPT‑4o Claude 3.5 Sonnet
No‑code setup ❌ (code/prompt required) ❌ (code/prompt required)
Direct PDF/image upload ❌ (text-only) ❌ (text-only)
Custom document type support ✅ (custom IDs) ✅ (via prompt) ✅ (via prompt)
Fixed JSON schema ❌ (varies by prompt) ❌ (varies by prompt)
Consistent field naming ❌ (“Line Items”variants)
Built-in validation
Confidence scores
Auto-completion
Human review optional
Workflow orchestration ✅ (API/hooks/dashboard)
Multi-language OCR ❌ (needs external OCR) ❌ (needs external OCR)
Multi-page document support
Processing speed ✅ (fast, <5s) ✅ (fastest) ⚠️ (slower)

view rawdoc_parsing_comparison.md hosted with ❤ by GitHub

成本和执行时间基准

我们在每个部分都介绍了定价结构,但我也同时进行了介绍,以便更容易做出决定。

Tool Cost Structure Typical Cost (per doc/simple invoice) Typical Execution Time Notes
Invofox Per document, usage-based, no fixed fees Custom / Not public. (Free trial, then custom) <5s per document Built for production, price via sales.
GPT-4o $2.50/million input tokens
$10/million output
$0.005–$0.015 (1,000–2,000 tokens) 1–30s per request, can vary by load Price = (input + output tokens) × pricing.
Claude 3.5 Sonnet $3/million input tokens
$15/million output
$0.006–$0.018 (1,000–2,000 tokens) ~200–300ms best-case, up to 10s+ API is fast, but batch/huge prompts increase time.

view rawcost_duration_benchmarks.md hosted with ❤ by GitHub

您还应该了解升级语言模型所涉及的持续成本和工作量。每当新版本发布时,团队通常需要对新模型进行基准测试、重新测试提示和模式,并调整输出解析逻辑。

这些隐性维护成本并非总是显而易见,但值得考虑。而使用 Invofox,则无需考虑这些成本。

底线

对于快速实验或一次性任务,您可以使用 GPT-4(ChatGPT API)或 Claude Sonnet 通过编写合适的提示来解析发票文本。它们能够很好地提取 JSON 中的字段(因为 GPT-4 的输出往往比早期的 GPT-3 更结构化、更清晰)。

然而,对于可靠的生产级发票或收据解析,Invofox API 更胜一筹。它专为文档构建,采用先进的专有模型并具备持续反馈功能。

您可以在 GitHub 存储库 中找到完整的代码。

正文完
 0
评论(没有评论)