batnieluyo/receipt-scanner

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

安装: 321

依赖项: 0

建议者: 0

安全: 0

星星: 0

关注者: 0

分支: 15

语言:富文本格式

1.0.1 2024-07-23 19:08 UTC

This package is auto-updated.

Last update: 2024-09-23 19:25:46 UTC


README

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

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

Latest Version on Packagist Total Downloads

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

功能

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

安装

通过composer安装包

composer require batnieluyo/receipt-scanner

发布配置文件

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

所有配置选项均在配置文件中有文档说明。

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

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 TheAi\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 TheAi\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和一个包含每个单独项目DTO的LineItem数组组成。

  • TheAi\ReceiptScanner\Data\Receipt
  • TheAi\ReceiptScanner\Data\Merchant
  • TheAi\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 TheAi\ReceiptScanner\Facades\ReceiptScanner;

ReceiptScanner::scan(
    $textPlainText
    asArray: true
)

指定模型

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

use TheAi\ReceiptScanner\Facades\ReceiptScanner;
use TheAi\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模型。

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

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

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

默认模型是 ModelNames::TURBO_INSTRUCT

$maxTokens (整数)

模型将处理的标记最大数量。默认值是 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 TheAi\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(US-West)、AWS GovCloud(US-East)、加拿大(中部)、欧盟(爱尔兰)、欧盟(伦敦)、欧盟(法兰克福)、欧盟(巴黎)、亚太地区(新加坡)、亚太地区(悉尼)、亚太地区(首尔)和亚太地区(孟买)区域可用。

查看: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 TheAi\ReceiptScanner\Facades\ReceiptScanner;

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

许可

此包采用MIT许可证。有关更多详细信息,请参阅许可文件