海外の候補者について調査会社から届く英文の経歴確認レポートを読み取り、応募書類と照らして、食い違いと照会できなかった項目を採用担当に返す
調査会社から届く英文の経歴確認レポートを読み取り、学歴・職歴の照会結果を応募書類の記載と1項目ずつ照らします。食い違いと、照会できなかった項目・照会中の項目を一覧にして採用担当へ返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- IT・SaaS/人材/金融
- 対象部門
- 採用
- 対象業務
- 内容確認・チェック/比較検討
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 調査会社から完了の通知メールが届き、担当者が依頼画面からレポートのPDFを取り出して共有フォルダに保存する
- レポートを開き、表紙の全体の判定と、学歴・職歴の項目ごとの判定を読む
- 採用管理システムで候補者の応募書類を開き、学校名・学位・専攻・卒業年、会社名・職位・在籍期間を見比べる
- 調査会社のコメント欄を読み、照会できなかった理由や照会中の経過を拾う
- 食い違いと照会できなかった項目をスプレッドシートにメモする
- 食い違いがあれば、候補者に事情を聞くメールを書く。照会できなかった項目があれば、卒業証書や在職証明書などの代わりの書類を頼む
- 結果を採用の責任者に報告し、照会中の項目は最終版を待つ
- 自動調査会社の完了の通知メールを受け、レポートのPDFを取り出して受付フォルダ(Amazon S3)に保存する
- 自動保存をきっかけに処理が動き、形式・ページ数・パスワードの有無を確かめ、候補者IDと版(途中版/最終版)を決める
- 自動OCRがレポートの全文、表のセル、キーと値、質問への答え、それぞれの信頼度を返す
- 自動学歴・職歴の項目ごとに、候補者の申告、照会で確かめた値、調査会社の判定、照会先、コメントを取り出して原文のまま記録する
- 自動プログラムが調査会社の判定の言い方を社内の区分に読み替え、応募書類の項目と規則で照らす
- 自動プログラムが同じ候補者の前の版と比べ、判定が変わった項目に印を付ける
- 自動食い違いには候補者への確認の文面、照会できなかった項目には代わりの書類の依頼の文面を下書きする
- 人採用担当が、印の付いた項目をレポートの画像と見比べて確かめ、候補者へ連絡する
- 人採用の責任者が、候補者の説明と代わりの書類を見て扱いを決める
各工程の詳しい説明を読む
- 調査会社から完了の通知メールが届き、担当者が依頼画面からレポートのPDFを取り出して共有フォルダに保存する
- レポートを開き、表紙の全体の判定と、学歴・職歴の項目ごとの判定を読む
- 採用管理システムで候補者の応募書類を開き、学校名・学位・専攻・卒業年、会社名・職位・在籍期間を見比べる
- 調査会社のコメント欄を読み、照会できなかった理由や照会中の経過を拾う
- 食い違いと照会できなかった項目をスプレッドシートにメモする
- 食い違いがあれば、候補者に事情を聞くメールを書く。照会できなかった項目があれば、卒業証書や在職証明書などの代わりの書類を頼む
- 結果を採用の責任者に報告し、照会中の項目は最終版を待つ
(a)Verified のまま食い違いを見落とす。 レポートの判定がすべて Verified なら、担当者は応募書類との見比べを省きがちです。応募書類では「Senior Engineer、2019年1月〜2024年6月」、レポートでは申告も照会結果も「Engineer、2019年7月〜2024年6月」。 レポートの中では合っているので Verified です。食い違いは、応募書類と並べて初めて見えます。
(b)照会できなかった項目の追いかけが漏れる。 「Unable to verify」の項目は、代わりの書類を候補者に頼むのが社内の決まりです。ところが依頼が担当者の手元のメモにしか無く、入社日の直前になって書類が届いていないと分かります。
(c)途中版と最終版の取り違え。 途中版のレポートで「照会中」だった項目が、最終版で「食い違いあり」に変わることがあります。途中版を見た時点で報告を済ませていると、最終版の変化に誰も気づきません。
- 【自動】 調査会社の完了の通知メールを受け、レポートのPDFを取り出して受付フォルダ(Amazon S3)に保存する
- 【自動】 保存をきっかけに処理が動き、形式・ページ数・パスワードの有無を確かめ、候補者IDと版(途中版/最終版)を決める
- 【自動】 OCRがレポートの全文、表のセル、キーと値、質問への答え、それぞれの信頼度を返す
- 【自動】 学歴・職歴の項目ごとに、候補者の申告、照会で確かめた値、調査会社の判定、照会先、コメントを取り出して原文のまま記録する
- 【自動】 プログラムが調査会社の判定の言い方を社内の区分に読み替え、応募書類の項目と規則で照らす
- 【自動】 プログラムが同じ候補者の前の版と比べ、判定が変わった項目に印を付ける
- 【自動】 食い違いには候補者への確認の文面、照会できなかった項目には代わりの書類の依頼の文面を下書きする
- 【人】 採用担当が、印の付いた項目をレポートの画像と見比べて確かめ、候補者へ連絡する
- 【人】 採用の責任者が、候補者の説明と代わりの書類を見て扱いを決める
8番目が、この設計の分かれ目です。 採用担当は90通を最初から読み直すのではなく、印の付いた項目だけをレポートの該当ページで確かめます。 印の無いものは、候補者ごとの一覧で流し見ます。
5番目と6番目をAIにさせないのも、意図してのことです。 期間の比較、学校名・会社名の照合、判定の読み替え、版の比較。どれも規則で決まる比較で、AIにはレポートから値を読み取るところまでをさせます。
02今回想定するシステム構成
調査会社の完了の通知メール(レポートのPDF) ▼【トリガー】受付フォルダ(Amazon S3)への保存 AWS Lambda ── 形式・ページ数・パスワードの確認、候補者IDと版の特定 ▼ AWS Textract(StartDocumentAnalysis:TABLES/FORMS/QUERIES) │ 全文、表のセル、キーと値、質問への答え、信頼度 ▼ Claude API ── 項目ごとに申告・照会結果・判定・照会先・コメントを取り出す │ ① 学歴(学校名・学位・専攻・在学期間・卒業日) │ ② 職歴(会社名・職位・在籍期間) ▼ Python ── 判定の読み替え、応募書類との照合、前の版との比較 ▼ 一覧(match / app_mismatch / vendor_discrepancy / unable / pending / needs_human) ▼ 【採用担当が印の付いた項目を確認】 ├──▶ 候補者への確認・代わりの書類の依頼(下書き) └──▶ 採用の責任者が扱いを決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(StartDocumentAnalysis/GetDocumentAnalysis) | Azure AI Document Intelligence、Google Document AI |
| 生成AI | Claude API(レポートの項目の取り出し、確認の文面の下書き) | OpenAI API、Gemini API |
| 差異計算 | Python(判定の読み替え、応募書類との照合、版の比較) | 採用管理システムの書類確認の機能 |
| 連携 | AWS Lambda(保存と完了の通知を起点に処理を動かす) | Amazon EventBridge |
| 保管 | Amazon S3(レポート、読み取り結果、照合の結果) | 社内のファイルサーバー |
採用管理システムと調査会社の依頼画面は、新しく足すものではありません。 最初の準備は、調査会社ごとの判定の言い方を社内の区分に読み替える対応表を作ることです。「Verified」「Verified – Discrepancy」「Unable to Verify」「In Progress」「Information Not Provided」のように、同じ意味でも調査会社によって書き方が違います。読み替えは表で決め、AIには任せません。
OCRに AWS Textract を選ぶのは、レポートが英文で、中身のほとんどが表だからです。 公式の上限の表で、対応言語は英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語とされ、日本語や中国語は読めません。 縦書きにも対応していません。海外の調査会社が出す英文のレポートに絞るので、この制約の内側に収まります。
この題材で効くのは、表(TABLES)です。 表は TABLE と CELL のブロックで返り、セルごとに行と列の番号(RowIndex/ColumnIndex)と信頼度が付きます。列見出しのセルには COLUMN_HEADER の種類が付くので、どの列が「Provided」でどの列が「Verified」かを見出しから決められます。表のタイトルとフッターも別のブロックで返るため、「Education Verification」「Employment Verification」のような表のタイトルで、学歴の表か職歴の表かを分けます。
03どうやって実装するのか
処理の起点を決める
起点は2つあります。レポートが保存されたときと、毎朝9時の定時です。
1つ目は、受付フォルダ(Amazon S3)にレポートのPDFが保存されたことです。調査会社の完了の通知メールを受けたら、メールの添付またはリンクからPDFを取り出し、ファイル名に候補者IDと受け取った日時を付けて保存します。保存の通知で AWS Lambda が動き、読み取りから一覧への記録までを済ませます。調査会社の依頼番号もファイル名に入れておくと、同じ候補者の途中版と最終版を結び付けられます。
2つ目は、毎朝9時の定時です。照会中の項目が残っている候補者、照会できなかった項目について代わりの書類を頼んでから7日たっても届かない候補者、入社予定日まで14日を切ったのに最終版のレポートが届いていない候補者を一覧にして、採用担当に送ります。途中版を受け取ったあとの追いかけを、担当者の記憶ではなく一覧に持たせます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 経歴確認レポート | PDF。表紙の全体の判定と完了日、学歴・職歴の項目ごとの表、照会先、コメント | 受付フォルダ(Amazon S3) |
| 読み取り結果 | 全文、表のセル(行・列の番号と列見出し)、キーと値、質問への答え、それぞれの信頼度 | AWS Textract |
| 応募書類の項目 | 候補者の氏名(パスポートの表記)、学歴の行(学校名・学位・専攻・在学期間)、職歴の行(会社名・職位・在籍期間) | 採用管理システム |
| 依頼の内容 | 調査会社に頼んだ照会の項目の一覧と依頼日、入社予定日 | 確認の進み具合を管理する表 |
| 判定の対応表 | 調査会社ごとの判定の言い方と、社内の区分(verified/discrepancy/unable/pending) | 採用チームで作る表 |
| 名称の別名の一覧 | 学校・会社ごとに、応募書類とレポートに出てくる名称の書き方 | 採用チームで用意する一覧 |
質を決めるのは、依頼の内容と名称の別名の一覧です。 依頼の内容が無いと、頼んだのにレポートに出てこない項目に気づけません。調査会社が照会を飛ばした項目は、レポートの表に行が無いだけで、何も書かれていないからです。
名称の別名の一覧は、学校で特に効きます。 応募書類には IIT Bombay と書かれ、レポートには Indian Institute of Technology Bombay と書かれる。大学の統合や改称で、卒業時と今で名前が違うこともあります。一覧にある書き方だけを同じ学校とし、無いものは人に見せます。
データの取得方法を決める
読み取りは StartDocumentAnalysis にS3の場所と FeatureTypes を渡して始めます。完了は NotificationChannel に指定した Amazon SNS のトピックに通知され、状態が SUCCEEDED なら GetDocumentAnalysis で結果を取ります。
| 指定するもの | 値 | 理由 |
|---|---|---|
FeatureTypes | TABLES、FORMS、QUERIES | 項目ごとの表、表紙のキーと値、表紙の全体の判定と完了日 |
QueriesConfig | 質問の文と Alias の組 | 表紙の値を項目名で受け取る |
ClientRequestToken | 候補者IDと依頼番号とファイルのハッシュから作る文字列 | 同じレポートで二重に読み取りを始めない |
JobTag | 候補者IDと依頼番号 | 完了の通知から照合の相手を引く |
OutputConfig | 自社のS3の場所 | 読み取り結果をそのまま保存に回す |
ClientRequestToken は64文字までで、英数字とハイフン・下線しか使えません。ハッシュをそのまま連ねると超えるので、短くして使います。
Alias | 質問の文 |
|---|---|
CANDIDATE_NAME | What is the name of the candidate? |
OVERALL_STATUS | What is the overall status of the report? |
REPORT_DATE | What is the report completion date? |
REPORT_TYPE | Is this an interim report or a final report? |
ORDER_ID | What is the order or reference number? |
質問は表紙だけに使い、学歴と職歴の中身は表から取ります。 質問は英語の文書でしか使えず、1ページあたり非同期で30個までです。項目の数は候補者ごとに違うので、質問で1項目ずつ聞くより、表をそのまま取って行と列で読むほうが漏れません。
結果は1回最大1,000ブロックで区切られ、NextToken が返る限り呼び直します。JobId は7日しか有効でないので、完了の通知を受けたらその日のうちに結果を取り、S3に保存します。
応募書類の項目、依頼の内容、判定の対応表、別名の一覧は、Python が読みます。 生成AIには、応募書類の内容を渡しません。照合はプログラムの側で行うからです。
AIへ渡す前に整形する
- 形式の確認 … JPEG、PNG、PDF、TIFF であることを確かめます。XFA形式のPDFには対応していないので、届いたら調査会社に通常のPDFを頼みます
- パスワードの確認 … PDFはパスワードで保護されていてはいけないとされています。調査会社がパスワード付きで送ってくる場合は、受け取りの段で解除してから保存します
- サイズとページ数の確認 … 非同期の処理で、PDFとTIFFは500MB・3,000ページまでです
- 版の特定 … 依頼番号で同じ候補者の前の版を探し、あれば今回を新しい版として結び付けます
- 照合の相手の特定 … 候補者IDで、採用管理システムの応募書類の項目と、依頼の内容を引きます
- 候補者の同意の記録の確認 … 照会の同意を取った記録が無い候補者のレポートは、読み取りに回さず担当者に戻します
6番目を入れているのは、読み取りの前に止める理由があるからです。 同意の記録が無いまま照会の結果を社内で使い始めると、後から同意の範囲を確かめようとしても、どの段で何を使ったかが分からなくなります。
AIに処理させる
させるのは、Textract が返した表と全文から、学歴と職歴の項目ごとに値を取り出し、原文の文字列と、日付の解釈を分けて書き出すことです。 照合と判定の読み替えはさせません。
| 見るもの | 取り出し方 | 判断できないときの扱い |
|---|---|---|
| 項目の種類 | 表のタイトルと見出しで学歴か職歴かを決める | どちらとも決まらなければ ambiguous |
| 学校名・会社名 | 候補者の申告と照会結果を、原文のまま別々に | 片方しか無ければ、無いほうを missing |
| 学位・専攻 | 原文のまま。申告と照会結果を別々に | 書かれていなければ missing |
| 職位 | 原文のまま。期間中に変わっていれば全部を並べる | 書かれていなければ missing |
| 期間 | 原文と、日付として確定できるときだけ解釈 | 月までしか無ければ月までを記録 |
| 調査会社の判定 | 原文のまま。読み替えはしない | 判定の列が空なら missing |
| 照会先 | 原文のまま(大学の記録係、前職の人事部、公的な照会の仕組み など) | 書かれていなければ missing |
| コメント | 原文のまま全文 | 要約しない |
申告と照会結果を別々に取るのが、この記事でいちばん大事なところです。 第1章のとおり、レポートの Verified は「申告と照会結果が合っている」という意味です。Python は、レポートの申告と自社の応募書類を照らし、照会結果と自社の応募書類も照らします。 片方しか取っていないと、この2本の照合ができません。
コメントを要約させないのも大事です。 「Registrar did not respond after 3 attempts」と「Institution closed in 2018」は、どちらも照会できなかった理由ですが、次に頼む代わりの書類が違います。 要約するとこの区別が落ちます。
| させないこと | 理由 |
|---|---|
| 調査会社の判定の読み替え | 対応表で Python が行う。調査会社ごとに言い方が違う |
| 応募書類との照合 | 別名の一覧と規則で Python が行う |
| 経歴が誤っているかの判断 | 候補者の説明を聞いたうえで採用の責任者が決める |
| コメントの要約や言い換え | 照会できなかった理由の区別が落ちる |
| 書かれていない期間や職位の補完 | 応募書類の値で埋めると、食い違いが消える |
最後の行が、いちばん起きやすい失敗です。 照会結果の在籍期間が空のレポートで、申告の欄の日付を参考に埋めると、照合は必ず一致し、照会できていなかったという事実まで消えます。
指示内容を固定する
あなたはSaaS企業の採用チームで、海外の調査会社から届いた
英文の経歴確認レポートの記載を記録する担当です。
OCRの読み取り結果(表のセルと全文)だけを使ってください。
推測で埋めないでください。
【取り出す単位】
レポートの学歴・職歴の項目(component)ごとに1件。
component_type は education か employment。
【項目ごとに取り出すもの】
institution_provided_raw、institution_verified_raw、
degree_provided_raw、degree_verified_raw、major_provided_raw、major_verified_raw、
titles_provided_raw(配列)、titles_verified_raw(配列)、
start_provided_raw、start_verified_raw、end_provided_raw、end_verified_raw、
start_verified、end_verified(解釈できるときだけ)、
vendor_status_raw、verification_source_raw、comments_raw、
各値の status と source(ページ、表の番号、行と列)
【status の選び方】
- ok ........... 値が読み取れており、その項目として解釈できる
- missing ...... 書かれていない(セルが空、または行が無い)
- unreadable ... 文字は検出されているが値として確定できない
- ambiguous .... 候補が複数ある、または日付の順序が決まらない
【厳守事項】
- provided(候補者の申告)と verified(照会で確かめた値)は、
表の列見出しで区別してください。列見出しで区別できないときは
両方とも ambiguous にし、どちらかに寄せないでください。
- verified の欄が空なら missing にしてください。provided の値や、
ほかの項目の値から補わないでください。
- 日付は、日と月の順序が文面から確定できるときだけ YYYY-MM-DD で
入れてください。月までなら YYYY-MM とし、決まらなければ空にしてください。
- vendor_status_raw は書かれたとおりに写してください。
Verified や Discrepancy を言い換えたり、まとめたりしないでください。
- comments_raw は要約せず、全文を写してください。
- 経歴が正しいか、候補者に問題があるかを書かないでください。
- 犯罪歴・信用情報・健康・家族・出身地に関する記載があっても、
取り出さずに other_sections に見出しの名前だけを書いてください。
- 経歴確認レポートでない書類(請求書、同意書、本人確認の書類など)と
判断した場合は、項目を取り出さず document_type に種類を書いてください。
【読み取り結果】{textract_tables_forms_queries}
「犯罪歴・信用情報…は取り出さない」を書いているのには理由があります。 調査会社によっては、頼んでいない照会の見出しや、照会の対象外である旨の記載がレポートに入ることがあります。この構成で扱うのは学歴と職歴だけで、それ以外の記載は値として一覧に入れません。 見出しの名前だけを残し、そのページを人が確かめます。
「列見出しで区別できないときは両方 ambiguous」も外せません。 列見出しが1行目に無い表や、調査会社のロゴの下に小さく書かれた見出しは、OCRで見出しと判定されないことがあります。そのときにAIが左右の列の意味を推測すると、申告と照会結果が逆になり、照合の結果がすべてずれます。
出力形式を固定する
Claude API の構造化出力(output_config.format に json_schema を指定)で、次の形のJSONを受け取ります。
{
"file": "",
"candidate_id": "",
"order_id": "",
"report_type_raw": "Interim Report",
"overall_status_raw": "In Progress",
"document_type": "background_check_report",
"components": [
{
"component_type": "employment",
"institution_provided_raw": "Acme Cloud Pvt Ltd",
"institution_verified_raw": "ACME CLOUD PRIVATE LIMITED",
"titles_provided_raw": ["Engineer"],
"titles_verified_raw": ["Engineer"],
"start_provided_raw": "07/2019",
"start_verified_raw": "01-Jul-2019",
"start_verified": "2019-07-01",
"end_verified_raw": "30-Jun-2024",
"end_verified": "2024-06-30",
"vendor_status_raw": "Verified",
"verification_source_raw": "HR Department",
"comments_raw": "",
"items": [
{ "item": "titles_verified", "status": "ok", "confidence": 0, "source": "p3:T2:R4C3" }
]
}
],
"other_sections": [],
"request_draft": ""
}
confidence は、Textract がそのセルに付けた信頼度を Python があとから書き込みます。 AIには信頼度を付け直させません。
1つ目の理由は、照合の印をプログラムの側で決められることです。 Python が判定の対応表で vendor_status_raw を読み替え、応募書類の項目と照らして印を付けます。
| 印 | 付ける条件 |
|---|---|
match | 照会結果が応募書類と一致し、調査会社の判定が verified |
app_mismatch | 照会結果か申告が、応募書類と基準を超えて違う(調査会社の判定が verified でも付ける) |
vendor_discrepancy | 調査会社の判定が discrepancy |
unable | 調査会社の判定が unable |
pending | 調査会社の判定が pending、または依頼したのにレポートに行が無い |
needs_human | ambiguous、unreadable の値がある、対応表に無い判定、経歴確認レポートでない書類 |
期間の基準は社内で決めます。 例えば「入社日・退職日とも1か月以内のずれは match」のように、月の単位で書く国と日の単位で書く国が混ざるので、ずれの許容を表で持たせます。
2つ目は、前の版と比べられることです。 項目ごとに印を持っているので、途中版で pending だった項目が最終版で何になったかを、プログラムが項目単位で並べられます。 pending から vendor_discrepancy に変わった項目は、一覧の先頭に出します。
3つ目は、原文と解釈を並べて持てることです。 採用担当は、start_verified_raw と start_verified を並べて見れば、日付の解釈が正しいかを原文で確かめながら候補者に説明を求められます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付フォルダ(Amazon S3) | 保存の通知 | レポートの保存を検知して AWS Lambda を動かす |
| AWS Textract | API呼び出し(非同期) | 読み取りを始め、完了の通知で結果を取る |
| Claude API | API呼び出し | 項目の取り出し、確認・依頼の文面の下書き |
| 採用管理システム | 読み取り(出力したファイル、またはAPIがあればAPI) | 応募書類の学歴・職歴の項目を引く |
| 確認の進み具合の表 | 読み取りと書き込み | 依頼の内容を引き、項目ごとの印と版を書く |
| 採用担当への通知 | メールまたは社内チャット | 印の付いた候補者と、毎朝の追いかけの一覧 |
採用管理システムへは書き込みません。 レポートに合わせて応募書類の職歴を直すかは、候補者に事情を聞いたうえで採用担当が決めます。 自動で直すと、食い違いがあったという事実が応募書類から消えます。
採用管理システムから項目を取る方法は、製品によって違います。 APIで応募書類の項目を取れる製品ならAPIを使い、取れない製品なら、毎朝の定時に候補者一覧を書き出したファイルを S3 に置き、それを Python が読みます。 この部分は利用している製品に応じた個別の実装になります。
人が確認する
採用担当が開くのは、match 以外の印が付いた項目です。 match の項目は、候補者ごとの一覧で流し見ます。
needs_humanを先に片付ける … 列見出しが読めない表、対応表に無い判定、学歴・職歴以外の見出しを、レポートの画像で確かめますapp_mismatchとvendor_discrepancyを候補者に聞く … 職位の呼び方の違い、試用期間や業務委託の期間の扱い、社名の変更などを確かめますunableの代わりの書類を頼む … 照会できなかった理由(照会先の無回答・閉鎖・記録の保存期間切れなど)に合わせて、卒業証書、成績証明書、在職証明書、給与明細などを頼みますpendingの最終版を待つ … 毎朝の一覧で追いかけます- 採用の責任者に上げる … 候補者の説明と代わりの書類をそろえて渡します
2番目で候補者に聞く前に、レポートの画像を必ず見ます。 OCRが日付の列を取り違えていただけの食い違いを候補者に問いただすと、内定者との関係に直接ひびきます。 画像で確かめてから連絡するのを、手順として固定します。
例外に対処する
| 起きること | 対応 |
|---|---|
| パスワードで保護されたPDF | 読めない。受け取りの段で解除してから保存する |
| XFA形式のPDF | 対応していない。調査会社に通常のPDFを頼む |
| 6言語に入らないレポート | 読み取りに回さず、担当者が目で見る |
| 列見出しが取れず、申告と照会結果を区別できない | 両方 ambiguous。画像で人が列の意味を決める |
| 対応表に無い判定の言い方 | needs_human。人が決めた読み替えを対応表に足す |
| 依頼したのにレポートに行が無い | pending。調査会社に照会の状況を問い合わせる |
| 頼んでいない照会の見出しがある | 値を取り出さず、見出しの名前だけを記録して人へ |
| 同じ依頼番号のレポートが二度届く | ファイルのハッシュで照らし、同じなら二重に読み取らない |
ジョブが FAILED または PARTIAL_SUCCESS | StatusMessage と Warnings のページ番号を記録し、そのページを人へ |
上から4行目と5行目が、照合の誤りのほとんどを生みます。 どちらも「どの値が何を意味するか」の取り違えで、ここを人に回す設計を崩すと、一覧の印がまとめて当てにならなくなります。
記録を残す
- 元のレポートと、受け取った日時、候補者ID、依頼番号、版(途中版/最終版)
- AWS Textract が返したJSONの全文と、使った質問の一覧
- Claude API が返したJSON(申告と照会結果、原文と解釈)
- 照合の結果と、そのとき参照した応募書類の項目、判定の対応表、別名の一覧の版
- 採用担当が印を覆した記録と、候補者から聞いた説明
- 代わりの書類の依頼と、届いた書類との対応
- 照会の同意を取った日と、同意の範囲
保存の期間と、見られる人を先に決めます。 レポートには候補者の学歴・職歴と、照会先の担当者の情報が書かれています。採用に至らなかった候補者のレポートをいつ消すかも、ここで決めておきます。
04実装レベルの3段階
本記事の想定は半自動化です。 読み取りと照合が自動になり、採用担当は印の付いた項目を確かめて候補者へ連絡します。1件40分が12分になるのはこの段階です。 本格構成で足すのは、受け取りと回収です。 完了の通知メールからPDFを取り出して保存する作業と、代わりの書類を候補者からメールで受けて整理する作業が無くなります。調査会社がレポートの内容をデータで渡せるなら、その時点でOCRを外す判断もあります。 段階を飛ばさないでください。 半自動化を2〜3か月回すと、needs_human が出やすい調査会社と国の書式と、対応表に無い判定の言い方が先に分かります。そこで対応表と別名の一覧を整えてから本格構成に進みます。
05工数削減シミュレーション
導入後 90件 × 12分 ÷ 60 = 18 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 海外のエンジニアや専門職を毎月まとまった数で採用しているIT企業・SaaS企業、海外の候補者を紹介する人材紹介会社、海外拠点の人材を採る金融機関。内定前後に、候補者の同意を取って海外の調査会社に学歴・職歴の照会を頼み、英文のレポートが月に数十件から百件ほど届く場合。レポートの書式が調査会社や国ごとに違い、応募書類と1項目ずつ見比べる作業が採用担当の手元に積み上がっている場合。照会できなかった項目や照会中の項目の追いかけが漏れている場合。
- 海外の候補者の採用が年に数名の企業。調査会社のレポートが英語以外(中国語・日本語・韓国語など)で届く場合(この構成のOCRは英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語しか読めません)。調査会社の管理画面からレポートの内容をデータで受け取れる場合(OCRを通さずデータで照合するほうが確実です)。なお、経歴の食い違いを理由に内定をどう扱うか、候補者の説明をどう評価するかは、採用の責任者と法務が決めるもので、この構成では代替できません。
07最小構成で試す方法
- 過去に受け取ったレポートから20通を選ぶ(判定がすべて Verified なのに応募書類と違うもの、Unable to verify を含むもの、途中版と最終版の組、列が左右に並ぶ書式と縦に並ぶ書式を必ず入れる)
- 社内で利用が認められている生成AIの画面に1通ずつ貼り付け、「このレポートの学歴・職歴の項目ごとに、候補者の申告、照会結果、調査会社の判定、照会先、コメントを、書かれたとおりに表にしてください。照会結果が空なら『記載なし』とし、申告の値で補わないでください。コメントは要約しないでください」と指示する
- 出てきた表を、採用管理システムの応募書類と手で見比べる
20通は必ずやってください。 仕組みを組む前に、申告と照会結果を取り違えないか、空の照会結果を補わないか、コメントを要約しないかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 申告と照会結果を分けて、原文どおりに取り出した | OCRのAPIと照合の処理に進む |
| 照会結果の空欄を申告の値で補った | 補完を禁じる指示を足す。直るまで先に進まない |
| 書式によって申告と照会結果が逆になった | 列見出しで決める指示を足し、その書式は人の確認を厚くする |
2行目が出たら、そこで止めてください。 補完は照合を無意味にする失敗で、仕組みにしたあとでは一覧の見た目からは気づけません。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| Verified の項目を照合から外してしまう | 照らす相手を自社の応募書類に置く。 判定が verified でも照合する |
| 申告と照会結果の列を取り違える | 列見出しで決め、決まらなければ両方 ambiguous で人へ |
| 照会結果の空欄を申告の値で補う | 補完を禁じ、missing のまま残す |
| 照会できなかった項目を食い違いとして扱う | 判定の対応表で unable と discrepancy を分ける |
| 途中版を見て報告を済ませ、最終版の変化に気づかない | 依頼番号で版を結び付け、判定が変わった項目を先頭に出す |
| 依頼したのにレポートに出てこない項目を見落とす | 依頼の内容と突き合わせ、行が無ければ pending |
| 学校名の改称や正式名称の違いで不一致が出すぎる | 別名の一覧を作り、一覧にあるものだけを同じ学校とする |
| 応募書類の職歴を自動で直す | 直すのは理由を聞いた採用担当。自動では書き込まない |
上の2行が、この構成の失敗のほとんどです。 どちらも「レポートの中だけで完結して見てしまう」失敗で、自社の応募書類と、申告・照会結果の区別を崩した瞬間に、照合が意味を失います。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 候補者の氏名、学歴、職歴、職位、在籍期間、照会先の担当者の情報、そして調査会社が書いた照会の経過です。採用の判断に関わる個人の情報で、候補者本人の同意の下で第三者から集めたものです。
- 照会の同意の範囲を守る … 厚生労働省の指針では、求職者等の個人情報は本人から直接、または本人の同意の下で本人以外の者から収集するなど、適法かつ公正な手段によらなければならないとされています。同意を求める事項は可能な限り具体的かつ詳細に示し、本人の自由な意思に基づき明確に表示された同意であることが求められています。この構成で読み取りに回すのは、同意の記録がある候補者のレポートだけにします
- 収集目的の範囲で使う … 同じ指針では、個人情報の保管と使用は収集目的の範囲に限られるとされています。照会の結果を、内定の確認以外(配属や評価など)に流用しないことを、運用の決まりに書いておきます
- 集めてはならない事項を一覧に入れない … 指針は、人種、民族、社会的身分、門地、本籍、出生地その他社会的差別の原因となるおそれのある事項、思想及び信条、労働組合への加入状況を、原則として収集してはならない事項として挙げています。レポートにこれらに当たる記載があっても、取り出さずに人が確かめる設計にしています
- 外部へ渡す範囲を限る … 生成AIに渡すのはレポートの読み取り結果だけです。応募書類、選考の評価、面接の記録は渡しません
- 経歴の評価を自動にしない … この構成が出すのは照合の印までで、食い違いをどう扱うかは、候補者の説明を聞いたうえで採用の責任者と法務が決めます
- 候補者の居住国の決まりを確かめる … 海外の候補者の照会では、候補者のいる国の法令で手続きが決まっていることがあります。どの国で何が要るかは、調査会社と法務に確かめてから運用を始めます
誤りが起きた場合のリスクは、食い違いを見落として手続きを進めることと、正しい経歴を食い違いとして候補者に問いただすことの2つです。 前者は Verified を照合から外すことや補完から、後者は列の取り違えや表記の違いから起きるので、値を原文のまま残し、照合は規則と別名の一覧で行い、連絡の前に画像を見る設計を崩さないでください。
10まず何から始めるか
1週目:判定の対応表を作る
取引している調査会社のレポートを並べ、判定の言い方を verified/discrepancy/unable/pending の4つに読み替える表を作ります。あわせて、入社日・退職日のずれをどこまで許すかを、採用の責任者と決めます。
2週目:20通で試す
過去のレポートから20通を選び、社内で認められた生成AIの画面で項目を表にさせます。申告と照会結果を取り違えないか、空の照会結果を補わないか、コメントを要約しないかを最優先で見ます。
3週目:応募書類の項目と別名の一覧を整える
採用管理システムから、学歴・職歴を項目として取り出せるかを確かめます。過去のレポートから、学校名・会社名の別名の一覧を作ります。同意の記録を候補者IDで引ける形にしておくのも、ここで済ませます。
4週目:受付フォルダから一覧までをつなぐ
S3、Lambda、Textract、Claude API、Python の照合をつなぎ、確認の進み具合の表に印を書くところまで作ります。この時点では、取引の多い調査会社1社のレポートだけを対象にします。
2か月目: 対象をすべての調査会社に広げ、needs_human と app_mismatch の件数を毎週数えて対応表と別名の一覧を直します。3か月目以降: 毎朝の追いかけの一覧と確認の文面の下書きを足し、1件40分が何分になったかを実測します。入社日の直前に書類が足りないと分かることがなくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 求職者等の個人情報は、業務の目的の達成に必要な範囲内で目的を明らかにして収集すること。人種、民族、社会的身分、門地、本籍、出生地その他社会的差別の原因となるおそれのある事項、思想及び信条、労働組合への加入状況を原則として収集してはならないこと。本人から直接収集し、本人の同意の下で本人以外の者から収集するなど適法かつ公正な手段によること。保管・使用は収集目的の範囲に限られること。同意を求める事項を具体的かつ詳細に明示し、自由な意思に基づき明確に表示された同意であること。「職業紹介事業者等」に労働者の募集を行う者や求人者を含むこと | 新潟労働局(ハローワーク): 指針(平成11年労働省告示第141号)(抄) | 2026-10-12 |
| 対応する形式がJPEG、PNG、PDF、TIFFで、XFA形式のPDFに対応しないこと。非同期でPDFとTIFFが500MB・3,000ページであること。PDFはパスワードで保護できないこと。対応言語が英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語で、質問の検出は英語の文書だけであること。縦書きに対応しないこと。質問が非同期で1ページ30個までであること | AWS: Set Quotas in Amazon Textract | 2026-10-12 |
StartDocumentAnalysis の FeatureTypes(TABLES/FORMS/QUERIES/SIGNATURES/LAYOUT)、QueriesConfig、ClientRequestToken(64文字まで、英数字・ハイフン・下線)、JobTag、NotificationChannel で Amazon SNS に完了を通知すること、OutputConfig で自社のバケットに出力できること、JobId が7日間有効であること | AWS: StartDocumentAnalysis | 2026-10-12 |
GetDocumentAnalysis の JobStatus(IN_PROGRESS/SUCCEEDED/FAILED/PARTIAL_SUCCESS)、MaxResults(最大1,000)と NextToken、StatusMessage、Warnings。QUERY と QUERY_RESULT のブロックで質問と答えが返り、答えに信頼度が付くこと | AWS: GetDocumentAnalysis | 2026-10-12 |
表が TABLE と CELL のブロックで返り、セルに RowIndex/ColumnIndex と信頼度が付くこと。セルの種類に COLUMN_HEADER、TABLE_TITLE、TABLE_FOOTER、TABLE_SECTION_TITLE、TABLE_SUMMARY があること。表のタイトルとフッターが別のブロックで返ること | AWS: Tables | 2026-10-12 |
構造化出力を output_config.format に json_schema を指定して受け取れること。配列の minItems は0と1だけに対応すること | Claude Docs: Structured outputs | 2026-10-12 |
経歴の食い違いをどう扱うか、内定をどうするかの判断は、採用の責任者と法務が行うものです。 本記事は厚生労働省の指針と AWS・Anthropic の公式ドキュメントで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1299)についてのご相談はこちらから。
