レシートを活用してお金持ちに: Google Cloud とスーパーマーケットのレシートで節約する - パート 2
Google Cloud Japan Team
※この投稿は米国時間 2023 年 6 月 6 日に、Google Cloud blog に投稿されたものの抄訳です。
多くの組織にとって、手作業でのドキュメントの分類と抽出は、依然として時間のかかる大変な作業です。このブログシリーズの目的は、Document AI や BigQuery などの Google Cloud プロダクトを組み合わせて使用することで、組織が手作業でドキュメントを処理しなくても済むようにする方法をご紹介することです。
このブログシリーズのパート 1 では、Google Cloud サービスを使用してスーパーマーケットのレシートをデジタル化し、支出パターンを分析する方法をご紹介しました。さらに、X という架空のスーパーマーケットに焦点を当て、レシートをデジタル化する方法について学びました。このシリーズのパート 2 では、問題の範囲を拡大し、世界中のあらゆるスーパーマーケットのレシートをデジタル化する方法を取り上げます。
このブログシリーズのパート 2 では、Document AI のカスタム分類器プロセッサを使用して、さまざまなスーパーマーケットのレシートを自動的に分類する方法について学びます。その後、Google Cloud Functions(第 2 世代)とトリガーを使用して、Google Cloud Storage にアップロードしたレシートをすぐに自動的に分類する方法についても学びます。
この情報をデジタル化することで、データを分析し、支出の傾向に関するインサイトを取得できます。このインサイトにより、有名メーカーの商品の代わりにノーブランドの商品を購入する、あるいはまとめ買いするなど、節約できる部分を特定できます。このように Google Cloud のテクノロジーをうまく組み合わせることで、レシートを貴重なデータソースに変え、お金を節約し、よりスマートな購入の意思決定を行うことができるようになります。
説明のために、近所にスーパーマーケット X、スーパーマーケット Y、スーパーマーケット Z という複数のスーパーマーケットがあり、それぞれが独自のレシート形式を使用していると仮定します。ここでは、さまざまな種類のスーパーマーケットのレシートを分類し、このブログシリーズのパート 1 でご紹介したカスタム プロセッサを使用して解析できるようにすることが、最初の課題となります。
以下は、アーキテクチャを視覚的に表現したものです。


このブログ投稿では、さまざまな種類のスーパーマーケットのレシートを分類し、個別の Cloud Functions の関数で自動的に処理できるよう、異なる Cloud Storage バケットに配置する方法をご説明します。(このブログシリーズのパート 1 で説明したように)すべてのスーパーマーケットのカスタム エクストラクタが同じプロセッサ スキーマを使用している場合、すべて同じコードを実行し、BigQuery と Datastore の同じテーブルに書き込むことができます。定義済みのスキーマをカスタム エクストラクタで使用しない場合、Cloud Functions がレシートから抽出されたデータを BigQuery の異なるテーブルに書き込むようにする必要があります。この場合、マテリアライズド ビューを構築して、異なるテーブルのデータを可視化できます。
上述のアーキテクチャには、以下のような利点があります。
スーパーマーケットのレシートのアップロードからデジタル化に至るまで、すべての手順を自動化できます。
カスタム エクストラクタを個別に保守、開発できます。ニーズに応じて、同じスキーマに従うことも、別々のスキーマに従うことも可能です。
すべての Cloud Functions がカスタムログ名を使用してログを書き込むため、問題を迅速に特定できます。
さまざまな種類のスーパーマーケットのレシートを分類し、個別の Cloud Storage バケットにアップロードする手順は、以下のとおりです。
1. 開始チェックリストを使って Google Cloud アカウントを設定します(まだ設定していない場合)。
2. Document AI カスタム ドキュメント分類器を設定します。
a. こちらのガイドでは、Document AI Workbench を使用して、さまざまなスーパーマーケットのレシートを分類するカスタム ドキュメント分類器を作成、トレーニングする方法を説明しています。
b. ガイドに沿って、よく行くスーパーマーケットのレシートを分類できるカスタム分類器を作成します。分類モデルのトレーニングとテストには、各スーパーマーケットのレシートが平均 20 枚ずつ必要です。
c. プロセッサ スキーマは、下の画像のようになります。必要に応じてラベルを追加します。ラベルは明確に定義し、スーパーマーケットごとに固有のものにする必要があります。わかりやすくするため、ラベルの名前はスーパーマーケットの名前にちなんだものにすることをおすすめします。


d. このカスタム ドキュメント分類器プロセッサは、ウェブまたはモバイルアプリを介してユーザーがアップロードしたレシートの種類を識別するために、Cloud Functions で使用されます。
3. Google Cloud Storage を設定します。こちらのドキュメントの手順に沿って、ユーザーがアップロードしたレシートを保存するストレージ バケットを作成します。
4. Google Cloud Functions の関数を設定します。
a. Cloud Functions(第 2 世代)の関数の作成方法については、こちらのドキュメントをご覧ください。この関数は、手順 3 で作成したクラウド ストレージに新しいオブジェクトが追加されると有効化される Eventarc トリガーをサポートしています。
b. 関数を作成する際は、ネットワーク設定の [内部トラフィックと Cloud Load Balancing からのトラフィックを許可する] がオンになっていることを確認します。
c. Eventarc トリガーを追加する際は、[google.cloud.storage.object.v1.finalized] イベントタイプを選択します。
d. Eventarc を作成する際は、[デフォルトのコンピューティング サービス アカウント] を使用する代わりに、新しいサービス アカウントを作成することをおすすめします。新しいサービス アカウントには、[Cloud Run 起動元] 権限と [Eventarc イベント受信者] 権限を付与する必要があります。
e. Cloud Functions の関数を作成する際は、[ランタイム サービス アカウント] として [デフォルトのコンピューティング サービス アカウント] を使用しないでください。代わりに、Datastore、BigQuery、Logging、Document AI に接続できるよう、アカウントを新規作成して、BigQuery データオーナー、Cloud Datastore ユーザー、Document AI API ユーザー、ログ書き込み、Storage オブジェクト作成者、Storage オブジェクト閲覧者のいずれかのロールを付与します。
f. 処理が終わると、サービス アカウントと権限が以下のように表示されます。


g. 次に、作成した Cloud Functions の関数を開き、ランタイムとして .NET 6.0 を選択します。これで、C# の関数を記述できるようになります。
h. 確実にビルドできるように、現在の Cloud Functions の関数のコードをこちらのコードに置き換え、コード内の変数を適切な Google Cloud サービス名に置き換えます。HelloGcs.csproj ファイルと Function.cs ファイルの内容を置き換えます。
i. Cloud Functions の関数をデプロイします。
5. テストします。
a. アプリケーションをテストするには、手順 3 で作成し、手順 4 で Eventarc の [イベントの受信元] に構成したものと同じ Cloud Storage バケットにスーパーマーケットのレシートをアップロードします。
b. 手順 3 の blob ストレージにスーパーマーケットのレシートがアップロードされると、手順 4 の Cloud Functions の関数がトリガーされます。Cloud Functions の関数は、Document AI カスタム分類器(手順 2 で作成)のエンドポイントを呼び出し、モデルのレスポンスに基づいてレシートを分類した後、そのスーパーマーケットのファイル専用クラウド バケットにファイルを保存します。
c. このブログシリーズのパート 1 でアーキテクチャを構築している場合、Cloud Storage バケットがソース ストレージ バケットであることを確認してください。これにより、別の Cloud Functions の関数がトリガーされます。このクラウド関数では、定義済みのスキーマに従ってレシートから情報を抽出し、BigQuery、Datastore、Cloud Storage に同時に書き込みます。
別の方法:
Google Pub/Sub と 1 つの Cloud Functions の関数を使用して、すべてのレシートを分類、処理する方法もあります。


このアプローチの場合、アップロードされたすべてのレシートがクラウド ストレージに保存され、処理のために参照 URL がメッセージとして Pub/Sub のキューに追加されます。Eventarc は「google.cloud.pubsub.topic.v1.messagePublished」イベントをサポートしています。そのため、Pub/Sub に新しいメッセージが書き込まれると、Cloud Functions(第 2 世代)の関数がトリガーされます。この関数は、クラウド ストレージにある、レシートの URI を含んだメッセージを読み取ることができます。その後、Cloud Functions の関数は URI を使用して Cloud Storage からレシートを取得、分類し、データを抽出して、Google Storage のオプションのいずれかに書き込みます。この方法の唯一の問題点は、Cloud Functions の単一の関数ですべての種類のレシートを処理すると、管理が困難になる可能性があることです。この方法は、このブログシリーズのパート 1 で説明したスーパーマーケットのカスタム エクストラクタが、同じプロセッサ スキーマを使用してスーパーマーケットのレシートをすべて抽出する場合に、最も効果的に機能します。
まとめ:
このブログシリーズのパート 1 では、Document AI、Cloud Functions(第 2 世代)、BigQuery、Datastore、Cloud Storage といった Google Cloud のサービスを使って、単一のスーパーマーケットが発行する独自形式のレシートをデジタル化するアーキテクチャについてご説明しました。パート 2 では、アーキテクチャの範囲を拡大し、世界中のあらゆるスーパーマーケットのあらゆるレシートを入力として受け取り、Document AI を使用して分類した後、パート 1 でご説明した処理を行うアーキテクチャをご紹介しました。
これで、世界中のスーパーマーケットのレシートをすべてデジタル化できるようになりましたね。この方法は、あらゆる業界のあらゆるドキュメント処理のユースケースに応用できます。
その前に、Google Cloud のチュートリアルやサンプルで、このようなユースケースの詳細をご確認ください。
- インフラストラクチャ担当シニア カスタマー エンジニア Krishna Chytanya Ayyagari