Amazon Web Services ブログ
Amazon Textract、Amazon Comprehend、および Amazon Lex を使ったインボイスからの対話型インサイトの取得
さまざまな業界の企業が、インボイスなどの処理する必要がある大量の物理的ドキュメントを抱えています。表、フォーム、段落、およびチェックボックスが含まれている場合、スキャンしたドキュメントからの情報の抽出は困難です。企業は、手作業、カスタムコード、または光学文字認識 (OCR) テクノロジーを使ってこれらの問題に対応してきましたが、これにはフォームの抽出とカスタムワークフローのためのテンプレートが必要です。
それに加えて、ドキュメントからのテキストまたはコンテンツの抽出後、エンドユーザーのためにこれらの領収書またはインボイスからインサイトも抽出したいとも考えています。しかし、これには複雑な NLP モデルの構築が必要となります。モデルのトレーニングには、大量のトレーニングデータとコンピューティングリソースが必要です。機械学習モデルの構築とトレーニングには、高額な費用と時間がかかりかねません。
また、これらのドキュメントとやり取りするための人間的なインターフェイスを提供しても、エンドユーザーにとっては扱いにくいものです。エンドユーザーはしばしばヘルプデスクに電話をかけますが、これも企業のコストを徐々に増加させます。
この記事では、AWS の AI サービスを使ってテキストデータの処理とインサイトの検出を自動化する方法について説明します。Amazon Textract、Amazon Comprehend、および Amazon Lex などの AWS の AI サービスを使用することで、自動化されたサーバーレスソリューションをセットアップしてこの要件に対応できます。今回は、以下のステップを順に説明していきます。
- Amazon Textract を使って pdf または画像の領収書/インボイスからテキストを抽出する。
- Amazon Comprehend を使ってインサイトを取得する。
- Amazon Lex を使って、これらのインサイトと自然言語でやり取りする。
次に、この問題を解決するソリューションを構築するためのサービスとアーキテクチャについて説明します。
使用されるサービス
このソリューションは、スケーラブルかつコスト効率性に優れたアーキテクチャを実装するために、以下の AI サービス、サーバーレステクノロジー、およびマネージドサービスを使用します。
- Amazon Cognito – ウェブおよびモバイルアプリケーションにユーザーサインアップ、サインイン、およびアクセスコントロールを簡単に素早く追加できるようにします。
- AWS Lambda – データの変更、システム状態の変化、ユーザーアクションなどのトリガーに応答してコードを実行します。Amazon S3 は Lambda 関数を直接トリガーできるため、さまざまなリアルタイムのサーバーレスデータ処理システムを構築できます。
- Amazon Lex – 対話型 Chatbot を作成するためのインターフェイスを提供します。
- Amazon Comprehend – テキスト内のインサイトと関係性を見つけるために機械学習を使用する NLP サービスです。
- Amazon Textract – スキャンされた PDF、JPEG、または PNG 形式のドキュメントからのテキストとデータの抽出に ML を使用します。
- Amazon Simple Storage Service (Amazon S3) – ドキュメントのオブジェクトストアとして機能し、微調整されたアクセスコントロールでの一元的な管理を可能にします。
アーキテクチャ
以下の図は、ソリューションのアーキテクチャを示しています。
アーキテクチャには以下のステップが含まれます。
- バックエンドユーザーと管理者が AWS マネジメントコンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使って PDF ドキュメントまたは画像を S3 バケットにアップロードします。
- Amazon S3 へのアップロードが AWS Lambda 関数をトリガーします。
- Lambda 関数が Amazon Textract の StartDocumentTextDetection API を呼び出します。この API は、アップロードされた PDF からのテキストを検知するための非同期ジョブをセットアップします。
- テキスト処理が完了したら、Amazon Textract が Amazon Simple Notification Service (Amazon SNS) に通知します。
- テキストを検知するジョブが完了したら、2 番目の Lambda 関数が SNS トピックから通知を受け取ります。
- Lambda が Amazon SNS からジョブ完了の通知を受けたら、非同期オペレーションからの結果を受け取るために Amazon Textract の GetDocumentTextDetection API を呼び出し、その結果を S3 バケットにロードします。
- Amazon Lex インテントを満たすために Lambda 関数が使用されます。やり取りのより詳しい順序については、「CloudFormation を使用したアーキテクチャのデプロイメント」セクションにある Chatbot の構築ステップを参照してください。
- Amazon Comprehend が、ML を使用してテキスト内のインサイトと関係性を見つけます。Lambda 関数 が、エンティティおよびキーフレーズ検知のために Amazon Comprehend から提供される boto3 API を使用します。
- Chatbot のウェルカムメッセージへの返答として、ユーザーが「インボイスの要約を見せてください」と入力します。これが GetInvoiceSummary Lex インテントを呼び出し、Lambda 関数 が Amazon Comprehend の DetectEntities API を呼び出してフルフィルメントのためのエンティティを検知します。
- ユーザーが「インボイスの詳細を取得してください」と入力すると、これによって GetInvoiceDetails インテントが呼び出され、Amazon Lex がインボイス番号の入力をユーザーに促して、Lambda 関数がインボイス詳細メッセージを返すための Amazon Comprehend の DetectEntities API を呼び出します。
- ユーザーが「<インボイス番号> のインボイスメモを表示できますか」と入力すると、これによって GetInvoiceNotes インテントが呼び出され、Lambda 関数がこのインボイスに関連するコメントを返すための Amazon Comprehend の DetectKeyPhrases API を呼び出します。
- 既存の CloudFormation スタックをネストされたスタックとして使用することで、AWS Cloudformation テンプレートに Lexbot Web UI をデプロイします。このスタックをダウンロードするには、Chatbot にウェブ UI をデプロイするを参照してください。このネストされたスタックは Lex Web UI をデプロイし、ウェブページは S3 バケットから静的ウェブサイトとして提供されます。ウェブ UI は Amazon Cognito を使って認証のためのアクセストークンを生成し、AWS CodeStar を使ってデリバリーパイプラインをセットアップします。エンドユーザーはこの Chatbot ウェブ UI とやり取りします。
AWS CloudFormation を使用したアーキテクチャのデプロイメント
CloudFormation テンプレートをデプロイして、Amazon S3、Lambda、Amazon Textract、Amazon Comprehend、および Amazon Lex Chatbot を含めたソリューションの必要な AWS Identity and Access Management (IAM) ロール、サービス、およびコンポーネントをプロビジョニングします。
- 米国東部 (バージニア北部) リージョンで次の CloudFormation テンプレートを起動します。
- スタックの名前、またはパラメータの BotName、
InvoiceBot
は変更しないでください。 - 機能と変換セクションにある 3 つのチェックボックスのすべてを選択して、AWS CloudFormation が IAM リソースを作成し、テンプレートを拡張することを承諾します。
これらのリソースの詳細については、「AWS IAM リソース」を参照してください。
このテンプレートは AWS サーバーレスアプリケーションモデル (AWS SAM) を使用します。これは、サーバーレスアプリケーションのための関数と API の定義方法を簡素化し、環境変数といったこれらのサービスのための機能も備えています。
- [スタックの作成] をクリックします。
以下のスタック詳細ページのスクリーンショットでは、スタックのステータスが CREATE_IN_PROGRESS
になっています。ステータスが CREATE_COMPLETE
に変更されるには、最大 20 分かかる場合があります。
- [出力] タブで、
LexLambaFunctionArn
、AssetsUploadBucket
、ExtractedTextfilesBucket
、およびLexUIWebAppUrl
の値をコピーします。
S3 バケットへのドキュメントのアップロード
ドキュメントを新しい S3 バケットにアップロードするには、先ほどコピーした AssetsUploadBucket
に対応する S3 バケット URL を選択します。PDF または画像をアップロードして、テキスト抽出フローを開始します。
このブログ記事で使用したインボイスは、GitHub リポジトリからダウンロードして AssetsUploadBucket
S3 URL にアップロードできます。このソリューションは、お使いのインボイステンプレートに合わせてカスタマイズすることが推奨されます。ファイルのアップロードに関する詳細については、「S3 バケットにファイルとフォルダをアップロードする方法」を参照してください。
アップロードが完了したら、Amazon S3 コンソールの [概要] タブにファイルが表示されます。
ファイルをアップロードしたら、ドキュメントからテキストが抽出されます。テキストが含まれた抽出ファイルを表示するには、先ほどコピーした URL を選択してバケットを開きます。
[概要] タブでは、ファイルをダウンロードして内容を調べ、それがアップロードしたファイルのテキストと同一かどうかを確認することができます。
Chatbot の構築
以下の会話を使って Chatbot のモデルを構築します。
Chatbot: InvoiceBot へようこそ。インボイスの概要、詳細、またはインボイスメモを提供するように指示してください。
ユーザー: インボイスの要約を見せてください
Chatbot: 入力ドキュメントをレビューし、インボイス番号が 35678-9 で合計金額が 2,100.0 USD のインボイスを 1 件見つけました。インボイス詳細またはインボイスメモを提供できます。リクエストを入力してください
ユーザー: インボイスの詳細を取得してください
Chatbot: インボイス番号を入力してください
ユーザー: 35678-9
Chatbot: 35678-9 のインボイス詳細: 2019 年 5 月 10 日付、アイテム One 対象、料金 1500.00 あり。2019 年 5 月 11 日付、アイテム One 対象、料金 100.00 あり。2019 年 5 月 12 日付、アイテム Merchant Two 対象、料金 300.00 あり。2019 年 5 月 13 日付、アイテム Merchant Three 対象、料金 200.00 あり。インボイスメモをリクエストする、またはチャットを閉じることができます。
ユーザー: 35678-9 のインボイスメモを表示できますか
Chatbot: 35678-9 のインボイスメモ: 5/13/2019 Merchant Three 200.00 Merchant Three 300.00 ラップトップ事務用品 Merchant Two 100.00 チームディナー食品 5/12/2019 5/11/2019 デスクと事務用品 5/10/1019 Merchant One 1500.00 椅子。オプションを再試行する、またはチャットを閉じることができます
Amazon Lex Chatbot (InvoiceBot) を以下のインテントで構築します。
- GetInvoiceSummary – ユーザーがインボイスの要約の表示をリクエストすると呼び出されるインテントです。これは Lambda 関数によって満たされ、利用できるインボイスの件数、およびインボイスの合計金額を返します。
- GetInvoiceDetails – ユーザーがインボイスの詳細の表示をリクエストすると呼び出されるインテントです。これは Lambda 関数 によって満たされ、日付、数量、およびアイテム詳細を含めたインボイスのアイテムレベルの内訳を提供します。
- GetInvoiceNotes – ユーザーがインボイスメモの表示をリクエストすると呼び出されるインテントです。これは Lambda 関数 によって満たされ、アップロードされたインボイスのメモを日付とアイテムの説明と共に提供します。
Chatbot の公開
前述のソリューション概要で説明したとおり、Amazon Textract が抽出したテキストから Amazon Comprehend が取得したインサイトでのやり取りには、Amazon Lex Chatbot (InvoiceBot) を使用します。
Chatbot を公開するには、以下のステップを実行します。
- Amazon Lex コンソールで [ボット] を選択します。
- 作成した Chatbot を選択します。
- [インテント] で [GetInvoiceSummary] を選択します。
- [フルフィルメント] で Lambda 関数を選択します。
LexLambdaFunction
を入力して結果を選択することで関数を検索します。
ポップアップボックスが表示されます。
- [OK] を選択します。
- [インテントの保存] を選択します。
- 残りの 2 つのインテント (
GetInvoiceDetails
とGetInvoiceNotes
) のためにこれらのステップを繰り返します。 - [構築] を選択します。
- 構築が完了したら、[公開] を選択します。
- [エイリアスの作成] に
Latest
と入力します。異なる名前を検討することもできます。test、dev、beta、または prod などの名前は、主に Chatbot の環境を示します。 - [公開] を選択します。
Chatbot が公開されたら、以下のページが開きます。
- [閉じる] を選択します。
Chatbot の使用
これで、Chatbot の使用準備が整いました。AWS CloudFormation の [出力] タブからコピーした URL LexUIWebAppUrl
に移動します。以下のスクリーンショットはユーザーの Chatbot との会話です (左から右へ読んでください)。
まとめ
この記事では、画像または PDF ドキュメントのテキストから Amazon Comprehend および Amazon Textract を使って得たインサイトでのやり取りを可能にする対話型 Chatbot を Amazon Lex で作成する方法をご紹介しました。この記事のコードは、使用および拡張のために GitHub リポジトリから入手できます。皆さんがユースケースにこのソリューションをどのように適用したいかについてぜひお聞かせください。ご意見とご質問は、コメント欄からお寄せください。
著者について
Mona Mona は、バージニア州アーリントンを拠点とする AI/ML スペシャリストソリューションアーキテクトです。Mona は、World Wide Public Sector チームと連携してお客様が大規模な機械学習の導入を行うお手伝いをしており、AI/ML における NLP と ML の説明可能性分野に情熱を傾けています。
Prem Ranga はテキサス州ヒューストンを拠点とするエンタープライズソリューションアーキテクトです。Prem は Machine Learning Technical Field Community の一員であり、ML および AI ジャーニーでお客様と連携することが好きです。ロボット工学に情熱を傾ける Prem は自律走行車研究者であり、ヒューストンおよびその他の地域で Alexa 制御のビール注ぎ機も製作しています。
Saida Chanda はワシントン州シアトルを拠点とするシニアパートナーソリューションアーキテクトです。Saida は、シンプルなソリューションによってお客様の複雑なビジネス要件を満たすために AWS パートナーを通じてイノベーションを促進するテクノロジー愛好家で、ML と DevOps に関心を持っています。仕事以外では、家族との時間を過ごすこと、そして瞑想を通じて内なる自分を探求することが好きです。