海外のエンジニア採用で届く英文の履歴書(CV)を読み取り、候補者データベースの項目に転記して、募集要件に照らした確認事項を採用担当へ返す
海外のエンジニアから届く英文のCVを読み取り、学歴・職歴・技術スタック・言語・ビザの状況を候補者データベースの項目に転記します。あわせて、募集要件に照らして書類選考の前に確かめるべき点を採用担当へ返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- IT・SaaS/人材/製造
- 対象部門
- 人事/採用
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/判断に時間がかかる
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 応募の経路ごとに届いたCVのPDFを、採用管理システムに添付する
- 担当者がCVを開き、氏名・連絡先・現住所の国を入力する
- 学歴(学位・専攻・学校・卒業年)と職歴(会社・役職・期間)を1件ずつ入力する
- 職歴の文から技術を拾い、技術ごとの経験年数を数えて入力する
- 言語の能力とビザの状況を探し、書いてあれば入力する
- 募集要件の文書と見比べ、満たしているか分からない点をメモに書く
- 現場のエンジニアへ書類選考を依頼する
- 【人/自動】 応募の経路ごとに届いたCVを、求人の番号を付けて受付フォルダへ入れる
- 自動保存をきっかけに、形式・ページ数・パスワードの有無を確かめる
- 自動OCRが文書のレイアウト(見出し・段落・箇条書き・表)を読む順に並べて返し、問い合わせへの答え(メールアドレスなど)を返す
- 自動前処理で、写真の領域と、選考に使わない項目(生年月日・婚姻の状況など)を外す
- 自動生成AIが、学歴・職歴・技術・言語・ビザの記載を項目にそろえ、根拠にした文字列を写す
- 自動技術の呼び名をそろえ、職歴の期間から技術ごとの経験年数を決まった規則で数える
- 自動募集要件と照らし、`stated`(書かれている)/`not_stated`(書かれていない)/`unclear`(読み取れない)と、確認事項の一覧を作る
- 人採用担当が転記の結果と確認事項を見て直し、候補者データベースへの登録を承認する
- 人現場のエンジニアへ書類選考を依頼する。確認事項のうち面談で聞くものを、面談の担当へ渡す
各工程の詳しい説明を読む
- 応募の経路ごとに届いたCVのPDFを、採用管理システムに添付する
- 担当者がCVを開き、氏名・連絡先・現住所の国を入力する
- 学歴(学位・専攻・学校・卒業年)と職歴(会社・役職・期間)を1件ずつ入力する
- 職歴の文から技術を拾い、技術ごとの経験年数を数えて入力する
- 言語の能力とビザの状況を探し、書いてあれば入力する
- 募集要件の文書と見比べ、満たしているか分からない点をメモに書く
- 現場のエンジニアへ書類選考を依頼する
(a)2段組みのCVで職歴の順が崩れる。 PDFからコピーすると、左の段と右の段の行が交互に混ざります。どの技術をどの会社で使ったのかを、読み直して組み立て直す手間がかかります。
(b)経験年数の数え方が担当者で違う。 同じ技術を2社で使っていれば足すのか、期間が重なっていれば重ねて数えるのか。決まりが無いので、データベースの「Python 5年」が何を意味するのかが担当者ごとに違います。
(c)ビザの状況の確認が最後に回る。 CVに書かれていないことが多く、5番は空欄のまま進みます。面接が2回進んだ後に、在留資格の確認に要る書類がそろわないと分かることがあります。
(d)件数が増えると、6番が省かれる。 応募が集中する月は、転記だけで手一杯になります。確認事項のメモが無いまま現場へ回すと、現場のエンジニアが同じ点を何度も聞き返します。
- 【人/自動】 応募の経路ごとに届いたCVを、求人の番号を付けて受付フォルダへ入れる
- 【自動】 保存をきっかけに、形式・ページ数・パスワードの有無を確かめる
- 【自動】 OCRが文書のレイアウト(見出し・段落・箇条書き・表)を読む順に並べて返し、問い合わせへの答え(メールアドレスなど)を返す
- 【自動】 前処理で、写真の領域と、選考に使わない項目(生年月日・婚姻の状況など)を外す
- 【自動】 生成AIが、学歴・職歴・技術・言語・ビザの記載を項目にそろえ、根拠にした文字列を写す
- 【自動】 技術の呼び名をそろえ、職歴の期間から技術ごとの経験年数を決まった規則で数える
- 【自動】 募集要件と照らし、
stated(書かれている)/not_stated(書かれていない)/unclear(読み取れない)と、確認事項の一覧を作る - 【人】 採用担当が転記の結果と確認事項を見て直し、候補者データベースへの登録を承認する
- 【人】 現場のエンジニアへ書類選考を依頼する。確認事項のうち面談で聞くものを、面談の担当へ渡す
7番目で「要件を満たすか」の結論は出しません。 出すのは、要件ごとにCVに記載があるかどうかと、その根拠の文字列です。記載の無い要件は、満たしていないのではなく「確かめていない」として残します。
8番目の承認は省きません。 転記された値が候補者データベースに載ると、その後の検索や絞り込みの結果を決めます。誤った経験年数のまま載せると、検索で拾われない候補者が出ます。
02今回想定するシステム構成
英文のCV(PDF、応募の経路ごと) ▼【トリガー】受付フォルダ(Amazon S3)への保存 AWS Lambda ── 形式・ページ数・サイズ・パスワードの確認 ▼ AWS Textract(StartDocumentAnalysis:LAYOUT/QUERIES) │ 読む順に並んだ見出し・段落・箇条書き・表、問い合わせへの答え、信頼度 ▼ 完了の通知(Amazon SNS)→ AWS Lambda が結果を取る Python ── 写真の領域と、選考に使わない項目を外す ▼ Claude API ── 項目をそろえる │ ① 学歴 ② 職歴と使った技術 ③ 言語 ④ ビザの状況(書かれたまま) ▼ Python ── 技術の呼び名をそろえ、経験年数を規則で数え、募集要件と照らす ▼ 確認事項の一覧(stated / not_stated / unclear) ▼ 【採用担当が確認して承認】 ├──▶ 候補者データベースへ登録 └──▶ 現場のエンジニアへ書類選考の依頼
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(StartDocumentAnalysis:LAYOUT/QUERIES) | Azure AI Document Intelligence、Google Document AI |
| 生成AI | Claude API(学歴・職歴・技術・言語・ビザの記載を項目にそろえる) | OpenAI API、Gemini API |
| 差異計算 | Python(経験年数の計算と、募集要件との照らし合わせ) | 採用管理システムの検索条件の機能 |
| 連携 | AWS Lambda(保存と完了の通知を起点に処理を動かす) | Amazon EventBridge |
| 保管 | Amazon S3(CV、読み取り結果、確認事項) | 社内のファイルサーバー |
採用管理システムは、新しく足すものではありません。 最初の準備は、求人ごとの募集要件を「必須」「歓迎」に分けた表にすることと、技術の呼び名をそろえる一覧を作ることです。
OCRに AWS Textract を選ぶのは、CVが英文だからです。 対応言語は英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語で、問い合わせ(Queries)は英語の文書だけが対象です。 日本語の職務経歴書を併せて送ってくる応募者もいますが、そちらは別の経路で扱います。
使う機能は、レイアウトの分析です。 見出し(LAYOUT_SECTION_HEADER)、段落(LAYOUT_TEXT)、箇条書き(LAYOUT_LIST)、表、図(LAYOUT_FIGURE)などを区別して返します。要素は読む順に並び、段組みのページでは左の段の上から下まで読み終えてから次の段へ進みます。 第3章の(a)の「行が交互に混ざる」問題は、ここで解けます。
請求書向けの AnalyzeExpense や、身分証向けの AnalyzeID は使いません。 AnalyzeID は米国のパスポートと運転免許証だけが対象で、本記事の書類には当たりません。
03どうやって実装するのか
処理の起点を決める
受付フォルダ(Amazon S3)にPDFが保存されたことを起点にします。 応募は毎日届くので、1日1回の定時処理にはしません。応募から最初の連絡までの日数が短いほど、他社との競り合いで有利になるからです。
応募の経路は3つあります。自社サイトの応募フォーム、求人媒体、紹介会社です。どの経路でも、求人の番号をファイル名かフォルダ名に付けて入れます。 求人の番号が無いと、どの募集要件と照らすかが決まりません。番号の無いファイルは止めずに受け、確認事項に「求人の番号が無い」と出します。
処理が終わったファイルは処理済みの場所へ移します。移すのは、確認事項の一覧への書き出しまで成功したときだけです。 受付フォルダに残っている数が、そのまま未処理の数になります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| CV | PDF。応募の経路、求人の番号、受け取った日時 | 受付フォルダ |
| 読み取り結果 | レイアウトの要素(読む順)、表のセル、問い合わせへの答え、信頼度 | AWS Textract |
| 募集要件 | 求人ごとの必須・歓迎の技術、経験年数、言語、勤務地、ビザの扱い | 自社で整備する表 |
| 技術の呼び名の一覧 | 「Golang」「Go language」→「Go」のような対応 | 自社で整備する一覧 |
| 経験年数の数え方 | 期間の重なりの扱い、在学中のインターンの扱い、「Present」の扱い | 自社で決める規則 |
| 候補者データベース | 同じ人の過去の応募の有無(メールアドレスで照合) | 採用管理システム |
質を決めるのは、真ん中の3つです。 募集要件が文章のままでは照らせず、呼び名の一覧が無ければ同じ技術が別の技術として数えられます。経験年数の数え方を決めておかないと、第3章の(b)がそのまま機械に移ります。
データの取得方法を決める
読み取りは、Lambda から StartDocumentAnalysis を呼んで始めます。 文書はS3の場所で指定し、完了の通知先にSNSのトピックを渡します。ClientRequestToken に受付のファイルごとの値を入れ、同じCVの処理が二重に始まらないようにします。 JobTag には求人の番号を入れ、完了の通知から求人を引けるようにします。JobId は7日間しか有効でないので、完了を受けたらすぐに GetDocumentAnalysis で結果を取ります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 見出し | LAYOUT_SECTION_HEADER | 「Experience」「Education」「Skills」などのまとまりの境 |
| 段落と箇条書き | LAYOUT_TEXT・LAYOUT_LIST | 職歴の説明、技術の一覧 |
| 図 | LAYOUT_FIGURE | 顔写真の領域を外すため |
| 問い合わせへの答え | QUERY・QUERY_RESULT | メールアドレス、現住所の国 |
| 信頼度 | 各ブロックの Confidence | 読み直しの要否 |
問い合わせ(Queries)は、場所の決まらない値だけに使います。 「What is the email address?」「What country does the candidate currently live in?」のように英語の質問を渡し、Alias を付けます。答えには信頼度が付き、見つからなければ空で返ります。 ビザの状況を問い合わせで拾うことはしません。書かれ方が多様で、文脈ごと読まないと意味が決まらないからです。
同じ人の過去の応募は、メールアドレスで候補者データベースを引いて確かめます。 氏名で引くと、表記の違いで別人として登録されます。
AIへ渡す前に整形する
- 形式の確認 … 扱えるのはJPEG、PNG、PDF、TIFFです。XFA形式のPDFには対応していません。 Word形式で届いたものはPDFに変換します
- パスワードの確認 … パスワードで保護されたPDFは読めません。 応募者に保護のないものを送り直してもらいます
- ページ数とサイズの確認 … 非同期の処理はPDFで500MB・3,000ページまで。CVなら収まります
- 解像度の確認 … 読み取れる文字の高さは15ピクセル以上で、150dpiで8ポイントの文字に当たります。デザインに凝ったCVの細い小さな文字が、この下限に近いことがあります
- 写真の領域を外す …
LAYOUT_FIGUREの領域にある文字以外のものは使いません。顔写真は生成AIにも候補者データベースにも渡しません - 選考に使わない項目を外す … 生年月日、年齢、婚姻の状況、家族、宗教などが書かれていれば、見出しと語で検出して本文から外します
- 言語の確認 … 英語以外のCVが入っていないかを見ます。英語以外なら別の経路へ回します
6番目を生成AIの前に置くのが、この構成の要です。 海外のCVには、生年月日や婚姻の状況、写真を載せる慣習の国があります。厚生労働省は、本籍地や家族の職業など「本人に責任のない事項」や、宗教や支持政党など「本来自由であるべき事項」を採用基準にしないことが必要だとしています。AIに渡した時点で、それが判断に混ざらない保証はありません。渡さないのがいちばん確実です。
AIに処理させる
させるのは、CVの文から項目を埋め、根拠にした文字列をそのまま写すことだけです。
| 見るもの | 書き出す内容 | 判断できないときの扱い |
|---|---|---|
| 学歴 | 学位、専攻、学校名、国、卒業年(在学中か) | 卒業年が無ければ「不明」 |
| 職歴 | 会社名、役職、開始と終了の年月、主な業務、その職で使った技術 | 年だけなら年だけを写す |
| 技術の一覧 | Skills の欄に書かれた技術(職歴と別に) | そのまま写す |
| 言語 | 言語ごとに書かれた水準(JLPT・CEFR・「Native」など) | 書かれていなければ「記載なし」 |
| ビザの状況 | 書かれた文のまま(例:「Requires visa sponsorship」) | 書かれていなければ「記載なし」 |
| 勤務地の希望 | 移住の可否、リモートの希望 | 書かれていなければ「記載なし」 |
職歴ごとに「その職で使った技術」を分けて写させるのは、経験年数を数えるためです。 Skills の欄に並ぶ技術には期間が付いていません。期間が付くのは職歴の側だけなので、どの職で何を使ったかが分からないと、年数を数えられません。
| させないこと | 理由 |
|---|---|
| 合否・順位・点数 | 判断するのは採用担当と現場のエンジニア |
| 経験年数の計算 | 規則で数える。AIに足し算をさせない |
| 日本語の能力の推測 | 国籍や学歴から推測しない。書かれていなければ「記載なし」 |
| ビザの取得の見込み | 在留資格の判断は出入国在留管理庁の審査による |
| 書かれていない技術の補完 | 「Kubernetes を使ったなら Docker も」と足さない |
3行目がいちばん起きやすい失敗です。 日本の大学を出た応募者に「日本語:ビジネス水準」と埋めたり、出身国から言語を足したりします。それは推測であって、CVに書かれた事実ではありません。
指示内容を固定する
あなたはエンジニア採用の担当者として、英文のCVから候補者データベースの項目を写す立場です。
渡すのは、OCRが読む順に並べたCVの本文です。そこに書かれたことだけを使ってください。
【写す項目】
- education: degree, field, school, country, graduation(年月。在学中なら in_progress)
- experience: company, title, start, end("Present" はそのまま), summary, technologies
- skills_listed: Skills 欄に並んでいる技術(職歴と別に)
- languages: 言語ごとに、書かれた水準の文字列
- work_authorization: ビザ・就労資格について書かれた文のまま
- relocation: 移住や勤務地について書かれた文のまま
【厳守事項】
- 書かれていない項目は「記載なし」としてください。推測で埋めないでください。
- 日本語の能力を、国籍・学歴・居住地から推測しないでください。
- 年月は書かれたとおりに写してください。月が無ければ年だけにしてください。
- 経験年数を計算しないでください。期間の足し算はこちらで行います。
- technologies には、その職の説明に書かれた技術だけを入れてください。
Skills 欄の技術を、職歴に割り当てないでください。
- 技術の呼び名は書かれたまま写してください。言い換えはこちらで行います。
- ビザの取得の見込み、在留資格に当たるかを書かないでください。
- 合否、適合度、順位、点数を書かないでください。
- 年齢、生年月日、婚姻の状況、家族、宗教、写真について、
本文に残っていても写さないでください。
- evidence には、根拠にした文字列をそのまま写してください。
- CVでない書類(推薦状、成績証明書など)と判断した場合は、写さずに
document_type に種類を書いてください。
【CVの本文】{cv_text}
「Skills 欄の技術を職歴に割り当てない」を書かないと、全部の職に全部の技術を入れます。 一覧にある技術を、もっともらしい職に振り分けるからです。その結果、経験年数が実際より長く数えられます。
「年齢・婚姻の状況を写さない」は前処理と二重にしています。 前処理の検出は語に頼るので、表記の揺れで漏れることがあります。漏れた1件が候補者データベースに残らないように、指示の側でも止めます。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format にJSONスキーマを渡す)を使うと、スキーマどおりの形で返り、必須の項目が欠けません。
{
"cv_id": "",
"requisition_id": "",
"document_type": "cv",
"education": [ { "degree": "", "field": "", "school": "", "country": "",
"graduation": "", "evidence": "" } ],
"experience": [ { "company": "", "title": "", "start": "", "end": "",
"technologies": [], "evidence": "" } ],
"skills_listed": [],
"languages": [ { "language": "", "level_text": "", "evidence": "" } ],
"work_authorization": { "text": "", "evidence": "" },
"relocation": { "text": "", "evidence": "" }
}
この後に、Python が要件との照らし合わせを足します。
| 要件の種類 | 照らし方 | 結果 |
|---|---|---|
| 必須の技術と年数 | 呼び名をそろえ、職歴の期間を規則で数える | stated(年数付き)/not_stated |
| 歓迎の技術 | 職歴と Skills 欄の両方を見る | stated/not_stated |
| 言語 | 書かれた水準を、要件の水準の表と照らす | stated/not_stated/unclear |
| ビザの扱い | 記載の有無だけを見る | stated/not_stated |
1つ目の理由は、経験年数を規則で数えられることです。 期間が重なる2つの職で同じ技術を使っていれば、重なりは1回だけ数えるのように決めておけば、誰が担当しても同じ年数になります。規則の例は次のとおりです。
| 場面 | 規則の例 |
|---|---|
| 2つの職の期間が重なる | 同じ技術なら重なった月は1回だけ数える |
| 終了が「Present」 | 処理した日の月を終了とみなす |
| 年だけで月が無い | 開始は7月、終了は6月とみなし、根拠に「年のみ」と残す |
| 在学中のインターン | 別に数え、職歴の年数には足さない |
| Skills 欄にだけある技術 | 年数は付けず、stated(年数なし)とする |
どの規則にするかは自社で決めることです。 大事なのは、規則が1つに決まっていて、計算の根拠と一緒に残ることです。
2つ目は、確認事項を機械的に作れることです。 not_stated の必須要件はすべて「面談で確かめる」に回り、ビザが not_stated なら、在留資格の確認に要る書類を早めに頼む項目が立ちます。出入国在留管理庁の「技術・人文知識・国際業務」の案内では、大学等の卒業証明書や、関連する業務に従事した期間を証明する在職証明書等が挙がっています。CVの学歴と職歴は、その書類を頼む前の下見になります。
3つ目は、evidence で確認が速くなることです。 経験年数の根拠になった職歴の行が並びます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付フォルダ(Amazon S3) | 保存の通知で Lambda を起動 | CVの受け取り |
| AWS Textract | StartDocumentAnalysis/GetDocumentAnalysis | レイアウトと問い合わせへの答え |
| Claude API | API呼び出し | 項目の書き出し |
| 募集要件の表・呼び名の一覧 | 読み取り | 照らし合わせの基準 |
| 候補者データベース | 読み取りと、承認後の登録 | 過去の応募の確認と、承認されたものの登録 |
| 確認事項の一覧 | 表への書き出し | 採用担当が確認する一覧 |
候補者データベースへの書き込みは、採用担当の承認の後だけです。 応募者へのメールの送信も、この構成からは行いません。最初の連絡は人が書きます。
人が確認する
人が開くのは全件です。ただし見る場所を絞ります。 転記の結果は、unclear と信頼度の低い項目だけをCVの画像と見比べ、それ以外は一覧で流し見ます。
- 求人の番号を確かめる … 照らした募集要件が正しいか
- 職歴の期間と技術を確かめる … 経験年数の根拠の行を
evidenceで見ます。2段組みのCVは、読む順が崩れていないかをここで見ます - 確認事項を直す … 面談で聞くもの、書類を頼むもの、聞かなくてよいものに分けます
- 登録を承認する … 承認したものだけが候補者データベースに載ります
- 直した内容を記録する … どの項目を、どう直したかを残します
2番目を省かないでください。 経験年数は、現場のエンジニアが書類選考で最初に見る値です。ここが誤っていると、書類選考そのものがずれます。
3番目の仕分けは、採用担当にしかできません。 たとえば必須の「Kubernetes の運用経験」が not_stated でも、職歴の説明に「container orchestration」と書かれていれば、面談で聞けば済む項目です。呼び名の一覧に足すべき言い方が見つかったら、その場で一覧の担当へ回します。
目標は、360件をならして1件5分です。 1ページの整ったCVは2〜3分、職歴の多い複数ページのものは10分前後かかる想定です。
例外に対処する
| 起きること | 対応 |
|---|---|
| パスワードで保護されたPDF | 読めない。応募者に送り直してもらう |
| XFA形式のPDF・Word形式 | PDFに変換して入れ直す |
| 英語以外のCV | 問い合わせは英語のみ。別の経路へ回す |
| 文字が小さすぎる | 15ピクセルが下限。下回るものは unclear で人へ |
| 職歴の年月が年だけ | 年だけで写し、経験年数は出力形式の規則で数え、根拠に「年のみ」と残す |
| 「Present」が複数の職にある | 兼業として両方を数える。重なりは1回だけ |
| 求人の番号が無い | 確認事項に出し、担当者が番号を付ける |
| 同じ人の再応募 | メールアドレスで照合し、過去の応募とつなぐ |
| CVでない書類が入った | document_type を見て、写さずに担当者へ戻す |
| OCRが応答しない | 受付フォルダに残す。処理済みへ移すのは成功時だけ |
5行目の「年だけ」はよく起きます。 「2019 - 2022」と書かれた職は、2年なのか4年近いのかが分かりません。数え方の規則を決め、根拠に残しておけば、現場のエンジニアが年数を読み替えられます。
記録を残す
- 元のCVのPDFと、受け取った日時・経路・求人の番号
- OCRが返したJSONの全文(ただし写真の領域の画像は残さない)
- AIが返したJSONと、そのとき参照した募集要件と呼び名の一覧の版
- 経験年数の計算の根拠(どの職のどの期間を数えたか)
- 確認事項の一覧と、採用担当が直した記録
- 候補者データベースへ登録した日時と承認者
- 保存の期限 … 不採用となった応募者の情報をいつ消すかを、自社の規程に合わせて決めておきます
「募集要件の版」を残すのは、要件が求人の途中で変わるためです。 必須の年数を5年から3年に下げた後で、過去の応募者を拾い直すことがあります。どの版で照らしたかが残っていれば、照らし直す範囲が決まります。
04実装レベルの3段階
本記事の想定は半自動化です。 1件15分が5分になります。本格構成に進むには、応募の経路ごとに受け付けの仕組みをつなぐ必要があり、経路の数だけ手間が増えます。 半自動化の確認事項を3か月見て、どの要件が not_stated になりやすいかを数えてからにするほうが、募集要件の書き方の見直しにもつながります。
05工数削減シミュレーション
導入後 360件 × 5分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 海外在住・国内在住の外国籍のエンジニアを通年で募集し、英文のCVをPDFで月に数百件受け取るIT・SaaS企業やメーカーの開発部門、エンジニアを紹介する人材会社。CVの書式が人ごとにばらばらで、候補者データベースへの転記に採用担当の時間が取られている場合。募集要件(必須の技術、経験年数、言語)を求人ごとに文書にしている場合。
- CVが日本語の履歴書・職務経歴書の書式で届く場合(この構成のOCRは英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語しか読めず、問い合わせ(Queries)は英語の文書だけが対象です)。応募が月に数十件で、目視の転記で足りる場合。応募者の採否や順位をAIに付けさせたい場合。なお、書類選考の合否と、在留資格の取得の見込みの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月届いたCVから20件を選ぶ(2段組みのもの、複数ページのもの、ビザの記載が無いものを必ず入れる)
- 20件について、担当者が入力した候補者データベースの値を書き出しておく
- PDFを1件ずつ手元のAIサービスに貼り付ける
- 「このCVから、学歴、職歴(会社・役職・期間・その職で使った技術)、言語の水準、ビザについての記載を写してください。書かれていない項目は『記載なし』としてください。推測で埋めないでください。年齢や婚姻の状況は写さないでください」と指示する
- 出てきた値を、担当者が入力した値と突き合わせる
20件は必ずやってください。 組む前に、「職歴ごとの技術を取り違えずに拾えるか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 職歴ごとの技術と期間が担当者の入力と合う | OCRと照らし合わせの仕組みに進む |
| Skills 欄の技術を全部の職に入れた | 指示の書き方で直る。構成は有効 |
| 2段組みのCVで職歴が混ざった | 画面への貼り付けの限界。 レイアウトの分析を通せば解ける見込み |
3行目は、最小構成ではよく起きます。 貼り付けたときに段の順が崩れているためで、本番ではレイアウトの分析で読む順を取ってから渡します。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| Skills 欄の技術が全部の職に入る | 職歴の説明に書かれた技術だけを写させる |
| 経験年数を生成AIが計算する | 計算を禁じ、規則で数える |
| 日本語の能力を推測で埋める | 「記載なし」とさせ、面談で聞く |
| 2段組みで職歴が混ざる | レイアウトの分析で読む順を取ってから渡す |
| 写真や生年月日がAIに渡る | 前処理で外し、指示でも写させない |
| 技術の呼び名が揺れて別物に数える | 呼び名の一覧でそろえる |
| 「Present」の扱いが担当者で違う | 規則に書き、処理した日を終了とみなす |
| 求人の番号が付いていない | 受け付けの時点で付ける決まりにする |
| 合否の目安をAIに出させたくなる | 出させない。 判断するのは人 |
| 同じ人が別人として登録される | メールアドレスで照合する |
| 不採用の応募者の情報が残り続ける | 保存の期限を決めて消す |
上の3行が、この構成の失敗のほとんどです。 どれも「AIがもっともらしく埋める」ことから出ています。書かれていないことを「記載なし」として残せるかで、確認事項の質が決まります。
5行目は、技術の問題ではなく採用の公正さの問題です。 一度候補者データベースに入った値は、検索や絞り込みに使われます。入れないことでしか防げません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 応募者の氏名・連絡先・現住所の国・学歴・職歴・言語・ビザの状況です。応募者がCVに書いてくる写真、生年月日、婚姻の状況、家族の情報が混ざります。
- 選考に使わない情報を、外部へ渡さず、残さない … 前処理で外し、生成AIにも候補者データベースにも渡しません。本人に責任のない事項や本来自由であるべき事項を採用基準にしないという考え方に沿います
- 合否・順位をAIに付けさせない … 出すのは記載の有無と確認事項までです。書類選考の判断は、採用担当と現場のエンジニアが行います
- 在留資格の見込みを判断しない … 在留資格は出入国在留管理庁の審査で決まります。この構成が出すのは、CVにビザの記載があるかどうかと、頼むべき書類の候補だけです
- 保存の期限と消し方を決める … 不採用の応募者のCVと読み取り結果をいつ消すかを、自社の規程と個人情報の担当に合わせて決めます
- 保存先を暗号化する … 非同期の分析では、結果を自社のバケットに出し、KMSの鍵で暗号化する設定ができます
- アクセスできる人を絞る … 確認事項の一覧は採用担当と、その求人の書類選考を行うエンジニアだけが見られるようにします
誤りが起きた場合のリスクは、推測で埋めた値が選考に使われることと、選考に使わない情報が残ることの2つです。 どちらも「渡さない・埋めさせない」設計で防ぎます。
10まず何から始めるか
1週目:募集要件を表にする
常時出している15件の求人について、必須と歓迎の技術、年数、言語、ビザの扱いを表にします。現場のエンジニアと一緒に決めます。
2週目:20件で試す
先月のCVから20件を選び、手元のAIサービスで項目を写させます。職歴ごとの技術の取り違えと、日本語の能力の推測が無いかを最優先で見ます。
3週目:数え方と除外の決まりを作る
経験年数の数え方(重なり、「Present」、年だけの期間)と、前処理で外す項目の一覧を決めます。外す項目は、人事と個人情報の担当で決めます。
4週目:受付から確認事項の一覧までをつなぐ
S3 の受付フォルダから StartDocumentAnalysis を呼び、前処理、項目の書き出し、要件との照らし合わせまでを作ります。この時点では候補者データベースへ書き込まず、一覧だけを見ます。
2か月目: 承認後の登録を足し、直した内容の記録を毎週見ます。3か月目以降: 1件15分が何分になったかを実測し、not_stated になりやすい要件を数えて募集要件の書き方を見直します。現場のエンジニアの聞き返しが減ったと確かめられた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
StartDocumentAnalysis がS3の文書を非同期で分析し、完了をSNSに通知し、JobId で GetDocumentAnalysis から結果を取ること。分析の種類に LAYOUT・QUERIES があること。ClientRequestToken で二重起動を防げること、JobTag が完了の通知に含まれること、JobId が7日間有効なこと。OutputConfig と KMSKeyId で自社のバケットへの出力と暗号化ができること | AWS: StartDocumentAnalysis | 2026-10-06 |
レイアウトの要素(LAYOUT_SECTION_HEADER・LAYOUT_TEXT・LAYOUT_LIST・LAYOUT_FIGURE など)と、読む順で返り、段組みでは左の段から読むこと | AWS: Layout Response Objects | 2026-10-06 |
問い合わせが質問と Alias を返し、答えに信頼度が付き、見つからなければ空で返ること | AWS: Queries | 2026-10-06 |
| 対応形式がJPEG・PNG・PDF・TIFFでXFA形式は不可、非同期のPDFが500MB・3,000ページまで、パスワード保護のPDFは不可、対応言語が6言語で問い合わせは英語のみ、文字の高さが15ピクセル以上(150dpiで8ポイント)、AnalyzeID が米国のパスポートと運転免許証のみであること | AWS: Set Quotas in Amazon Textract | 2026-10-06 |
| 在留資格「技術・人文知識・国際業務」の該当例に機械工学等の技術者が含まれること。提出書類に大学等の卒業証明書、関連する業務に従事した期間を証明する在職証明書等、ITの技術者の場合の情報処理技術に関する試験・資格の合格証書等が挙がっていること | 出入国在留管理庁: 在留資格「技術・人文知識・国際業務」 | 2026-10-06 |
| 本籍地や家族の職業など「本人に責任のない事項」や、宗教や支持政党など「本来自由であるべき事項」を採用基準にしないことが必要とされていること | 厚生労働省: 公正な採用選考の基本 | 2026-10-06 |
構造化出力を output_config.format で指定でき、スキーマどおりの形で必須の項目が欠けずに返ること | Claude Docs: Structured outputs | 2026-10-06 |
応募者の個人情報の扱いと、在留資格の手続きについては、自社の規程と専門家の確認に従ってください。 本記事は上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0507)についてのご相談はこちらから。
