使用 GPT-4 和 Python 提取收据数据¶
本文演示了如何使用 Python 的 Pydantic 库和 OpenAI 的 GPT-4 模型从图像中提取收据数据并验证总金额。此方法对于自动化费用跟踪和财务分析任务特别有用。
定义 Item 和 Receipt 类¶
首先,我们定义两个 Pydantic 模型,Item
和 Receipt
,用于构建提取的数据结构。Item
类表示收据上的单个项目,包含名称、价格和数量字段。Receipt
类包含一个 Item
对象列表和总金额。
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
quantity: int
class Receipt(BaseModel):
items: list[Item]
total: float
验证总金额¶
为了确保提取数据的准确性,我们使用 Pydantic 的 model_validator
装饰器定义一个自定义验证函数 check_total
。此函数计算项目价格的总和,并将其与提取的总金额进行比较。如果存在差异,则引发 ValueError
。
from pydantic import model_validator
@model_validator(mode="after")
def check_total(self):
items = self.items
total = self.total
calculated_total = sum(item.price * item.quantity for item in items)
if calculated_total != total:
raise ValueError(
f"Total {total} does not match the sum of item prices {calculated_total}"
)
return self
从图像中提取收据数据¶
extract_receipt
函数使用 OpenAI 的 GPT-4 模型处理图像 URL 并提取收据数据。我们利用 instructor
库为此目的配置 OpenAI 客户端。
import instructor
from openai import OpenAI
client = instructor.from_openai(OpenAI())
def extract(url: str) -> Receipt:
return client.chat.completions.create(
model="gpt-4",
max_tokens=4000,
response_model=Receipt,
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url": url},
},
{
"type": "text",
"text": "Analyze the image and return the items in the receipt and the total amount.",
},
],
}
],
)
实际示例¶
在这些示例中,我们将此方法应用于从两个不同图像中提取收据数据。自定义验证函数确保提取的总金额与项目价格的总和匹配。
url = "https://templates.mediamodifier.com/645124ff36ed2f5227cbf871/supermarket-receipt-template.jpg"
receipt = extract(url)
print(receipt)
"""
items=[Item(name='Lorem ipsum', price=9.2, quantity=1), Item(name='Lorem ipsum dolor sit', price=19.2, quantity=1), Item(name='Lorem ipsum dolor sit amet', price=15.0, quantity=1), Item(name='Lorem ipsum', price=15.0, quantity=1), Item(name='Lorem ipsum', price=15.0, quantity=1), Item(name='Lorem ipsum dolor sit', price=15.0, quantity=1), Item(name='Lorem ipsum', price=19.2, quantity=1)] total=107.6
"""
通过结合 GPT-4 和 Python 的 Pydantic 库的强大功能,我们可以准确地从图像中提取和验证收据数据,从而简化费用跟踪和财务分析任务。