中途採用の選考の記録と候補者とのやり取りから、内定を出した候補者が承諾するかを見込み、辞退のおそれが高い人と理由の候補を採用担当に示す
中途採用で内定を出した候補者ごとに、選考の記録と候補者とのやり取りから、内定を承諾する確率を見込みます。辞退のおそれが高い候補者と、確率を下げている理由の候補を並べ、採用担当が回答の期限より前に働きかけられるようにします。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Python
- 対象業界
- IT・SaaS/人材/金融
- 対象部門
- 採用
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- 判断に時間がかかる/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 内定を出した候補者について、採用管理システムで選考の経過と面接の記録を読み返す
- 候補者や紹介会社とのメッセージを読み、他社の選考の状況や気にしている点を拾う
- 希望年収と内定の条件の差、回答の期限までの日数を確かめる
- 辞退のおそれを「高い・中くらい・低い」で置き、内定者の一覧に書く
- 週の読み合わせで、担当者どうしで見込みを話し、働きかけの手を決める
- 回答が出たら、承諾か辞退かを一覧に書く。辞退なら理由を聞けた範囲で書く
- 自動毎朝7時に、内定を出して回答を待っている候補者の記録を採用管理システムから取り込む
- 自動候補者と紹介会社とのメッセージから、決まった種類の手がかりだけを取り出す
- 自動選考の記録と手がかりから、承諾の確率を見込む
- 自動確率を下げている理由の候補を、上位3つまで並べる
- 自動確率の低い順に並べた一覧を、採用グループのチャネルに投稿する
- 人採用担当が上位の候補者の記録を開き、理由の候補が当たっているかを確かめる
- 人働きかけの手を決める(現場の社員との面談、条件の説明のし直し、など)
- 人回答が出たら、承諾か辞退かと、聞けた理由を記録する
各工程の詳しい説明を読む
- 内定を出した候補者について、採用管理システムで選考の経過と面接の記録を読み返す
- 候補者や紹介会社とのメッセージを読み、他社の選考の状況や気にしている点を拾う
- 希望年収と内定の条件の差、回答の期限までの日数を確かめる
- 辞退のおそれを「高い・中くらい・低い」で置き、内定者の一覧に書く
- 週の読み合わせで、担当者どうしで見込みを話し、働きかけの手を決める
- 回答が出たら、承諾か辞退かを一覧に書く。辞退なら理由を聞けた範囲で書く
(a)辞退のおそれの読みが人によって違う。 同じ候補者の記録を読んでも、経験の長い担当者は他社の選考の話に敏感で、新しい担当者は見落とします。読みの違いは、読み合わせで話してみるまで表に出ません。
(b)働きかけが回答の期限の直前になる。 読み合わせは週1回なので、木曜に内定を出した候補者は、次の月曜まで誰も見込みを話しません。 期限が1週間なら、働きかけの時間は残りわずかです。
(c)辞退の理由を振り返れない。 辞退のあとに理由を聞けても、一覧に書くのは一言だけです。どんな記録のときに辞退が多かったかを、数で見たことがありません。 毎年同じ型の辞退を、同じように見逃しています。
(d)やり取りを読み返す時間がかかる。 選考が長い候補者ほど、メッセージは数十通になります。紹介会社の担当のメールまで読むと、1人の読み返しに20分以上かかります。
- 【自動】 毎朝7時に、内定を出して回答を待っている候補者の記録を採用管理システムから取り込む
- 【自動】 候補者と紹介会社とのメッセージから、決まった種類の手がかりだけを取り出す
- 【自動】 選考の記録と手がかりから、承諾の確率を見込む
- 【自動】 確率を下げている理由の候補を、上位3つまで並べる
- 【自動】 確率の低い順に並べた一覧を、採用グループのチャネルに投稿する
- 【人】 採用担当が上位の候補者の記録を開き、理由の候補が当たっているかを確かめる
- 【人】 働きかけの手を決める(現場の社員との面談、条件の説明のし直し、など)
- 【人】 回答が出たら、承諾か辞退かと、聞けた理由を記録する
5番目を毎朝にしているのが、第3章の(b)への答えです。 木曜に内定を出した候補者も、金曜の朝には一覧に載ります。新しいメッセージが来れば翌朝の確率が変わるので、他社の内定が出た気配に、週の読み合わせを待たずに気づけます。
6番目で人が見るのは、一覧の上位だけです。 確率の高い候補者は一覧で流し見て、普段どおりの連絡にします。時間を使うのは、確率が低いか、前の日から大きく下がった候補者です。
02今回想定するシステム構成
採用管理システム(選考の記録・内定の条件・メッセージ)/紹介会社とのメール │ CSV の出力とメッセージの書き出し(読み取りのみ) ▼【トリガー】毎朝7時(回答待ちの候補者がいる日) Python(pandas・scikit-learn) ├──▶ 使ってよい項目だけを残す(除く項目は読み込まない) ├──▶ Claude API ── メッセージから決まった種類の手がかりを取り出す(構造化出力) ├──▶ LogisticRegression で承諾の確率を見込み、較正を確かめる └──▶ 係数と特徴量の値から、確率を下げている理由の候補を並べる ▼ 内定者の見込みの一覧(採用グループだけが見られる共有フォルダ) ▼ 採用グループのチャネルに通知 ▼ 【採用担当が上位を確かめ、働きかけの手を決める】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn の LogisticRegression と確率の較正) | R、BigQuery ML |
| 生成AI | Claude API(メッセージからの手がかりの取り出し、構造化出力) | OpenAI API、Gemini API |
| データの取得元 | 採用管理システムの CSV の出力とメッセージの書き出し | 採用管理システムの API |
| 結果の出力先 | 採用グループだけが見られる共有フォルダ | 社内の BI の画面 |
| 通知 | 社内チャットの採用グループのチャネル | メール |
新しく入れるものは、Python の処理と Claude API だけです。 採用管理システムには書き込みません。最初の準備は、特徴量に使ってよい項目と使わない項目の表を、人事部の責任者と決めることです。
承諾の確率は、scikit-learn の LogisticRegression で見込みます。 内定は年に数百件なので、複雑なモデルを使うほどのデータはありません。係数を読めるので、どの特徴量が確率を下げているかを説明しやすいのが選んだ理由です。 公式の説明では、既定で正則化がかかり、C が小さいほど正則化が強くなるとされています。1.8 以降は penalty の指定が非推奨になり、l1_ratio と C で正則化の種類を指定するとされているので、新しく書くコードはこの書き方にします。
メッセージからの手がかりは、Claude API の構造化出力で取り出します。 公式の説明では、output_config.format に type: "json_schema" でスキーマを渡すと、制約付きの生成でスキーマに沿った応答になるとされています。ただし、応答の拒否や上限の長さでの打ち切りのときは、スキーマに合わないことがあるとも書かれています。stop_reason を見て、合わない応答は使わずに担当者に回します。
03どうやって実装するのか
処理の起点を決める
毎朝7時に、回答を待っている候補者をまとめて見込みます。 内定を出した日から、承諾・辞退・取り下げのどれかが記録されるまで、毎朝見込み直します。採用担当が始業してすぐ一覧を見られる時刻にします。
内定を出したその日の午後にも、1回だけ動かします。 内定の通知のあとに候補者から返ってくる最初のメッセージには、「前向きに考えます」か「少しお時間をください」か、本音が出やすいからです。 翌朝まで待つと、他社との比較の連絡が先に入ることがあります。
回答の期限の2日前の朝は、確率に関わらず一覧の先頭に載せます。 期限が近い候補者は、確率が高くても最後の連絡を入れる時期です。確率の順と期限の順は別の列にして、両方で並べ替えられるようにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 選考の経過 | 応募日、各段階の日付、面接の回数、段階のあいだの日数、日程の調整に返事が来るまでの時間 | 採用管理システムの CSV |
| 応募の経路 | 紹介会社・採用サイト・スカウト・社員の紹介 | 同上 |
| 内定の条件 | 職種、提示した年収、希望年収、回答の期限、入社の時期 | 同上 |
| 面接での申告 | 他社の選考の状況(候補者が面接の記録の欄で申告したもの) | 同上 |
| メッセージ | 候補者と紹介会社とのメッセージの本文と日時 | 採用管理システムの書き出し、紹介会社とのメール |
| 過去の結果 | 内定ごとの承諾・辞退と、聞けた辞退の理由 | 採用管理システムの CSV |
使わない項目は、読み込む段階で外します。 採用管理システムには、年齢、性別、住所、家族の状況、健康にかかわる申告などが入っていることがあります。特徴量にしないだけでなく、Python の処理に読み込みません。 読み込んだものは、いつか誰かが特徴量に足します。
質を決めるのは、過去の結果の記録です。 辞退の理由が「一身上の都合」ばかりだと、どの理由の候補が当たっていたかを確かめられません。辞退した候補者に聞けた理由を、決まった選択肢で記録する運用を先に始めます。
紹介会社とのメールは、採用管理システムに取り込まれているものだけを使います。 担当者の個人のメールボックスにだけあるやり取りは、誰が読んでよいかの取り決めがないまま処理に入れません。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 回答待ちの候補者の記録 | 採用管理システムの CSV の出力 | 見込みの対象 |
| 過去2年分の内定と結果 | 同上 | 学習と評価 |
| メッセージ | 採用管理システムのメッセージの書き出し | 手がかりの取り出し |
| 使ってよい項目の表 | 人事部が持つ設定の表 | 読み込む列の決定 |
CSV は、使ってよい項目の表にある列だけを読みます。 表にない列が CSV に増えていても、読み込まずに処理を続け、増えた列の名前を担当者に知らせます。 採用管理システムの改修で、使わない項目の列が増えることがあるからです。
メッセージは、前回の処理より後のものだけを Claude API に渡します。 前回までの手がかりは保存しておき、新しいメッセージの分だけ足します。同じメッセージを毎朝渡すと、費用が日を追って膨らみます。
AIへ渡す前に整形する
- 列の絞り込み … 使ってよい項目の表にある列だけを残します
- 日数の特徴量 … 最終面接から内定までの日数、内定から回答の期限までの日数、日程の調整に返事が来るまでの時間の中央値を作ります
- 年収の差 … 提示した年収と希望年収の差を、希望年収に対する割合にします
- メッセージの整え … 署名、引用、定型のあいさつを落とし、送り手(候補者・紹介会社・自社)を付けます
- 取り除く話題の確認 … 家族、健康、宗教などの語が含まれるメッセージは、該当する文を落としてから渡します
- 時点の固定 … 学習のときは、内定を出してから回答の前日までの記録だけで特徴量を作ります
6番目を守らないと、評価がよく見えすぎます。 辞退した候補者は、回答の日に「他社に決めました」と書きます。この一文が特徴量に入ると、見込みは当たって見えますが、回答の前には存在しない情報です。 学習の行は、回答の前日の時点の記録で作ります。
5番目は、AIへの指示だけに頼らないための処理です。 指示で「拾わない」と書いても、渡した文は読まれます。渡す前に落とせるものは落とし、指示はその後ろの守りにします。
AIに処理させる
Claude API にさせるのは、メッセージから決まった種類の手がかりを取り出すことだけです。 確率の計算と理由の候補の順位付けは、Python の処理で行います。
| 取り出す手がかり | 中身 | 書かれていないとき |
|---|---|---|
| 他社の選考への言及 | 他社の内定・最終面接・選考中への言及の有無と、時期の言及 | false |
| 回答の期限の延長の依頼 | 延長を頼んだか、頼んだ日数 | false |
| 条件への質問 | 年収、働き方(リモート・勤務地)、職務の範囲、入社の時期のどれへの質問か | 空の配列 |
| 前向きな行動 | 入社の手続や書類、入社前の準備についての質問 | false |
| 紹介会社の所感 | 紹介会社の担当が書いた、候補者の気持ちについての一文の写し | null |
確率を出すモデルが使う特徴量は、次のとおりです。
| 特徴量 | 意味 |
|---|---|
| 年収の差の割合 | 提示が希望に届かない幅 |
| 最終面接から内定までの日数 | 待たせた長さ |
| 返事が来るまでの時間の中央値 | 選考中の反応の速さ |
| 他社の選考への言及 | 面接の申告とメッセージのどちらかにあれば1 |
| 延長の依頼 | 依頼があれば1 |
| 条件への質問の数 | 内定のあとに増えたか |
| 前向きな行動 | あれば1 |
| 応募の経路 | カテゴリ |
理由の候補は、係数と特徴量の値から並べます。 候補者ごとに「係数 ×(その人の値 - 過去の内定者の平均)」を特徴量ごとに出し、確率を下げる向きに大きいものから3つを、決めておいた日本語の表現に置き換えます。 理由の文をAIに作らせないので、根拠の無い理由が一覧に載りません。
| させないこと | 理由 |
|---|---|
| 家族・健康・思想などの話題の要約 | 選考と働きかけに使ってはならない情報 |
| 候補者の性格や意欲の評価 | 文面から人柄を推し量らせない |
| 辞退の理由の文章の作成 | 理由の候補は係数から決まった表現で出す |
| 働きかけの手の決定 | 採用担当が候補者との関係を見て決める |
| 条件の見直しの提案 | 人事部長が社内の基準と照らして決める |
2行目がいちばん起きやすい失敗です。 指示が緩いと、「返信が短く、熱意に欠ける印象」のような評価を書きます。評価は確率を動かさなくても、一覧に載れば読む人の見方を変えます。 取り出すのは書かれた事実の有無だけにします。
指示内容を固定する
あなたは採用グループの事務担当です。
内定を出した候補者と、その候補者を紹介した人材紹介会社とのメッセージを読み、
決まった種類の手がかりの有無だけを取り出してください。
【取り出す手がかり】
1. other_offer ... 他社の内定、最終面接、選考中への言及があるか
2. extension_request ... 回答の期限の延長を頼んでいるか。頼んだ日数
3. condition_questions ... 内定の条件への質問。salary / work_style / role / start_date から選ぶ
4. positive_action ... 入社の手続、書類、入社前の準備についての質問があるか
5. agent_note ... 紹介会社の担当が候補者の気持ちについて書いた一文(写すだけ)
【厳守事項】
- 書かれていることだけを答えてください。書かれていなければ false か空にしてください。
- 候補者の性格、意欲、熱意、人柄を評価しないでください。
「返信が短い」「前向きに見える」のような印象を書かないでください。
- 家族、健康、宗教、思想、支持政党、出身地にかかわる内容が含まれていても、
取り出さず、要約もせず、言及があったことも書かないでください。
- agent_note は原文の一文をそのまま写してください。言い換えないでください。
- 他社の社名は書かないでください。言及の有無と時期だけにしてください。
- evidence には、判断の根拠にした原文の一節を写してください。
ただし上の取り出さない内容を含む一節は写さないでください。
- 辞退するかどうかを予想しないでください。
【候補者のメッセージ(前回より後のもの)】{messages}
「言及があったことも書かない」まで書くのは、有無だけでも情報になるからです。 「家族の事情に触れている:あり」という印が一覧に載れば、その印が働きかけや評価に使われるおそれがあります。 取り出さないものは、存在ごと出力から消します。
「他社の社名は書かない」のは、一覧の読み手を守るためです。 社名が載ると、競合への対抗の条件を考え始めます。この一覧の目的は働きかけの順番で、条件の競り合いではありません。
確率を出すモデルの側の設定は、次のとおりです。 こちらは生成AIへの指示ではなく、Python の処理の設定です。
【学習のデータ】
- 対象:過去24か月に内定を出し、承諾か辞退が記録された候補者
- 除く:内定の後に自社の都合で取り消した例、候補者が選考を取り下げた例
- 目的の変数:承諾=1、辞退=0
- 特徴量:回答の前日の時点の記録だけで作る
【モデル】
- LogisticRegression(l1_ratio=0, C=1.0) ※ L2 の正則化
- 数値の特徴量は標準化してから入れる(係数を比べられるようにする)
- 評価:TimeSeriesSplit(n_splits=5)。内定の日の順に並べて分ける
【確率の確かめ方】
- 出した確率と実際の承諾の割合を、10の階級で比べる
- ずれが大きければ CalibratedClassifierCV(method="sigmoid") で較正する
(件数が少ないので isotonic は使わない)
【理由の候補】
- 特徴量ごとに 係数 ×(標準化した値 − 0)を出す
- 確率を下げる向きの大きい順に3つ
- 決めておいた日本語の表現の一覧に置き換える。一覧にない特徴量は出さない
数値の特徴量を標準化するのは、理由の候補を比べるためです。 年収の差の割合と日数では単位が違い、標準化しないと、係数の大きさが単位の違いで決まってしまいます。
評価を内定の日の順に分けるのは、採用の市況が年によって変わるからです。 公式の説明では、TimeSeriesSplit は時間の順のデータで、未来のデータで学習して過去を評価することを避けるためのものとされています。ばらばらに分けると、翌年の辞退の傾向を学んだモデルで前年を評価することになります。
出力形式を固定する
Claude API からは、スキーマで決めた次の形で受け取ります。
{
"candidate_id": "",
"other_offer": { "mentioned": false, "timing": "" },
"extension_request": { "requested": false, "days": 0 },
"condition_questions": ["salary"],
"positive_action": false,
"agent_note": null,
"evidence": [""]
}
一覧には、Python の処理が次の形で書き出します。
{
"run_id": "",
"as_of": "YYYY-MM-DD",
"candidate_id": "",
"job_family": "",
"offer_date": "",
"deadline": "",
"p_accept": 0.0,
"p_accept_prev": 0.0,
"reasons": ["希望年収との差が大きい", "他社の選考に触れている", "期限の延長を頼まれた"],
"flags": ["drop_since_yesterday", "deadline_in_2days"],
"evidence_refs": [""]
}
1つ目の理由は、手がかりと確率を別の層に置けることです。 手がかりはAIが埋め、確率と理由の候補は Python の処理が決めます。手がかりの取り出しに誤りがあれば、evidence で原文に戻って確かめられます。
2つ目は、p_accept_prev で前の日との差が見えることです。 確率そのものより、下がったことのほうが働きかけのきっかけになります。 drop_since_yesterday は、前の日から10ポイント以上下がった候補者に付けます。
3つ目は、reasons が決まった表現だけになることです。 表現の一覧は人事部が決め、一覧にない言い回しは出てきません。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 採用管理システム | CSV の出力とメッセージの書き出し(読み取りのみ) | 選考の記録、内定の条件、メッセージ、結果 |
| Claude API | API 呼び出し(構造化出力) | メッセージからの手がかりの取り出し |
| 共有フォルダ | ファイルの書き出し | 見込みの一覧、評価の結果 |
| 社内チャット | 採用グループのチャネルへの通知 | 上位の候補者と、確率が下がった候補者 |
採用管理システムには書き込みません。 確率や理由の候補が候補者の記録に残ると、次に同じ候補者が応募したとき、あるいは入社した後に、誰かの目に触れます。 一覧は採用グループだけが見られる場所に置き、回答が出たら見込みの欄を閉じます。
面接官と配属先には一覧を見せません。 確率を知った面接官や配属先の部長が候補者と話すと、話し方が変わり、それ自体が回答に影響します。 働きかけを頼むときは、「この点の説明をお願いしたい」と、理由の候補を言い換えて伝えます。
人が確認する
人が見るのは、一覧の上位と、確率が下がった候補者です。
drop_since_yesterdayを先に見る … 前の日から確率が下がった候補者。新しく届いたメッセージのevidenceを読みます- 確率の低い順に上位を見る … 理由の候補が、記録とメッセージに照らして当たっているかを確かめます
- 働きかけの手を決める … 現場の社員との面談、条件の説明のし直し、配属先からの連絡などから選びます
- 条件の見直しが要りそうなら人事部長に上げる … 採用担当の判断で条件を変えません
- 回答を記録する … 承諾か辞退かと、辞退なら聞けた理由を決まった選択肢で記録します
2番目で理由の候補が外れていたら、それを記録します。 「年収の差」と出たのに、実際は入社の時期が合わないことが気がかりだった、という具合です。外れの記録がたまると、特徴量に足すべき手がかりが分かります。
目標は、30件をならして1件10分です。 上位の数人は記録とメッセージを読み直すので20分ほど、それ以外は一覧で流し見て数分です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 構造化出力の応答が拒否か打ち切りで終わる | その候補者の手がかりは前回の値のままにし、担当者に知らせる |
| メッセージが1通も無い | 手がかりを空にし、「やり取りなし」の印を付けて担当者へ |
| 紹介会社の経由で、候補者本人とのやり取りが無い | 紹介会社のメッセージだけで取り出し、その旨の印を付ける |
| 過去の内定が少ない職種 | 職種のカテゴリをまとめて見込み、「データ少」の印を付ける |
| CSV に使わない項目の列が増えた | 読み込まずに処理を続け、列の名前を担当者に知らせる |
| 回答の期限が未設定 | 期限の特徴量を欠損として扱い、担当者に期限の設定を促す |
| 候補者が選考を取り下げた | 見込みの対象から外し、一覧から消す |
| 評価の成績が前の月より大きく落ちた | 一覧に注意書きを付け、モデルの見直しを担当に知らせる |
上から3行目は、紹介会社の経由の候補者の半分で起きます。 紹介会社の担当の一文が、候補者の本音にいちばん近いことが多いので、紹介会社とのメールを採用管理システムに取り込む運用が、この構成の精度を決めます。
記録を残す
- 処理を動かした日時、読み込んだ列の一覧、使ってよい項目の表の版
- Claude API に渡したメッセージの範囲と、返った手がかりの JSON
- モデルの版、係数、較正の結果、評価の成績
- 候補者ごとの確率、理由の候補、前の日との差
- 採用担当が理由の候補を外れと判断した記録
- 回答の結果と、聞けた辞退の理由
1つ目で「使ってよい項目の表の版」を残すのは、何を使って見込んだかを後から説明するためです。 候補者から自分の情報の扱いを問われたときに、その日にどの項目を使ったかを示せます。
04実装レベルの3段階
最小構成では毎朝の見込みはできません。 確かめるための段階です。 半自動化で、1件30分が18分程度になります。 手がかりは並びますが、辞退のおそれの見立ては人が行います。本格構成で10分になり、この段階が本記事の想定です。 差が大きいのは、確率の順に並ぶことで、見るべき候補者を人が選ばなくてよくなるからです。 段階を飛ばさないでください。 半自動化を3か月回すと、辞退の理由の記録がたまり、理由の候補が当たっているかを確かめる材料ができます。 材料が無いまま確率を出すと、もっともらしい理由が並ぶだけになります。
05工数削減シミュレーション
導入後 30件 × 10分 ÷ 60 = 5 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- エンジニアや営業などの中途採用で毎月数十人に内定を出し、内定の辞退が採用の計画を崩しているIT・SaaSの会社や金融機関。採用管理システムに選考の段階ごとの日付、内定の条件、候補者とのメッセージが2年分ほど残っている場合。内定者ごとの辞退のおそれを、採用担当が週の打ち合わせで経験から読み合わせている場合。人材紹介会社が自社の採用を代行する場合も含む。
- 内定が月に数人で、採用担当が全員と毎週話せている場合。採用管理システムに選考の記録が残っておらず、メールと表計算に散らばっている場合(記録の整備が先)。過去の内定の件数が少なく、承諾と辞退の傾向を数で見られない場合。なお、内定を出すか、条件を見直すか、どの候補者にどう働きかけるかの判断は、この構成では代替できません。見込みを選考の合否や内定の取り消しに使うこともできません。
07最小構成で試す方法
- 過去1年分の内定者から、承諾した人と辞退した人を20人ずつ選ぶ
- 回答の前日までのメッセージを、手元のAIサービスに1人ずつ貼り付ける
- 「このやり取りから、他社の選考への言及、回答の期限の延長の依頼、条件への質問、入社の手続についての質問の有無だけを答えてください。人柄や意欲を評価しないでください。家族や健康の話題は取り出さないでください」と指示する
- 出てきた手がかりと、希望年収との差、最終面接から内定までの日数を、表計算に並べる
- 承諾した人と辞退した人で、手がかりの出方がどれだけ違うかを見る
モデルを組む前に、「手がかりが承諾と辞退を分けるか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 辞退した人に他社の言及や延長の依頼が偏っている | モデルと毎朝の一覧に進む |
| 違いが年収の差にしか出ない | 手がかりが足りない。面接での申告の欄を整える |
| 人柄の評価や家族の話題が出てくる | 指示と前処理で落とす。落とせるまで先に進まない |
3行目が出たら、そこで止まってください。 モデルの成績より先に、使ってはならない情報が出力に混ざらないことを確かめるのが、この構成の前提です。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 評価が良いのに本番で外れる | 回答の前日までの記録だけで特徴量を作る |
| 人柄や意欲の評価が出力に混ざる | 指示で禁じ、手がかりを有無と原文の写しに限る |
| 家族や健康の話題が拾われる | 渡す前に文を落とし、指示で存在ごと出力から消す |
| 使わない項目が特徴量に紛れ込む | 使ってよい項目の表にない列を読み込まない |
| 確率が実際の承諾の割合とずれる | 10の階級で比べ、ずれれば sigmoid で較正する |
| 理由の候補が当たらない | 外れの記録をため、特徴量に足すべき手がかりを探す |
| 一覧が面接官や配属先に回る | 閲覧を採用グループに限り、頼むときは言い換える |
| 確率で条件を下げる・取り消す使い方が出る | 目的を働きかけの順番に限ると明文化する |
| 構造化出力の応答が途中で切れる | stop_reason を見て、前回の値を使い担当者へ |
| 紹介会社のメールが入っていない | 採用管理システムに取り込む運用を紹介会社と決める |
上の3行が、この構成の失敗のほとんどです。 1行目は精度の問題、2行目と3行目は使ってはならない情報の問題です。後者は精度がいくら高くても、一覧を使えなくします。
下から3行目を最初に決めておいてください。 確率が出ると、「辞退しそうなら条件を下げてよいのでは」という使い方を思いつく人が必ず出ます。目的を文書にしておけば、そこで止められます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 候補者の氏名と連絡先、選考の経過、希望年収と内定の条件、候補者と紹介会社とのメッセージです。候補者の転職の事情や在職中の会社が分かる情報で、本人に知られずに扱われることへの不安が大きいものです。
- 使ってよい項目を文書で決める … 厚生労働省は、社会的差別の原因となるおそれのある個人情報などは、職業安定法第5条の5と指針により原則として収集が認められないとしています。特徴量の表を人事部の責任者が承認し、版を残します
- 候補者への説明を確かめる … 応募者向けの個人情報の取扱いの説明に、選考と内定のあとの連絡のために記録を分析することが含まれているかを確かめます。含まれていなければ、運用を始める前に説明を見直します
- 外部のAIに渡す範囲を絞る … Claude API に渡すのは、整えたメッセージの本文だけです。氏名、連絡先、年収は渡しません
- 閲覧を採用グループに限る … 確率と理由の候補は、面接官、配属先、候補者本人の上司になる人に見せません
- 選考の判断に使わない … 見込みは内定を出した後だけに使い、選考の合否や内定の取り消しには使いません
- 回答が出たら見込みを閉じる … 承諾した候補者の確率が入社後に残らないよう、一覧から外し、ログは採用グループだけが見られる場所に期間を決めて残します
誤りが起きた場合のリスクは、辞退の気配を見逃すことと、使ってはならない情報が判断に入り込むことの2つです。 前者は働きかけが遅れるだけですが、後者は公正な採用選考の考え方そのものに反します。 精度より先に、後者を設計で守ります。
10まず何から始めるか
1週目:使ってよい項目の表を決める
採用管理システムの列を全部並べ、特徴量に使ってよいもの、使わないもの、読み込まないものに分けます。人事部の責任者が承認し、版を付けて残します。
2週目:40人で試す
第8章のとおり、承諾した人と辞退した人のメッセージから手がかりを取り出させます。人柄の評価や家族の話題が出てこないかを最優先で見ます。
3週目:辞退の理由の記録を始める
辞退した候補者に聞けた理由を、決まった選択肢(年収、働き方、職務、他社の条件、入社の時期、その他)で記録する運用を始めます。
4週目:毎朝の手がかりの一覧を出す
Python と Claude API で、回答待ちの候補者の手がかりを毎朝一覧にします。この時点では確率を出さず、手がかりの取り出しの当否だけを見ます。
2か月目: 過去2年分の内定で LogisticRegression を学習し、較正を確かめて確率と理由の候補を足します。3か月目以降: 理由の候補の外れの記録を見て特徴量を見直し、1件30分が何分になったかを実測します。確率の下がった候補者に期限の前に働きかけられた件数が見えた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 公正な採用選考の基本が、応募者の基本的人権を尊重することと、適性・能力に基づいた基準で行うことであること。本人に責任のない事項(本籍地、家族の職業など)と本来自由であるべき事項(宗教、支持政党など)を基準にしないこと。社会的差別の原因となるおそれのある個人情報などは、職業安定法第5条の5と指針により原則として収集が認められないこと | 厚生労働省: 公正な採用選考の基本 | 2026-10-08 |
LogisticRegression が既定で正則化をかけ、C が小さいほど正則化が強いこと。coef_ で特徴量の係数を持つこと。predict_proba で確率を返すこと。1.8 で penalty が非推奨になり、l1_ratio と C で指定すること。class_weight='balanced' の重みの付け方 | scikit-learn: LogisticRegression | 2026-10-08 |
較正された分類器では predict_proba の値を確からしさとして読めること。sigmoid が少ないデータで効き、isotonic は少ないデータで過学習しやすいこと。信頼度の図(calibration_curve)での確かめ方 | scikit-learn: Probability calibration | 2026-10-08 |
| TimeSeriesSplit が時間の順のデータを分け、未来のデータで学習して過去を評価することを避けるためのものであること | scikit-learn: TimeSeriesSplit | 2026-10-08 |
Claude API の構造化出力が output_config.format に type: "json_schema" でスキーマを渡し、制約付きの生成でスキーマに沿った応答を返すこと。拒否や上限の長さでの打ち切りのときはスキーマに合わないことがあること | Claude Docs: Structured outputs | 2026-10-08 |
どの情報を見込みに使ってよいか、候補者にどう説明するかは、人事部の責任者と自社の個人情報の担当で決めてください。 本記事は公開されている資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1023)についてのご相談はこちらから。
