helgesverre/receipt-scanner

使用OpenAI从文本、Html、图像和PDFs中提取结构化收据和发票数据。

安装: 340

依赖项: 0

建议者: 0

安全性: 0

星标: 107

关注者: 2

分支: 15

开放问题: 1

语言:富文本格式

v3.1.0 2024-03-26 23:32 UTC

This package is auto-updated.

Last update: 2024-09-14 09:41:28 UTC


README

需要更多灵活性? 尝试使用Extractor包,这是一个用于Laravel的AI数据提取库

用于Laravel的AI收据和发票扫描器

Latest Version on Packagist Total Downloads

使用OpenAI,轻松从您的Laravel应用程序中的图像、PDFs和电子邮件中提取结构化收据数据。

功能

  • OpenAI Chat和Completion端点的轻量级包装。
  • 接受文本作为输入,并返回结构化收据信息。
  • 包括用于解析收据的优化提示。
  • 支持包括纯文本、PDF、图像、Word文档和Web内容在内的各种输入格式。
  • Textract集成以提供OCR功能。

安装

通过composer安装包

composer require helgesverre/receipt-scanner

发布配置文件

php artisan vendor:publish --tag="receipt-scanner-config"

所有配置选项都在配置文件中进行了文档说明。

由于此包使用OpenAI Laravel Package,因此您还需要发布他们的配置,并将OPENAI_API_KEY添加到您的.env文件中

php artisan vendor:publish --provider="OpenAI\Laravel\ServiceProvider"
OPENAI_API_KEY="your-key-here

用法

从纯文本中提取收据数据

当您已经拥有收据或发票的文本表示时,纯文本扫描非常有用。

以下示例来自Paddle.com收据电子邮件,我将电子邮件中的所有文本都复制下来,并删除了所有空行。

$text = <<<RECEIPT
Liseth Solutions AS
via software reseller Paddle.com
Thank you for your purchase!
Your full invoice is attached to this email.
Amount paid
Payment method
NOK 2,498.75
visa
ending in 4242
Test: SaaS Subscription - Pro Plan
September 22, 2023 11:04 am UTC - October 22, 2023 11:04 am UTC
NOK 1,999.00
QTY: 1
Subtotal
NOK 1,999.00
VAT
NOK 499.75
Amount paid*
NOK 2,498.75
*This payment will appear on your statement as: PADDLE.NET* EXAMPLEINC
NEED HELP?
Need help with your purchase? Please contact us on paddle.net.
logo
Paddle.com Market Ltd, Judd House, 18-29 Mora Street, London EC1V 8BT
© 2023 Paddle. All rights reserved.
RECEIPT;


ReceiptScanner::scan($text);

从其他格式提取数据

use HelgeSverre\ReceiptScanner\Facades\Text;

$textPlainText = Text::text(file_get_contents('./receipt.txt'));
$textPdf = Text::pdf(file_get_contents('./receipt.pdf'));
$textImageOcr = Text::textract(file_get_contents('./receipt.jpg'));
$textPdfOcr = Text::textractUsingS3Upload(file_get_contents('./receipt.pdf'));
$textWord = Text::word(file_get_contents('./receipt.doc'));
$textWeb = Text::web('https://example.com');
$textHtml = Text::html(file_get_contents('./receipt.html'));

加载后,您可以将TextContent或纯文本(可以通过调用->toString()检索)传递给ReceiptScanner::scan()方法。

use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner;

ReceiptScanner::scan($textPlainText)
ReceiptScanner::scan($textPdf)
ReceiptScanner::scan($textImageOcr)
ReceiptScanner::scan($textPdfOcr)
ReceiptScanner::scan($textWord)
ReceiptScanner::scan($textWeb)
ReceiptScanner::scan($textHtml)

收据数据模型

扫描的收据被解析成一个DTO,它由一个包含收据元数据的Receipt主类和一个表示收据或发票上的卖家的Merchant dto组成,以及一个包含每个单独项目行的LineItem dto数组。

  • HelgeSverre\ReceiptScanner\Data\Receipt
  • HelgeSverre\ReceiptScanner\Data\Merchant
  • HelgeSverre\ReceiptScanner\Data\LineItem

该DTO有一个toArray()方法,将生成如下结构

为了灵活性,所有字段都是可空的。

[
    "orderRef" => "string",
    "date" => "date",
    "taxAmount" => "number",
    "totalAmount" => "number",
    "currency" => "string",
    "merchant" => [
        "name" => "string",
        "vatId" => "string",
        "address" => "string",
    ],
    "lineItems" => [
        [
            "text" => "string",
            "sku" => "string",
            "qty" => "number",
            "price" => "number",
        ],
    ],
];

返回数组而不是DTO

如果您更喜欢使用数组而不是内置的DTO,可以在调用scan()时指定asArray: true

use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner;

ReceiptScanner::scan(
    $textPlainText
    asArray: true
)

指定模型

要使用不同的模型,可以在调用scan()方法时使用model命名参数指定要使用的模型名称。

use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner;
use HelgeSverre\ReceiptScanner\ModelNames;

// With the ModelNames class
ReceiptScanner::scan($content, model: ModelNames::GPT4_1106_PREVIEW)

// With a string
ReceiptScanner::scan($content, model: 'gpt-4-1106-preview')

所有参数及其功能

$text (TextContent|string)

需要解析的收据或发票的输入文本。它接受一个TextContent对象或字符串。

**$model (string)

此参数指定用于提取过程的OpenAI模型。

HelgeSverre\ReceiptScanner\ModelNames是一个包含每个模型的常量类,提供方便。然而,如果您愿意,也可以直接使用字符串来指定模型。

不同的模型有不同的速度/准确性特性。

如果您需要高精度,请使用GPT-4模型;如果您需要速度,请使用GPT-3模型;如果您需要更高的速度,请使用gpt-3.5-turbo-instruct模型。

默认模型是ModelNames::TURBO_INSTRUCT

$maxTokens (int)

模型将处理的令牌的最大数量。默认值为 2000,对于非常长的文本,可能需要调整此值,但通常2000已经相当好了。

$temperature (浮点数)

控制模型输出的随机性/创造力。

更高的值(例如,0.8)会使输出更随机,在这个场景中通常不是我们想要的,我通常使用0.1或0.2,超过0.5变得没有用。默认值为 0.1

$template (字符串)

此参数指定用于提示的模板。

默认模板是 'receipt'。您可以通过在 resources/views/vendor/receipt-scanner/ 目录中添加新的blade文件来创建并使用额外的模板,并将文件名(不带扩展名)指定为 $template 值(例如: "minimal_invoice")。

$asArray (布尔值)

如果为真,则将AI模型的响应作为数组而不是DTO返回,如果您需要修改默认DTO以包含更多/更少的字段或将响应转换为自己的DTO,则很有用,默认为 false

示例用法

use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner;

$parsedReceipt = ReceiptScanner::scan(
    text: $textInput,
    model: ModelNames::TURBO_INSTRUCT,
    maxTokens: 500,
    temperature: 0.2,
    template: 'minimal_invoice',
    asArray: true,
);

支持的模式列表

AWS Textract的OCR配置

要使用AWS Textract从大图像和多页PDF中提取文本,该包需要将文件上传到S3,并将S3对象位置传递给textract服务。

因此,您需要在 config/receipt-scanner.php 文件中配置您的AWS凭据如下所示

TEXTRACT_KEY="your-aws-access-key"
TEXTRACT_SECRET="your-aws-security"
TEXTRACT_REGION="your-textract-region"

# Can be omitted
TEXTRACT_VERSION="2018-06-27"

您还需要配置一个单独的textract磁盘,用于存储文件,打开您的 config/filesystems.php 配置文件并添加以下内容

'textract' => [
    'driver' => 's3',
    'key' => env('TEXTRACT_KEY'),
    'secret' => env('TEXTRACT_SECRET'),
    'region' => env('TEXTRACT_REGION'),
    'bucket' => env('TEXTRACT_BUCKET'),
],

请确保 config/receipt-scanner.php 中的 textract_disk 设置与 filesystems.php 配置中的磁盘名称相同,您可以使用 .env 值 TEXTRACT_DISK 进行更改。

return [
    "textract_disk" => env("TEXTRACT_DISK")
];

.env

TEXTRACT_DISK="uploads"

注意

并非所有地区都提供Textract

问:在哪些AWS地区中Amazon Textract可用?Amazon Textract目前在以下地区可用:美国东部(弗吉尼亚北部)、美国东部(俄亥俄)、美国西部(俄勒冈)、美国西部(北加利福尼亚)、AWS GovCloud(美国西部)、AWS GovCloud(美国东部)、加拿大(中部)、欧洲(爱尔兰)、欧洲(伦敦)、欧洲(法兰克福)、欧洲(巴黎)、亚太地区(新加坡)、亚太地区(悉尼)、亚太地区(首尔)和亚太地区(孟买)。

参见:https://aws.amazon.com/textract/faqs/

发布提示

您可以通过运行以下命令来发布底层使用的提示文件

php artisan vendor:publish --tag="receipt-scanner-prompts"

此包简单地使用blade文件作为提示,{{ $context }} 变量将被您传递给 ReceiptScanner::scan("text here") 的文本替换。

添加提示/模板

默认情况下,该包使用 receipt.blade.php 文件作为其提示模板,您可以通过在 resources/views/vendor/receipt-scanner/minimal_invoice.blade.php 中创建一个新的blade文件并更改调用 scan() 时的 $template 参数来添加额外的模板。

示例提示

Extract the following fields from the text below, output as JSON

date (as string in the  Y-m-d format)
total_amount (as float, do not include currency symbol) 
vendor_name (company name)

{{ $context }}

OUTPUT IN JSON
use HelgeSverre\ReceiptScanner\Facades\ReceiptScanner;

$receipt = ReceiptScanner::scan(
    text: "Your invoice here",
    model:  ModelNames::TURBO_INSTRUCT,
    template: 'minimal_invoice',
    asArray: true,
);

许可证

此包受MIT许可证许可。有关详细信息,请参阅 许可证文件