ウェブサイト検索

12 日間 (9 日目) - の GenAI エージェントを使用した領収書の解析の自動化


🎄 9日目: DigitalOceanのGenAIを使用して主要な領収書の詳細を抽出する 🎁

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

便利そうですよね?ここで、これを手動で行うことを考えてみましょう。電子メールを調べ、詳細を 1 つずつコピーし、スプレッドシートに貼り付けます。これは繰り返しの作業であり、間違いが発生しやすく、正直に言うと時間の無駄です。そこでAIが登場します。

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

🤔 これに GenAI エージェントを使用する理由?

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

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

✨ 学べること

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

🛠 必要なもの

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

  1. DigitalOcean にすでにデプロイされている Flask アプリ: Flask アプリをまだデプロイしていない場合は、「7 日目 - 電子メールベースの受信プロセッサの構築とデプロイ」の手順に従うことができます。
  2. 電子メールのテスト用に構成された消印: 電子メールから受信までの処理パイプラインをテストするには、メールを Flask アプリに転送するように消印を設定する必要があります。ステップバイステップのガイドについては、「8 日目 - 消印を Flask アプリに接続する」を参照してください。

注: これらを設定していない場合でも、次の方法を学習します。

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

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

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

まず、このシステムのコアコンポーネントである GenAI エージェントを作成しましょう。

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

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

  • { }

  • [エージェントの作成] をクリックし、エージェントに receipt-processor-agent のような名前を付けます。

  • エージェントのタスクを説明する次の指示を追加します。

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) を選択します。指示に従う一般的なタスクに最適です。

    専門的なヒント: エージェントの作成後でも、モデルは後で更新できます。モデルを選択する前に、モデル プレイグラウンドでモデルを評価することもできます。サポートされているモデルの完全なリストについては、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 をコピーします。次のようになります。
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 アプリを更新する

次に、OpenAI SDK を使用して GenAI エージェントと通信するように Flask アプリを更新します。これにどのようにアプローチするかは次のとおりです。

  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 のアプリ プラットフォームへの自動デプロイメントがトリガーされます。
git add .
git commit -m "Add GenAI integration for receipt processing"
git push origin main

2.デプロイメントの監視: アプリのダッシュボードのデプロイメントセクションで進行状況を追跡できます。

3.展開を確認します。 デプロイが完了したら、アプリのパブリック URL に移動し、その機能をテストします。ダッシュボードのランタイム ログをチェックして、アプリが正常に起動したことを確認することもできます。

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

  1. サンプル メールを送信: 8 日目に設定した消印アドレスにサンプルの領収書メールを転送します。

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

  3. ランタイム ログを確認する: DigitalOcean アプリ プラットフォーム ダッシュボードで、アプリのランタイム ログを表示します。 Flask アプリからの JSON 出力が表示されるはずです。

    期待される出力:

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

    ![アプリケーション出力を示す DigitalOcean ランタイム ログ](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 日目: 消印を Flask アプリに接続するは次のとおりです。

次へ: 次のチュートリアルでは、抽出された JSON データをデータベースに保存してパイプラインを完成させます。これにより、電子メールベースの領収書処理サービスを実際に使用できるようになります。乞うご期待 — 10 日目はすべてを結びつけることです。 🚀