Amazon BedrockのBedrock Data Automation (BDA)について調べたので、学習メモとして整理します。
1. Bedrock Data Automation (BDA) とは
Bedrock Data Automation (BDA) は、ドキュメント、画像、動画、音声などの非構造化データから、後の処理で必要になるような情報の抽出/構造化を自動化するサービス。
一言でいうと、「生成AIを使ったデータの構造化機能」です。
OCRや文字起こしを行い、欲しいデータを抽出するといった自前の実装では手間のかかる部分を、BDAなら簡単に作れるので、Agentなどに読み込ませる時にも使えそうです。
2. 標準/カスタム出力、プロジェクト
BDAでは入力したデータに対して、標準出力とカスタム出力を選ぶことができます。
| 標準出力 | カスタム出力 | |
|---|---|---|
| 何を返すか | データ型ごとに決まったデフォルトの項目 | 自分で定義した項目 |
| 準備するもの | 特になし | ブループリント(出力の設計図みたいなもの) |
| イメージ | 「とりあえず全部読んで」 | 「請求書番号と合計金額だけ、この型で出して」 |
そして、上記のような出力ルールをまとめて、「このデータが入力されたら、こう処理する」というルールをカスタマイズしたものが プロジェクトになります。
プロジェクトにはLIVEまたはDEVELOPMENTのステージを指定でき、開発環境(DEVELOPMENT)で試してから本番(LIVE)で処理させることもできます。
どちらのステージもプロジェクトの一意かつ変更可能なバージョンですが、DEVELOPMENTはコンソールからアクセスできないため、APIを介した処理が必要です。(検証用の設定を本番に影響させず持てるが、API操作前提ということに注意)
3. ブループリント (カスタム出力の「設計図」)
3-1. ブループリントとは何か
ブループリントは、「このデータから、どの項目を、どんな形式で取り出すか」を定義した設計図です。
公式ドキュメントの定義では、ブループリントは次の3つで構成されます。
- 抽出したい項目(フィールド)名のリスト
- 各フィールドのデータ形式 (文字列、数値、ブール値など)
- 各フィールドの自然言語の説明 (正規化ルールや検証ルールもここ)
ブループリントは処理するデータの種類ごとに1つ作ります。(請求書用や顧客データ用など)
作成したブループリントはそれぞれ独自のIDとARNを持つAWSリソースになるので、アカウント内で保存・共有・バージョン管理ができます。
ブループリント内の各フィールドは以下のようなもので構成されます。
| パラメータ | 内容 |
|---|---|
| 説明 (プロンプト) | そのフィールドが何を表すかの自然言語の説明。最大300文字 |
| タイプ | 文字列/数値/ブール値/配列 (文字列・数値の配列) |
| 推論タイプ | 明示的 (explicit)か推論 (inferred)か |
「明示的」とはドキュメントに書いてある情報をそのまま取る場合、「推論」は実際の内容から変換が必要な場合に使います。公式の例だと、111-22-3333という番号の情報からハイフンを除いて111223333にするようなケースが推論にあたります。
APIのJSONスキーマ上では、次のような形になります。
"product_type": {
"type": "string",
"inferenceType": "inferred",
"description": "What is the primary product or service being advertised, e.g., Clothing, Electronics, Food & Beverage, etc.?"
}
descriptionがそのまま生成AIへの指示になるので、抽出精度に直結することに注意!
抽出結果には、値そのものに加えて以下の情報も付いてきます。(入力するデータによってはない場合もあり)
- 信頼スコア (抽出結果に対するBDAの確信度)
- 抽出タイプ (明示的か推論か)
- ページ番号 (結果が見つかったページ)
「信頼スコアが低いものだけ人間がレビューする」といった運用も組めそうです。
単純なフィールド以外に、以下の構造も使えます。
- テーブルフィールド (表を、列名・列の説明・列タイプで定義)
- グループ (複数のフィールドを1つにまとめる)
- カスタムタイプ (Addressのような型を定義して、zip_code/city_name/street_nameなどをまとめて持たせる。グループと違って使い回し可)
BDAにあるサンプルブループリントの1つ「Water-And-Sewer-Bill」に関して、抽出を行った結果の一部が以下の通り。
1つのJPGファイルから様々な情報が抽出出来ていることが確認できます。
3-2. ブループリントの作り方
作り方は大きく分けて、「既製品を使う」「プロンプトで作る」「自分で作る」の3つがあります。
既製品を使う
処理したいデータの種類(請求書など)が既に決まっている場合、用意されているサンプルブループリントを複製して出発点にします。カタログにない場合は自分でブループリントを作ります。
プロンプトで作る
「請求書番号、合計金額、ベンダー名を請求書から抽出する。」のように自然言語で書くと、そこからブループリントを生成してくれます。(プロンプトが空白でも自動的に案が生成されます。)
自分で作る
プロンプトだとAI任せになるので、細かく制御したい場合は、1つずつ定義します。
コンソールで作成するか、ブループリントのJSONを直接編集するJSONエディタを使います。ドキュメントの分割やレイアウト処理といった追加設定も可能。以下はコンソールでの作成画面。
作成後は、コンソールのプレビュー機能でサンプルデータを使ってテストも可能です。
3-3. プロジェクトへの登録
プロジェクトに対して、ドキュメントのブループリントは40個まで登録可能。
ドキュメント以外のブループリントは、プロジェクトに対して1個のみ。
ドキュメントだけ40個まで持てるのは、書類の種類ごとにブループリントを分けて、後述のマッチングで自動的に振り分ける使い方を推奨しているから。
一方、画像・音声・動画はそれぞれ1つだけなので、「このプロジェクトで画像をどう解釈するか」を1つに決める形となります。
なお、紙をスキャンしたデータとして、PDFとTIFFは自動的にドキュメントとして扱われます。PNGとJPEGは内部の分類器が「画像かドキュメントか」を判定して振り分けますが、コストや精度のことを考えると、後述するモダリティの制御を行うのが良さそうです。
3-4. ブループリントのマッチングと、ドキュメントの分割
BDAは入力したデータに対して、どのブループリントを使うべきかを自動で判定します。
マッチングの判定材料は以下3つ。
- ブループリント名
- ブループリントの説明
- ブループリントのフィールド
BDAが各ドキュメントを最適なブループリントとマッチングさせるため、精度を高めるには上記3つの内容が重要になります。
公式でも「明確かつ詳細に記述すること」「最大限の正解率が必要ならベンダーやドキュメントのソースごとに専用のブループリントを作ること」が推奨されています。
さらに、1つのPDFに複数の書類が入っている場合は分割が使えます。
BDAの分割はセマンティック境界(意味的な切れ目)で行われ、分割後のドキュメントが最も近いブループリントとマッチングされます。
デフォルトではオフの機能なので、利用時の有効化が必要。↓はAPIでの有効化例。
response = client.create_data_automation_project(
projectName=project_name,
projectStage='LIVE',
standardOutputConfiguration=output_config,
customOutputConfiguration={
'blueprints': [
{'blueprintArn': Blueprint ARN, 'blueprintStage': 'LIVE'},
# ...
]
},
overrideConfiguration={'document': {'splitter': {'state': 'ENABLED'}}}
)
ただし、分割は「投入するPDFが3,000ページまで」、「分割された1件1件の結果は20ページまで」という制限がある点には注意。(長いドキュメントを投げるより、短い書類が大量にまとまったファイルを捌く用途を想定?)
3-5. フォールバックブループリント
想定外の書類が入力され、どのブループリントにもマッチしない時のため、フォールバックの機能もあります。
| 設定 | マッチしなかった時の挙動 |
|---|---|
| フォールバックなし |
customOutputStatus: NO_MATCHが返り、そのドキュメントのカスタム出力は生成されない |
| フォールバックあり | フォールバックブループリントで抽出を行い、customOutputStatus: FALLBACKが返る |
制約として、フォールバックはプロジェクトごとに最大1つ、かつドキュメントモダリティでのみサポートされています。
また、フォールバックは信頼スコアの挙動にも影響する点に注意。
3-6. ブループリントでできること
ドキュメントの処理では、以下の4タスクが実現できます。
① 分類
ドキュメントクラスと説明を割り当てることで、ドキュメントを分類。
説明には、含まれるデータの一般的なタイプや、ドキュメントの目的・想定されるエンティティを書くことが推奨されています。
② 抽出
employee_idやproduct_nameのように、抽出したいフィールドを定義して抽出。前述の通り、明示的抽出と推論抽出を選べます。
③ 正規化
抽出したデータを、要件に沿って変換・標準化。
(06/25/2022という日付をYYYY-MM-DD形式にするなど)
④ 検証
フィールドの説明に検証ルールを書くと、抽出結果が基準を満たすかチェック可能。(抽出したIDが指定の桁数を持つかなど)
ドキュメント以外のモダリティでは、明示的な抽出はなく推論のみになります。以下のような推論タスクが可能です。
- 広告画像から製品名や価格を取る
- 写真から人数を数える
- 顧客とカスタマーサービス担当者の会話(音声)から、顧客名・問い合わせ内容・解決ステータスを取る
ビデオの場合は粒度をオプションで指定でき、動画全体で推論するか、チャプターごとに推論するかを選べます。
3-7. ブループリント命令の最適化
作ったブループリントの精度が微妙だった場合、正解データを使って最適化する機能もあります。
本番ワークロードから代表的なサンプルを最大10個用意し、各フィールドの正解を与えれば、BDAが期待値と推論結果の差分を分析し、プロンプト部分の改善を行います。(モデルのトレーニングやファインチューニングは不要)
コンソールから最適化を行う場合は、最適化したいブループリントを選んで、「ブループリントを最適化」を選べば実行できます。
4. その他
4-1. モダリティの制御
モダリティ(文書や画像といったデータの種類)を制御することで、データを処理するかであったり、どう処理するかであったりを制御できます。
プロジェクトによって動画を処理する可能性がないなら無効化にしたり、入力する画像が文書をスキャンしたものだけなら、文書として処理することを設定することで不要な推論を回避できるので、精度やコストに影響するようです。プロジェクトの「詳細設定」から設定できます。
4-2. リージョンとデータの取り扱い
BDAではクロスリージョン推論が必須になり、特定リージョンに限定することができません。
公式ページを参考に利用される可能性のある推論リージョンをポリシーで設定する必要があります。
クロスリージョンにおけるデータの扱いについて、公式には以下の記載があります。
米国内で行われたリクエストは、米国内リージョン内に保持されます。データは送信元リージョンにのみ保存されますが、クロスリージョン推論を使用する場合、リクエストと出力結果がプライマリリージョン外に移動される可能性があります。すべてのデータは、Amazonの安全なネットワークを介した送信中に暗号化されます。
データは元のリージョンを出ないとしていますが、これを許容できるかは要確認です。
4-3. ドキュメント出力の詳細度
ドキュメントの場合、レスポンスの詳細度として ページ・要素・単語 のレベルでの設定が可能です。
| 詳細度 | 返ってくるもの | 主な用途 |
|---|---|---|
| ページ | ページごとのテキスト | ページ番号付きで全文を扱いたい時 |
| 要素 | タイトル・段落・表・図など | RAGのチャンク分割、表・図だけの抽出 |
| 単語 | 単語ごとのテキストと位置 | 特定の語句の位置をハイライトしたい時 |
抽出された結果はJSONとしてだけでなく、トリミングした画像をS3に保存することもでき、他にも境界ボックス(要素や単語がページのどの位置にあるかの座標)や、生成フィールド(文書全体の要約や図ごとの説明)などを生成させることも可能です。
出力としては、JSONだけでなく、トリミングした画像をS3に保存することもできます。
4-4. 画像・動画・音声タイプでできること
画像、動画、音声タイプの場合、以下のような処理が可能です。
- 概要 (要約)
- 分類
- テキスト抽出 (文字起こし)
- ロゴ検出
- コンテンツモデレーション
文字起こし以外にも色々できるので、設定次第で様々な用途に使える?(具体的には思いつきませんが•••)
4-5. 機密データの保護
BDAは、出力結果に含まれる個人情報を検出し、マスクする機能もあります。
検出にはBedrockのGuardrailsの機密情報フィルターが使われているようです。
この機能はデフォルトでは無効のため、プロジェクトの overrideConfiguration の中で、モダリティごとに sensitiveDataConfiguration を設定して有効にする必要があります。(コンソールでは設定できなさそう)
4-6. カスタム語彙による精度向上
音声や動画を扱う場合は、データオートメーションライブラリ(Data Automation Library)にカスタム語彙を登録することで、専門用語の精度を上げられます。
カスタム語彙が効くのは、音声・動画だけ。PDF などのドキュメントの OCR 精度には影響しません。
大まかな手順は以下の通り。
① マニフェストファイル(IDや言語、登録する単語などを記載したJSON)を作成
② ①のファイルをS3にアップロード
③ コンソールのライブラリから、②のファイルの取り込みを実行
④ ライブラリをプロジェクトに関連付け
マニフェストファイルを作らずに手動で語彙を追加することも可能ですが、手間を考えると上記の手順を取る方が良さそうです。
なお、言語として日本語には対応していますが、東京リージョンは非対応です。社内用語や製品名が多い業務で使いたい場合は、リージョンの制約を先に確認しておいた方が良さそうです。
まとめ
Amazon Bedrock Data Automationについて、調べた内容を整理しました。
- BDAは、ドキュメント・画像・動画・音声といった非構造データを、生成AIで構造化できる機能
- 出力は、決まった項目を返す「標準出力」と、自分で定義した項目を返す「カスタム出力」の2種類で、これらの処理ルールをまとめたものがプロジェクト
- カスタム出力の設計図となるのがブループリント。フィールドの説明が生成AIへの指示になるため、精度を左右する。分類・抽出・正規化・検証まで定義でき、精度が足りなければ正解データを使った最適化も可能
- ブループリントが複数ある場合は名前・説明・フィールドをもとに自動で振り分けられる。複数の書類がまとまったPDFは分割してブループリントとマッチングさせることも可能
- モダリティの制御や出力の詳細度、境界ボックス、個人情報のマスク、カスタム語彙など、細かい調整機能もあり
- クロスリージョン推論が必須のため、東京リージョンで使ってもアジア地域の他リージョンで処理される可能性がある点には注意
リージョンの問題があるため注意は必要ですが、非構造データの前処理サービスとして今後触ってみたいと思います。
便利な機能などがあれば、また記事として紹介できればと思います。





