ストーリー
ミッション概要
| 項目 | 内容 |
|---|---|
| 目標 | Document AIパイプラインの設計書を作成する |
| 所要時間 | 90分 |
| ミッション数 | 3つ |
| 使用知識 | Document AI / 請求書処理 / 表抽出 / IDP |
| 評価観点 | パイプライン設計、バリデーション、運用設計、拡張性 |
ミッション1: 経理部の請求書自動処理システム(35分)
シナリオ
【経理部 鈴木マネージャーからの最終要件】
Step 1で議論した請求書処理について、詳細な設計を進めてほしい。
追加で以下の要件が出ている:
1. 請求書の受付チャネル
- メール添付(60%): 受信メールから自動取得
- 郵送スキャン(30%): 複合機スキャンからフォルダ監視
- Webアップロード(10%): 取引先ポータル経由
2. 処理後の連携先
- 会計システム(freee)にAPI経由で仕訳データを登録
- 承認ワークフロー(10万円以上は部長承認、100万円以上は役員承認)
- 支払日カレンダーに登録
3. 定型取引先のテンプレート管理
- 上位30社のテンプレートは事前登録
- 新規テンプレートの自動学習機能
4. 月次レポート
- 処理件数、自動処理率、エラー率
- 取引先別の精度統計
- コスト削減効果の可視化
タスク
以下を設計してください。
1. 全体アーキテクチャ図
- 受付チャネル → 処理パイプライン → 連携先
- 使用するAWSサービスまたは技術スタック
2. 処理パイプライン詳細
- 各ステージの処理内容とAPI呼び出し
- 定型/準定型/非定型の分岐ロジック
- バリデーションルールの一覧
3. 承認ワークフロー
- 金額に基づく承認フロー
- 自動承認の条件
4. テンプレート管理
- テンプレートの構造
- 自動学習の仕組み
5. コスト試算とKPI
解答例を見る
1. 全体アーキテクチャ
[メール] → SES → S3 → EventBridge
[スキャン] → フォルダ監視 → S3 → EventBridge → Lambda(分類)
[ポータル] → API Gateway → S3 → EventBridge ↓
Lambda(抽出)
↓
Lambda(検証)
↓
[承認判定]
├→ 自動承認 → freee API
└→ 要承認 → Slack通知 → 承認後 → freee API
技術スタック:
- 受付: SES, S3, EventBridge
- 処理: Lambda, Claude Vision API
- テンプレートDB: DynamoDB
- 承認: Step Functions
- 連携: freee API
- モニタリング: CloudWatch + Grafana
2. 処理パイプライン
Stage 1 - 前処理:
PDF → 画像変換 → 傾き補正 → 解像度調整
Stage 2 - 分類:
画像 → Claude Vision → 文書種別判定
→ 請求書以外ならリジェクト
Stage 3 - 取引先識別:
→ DynamoDBのテンプレートDBと照合
→ マッチ: 定型処理、不マッチ: VLM処理
Stage 4 - 抽出:
定型: テンプレート領域OCR → フィールド抽出
準定型/非定型: Claude Vision → JSON抽出
Stage 5 - バリデーション:
- 明細合計 = 小計
- 小計 + 税 = 合計
- 税率: 8% or 10%
- 日付: 過去1年以内
- 取引先: マスタDB存在チェック
- 重複チェック: 請求書番号 + 取引先で重複検知
3. 承認ワークフロー
金額別:
10万円未満 → 自動承認(信頼度95%以上かつバリデーション合格)
10万〜100万円 → 部長承認(Slack通知 + ワンクリック承認)
100万円以上 → 部長承認 → 役員承認
4. テンプレート管理
テンプレート構造:
{
vendor_id: "V001",
vendor_name: "株式会社ABC",
template_version: 3,
field_regions: {...}, // 座標ベース
sample_images: ["s3://..."],
accuracy_stats: {total: 500, correct: 490, rate: 0.98}
}
自動学習:
- VLMで処理した準定型請求書の結果を人間が確認・修正
- 同一取引先から10件以上の確認済みデータが溜まったら
テンプレートを自動生成(フィールド位置の統計的推定)
5. コスト試算
月間3,000件:
- Claude Vision API: 3,000 × $0.02 = $60
- Lambda: 微少
- S3/DynamoDB: $10
- freee API: 既存契約内
合計: 約$70/月 ≒ 10,500円/月
削減効果: 400時間 × 3,000円 = 120万円/月
ROI: 120万 - 1万 = 119万円/月
ミッション2: 人事部の採用書類処理システム(30分)
シナリオ
【人事部 木村マネージャーからの依頼】
採用活動で大量の書類を処理する必要がある。
書類の種類:
1. 履歴書(PDF/画像): 月200件
2. 職務経歴書(PDF): 月200件
3. 資格証明書(画像): 月100件
現在の課題:
- 1応募者あたり3〜4種類の書類を目視確認
- 書類情報の手入力に1件あたり15分
- スクリーニング基準の適用が属人的
- 書類の保管・検索が紙ベース
希望:
- 書類の自動データ化
- スクリーニング条件に基づく自動フィルタリング
- 応募者プロフィールの自動構築
- 個人情報の適切な取り扱い(匿名化レビュー対応)
タスク
1. 書類処理パイプラインの設計
2. 各書類タイプの抽出フィールド定義
3. スクリーニングロジックの設計
4. 個人情報保護の対策
5. 匿名化レビュー機能の設計
解答例を見る
1. 書類処理パイプライン
応募フォーム / メール受信
│
▼
[S3アップロード] → [文書分類(履歴書/職歴書/資格証明)]
│
├── 履歴書 → [VLM: 基本情報抽出]
│ → 氏名、生年月日、学歴、職歴サマリー、写真有無
│
├── 職務経歴書 → [VLM: 詳細経歴抽出]
│ → 各社の期間、役職、プロジェクト詳細、スキル
│
└── 資格証明書 → [OCR + VLM: 資格情報抽出]
→ 資格名、取得日、発行機関、有効期限
│
▼
[応募者プロフィール統合] → DB登録
│
▼
[自動スクリーニング] → 合格/不合格/要確認
│
▼
[匿名化レビュー画面] → 採用担当者
2. 抽出フィールド
履歴書: {name, date_of_birth, address, education[{school, degree, year}],
work_history[{company, period, position}], certifications, photo_exists}
職務経歴書: {summary, experiences[{company, period, role, projects[{name, description,
technologies, achievements}]}], skills[{name, level}]}
資格証明書: {certification_name, issue_date, issuer, expiration_date, id_number}
3. スクリーニングロジック
条件ベースのスコアリング:
| 条件 | 配点 |
|------|------|
| 必須資格保有 | 30点 |
| 関連業務経験3年以上 | 25点 |
| 求めるスキル保有数 | 最大20点 |
| 学歴要件合致 | 15点 |
| 転職回数(少ないほど高得点) | 10点 |
合計60点以上: 合格、40-59: 要確認、39以下: 不合格
4. 個人情報保護
- 処理時: 暗号化通信(TLS)、一時ファイルの即時削除
- 保管時: AES-256暗号化、アクセスログ記録
- API利用: 機密設定の場合はオンプレLLMに切り替え
- データ保持: 不採用者データは6ヶ月で自動削除
- アクセス制御: 人事部+面接担当のみ、最小権限
5. 匿名化レビュー
第一次スクリーニングでは以下を匿名化:
- 氏名 → 「応募者A001」
- 年齢/生年月日 → 非表示
- 性別 → 非表示
- 写真 → 非表示
- 住所 → 都道府県のみ
- 大学名 → 「四年制大学」等に一般化(オプション)
表示する情報:
- 職務経験(年数、分野、スキル)
- 資格
- スクリーニングスコア
ミッション3: 全社IDPプラットフォーム設計(25分)
シナリオ
【CTO 佐藤からの依頼】
ミッション1(経理)とミッション2(人事)の成果を踏まえ、
全社で使えるIDPプラットフォームを設計してほしい。
対象部門と文書タイプ:
- 経理: 請求書、領収書、経費精算書
- 人事: 履歴書、職務経歴書、資格証明書、勤怠表
- 法務: 契約書、NDA、覚書
- 営業: 見積書、注文書、納品書
- 総務: 社内申請書、届出書
設計要件:
- 新しい文書タイプの追加が容易(プラグイン方式)
- マルチテナント対応(将来のSaaS化を視野)
- 処理量: 月間10,000〜50,000件
タスク
1. プラットフォームアーキテクチャ
- プラグインシステムの設計
- マルチテナント対応の方針
2. 共通コンポーネントの設計
- 文書取り込み / 分類 / 抽出 / 検証 / 登録
- 各コンポーネントの共通インターフェース
3. スケーラビリティ設計
- 月間50,000件を処理するインフラ設計
解答例を見る
1. プラットフォームアーキテクチャ
[文書取り込み層]
メール / API / スキャン / Webアップロード
│
▼
[共通処理層]
前処理 → 分類 → ルーティング
│
▼
[プラグイン層(文書タイプ別)]
├── InvoicePlugin: 請求書抽出 + 会計連携
├── ContractPlugin: 契約書分析 + リスク評価
├── ResumePlugin: 履歴書抽出 + スクリーニング
└── GenericPlugin: 汎用OCR + 構造化
│
▼
[共通後処理層]
バリデーション → Human-in-the-Loop → 登録 → 通知
│
▼
[データ層]
文書DB / メタデータDB / 検索インデックス / 監査ログ
プラグインインターフェース:
class DocumentPlugin(ABC):
@abstractmethod
def get_document_types(self) -> list[str]
@abstractmethod
def extract(self, image: bytes, doc_type: str) -> dict
@abstractmethod
def validate(self, data: dict) -> ValidationResult
@abstractmethod
def get_output_schema(self) -> dict # JSONスキーマ
@abstractmethod
def register(self, data: dict) -> bool # 業務システム連携
マルチテナント:
- テナントID付きデータ分離
- テナントごとのプラグイン設定・テンプレートDB
- APIキーベースの認証
- テナント別の利用量制限・課金
2. 共通コンポーネント
取り込み: S3トリガー → SQSキュー → 処理ワーカー
分類: 共通VLMベース分類器(テナント別カスタムタイプ対応)
抽出: プラグインに委譲
検証: 共通バリデーション + プラグイン固有バリデーション
登録: プラグインの register() を呼び出し + 共通監査ログ
3. スケーラビリティ
月50,000件 ≒ 日2,300件 ≒ 時間280件(8時間稼働)
インフラ:
- SQSキュー: バッファリング + 処理平準化
- ECS Fargate: オートスケーリング(1タスクあたり10件/分 → 最大30タスク)
- DynamoDB: オンデマンドキャパシティ
- S3: ライフサイクルポリシーで古いデータをGlacierに移行
コスト(月50,000件):
- VLM API: 50,000 × $0.02 = $1,000
- ECS Fargate: $200
- DynamoDB + S3: $100
合計: 約$1,300/月 ≒ 195,000円/月
振り返り
評価基準
| 評価項目 | A(優秀) | B(合格) | C(要改善) |
|---|---|---|---|
| パイプライン設計 | 全ステージ網羅 + エラーハンドリング | 基本的な処理フロー | ステージの欠落あり |
| バリデーション | 複数ルール + クロスチェック | 基本的な検証 | バリデーション不十分 |
| 運用・拡張性 | プラグイン方式 + スケーラビリティ | 基本的な運用設計 | 拡張性の考慮なし |
| セキュリティ | 暗号化 + アクセス制御 + 匿名化 | 基本的なセキュリティ | セキュリティ未考慮 |
推定所要時間: 90分