三大文档解析 API 对标测评(含代码)
技术博文对比 GPT-4o、Claude Sonnet 3.5、Invofox 的文档提取能力与成本,提供完整代码示例助力开发者选型
技术博文对比 GPT-4o、Claude Sonnet 3.5、Invofox 的文档提取能力与成本,提供完整代码示例助力开发者选型
OpenAI 的 GPT-4o 在正确 prompt 的引导下可以提取结构化信息,但与 Invofox 不同,它不能直接读取 PDF 文件。必须先用 Tesseract 或 pdfplumber 等 OCR 工具提取文本,然后通过 API prompt 发送给 GPT。
你需要一个 OpenAI API 密钥。创建一个 .env 文件,规约如下:
OPENAI_API_KEY=your_api_key
创建虚拟环境来隔离依赖:
# macOS / Linux:
python3 -m venv env
source env/bin/activate
# Windows:
python -m venv env
.\env\Scripts\activate
安装必要的库:
pip install pdfplumber openai python-dotenv
安装后,生成 requirements.txt 文件:
pip freeze > requirements.txt
添加 .gitignore 来避免提交虚拟环境。
完整代码见 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_pdf 函数使用 pdfplumber 读取每一页并连接文本。parse_invoice_with_openai 函数将文本发送给 GPT-4o,要求其输出 JSON。
运行 python openai-main.py 会生成包含提取字段的 JSON 输出:
{
"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."
}
优势:
劣势:
1-2 页发票提取的成本估计: $0.005–$0.018,取决于 prompt 的细节。响应时间: 1–30 秒,受负载波动影响。
Anthropic 的 Claude 3.5 Sonnet 在正确 prompt 的引导下可以从文本解析结构化数据。与 GPT-4o 一样,它不能通过 API 直接读取 PDF 文件,所以必须先提取文本。
你需要一个 Anthropic API 密钥:
ANTHROPIC_API_KEY=your_api_key
创建虚拟环境:
# macOS / Linux:
python3 -m venv env
source env/bin/activate
# Windows:
python -m venv env
.\env\Scripts\activate
安装所需的库:
pip install pdfplumber anthropic python-dotenv
然后导出到 requirements.txt 并添加 .gitignore。
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)
运行 python anthropic-main.py 会生成:
{
"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."
}
优势:
劣势:
成本估计: 每份文档 $0.005–$0.018。响应时间: 最佳情况 200–300ms,大型 prompt 可能长达 10 秒以上。
Invofox 是一家 Y Combinator 支持的初创公司,专门为文档解析而建。它使用针对发票和其他文档进行微调的专用模型,不同于通用的 LLM。
Splitter:自动分离单个 PDF 中的多份文档(例如混合的发票),将页面分组为逻辑性子文档以获得更好的提取效果。
Classifier:预训练的 AI 模型,检测文档类型(发票、收据等),以便每份文档都用正确的 schema 处理。
高级 AI 模型与专有算法:验证和自动完成数据。
创建一个账户以生成 Invofox 仪表板的 API 密钥。
一旦你有了 API 密钥,使用 Postman 向 Invofox 的 /uploads 端点发送文档。
打开 Postman 并创建一个集合和新请求
请求端点: https://api.invofox.com/v1/ingest/uploads
Headers:
不要手动设置 Content-Type;Postman 会在 form-data 中自动处理。
切换到 Body 标签,选择 form-data 并添加:
{
"type": "6840c4511cbcc77119347248",
"data": {
"companyActsLike": "issuer"
}
}
data 字段对于自定义元数据或解析指令是可选的。
点击 "Send" 会返回一个包含详情的响应:
{
"accountId": "683edb9d7ded4695232c4979",
"environmentId": "683edb9d7ded4695232c497b",
"importId": "68662d83c3a0849a86a6aa30",
"files": [
{
"id": "68662d83c3a0849a86a6aa33",
"filename": "invoice_sample.pdf",
"documentId": "68662d83c3a0849a86a6aa34"
}
]
}
向 https://api.invofox.com/documents/{documentID} 发起 GET 请求,请求头为:
响应包括原始文档图像和提取的数据,相比 GPT 或 Claude 的输出包含许多额外字段。
安装 requests 库:
pip install requests
创建 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))
使用的三个主要 API 端点:
运行 python invofox-main.py 会返回已解析的文档,所有字段都已正确提取和验证。
| 方面 | GPT-4o/Claude | Invofox |
|---|---|---|
| 工作流 | 发送文本配 prompt | 使用 API 或批量上传文件(图像/PDF) |
| 代码需求 | 需要 prompt 工程代码 | 最少的代码,无需 prompt |
| 验证 | 需要手动验证 | 内置验证和置信度分数 |
| 文档处理 | 受 token/窗口大小限制 | 通过后端 OCR 和 AI 处理多页文档 |
ChatGPT (GPT-4o):在清晰 prompt 的指导下擅长解析已知字段。你可以获得 JSON 但必须解析/清理它。如果 prompt 不清晰会出现错误。
Claude 3.5 (Sonnet):与 GPT-4 类似。处理发票字段表现不错,有时对识别陌生术语的表现更佳。仍需要调整 prompt。
Invofox API:返回完全解析的发票 JSON,开箱即用。所有字段都正确提取和验证,具有恰好所需的 schema,无需额外编码。
考虑升级语言模型的持续成本。团队通常需要对新模型进行基准测试、重新测试 prompt、调整 schema,以及在新版本发布时修改解析逻辑。这些隐藏的维护成本很大。使用 Invofox,不存在这种需求。
对于快速实验或一次性任务,通过精心设计 prompt,GPT-4(ChatGPT API)或 Claude Sonnet 都能相当好地工作。它们可以熟练地生成结构化 JSON 输出。
但是,对于发票或收据的可靠的生产级解析,Invofox 文档 OCR API 更为优越。它是专门为文档构建的,使用高级专有模型和持续的反馈循环。
你需要的两个 Invofox 端点取决于你需要什么回报。如果你能提前命名字段——发票号、总额、日期——文档 OCR API 会返回恰好这些,有类型和验证。如果你宁愿将整个文档作为干净、结构化的输入供 RAG 或 LLM 管道使用,文档解析 API 会将任何 PDF 转换为 Markdown 或带类型的 JSON,保留布局、表格和阅读顺序。
完整代码可在 GitHub 仓库中获得。
立即开始自动化文档工作流。
预约演示,我们将在你的实际文档上展示 Invofox——相同的规则、相同的阈值、完全的可见性。
相关阅读: