structおよびtableフィールドタイプを使用してドキュメントの形式に合わせたスキーマを定義した後、抽出エージェント (強化) で抽出エンドポイントを呼び出して、下流システム、自動化、Boxメタデータに使用できる状態のデータを返します。
構築する内容
このチュートリアルの最後には、次のような機能を備えた、動作するPythonプロジェクトが完成します。- Boxに対する認証を実行し、Boxフォルダに保存されているサプライヤ契約書を読み取る。
- グループ化されたベンダー詳細データに
structフィールドを使用し、繰り返しの納品スケジュールにtableフィールドを使用する抽出スキーマを定義する。 - 抽出エージェント (強化) を使用してPOST /2.0/ai/extract_structuredエンドポイントを呼び出す。
- レスポンスを、ERP、調達プラットフォーム、プロジェクトトラッカーにプッシュできるように調達レポートにマッピングする。
構造および表を選ぶ理由
POST /2.0/ai/extract_structuredエンドポイントは、string、float、date、enum、multiSelectなどのスカラー型に加え、2つの複雑なフィールドタイプをサポートしています。
| フィールドタイプ | 戻り値 | 用途 |
|---|---|---|
struct | 単一のネストされたJSONオブジェクト | ベンダーの正式名称、住所、連絡先情報など、属性が同じ関連のある値。 |
table | 同じスキーマを持つJSONオブジェクトの配列 | 納期のマイルストーン、明細行、支払いスケジュールなど、繰り返し出現する行。 |
前提条件
始める前に、以下が揃っていることを確認してください。- Box AI APIへのアクセスを提供する無料の。
- クライアント資格情報許可認証で構成されたBoxアプリケーション。
- Python 3.11以上。
- Boxにアップロードされたサプライヤ契約書。をダウンロードして、それをBoxフォルダにアップロードできます。そのファイルIDはURLで決まることに注意してください。たとえば、URLが
https://app.box.com/file/123456789の場合、ファイルIDは123456789となります。 - アプリで以下のスコープが有効になっていること。
- Boxに格納されているすべてのファイルとフォルダの読み取りと書き込み
- AIを管理する
手順
このチュートリアルでは、Box Platformの機能とBox AIエージェントをそれぞれ1つずつ使用します。| コンポーネント | 目的 | API |
|---|---|---|
| Box AI Extract | グループ化された構造化データや繰り返し構造を持つ構造化データを契約書から取得する | POST /2.0/ai/extract_structured |
| 抽出エージェント (強化) | ネストされたフィールドや繰り返し出現するフィールドの精度を向上させる | ai_agent.id = enhanced_extract_agent |
ai_agentパラメータのID (enhanced_extract_agent) で参照されます。詳細については、 に関するリファレンスを参照してください。
開発環境のセットアップ
- ターミナルを開き、新しいプロジェクトディレクトリを作成します。
- Pythonの仮想環境を作成してアクティブ化します。
(.venv)と表示されます。これにより、仮想環境内で作業していることがわかります。新しいターミナルウィンドウやタブを開くたびに、プロジェクトディレクトリから
source .venv/bin/activateを実行して、仮想環境を再アクティブ化します。コマンドの実行中にModuleNotFoundErrorが表示される場合、通常、venvがアクティブ化されていないことを意味します。- 必要なパッケージをインストールします。
- 資格情報を保存するための
.envファイルを作成し、以下の内容を追加します。プレースホルダの値を、Box開発者コンソールで確認した実際の資格情報で置き換えます。
Boxクライアントの認証
box_client.pyという名前のファイルを作成して次のコードを追加します。これにより、SDKを通じてBox AIを呼び出す際に使用する、認証済みのクライアントが作成されます。抽出スキーマの定義
schema.pyという名前のファイルを作成して以下のコードを追加します。このスキーマでは、2つの複雑なフィールドを使用して契約書を記述しています。vendorは、関連するベンダーの詳細を1つのネストされたオブジェクトにグループ化するstructフィールドです。delivery_scheduleは、マイルストーンごとに1行を返すtableフィールドです。
fields配列を必要とします。サブフィールドではスカラー型のみがサポートされます。ネストされたstructまたはtable型は使用できません。抽出関数の構築
extract.pyという名前のファイルを作成して以下のコードを追加します。これは、SDKのcreate_ai_extract_structuredメソッドを使用してスキーマをBox AIに送信し、抽出エージェント (強化) を指定します。これにより、ネストされたフィールドや繰り返し出現するフィールドの精度が向上します。抽出エージェント (強化) は厳密には必須ではありませんが、特にネストされたフィールドや繰り返し出現するフィールドが含まれている場合、より詳細なスキーマや複雑なドキュメントレイアウトにおいて結果の精度が向上します。
構造化された出力のマッピング
app.pyという名前のファイルを作成して以下のコードを追加します。Box AIは、vendorフィールドをネストされたオブジェクトとして返し、delivery_scheduleフィールドを行のリストとして返します。このスクリプトは、抽出を実行し、その結果を下流システムで使用できるフラットなレコードにマッピングします。トラブルシューティング
ModuleNotFoundError: 「...」という名前のモジュールが見つからない
ModuleNotFoundError: 「...」という名前のモジュールが見つからない
仮想環境がアクティブ化されていません。
python3コマンドを実行する前に、プロジェクトディレクトリからsource .venv/bin/activateを実行してください。新しく開いたターミナルタブは、すべて個別にアクティブ化する必要があります。invalid_client: クライアント資格情報が無効である
invalid_client: クライアント資格情報が無効である
以下のように、
.envファイルを確認します。BOX_CLIENT_IDおよびBOX_CLIENT_SECRETが、開発者コンソール > [構成] の値と一致していることを確認します。BOX_ENTERPRISE_IDが自分のEnterprise IDであることを確認します。- アプリが開発者コンソールで承認されていて、クライアント資格情報許可を使用していることを確認します。
404 Not Found
404 Not Found
サービスアカウントに、そのファイルへのアクセス権限がありません。開発者コンソール > [一般設定] に記載されているサービスアカウントのメールアドレスを、契約書が保管されているフォルダのコラボレータとして招待します。
サブフィールドの値が空またはマージ済みで返される
サブフィールドの値が空またはマージ済みで返される
ネストされた
structおよびtableタイプは、サブフィールドとしてサポートされていません。また、structまたはtableフィールドにはfields配列を含める必要があります。サブフィールドにはスカラー型のみが使用されていることを確認し、抽出対象を明確にするために複雑なフィールドにpromptを追加してください。本番環境へのスケーリング
結果のBoxメタデータへの書き戻し
結果のBoxメタデータへの書き戻し
契約書をBox内で検索可能およびルーティング可能にするには、フラット化されたトップレベルの値をメタデータインスタンスとしてファイルに書き戻したうえで、を使用して、ベンダー、国、または発効日でフィルタをかけます。エンドツーエンドのメタデータ書き戻しパターンについては、を参照してください。
自動的な抽出の開始
自動的な抽出の開始
スクリプトを手動で実行せず、契約書のフォルダにWebhookを登録して、アップロードが行われるたびに抽出が開始されるようにします。受信したリクエストを実稼働環境で検証する方法については、を参照してください。
レイアウトが複雑な場合の精度の調整
レイアウトが複雑な場合の精度の調整
フィールドレベルの
promptを抽出のガイドとして追加し、表が密集している複数ページの契約書に対して抽出エージェント (強化) を引き続き使用します。複数のドキュメント間でスキーマの一貫性を維持には、フィールドをインラインではなくで定義してください。次の手順
請求書の取り込み自動化
フォルダに新しい請求書がないか監視し、フィールドを抽出して検索可能なメタデータとして書き戻します。
APIリファレンスの抽出
抽出 (構造化) のための詳細なAPI仕様を確認します。
