跳到内容

使用 GPT-4 和 Python 提取收据数据

本文演示了如何使用 Python 的 Pydantic 库和 OpenAI 的 GPT-4 模型从图像中提取收据数据并验证总金额。此方法对于自动化费用跟踪和财务分析任务特别有用。

定义 Item 和 Receipt 类

首先,我们定义两个 Pydantic 模型,ItemReceipt,用于构建提取的数据结构。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 库的强大功能,我们可以准确地从图像中提取和验证收据数据,从而简化费用跟踪和财务分析任务。