ウェブサイト検索

12日間の(9日目) - GenAIエージェントによるレシート解析の自動化


🎄 9日目: DigitalOceanのGenAIを使用した重要な領収書詳細の抽出 🎁

DigitalOceanの12日間の9日目へようこそ!ここ数日間、私たちはメールベースの領収書処理サービスを構築していました。目標はシンプルです:ユーザーが領収書や請求書を専用のメールアドレスに転送し、日付、金額、通貨、ベンダーなどの主要な詳細を抽出し、それらをデータベースまたはスプレッドシートに保存して、後で簡単に確認できるようにすることです。

便利そうですね?さて、これを手動で行うことを考えてみてください—メールを掘り起こし、詳細を一つずつコピーして、スプレッドシートに貼り付ける。これは繰り返し作業で、ミスが起こりやすく、正直言って、あなたの時間の無駄です。そこにAIの出番があります。

あらゆる領収書のフォーマット用にパーサーを書くのではなく、DigitalOceanのGenAIプラットフォームを使ってこれを動的に処理します。このチュートリアルの終わりまでには、雑然とした領収書のメールを受け取り、AIで処理し、クリーンで構造化されたJSONに変換するFlaskアプリを作成します。

🤔 なぜこれにGenAIエージェントを使うのですか?

メールは標準化されていません。各ベンダーはレシートを異なる形式で作成し、そのすべてのバリエーションに対してカスタムパーサーを書くことは現実的ではありません。AIはこの種の問題に最適です。AIは非構造化テキストのパターン認識と関連情報の抽出が得意です。

DigitalOceanのGenAIプラットフォームを使用すると、Meta、Mistral、Anthropicの事前トレーニング済みモデルにアクセスできます。これらのモデルは強力で柔軟性があり、必要に応じて特定のタスクに合わせて微調整することもできます。このチュートリアルでは、簡単にするために事前トレーニング済みモデルを使用します。

✨ あなたが学ぶこと

  • DigitalOceanでGenAIエージェントを作成し、構成する方法。
  • エージェントが正しい詳細を抽出していることを確認する方法。
  • 既に展開されたFlaskアプリにエージェントを統合する方法。
  • メールからJSON出力までの全体のパイプラインをテストする方法。

🛠 必要なもの

このチュートリアルを最大限に活用するために、以下のことを前提としています。

  1. DigitalOceanに既に展開されたFlaskアプリ:まだFlaskアプリを展開していない場合は、Day 7 - メールベースの領収書処理システムの構築と展開の指示に従うことができます。
  2. メールテスト用にPostmarkが設定されました: メールから領収書処理パイプラインをテストするには、PostmarkがあなたのFlaskアプリにメールを転送するように設定されている必要があります。FlaskアプリにPostmarkを接続するためのステップバイステップガイドは、8日目を参照してください。

注意: たとえこれらを設定していなくても、あなたは次のことを学ぶことができます:

  • DigitalOceanでGenAIエージェントを設定します。
  • OpenAIのPython SDKを使用して、エージェントとプログラムで対話し、タスクを完了させます。

👨🍳 ステップバイステップガイド

ステップ1:GenAIエージェントを作成する

このシステムのコアコンポーネントであるGenAIエージェントを作成することから始めましょう。

  • あなたのDigitalOceanアカウントにログインして、GenAIプラットフォームに移動します。

    注意: GenAIプラットフォームは現在、初期利用可能です。アクセス権がない場合は、ここでアクセスをリクエストできます。

  • { }

  • エージェントの作成をクリックし、あなたのエージェントにレシート処理エージェントのような名前を付けてください。

  • エージェントのタスクを説明するために、以下の指示を追加してください:

Extract the following details from emails:
- Date of transaction
- Amount
- Currency
- Vendor name

Ensure the output is in the following JSON format:
{
    "date": "<date>",
    "amount": "<amount>",
    "currency": "<currency>",
    "vendor": "<vendor>"
}

  • モデルを選択: このチュートリアルでは、Llama 3.1 Instruct (8B)を選択してください。これは一般的な指示に従うタスクに最適です。

    プロのヒント: モデルは後で、エージェントが作成された後でも更新できます。また、1つを選択する前にモデルプレイグラウンドでモデルを評価することもできます。サポートされているモデルの完全なリストについては、DigitalOceanのドキュメントを参照してください。

  • { }

  • オプション:知識ベースを追加する 特定の文書やデータセットから学習できるように、エージェントを強化するために知識ベースを追加できます。このチュートリアルでは、簡単のためにこのステップを省略します。

  • エージェントを作成する: スクロールダウンしてエージェントを作成をクリックして設定を完了します。

ステップ2:エージェントをテストする

エージェントをアプリに接続する前に、正常に動作するか確認しましょう。エージェント設定のプレイグラウンドタブに移動してください。ここはエージェントと対話し、その反応を確認できるテストエリアです。

  • この「サンプルメール」テキストをプレイグラウンドに貼り付けてください:
Thank you for your purchase! Your order #12345 has been processed.  Total: $35.99. Date: December 29, 2024. Thank you for shopping at Amazon.com
  • エージェントは次のことを返すべきです。
{
    "date": "Dec 29, 2024",
    "amount": "35.99",
    "currency": "USD",
    "vendor": "Amazon"
}

  • もしそれがうまくいかない場合は、指示を調整して再テストしてください。このステップは、エージェントがあなたの欲しいことを理解しているか確認することに関するものです。

ステップ3: エンドポイントとアクセスキーを取得する

  • エージェントが動作し始めたら、それをアプリに接続する時間です。エージェント設定のエンドポイントタブに移動し、URLをコピーします。そのURLはこのようになります:
https://agent-1234abcd5678efgh1234-abcde.ondigitalocean.app

  • 次に、設定タブに移動して、アクセストークンを作成します。このキーを使用すると、アプリがエージェントと安全に通信できます。キーは安全な場所に保存してください。すぐに必要になります。

ステップ4:DigitalOceanに環境変数を安全に保存する

エージェントエンドポイントとセキュアエージェントキーを手に入れたので、これらを安全に保存し、Flaskアプリにアクセスできるようにする必要があります。

  1. アプリ設定に移動: DigitalOcean ダッシュボードでアプリを選択し、設定をクリックします。

  2. 環境変数を見つける: アプリレベルの環境変数セクションまでスクロールします。

  3. 次の変数を追加します:

    • AGENT_BASE_URL: GenAIエージェントのベースURLを貼り付けます。例えば、https://agent-1234abcd5678efgh1234-abcde.ondigitalocean.app。
    • SECURE_AGENT_KEY: GenAIの設定で生成されたセキュアエージェントキーを貼り付けてください。
  4. 保存して再展開: 変更を保存すると、DigitalOceanが新しい環境変数を使用してアプリを自動的に再展開します。

ステップ5: OpenAI SDKを使用してFlaskアプリを更新する

さて、Flaskアプリを更新して、OpenAI SDKを使用してGenAIエージェントと通信します。以下にそのアプローチを示します:

  1. 必要なライブラリをインストール: 必要なライブラリがあることを確認するために、このコマンドを実行してください:

    pip install openai flask python-dotenv
    
  2. 要件の凍結: 依存関係を追跡するために requirements.txt ファイルを生成します。

    pip freeze > requirements.txt
    
  3. OpenAI SDKの設定: アプリ内で、OpenAI SDKを初期化し、DigitalOcean GenAIエンドポイントを使用するように構成します。これにより、以前に作成したエージェントとの通信が処理されます。

    from openai import OpenAI
    import os
    from dotenv import load_dotenv
    
    Load environment variables
    load_dotenv()
    
    Secure agent key and endpoint
    SECURE_AGENT_KEY = os.getenv("SECURE_AGENT_KEY")
    AGENT_BASE_URL = os.getenv("AGENT_BASE_URL")
    AGENT_ENDPOINT = f"{AGENT_BASE_URL}/api/v1/"
    
    Initialize the OpenAI client
    client = OpenAI(
        base_url=AGENT_ENDPOINT,
        api_key=SECURE_AGENT_KEY
    )
    
  4. メールコンテンツを処理する関数を追加する: これから、メールの内容をGenAIエージェントに送信し、プロンプトを使用して処理し、その結果を返す関数を追加します。動作は次のようになります:

    def process_with_ai(email_content):
        """
        Process email content with GenAI.
        """
        prompt = (
            "Extract the following details from the email:\n"
            "- Date of transaction\n"
            "- Amount\n"
            "- Currency\n"
            "- Vendor name\n\n"
            f"Email content:\n{email_content}\n\n"
            "Ensure the output is in JSON format with keys: date, amount, currency, vendor."
        )
    
        response = client.chat.completions.create(
            model="your-model-id",  # Replace with your GenAI model ID
            messages=[{"role": "user", "content": prompt}]
        )
    
        return response.choices[0].message.content
    
  5. Flask エンドポイントの更新: 最後に、この関数を Flask アプリの /inbound ルートに接続して、受信メールを処理します。こちらが更新されたエンドポイントです:

    @app.route('/inbound', methods=['POST'])
    def handle_inbound_email():
        """
        Process inbound emails and return extracted JSON.
        """
        email_content = request.json.get("TextBody", "")
        if not email_content:
            return jsonify({"error": "No email content provided"}), 400
    
        extracted_data = process_with_ai(email_content)
        return jsonify({"extracted_data": extracted_data})
    

GenAI統合を持つ完全なFlaskアプリ

app.py

from flask import Flask, request, jsonify
import os
from dotenv import load_dotenv
from openai import OpenAI
import logging

Load environment variables
load_dotenv()

Initialize Flask app
app = Flask(__name__)

Configure logging
logging.basicConfig(level=logging.INFO)

Secure agent key and endpoint
SECURE_AGENT_KEY = os.getenv("SECURE_AGENT_KEY")
AGENT_BASE_URL = os.getenv("AGENT_BASE_URL")
AGENT_ENDPOINT = f"{AGENT_BASE_URL}/api/v1/"

Initialize the OpenAI client for GenAI
client = OpenAI(
    base_url=AGENT_ENDPOINT,
    api_key=SECURE_AGENT_KEY
)

def process_with_ai(email_content):
    """
    Process email content with GenAI.
    """
    prompt = (
        "Extract the following details from the email:\n"
        "- Date of transaction\n"
        "- Amount\n"
        "- Currency\n"
        "- Vendor name\n\n"
        f"Email content:\n{email_content}\n\n"
        "Ensure the output is in JSON format with keys: date, amount, currency, vendor."
    )

    response = client.chat.completions.create(
        model="your-model-id",  # Replace with your GenAI model ID
        messages=[{"role": "user", "content": prompt}]
    )

    return response.choices[0].message.content

@app.route('/inbound', methods=['POST'])
def handle_inbound_email():
    """
    Process inbound emails and return extracted JSON.
    """
    email_content = request.json.get("TextBody", "")
    if not email_content:
        logging.error("No email content provided.")
        return jsonify({"error": "No email content provided"}), 400

    extracted_data = process_with_ai(email_content)
    logging.info("Extracted Data: %s", extracted_data)  # Log the extracted data

    return jsonify({"extracted_data": extracted_data})

if __name__ == "__main__":
    app.run(port=5000)

ステップ6:DigitalOceanにデプロイする

更新されたFlaskアプリをデプロイするには、7日目の手順に従ってください。以下は簡単なまとめです:

  1. 更新されたコードをGitHubにプッシュする: Flaskアプリに必要な変更を加えたら、更新されたコードをコミットし、GitHubにプッシュします。これにより、DigitalOceanのApp Platformで自動デプロイがトリガーされます。
git add .
git commit -m "Add GenAI integration for receipt processing"
git push origin main

2.モニターデプロイメント: アプリのダッシュボードのデプロイメントセクションで進捗を追跡できます。

3.デプロイの確認: デプロイが完了したら、アプリの公開URLに移動してその機能をテストします。また、ダッシュボードの実行ログを確認して、アプリが正常に起動したかどうかを確認できます。

ステップ7:全体のパイプラインをテストする

  1. サンプルメールを送信する: 8日目に設定したPostmarkアドレスにサンプル受領確認メールを転送してください。

  2. ポストマークのアクティビティを監視する: ポストマークにログインして、メールがアプリに転送されたことを確認してください。8日目のチュートリアルを参照してください。

  3. 実行時ログの確認: DigitalOcean App Platformのダッシュボードで、アプリの実行時ログを確認します。FlaskアプリからのJSON出力が表示されるはずです。

    期待される出力:

    2024-12-31 12:34:56,789 INFO Extracted Data: {
     "date": "Dec 29, 2024",
     "amount": "35.99",
     "currency": "USD",
     "vendor": "Amazon"
    }
    
    

    ![デジタルオーシャンランタイムログがアプリケーション出力を表示しています](https://doimages.nyc3.cdn.digitaloceanspaces.com/006Community/12-Days-of-DO/email-receipt-processor/digitalocean_runtime_logs_screenshot_json_response.png)

🎁 まとめ

今日私たちが達成したことは次のとおりです:

  1. DigitalOceanでレシートメールを処理するためにGenAIエージェントを作成して設定しました。
  2. エージェントをインタラクティブおよびプログラムでテストして、正しい詳細を抽出したことを確認しました。
  3. OpenAI SDKを使用してGenAIエージェントと統合するためにFlaskアプリを更新しました。
  4. 更新されたアプリをDigitalOceanにデプロイしました。
  5. メールを送信するところから、ログに抽出されたJSONを表示するところまで、パイプライン全体をテストしました。

こちらがこのシリーズの前回のチュートリアル、8日目の「PostmarkをFlaskアプリに接続する」です。

次は: 次のチュートリアルでは、抽出したJSONデータをデータベースに保存することでパイプラインを完成させます。これにより、あなたのメールベースの領収書処理サービスが実際の使用に向けて準備が整います。お楽しみに—10日目はすべてをまとめることについてです!🚀

関連記事: