新しい応募が届いたときに、過去の応募者と選考の記録を氏名の表記ゆれ・メールアドレス・電話番号・経歴で探し、重複応募と過去の選考結果を採用担当に示す
新しい応募が届くたびに、過去の応募者と選考の記録から同じ人の候補を探します。氏名の表記ゆれ・メールアドレス・電話番号・経歴で照らし、重複応募か再応募かと、過去の選考の経緯を根拠の記録付きで採用担当に示します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- 人材/小売/物流/飲食
- 対象部門
- 採用
- 対象業務
- 台帳・マスタ管理/情報検索
- 主な課題
- 人手が足りない/情報が見つからない/確認ミスが多い
- AIで行う処理
- 検索(RAG)
- 主な効果
- 入力漏れ削減/対応スピード向上/検索時間短縮
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 応募が採用管理の仕組みに入ると、登録センターの担当が応募を開く
- 氏名の漢字で採用管理の仕組みを検索し、当たらなければカタカナ、旧姓らしいもの、姓だけで検索し直す
- メールアドレスと電話番号で検索する
- 当たった記録を開き、同じ人かを生年月日・住所の市区町村・経歴で見比べる
- 同じ人なら、過去の段階と結果、担当の支店を読む
- 重複の印を付け、過去に担当した支店に連絡するか、新しい応募として面談を案内する
- 自動応募が採用管理の仕組みに入ると、氏名・カナ・メールアドレス・電話番号・生年月日・経歴の表記をそろえる
- 自動過去の応募者の索引を、メールアドレス・電話番号の一致、氏名のあいまい検索、経歴の文字の一致を組み合わせて1回で検索する
- 自動上位の候補について、項目ごとに一致・不一致を規則で照らす
- 自動規則で `same_contact` / `likely_same` / `possible` / `no_match` を付ける
- 自動生成AIが、候補ごとの一致する点と違う点、過去の選考の経緯を、根拠の記録の番号付きで短くまとめる
- 人採用担当が `same_contact` と `likely_same` の候補を見て、同じ人かを決める
- 人同じ人なら記録をつなぎ、過去の担当の支店に知らせるか、面談を案内するかを決める
各工程の詳しい説明を読む
- 応募が採用管理の仕組みに入ると、登録センターの担当が応募を開く
- 氏名の漢字で採用管理の仕組みを検索し、当たらなければカタカナ、旧姓らしいもの、姓だけで検索し直す
- メールアドレスと電話番号で検索する
- 当たった記録を開き、同じ人かを生年月日・住所の市区町村・経歴で見比べる
- 同じ人なら、過去の段階と結果、担当の支店を読む
- 重複の印を付け、過去に担当した支店に連絡するか、新しい応募として面談を案内する
(a)表記ゆれで見つからない。 「齋藤」と「斉藤」、「タナカ」と「タナカ」、姓と名の間の空白の有無で、検索に当たらない記録があります。 担当ごとに検索のし直し方が違い、見つけられるかが人によって変わります。
(b)同じ人に二重に連絡する。 同じ人が2つの求人サイトから同じ日に応募すると、2つの支店から別々に面談の案内が届きます。 応募者からは、同じ会社から何度も電話が来るように見えます。
(c)過去の経緯を知らずに連絡する。 以前に就業していた人に、初めての応募者と同じ説明の電話をしてしまいます。過去の担当の支店が経緯を知っていても、受付の段階でつながっていません。
(d)検索の時間が足りない。 1件ごとに検索を何度もやり直すと、応募の多い月曜と月初に受付が追いつかず、最初の連絡が翌日に回ります。 応募の直後に連絡がつくかどうかは、面談に来てもらえるかを左右します。
- 【自動】 応募が採用管理の仕組みに入ると、氏名・カナ・メールアドレス・電話番号・生年月日・経歴の表記をそろえる
- 【自動】 過去の応募者の索引を、メールアドレス・電話番号の一致、氏名のあいまい検索、経歴の文字の一致を組み合わせて1回で検索する
- 【自動】 上位の候補について、項目ごとに一致・不一致を規則で照らす
- 【自動】 規則で
same_contact/likely_same/possible/no_matchを付ける - 【自動】 生成AIが、候補ごとの一致する点と違う点、過去の選考の経緯を、根拠の記録の番号付きで短くまとめる
- 【人】 採用担当が
same_contactとlikely_sameの候補を見て、同じ人かを決める - 【人】 同じ人なら記録をつなぎ、過去の担当の支店に知らせるか、面談を案内するかを決める
4番目の区分は、規則で決めます。 どの項目が一致したかで決まり、AIの言い回しや検索の点数では決めません。 点数は候補を並べる順に使うだけです。
6番目で人が決めるのは、記録をつなぐと取り消しにくいからです。 別人の記録を1人にまとめると、その人に別の人の過去の経緯が付いたまま選考が進みます。
02今回想定するシステム構成
新しい応募(求人サイト4社・自社サイト → 採用管理の仕組み) ▼【トリガー】応募の登録 AWS Lambda ── 氏名・カナ・メールアドレス・電話番号・生年月日の表記をそろえる ▼ Amazon OpenSearch Service(過去の応募者の索引) │ ハイブリッドクエリ:メールの一致 + 電話の一致 + カナのあいまい検索 │ + 漢字の氏名 + 経歴の文字の一致 │ 正規化プロセッサーで点数をそろえて並べる ▼ AWS Lambda ── 上位の候補を項目ごとに照らす │ (same_contact / likely_same / possible / no_match) ▼ Claude API ── 一致する点・違う点と過去の経緯の要約(根拠の記録の番号付き) ▼ 【採用担当が判断】──▶ 採用管理の仕組み(記録をつなぐのは人)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(ハイブリッドクエリ、あいまい検索、日本語の解析) | Vertex AI Search(Agent Search)、Azure AI Search |
| 生成AI | Claude API(候補の一致点・相違点と過去の経緯の要約) | OpenAI API、Gemini API |
| 連携 | AWS Lambda(応募の登録を起点に表記をそろえ、検索と照合を動かす) | AWS Step Functions |
| 保管 | Amazon S3(検索と判断の記録) | 社内のデータベース |
採用管理の仕組みは、新しく足すものではありません。 過去の記録は毎晩の書き出しで索引に写し、索引から採用管理の仕組みへは書き込みません。 索引は検索のための写しで、元の記録が正です。 応募の登録を知らせる方法と書き出しの方法は、仕組みごとに違うため、利用環境に応じた個別の作りになります。
検索の土台は、Amazon OpenSearch Service です。 日本語の解析のためのプラグイン(kuromoji、ICU、日本語向けに勧められている Sudachi)が使えます。完全一致・あいまい検索・日本語の文字の一致を1回の検索で組み合わせられることが、この構成に合っています。
組み合わせには、ハイブリッドクエリを使います。 複数の問い合わせの点数を1つにまとめる問い合わせで、中に入れられる問い合わせは最大5つです。 文書は、どれか1つの問い合わせに当たれば結果に入ります。点数のまとめ方は、検索パイプラインの正規化プロセッサーで決めます。
03どうやって実装するのか
処理の起点を決める
採用管理の仕組みに応募が登録されたことを起点にします。 1件ずつ届いた順に検索し、応募の画面に候補を出してから担当が開くようにします。担当が開いた時点で候補が出ていないと、これまでどおり手で検索し始めます。
過去の記録の索引は、毎晩の書き出しで更新します。 当日の応募同士の重複(同じ日に2つの求人サイトから応募した人)は毎晩の更新を待てないので、当日の応募だけを入れる小さな索引を別に持ち、応募のたびに書き足します。 検索は2つの索引に同時にかけます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 新しい応募 | 氏名(漢字・カナ)、メールアドレス、電話番号、生年月日、住所の市区町村、直近の勤務先、応募経路 | 採用管理の仕組み |
| 過去の応募者の索引 | 同じ項目と、応募の番号、応募日 | 毎晩の書き出し |
| 過去の選考の記録 | 段階(応募・面談・登録・就業・就業終了)、結果の区分、日付、担当の支店 | 毎晩の書き出し |
| 表記の対応表 | 異体字の対応(齋・斉・斎など)、よくある読みの揺れ | 自社で用意する一覧 |
索引に入れないものを先に決めます。 面談の自由記述のメモ、就業先からの評価の文章、健康や家族に関する記述は入れません。選考の経緯は「段階」「結果の区分」「日付」「支店」の4つで足ります。 理由を知る必要があれば、担当が採用管理の仕組みで元の記録を開きます。
表記の対応表は、最初は小さく始めます。 検索に当たらなかったのに同じ人だった例が出るたびに、その揺れを1行ずつ足します。
データの取得方法を決める
検索は、ハイブリッドクエリ1本で行います。 中に入れる5つの問い合わせは次のとおりです。
| 問い合わせ | 対象の項目 | 何を拾うか |
|---|---|---|
term | メールアドレス(小文字にそろえたもの) | アドレスが同じ人 |
term | 電話番号(数字だけにそろえたもの) | 電話番号が同じ人 |
fuzzy | カナ氏名(全角カタカナ・空白なし) | 1〜2文字の打ち間違い、読みの揺れ |
match | 漢字氏名(日本語の解析をかけたもの) | 姓だけ・名だけの一致、異体字 |
match | 直近の勤務先と学校 | 経歴の重なり |
あいまい検索は、1文字の置き換え・挿入・削除・隣り合う2文字の入れ替えを1回の編集として数えます。 既定の AUTO では、2文字までは完全一致、3〜5文字は1回、6文字以上は2回まで許します。カナ氏名は6文字を超えることが多いので、2回の揺れまで拾います。 別人まで当たりすぎる場合は、prefix_length で先頭の文字を固定します。
電話番号やメールアドレスの一致だけで返る候補は、1件だけのことが多くなります。 正規化プロセッサーの最小最大の方式では、問い合わせの結果が1件だけなら、その文書は1.0になります。 点数が高いことは「一致の根拠が強い」ことと同じではないので、区分は点数ではなく、次の照合で決めます。
filter で、索引の保存期間を過ぎた記録を除きます。 フィルターは5つの問い合わせすべてにかかります。
検索の要求は、おおむね次の形になります。 検索パイプラインの名前を付けて呼び、正規化の方式と問い合わせごとの重みはパイプラインの側に置きます。
POST /applicants,applicants_today/_search?search_pipeline=dup-pipeline
{
"size": 10,
"query": {
"hybrid": {
"queries": [
{ "term": { "email_norm": "[email protected]" } },
{ "term": { "phone_norm": "09012345678" } },
{ "fuzzy": { "kana_norm": { "value": "サトウタロウ", "fuzziness": "AUTO" } } },
{ "match": { "kanji_name": "佐藤 太郎" } },
{ "match": { "career_text": "株式会社〇〇物流 〇〇高等学校" } }
],
"filter": { "range": { "retention_until": { "gte": "now/d" } } }
}
}
}
重みは、連絡先の2つを高く、経歴を低く置きます。 経歴の文字の一致は、同じ地域の同じ会社に勤めていた別人を多く拾うためです。重みを変えても区分の規則は変わらないので、画面に並ぶ順だけを見ながら調整できます。
AIへ渡す前に整形する
- 文字の幅と形をそろえる … 半角カナを全角に、全角英数を半角に、互換の文字を正規化します
- カナ氏名をそろえる … ひらがなをカタカナに、空白と中黒を除きます。読みが無い求人サイトの応募は、カナの問い合わせを外します
- 漢字氏名をそろえる … 表記の対応表で異体字を代表の字に寄せた値を、元の値と別に持たせます
- メールアドレスをそろえる … 前後の空白を除き、小文字にします
- 電話番号をそろえる … ハイフン・空白・括弧を除き、国番号の付いた番号を国内の形に直します
- 生年月日をそろえる … 西暦の年月日の形にします。無い応募は、照合の項目から外します
- カナの読みの揺れを寄せる … 「ヂ」と「ジ」、「ヅ」と「ズ」、「ヴ」と「ブ」、長音の有無を、表記の対応表で寄せた値を別に持たせます
- 経歴の文字をそろえる … 「株式会社」「(株)」の位置と有無を除き、会社名と学校名だけを並べます
7番目を足すのは、あいまい検索の揺れの回数を節約するためです。 「ヂ」と「ジ」の違いも1回の編集に数えられるので、読みの揺れが2か所ある氏名は、打ち間違いが1つ加わるだけで当たらなくなります。 決まった揺れは先に寄せ、あいまい検索は本当の打ち間違いに残します。
元の値は、必ず残します。 そろえた値は検索と照合のためのもので、採用担当の画面には元の値を並べます。 「齋藤」を「斉藤」に寄せた結果だけを見せると、別の人と同じ表記に見えてしまいます。
AIに処理させる
検索と区分は機械が行います。AIにさせるのは、候補ごとに「何が同じで何が違うか」と「過去にどうなったか」を、記録の番号を付けて短く書くことだけです。
| 書くこと | 中身 | 根拠 |
|---|---|---|
| 一致する点 | どの項目が、どの値で一致したか | 照合の結果 |
| 違う点 | 姓だけが違う、電話番号が違う、など | 照合の結果 |
| 違いの読み方の候補 | 姓の変更の可能性、打ち間違いの可能性 | 「可能性」とだけ書く |
| 過去の経緯 | 段階・結果の区分・日付・支店を時系列で | 選考の記録の番号 |
| させないこと | 理由 |
|---|---|
| 同じ人かどうかの結論 | 区分は規則、最終の判断は人 |
| 過去の結果の評価 | 「以前に辞退したので見込みが低い」などを書かせない |
| 渡していない記録への言及 | 索引に入れていない情報を推測で補わない |
| 記録をつなぐ操作 | 採用管理の仕組みは人が操作する |
2行目がいちばん大事な禁止です。 過去に面談を辞退した人を「意欲が低い」と書けば、今回の応募がその言葉で読まれます。 書くのは事実の時系列だけにします。
それでもAIに書かせるのは、候補が複数あるときの読み比べが重いからです。 同姓同名の候補が3件並ぶと、担当は項目の表を3つ見比べることになります。「この候補は電話番号と生年月日が一致し、姓だけが違う」と1行で書かれていれば、どの候補から開けばよいかがすぐ分かります。過去の経緯も、段階ごとの記録を時系列の数行にまとめるだけで、読む時間が変わります。
指示内容を固定する
あなたは人材派遣会社の登録センターで、新しい応募と、
過去の応募者の候補を見比べる材料を作る立場です。
渡すのは、新しい応募の項目、候補ごとの項目と照合の結果、
候補ごとの過去の選考の記録です。
そこに書かれたことだけを使ってください。
【書くこと】
1. 候補ごとに、一致した項目と値
2. 候補ごとに、違う項目と値
3. 違いについて考えられる事情を、「可能性」として1つまで
(姓の変更、打ち間違い、連絡先の変更)
4. 過去の選考の経緯を、日付の古い順に、段階・結果の区分・支店で
【厳守事項】
- 同じ人である、別の人である、と結論を書かないでください。
- 過去の結果から、応募者の意欲・人柄・適性を評価しないでください。
「辞退した」「就業を終えた」という事実だけを書いてください。
- 渡していない情報(理由、評価、メモ)を推測で補わないでください。
- 経緯の各行には、根拠にした記録の番号を付けてください。
- 年齢、性別、国籍、家族、健康に触れないでください。
- 候補が無い場合は、「候補なし」とだけ書いてください。
【新しい応募】{new_application}
【候補と照合の結果】{candidates}
【候補ごとの選考の記録】{history}
「評価しないでください」を書かないと、経緯の後ろに一言の見立てを付けます。 「辞退が2回あり、連絡がつきにくい可能性があります」のような文です。その一文は記録のどこにも無く、AIが作った評価です。
「年齢、性別、国籍…に触れない」は、生年月日を照合に使っているためです。 照合の材料に生年月日があると、要約の中で年齢に言い換えることがあります。
出力形式を固定する
区分と照合の結果はプログラムが作り、AIの出力はその隣に並べます。 Claude API の構造化出力で、次の形のJSONを受け取ります。
{
"application_id": "",
"candidates": [
{
"candidate_id": "",
"class": "same_contact | likely_same | possible | no_match",
"matched": [ { "field": "", "value": "" } ],
"differed": [ { "field": "", "new": "", "past": "" } ],
"possible_reason": "",
"history": [
{ "date": "", "stage": "", "result": "", "branch": "", "record_id": "" }
]
}
]
}
class はプログラムが入れ、AIには書き換えさせません。 区分の規則は次のとおりです。
| 区分 | 規則 |
|---|---|
same_contact | メールアドレスか電話番号が一致し、生年月日が一致するか、どちらかに無い |
likely_same | 連絡先は違うが、カナ氏名(揺れ2回以内)と生年月日が一致する。または、姓だけが違い、名と生年月日と直近の勤務先が一致する |
possible | カナ氏名か漢字氏名が近く、直近の勤務先か学校が一致する |
no_match | 上のどれにも当たらない |
history の record_id は、Python が渡した記録の番号と照らします。 渡していない番号や、日付が記録と違う行があれば、その候補の要約を出さずに照合の結果だけを見せます。
応募の画面には、たとえば次のように並べます。
【候補1】likely_same
一致:カナの名(ハナコ)/漢字の名(花子)/生年月日/直近の勤務先
違い:姓(過去:佐藤 → 今回:田中)/メールアドレス/電話番号
可能性:姓の変更
経緯:2023-04-10 応募(渋谷支店)R-208811
2023-04-14 面談・登録(渋谷支店)R-208940
2023-05-01〜2024-03-31 就業・就業終了(渋谷支店)R-209377
【候補2】possible
一致:カナ氏名(揺れ1回)
違い:生年月日/連絡先/経歴
理由の1つ目は、区分の規則を後から変えられることです。 規則を変えても、AIの出力をやり直さずに区分だけを付け直せます。 2つ目は、画面の並びを区分の順に固定できることです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 採用管理の仕組み | 応募の登録の通知と、毎晩の書き出し | 利用環境に応じた個別の作り |
| Amazon OpenSearch Service | ハイブリッドクエリ(検索パイプライン付き) | 候補の検索 |
| Claude API | API呼び出し(構造化出力) | 一致点・相違点・経緯の要約 |
| 採用管理の仕組みの応募の画面 | 候補の表示 | 記録をつなぐのは人 |
採用管理の仕組みへは書き込みません。 画面に候補を出すまでで、記録をつなぐ操作、支店への連絡、面談の案内は人が行います。
人が確認する
same_contactは元の値を並べて確かめる … 家族で同じメールアドレスや電話番号を使っていることがあります。氏名と生年月日の一致まで見ますlikely_sameは違う点を読む … 姓だけが違う、連絡先が変わった、のどちらかが多くあります- 同じ人と決めたら、採用管理の仕組みで記録をつなぐ … どの候補とつないだかを記録します
- 過去の担当の支店に知らせるかを決める … 就業中・就業を終えたばかりの人なら、その支店に知らせます
possibleは、気になるときだけ開く … 同姓同名の別人が多く含まれます
1番目を省かないでください。 メールアドレスが同じでも、家族の別の人の応募のことがあります。氏名と生年月日まで一致して初めて、同じ人の候補として扱います。
4番目で知らせる先を支店に限るのは、経緯を知っているのが支店だからです。 登録センターから応募者に「以前こういうことがありましたね」と切り出すのではなく、過去の担当が経緯を踏まえて連絡するか、登録センターが初めての応募者と同じように案内するかを、支店と決めます。
目標は、1,200件をならして1件2分です。 no_match の応募は候補が無いことを確かめるだけで、時間は same_contact と likely_same の確認にかかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| カナ氏名が無い応募 | カナの問い合わせを外し、漢字氏名と連絡先で探す |
| 外国籍の応募者でローマ字の氏名 | ローマ字の氏名の項目を別に持ち、あいまい検索をかける |
| 同じ日に2つの求人サイトから応募 | 当日の索引で当てる。面談の案内は1つの支店にまとめる |
| 候補が多すぎる(同姓同名) | possible は上位5件までにし、生年月日の一致を優先する |
| 生年月日が無い | same_contact と likely_same の規則から生年月日を外し、人が確かめる印を付ける |
| 保存期間を過ぎた記録が索引に残る | 毎晩の書き出しで消す。filter でも除く |
| 検索が応答しない | 応募の画面に「候補の検索が未実施」と出す。手で検索する |
| 過去の記録どうしがすでに重複している | 候補に同じ人の記録が2件並ぶ。つなぐのは今回の応募と1件だけにし、過去の2件の整理は別の作業に回す |
| 応募者本人から過去の記録の削除を求められている | 削除の手続き中の記録は索引から先に外す |
3行目は、応募者から見て最も不快な形です。 同じ人に2つの支店から電話が来ると、どちらの連絡にも出てもらえなくなります。 当日の索引を作るのは、この1行のためです。
7行目で「未実施」と出すのは、「候補なし」と区別するためです。 検索が止まっていたのに候補なしと見えると、重複を見逃したまま面談を案内します。
記録を残す
- 応募の番号と、検索にかけたそろえた値
- 検索で返った候補と点数、照合の結果と区分
- AIが返したJSONと、記録の番号の照合の結果
- 人が同じ人と決めた記録(どの候補とつないだか)と、別人と決めた記録
- 検索が応答しなかった応募の一覧
区分ごとに、人が同じ人と決めた割合を毎月数えます。 same_contact で別人が多ければ家族の連絡先の共有、likely_same で別人が多ければ規則が緩すぎる、という見当がつきます。規則を直すかどうかは、この割合で決めます。
別人と決めた記録も残すのは、同じ組み合わせが繰り返し候補に出るためです。 一度別人と決めた2人は、次の応募で候補の順を下げるのに使えます。ログ自体も個人情報なので、採用管理の仕組みと同じ保存期間で消します。
04実装レベルの3段階
本記事の想定は本格構成です。 1件5分が2分になります。半自動化の一覧では、担当が一覧と応募の画面を行き来する時間が残ります。 応募の画面に候補が出て初めて、手で検索し直す習慣がなくなります。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、表記の対応表に足すべき揺れと、生年月日が入っていない求人サイトが先に分かります。
05工数削減シミュレーション
導入後 1,200件 × 2分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 複数の求人サイトと自社サイトから応募を受け、月に千件を超える応募を受け付ける人材派遣会社・人材紹介会社と、店舗や物流拠点で通年の採用を続ける小売・物流・飲食の企業。同じ人が別の求人サイトから、あるいは数年おいて応募し直してくることが多く、採用担当が氏名・メールアドレス・電話番号で採用管理の仕組みを何度も検索している場合。過去の応募と選考の記録を数万件以上持っている場合。
- 応募が月に数十件で、氏名の検索で足りる場合。応募の受付を1つの求人サイトに絞っており、その仕組みの重複の検知で足りる場合。過去の応募者の記録を保存期間の定めなく持ち続けている場合(先に保存期間を決めます)。なお、同じ人かどうかの最終の判断と、過去の結果を選考でどう扱うかの判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の応募から50件を選ぶ(後から同じ人だと分かった応募、姓が変わった人、同じ日に2つのサイトから応募した人を入れる)
- その50件について、担当が最終的にどの記録とつないだかを書き出しておく
- 採用管理の仕組みから、その50件の候補になりそうな過去の記録を数百件書き出し、氏名・カナ・メールアドレス・電話番号・生年月日・直近の勤務先の列だけを残す
- 表計算で表記をそろえる列を作り、メールアドレス・電話番号・カナ氏名の一致を関数で見る
- 当たった候補と、担当がつないだ記録を突き合わせる
生成AIを使わずに始めてください。 まず確かめたいのは、表記をそろえるだけで、どれだけの重複が見つかるかです。
| 出てきた内容 | 判断 |
|---|---|
| 担当がつないだ記録のほとんどが当たった | 索引とハイブリッドクエリに進む |
| 姓の変わった人だけが当たらない | カナの名と生年月日の組み合わせを足す。構成は有効 |
| 別人が大量に当たる | 生年月日の入り方の確認が先。 求人サイトごとの項目を見直す |
2行目は、ほぼ確実に出ます。 姓が変わった人は、メールアドレスも変えていることが多いからです。名と生年月日の一致を likely_same の規則に入れる理由が、ここで確かめられます。
50件の中に、担当が見つけられなかった重複が混ざっていることもあります。 表計算の一致で当たったのに、当時は新しい応募者として扱われていた組み合わせです。それを数えておくと、第3章の(a)がどのくらいの頻度で起きていたかが分かり、索引を作るかどうかの判断の材料になります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 検索の点数で同じ人と決めてしまう | 区分は項目ごとの照合で決める。 点数は並べる順だけ |
| 1件だけ返った候補が1.0になり強く見える | 最小最大の正規化の性質。区分を見て判断する |
| AIが過去の結果から評価を書く | 評価を禁じ、事実の時系列だけにする |
| 自由記述のメモまで索引に入れる | 段階・結果の区分・日付・支店の4つに絞る |
| 姓が変わった人が当たらない | 名と生年月日の組み合わせを規則に入れる |
| 家族の応募を同じ人とつなぐ | 連絡先の一致だけでつながず、氏名と生年月日まで見る |
| 同じ日の重複が当たらない | 当日の索引を別に持つ |
| 異体字を寄せた値だけを見せる | 画面には元の値を並べる |
| あいまい検索が動かない | 高負荷の問い合わせを止める設定(search.allow_expensive_queries)が false だと実行されない |
上の3行が、この構成の失敗のほとんどです。 どれも、機械が出した数字や文章が「判断」に見えてしまうことから出ています。区分は規則、判断は人、という分け方を画面の並びでも崩さないことです。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 応募者の氏名、生年月日、連絡先、住所の市区町村、経歴、そして過去の選考の段階と結果です。職業安定法は、労働者の募集を行う者などに、求職者の個人情報を業務の目的の達成に必要な範囲内で、目的を明らかにして集め、その目的の範囲内で保管・使用することを求めています。
- 重複の見分けを利用目的として明らかにする … 応募の受付のときに示す個人情報の利用目的に、過去の応募との照合が含まれているかを確かめます
- 索引に入れる項目を絞る … 面談のメモ、評価の文章、健康や家族の記述は入れません。索引は、重複の見分けと選考の経緯に要る項目だけにします
- 保存期間を決め、過ぎた記録を消す … 索引だけ古い記録が残ると、採用管理の仕組みで消したはずの情報が検索で出てきます
- 過去の結果で自動的に選考しない … 過去の辞退や就業の終了は、今回の応募の評価ではありません。区分も要約も、選考の判断の材料として扱いません
- 生成AIに渡す範囲を絞る … 渡すのは候補数件分の照合の結果と経緯だけで、索引そのものや生年月日の値は渡しません
- 見られる人を絞る … 候補の表示は、登録センターの担当だけが見られるようにします
誤りが起きた場合のリスクは、別人の記録をつなぐことと、過去の経緯を評価として読むことの2つです。 前者は連絡先の一致だけでつなぐと起き、後者はAIの要約に評価の言葉が混ざると起きます。どちらも、区分を規則に、判断を人に置く設計で防ぎます。
10まず何から始めるか
1週目:索引に入れる項目と保存期間を決める
採用の責任者と個人情報の担当で、索引に入れる項目、入れない項目、保存期間を決めます。応募の受付で示している利用目的に、過去の応募との照合が含まれているかも確かめます。
2週目:50件で試す
表計算で表記をそろえ、メールアドレス・電話番号・カナ氏名の一致で、担当がつないだ記録がどれだけ当たるかを見ます。姓が変わった人が当たるかを最優先で見ます。
3週目:区分の規則を決める
same_contact と likely_same の規則を、2週目の結果を見て決めます。家族の応募をどう見分けるかを、登録センターで合わせます。
4週目:索引とハイブリッドクエリを作る
過去の記録を毎晩書き出して索引に写し、ハイブリッドクエリで候補を一覧に出すところまで作ります。この時点では要約を作らず、区分の一覧だけを見ます。
2か月目: 当日の索引と、応募の画面への表示を足します。3か月目以降: 生成AIの要約を足し、1件5分が何分になったかを実測します。手で検索し直す担当がいなくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
ハイブリッドクエリが複数の問い合わせの点数を1つにまとめ、文書はどれか1つの問い合わせに当たれば結果に入ること。点数は検索パイプラインでまとめること。中に入れられる問い合わせが最大5つであること。filter がすべての問い合わせにかかること | OpenSearch Documentation: Hybrid query | 2026-10-08 |
あいまい検索が置き換え・挿入・削除・隣り合う2文字の入れ替えを1回の編集と数えること。既定の AUTO(AUTO:3,6)で、0〜2文字は完全一致、3〜5文字は1回、6文字以上は2回まで許すこと。prefix_length、max_expansions(既定50)があること。search.allow_expensive_queries が false だと実行されないこと | OpenSearch Documentation: Fuzzy query | 2026-10-08 |
正規化プロセッサーが問い合わせごとの点数を正規化してまとめること。最小最大の方式で0〜1にそろえ、問い合わせの結果が1件だけなどすべて同じ点数ならその文書が1.0になること。weights で問い合わせごとの重み(0〜1、合計1)を指定できること | OpenSearch Documentation: Normalization processor | 2026-10-08 |
| Amazon OpenSearch Service で Japanese (kuromoji) Analysis と ICU Analysis が使え、Sudachi Analysis が日本語向けに勧められていること | AWS: Plugins by engine version in Amazon OpenSearch Service | 2026-10-08 |
Claude の構造化出力を output_config.format に type: "json_schema" を指定して使うこと。enum が使えること | Claude Docs: Structured outputs | 2026-10-08 |
| 職業安定法第5条の5で、労働者の募集を行う者などが、求職者等の個人情報を業務の目的の達成に必要な範囲内で、目的を明らかにして収集し、その目的の範囲内で保管・使用しなければならないこと(本人の同意がある場合その他正当な事由がある場合を除く)、適正に管理するための措置を講じなければならないこと | e-Gov 法令API: 職業安定法 | 2026-10-08 |
過去の応募者の記録をどこまで照合に使うか、保存期間をどう定めるかは、自社の個人情報の取り扱いの定めと、必要に応じて専門家の助言に従ってください。 本記事は上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0952)についてのご相談はこちらから。
