Media > AI活用ユースケース > 人事 > 社内公募やプロジェクトの人選のときに、社員のスキル登録・研修履歴・過去のプロジェクト記録から要件に合う社員を探し、根拠の記録付きで候補を人事へ返す

社内公募やプロジェクトの人選のときに、社員のスキル登録・研修履歴・過去のプロジェクト記録から要件に合う社員を探し、根拠の記録付きで候補を人事へ返す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

プロジェクトや社内公募の要件を入れると、社員のスキル登録・研修履歴・過去のプロジェクト記録から要件に合う社員を探し、候補ごとに根拠の記録を引用付きで並べて人事へ返します。選ぶのは人事と事業部です。

サマリー
生成AI
ChatGPT/Claude/Gemini
AIサービス
Azure AI/Google Vertex AI/OpenSearch
対象業界
IT・SaaS/商社/製造/金融
対象部門
人事/経営企画
対象業務
情報検索/比較検討
主な課題
判断に時間がかかる/属人化している/情報が見つからない
AIで行う処理
検索(RAG)
主な効果
判断支援/属人化解消/検索時間短縮/機会損失防止
導入難易度
★★★★★
実装レベル
本格構成
費用感
RAG・個別開発(大)
人間の確認
条件付き
現在工数
80h/月
AI導入後
20h/月
想定削減
75%
年間削減
720h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 事業部の管理職から人選の依頼書が届く
  2. 人事の担当が、スキルの自己登録を表計算に書き出し、必須のスキルとレベルで絞る
  3. 研修の受講管理から、必須の資格の取得者を書き出し、2番目の一覧と突き合わせる
  4. 残った社員について、プロジェクトの管理の仕組みで体制表と振り返りを1件ずつ開き、経験を確かめる
  5. 担当が知っている人、他の事業部の管理職が推す人を足す
  6. 候補ごとに根拠(どのスキル、どの資格、どのプロジェクト)を書き、依頼した管理職に返す
導入後(After)
  1. 自動スキル登録・研修の受講履歴・体制表を社員番号で結び、社員1名を1件の文書にして検索基盤に登録する
  2. 自動スキルと資格の名前を、社内の共通のコードにそろえる(「AWS SAA」と「AWS認定ソリューションアーキテクト」を同じコードに)
  3. 自動プロジェクトの振り返りを、社員とプロジェクトの組ごとに1件の文書にして登録する
  4. 自動人選の対象から外す社員(休職中、本人が希望しない、異動の直後など)に印を付ける
  5. 人人事の担当が、依頼書から必須のスキル・資格と、必要な数(5つのうち4つ以上など)、あるとよい経験の言葉を入れる
  6. 自動必須の条件を満たす数で社員を絞り、その中で経験の言葉が近い振り返りを探す
  7. 自動Claude が、候補ごとに満たした条件・満たさなかった条件と、根拠の振り返りを引用付きで並べる
  8. 人人事の担当が候補を読み、本人の現在の稼働と希望を確かめ、管理職に返す候補を選ぶ
  9. 人管理職が面談する相手を決める
各工程の詳しい説明を読む
  1. 事業部の管理職から人選の依頼書が届く
  2. 人事の担当が、スキルの自己登録を表計算に書き出し、必須のスキルとレベルで絞る
  3. 研修の受講管理から、必須の資格の取得者を書き出し、2番目の一覧と突き合わせる
  4. 残った社員について、プロジェクトの管理の仕組みで体制表と振り返りを1件ずつ開き、経験を確かめる
  5. 担当が知っている人、他の事業部の管理職が推す人を足す
  6. 候補ごとに根拠(どのスキル、どの資格、どのプロジェクト)を書き、依頼した管理職に返す

(a)表計算の突き合わせで漏れる。 2番目と3番目を社員番号で突き合わせますが、スキルの一覧の名前と研修の資格の名前が一致しません。 「AWS認定ソリューションアーキテクト」と「AWS SAA」が別の行になり、資格を持っている人が落ちます。

(b)経験の中身は自由文にしかない。 4番目で振り返りを読まないと、「金融機関向け」か「基幹システム」かは分かりません。候補が数十名いると全員分は読めず、担当が知っている人から読むことになります。

(c)思い出せる人に偏る。 5番目で足される候補は、人事や管理職が最近関わった人です。別の事業部で同じ経験を積んだ人は、記録に残っていても上がりません。 社内公募でも、募集の情報が届く範囲で応募者が偏ります。

(d)見てはいけない項目が混ざる。 2番目で人事の仕組みから書き出すと、等級や評価、配慮事項が同じ表に並ぶことがあります。その表を管理職に返すと、人選と関係の無い情報が渡ります。

取り込み(毎晩)

  1. 【自動】 スキル登録・研修の受講履歴・体制表を社員番号で結び、社員1名を1件の文書にして検索基盤に登録する
  2. 【自動】 スキルと資格の名前を、社内の共通のコードにそろえる(「AWS SAA」と「AWS認定ソリューションアーキテクト」を同じコードに)
  3. 【自動】 プロジェクトの振り返りを、社員とプロジェクトの組ごとに1件の文書にして登録する
  4. 【自動】 人選の対象から外す社員(休職中、本人が希望しない、異動の直後など)に印を付ける

人選の依頼が来たとき

  1. 【人】 人事の担当が、依頼書から必須のスキル・資格と、必要な数(5つのうち4つ以上など)、あるとよい経験の言葉を入れる
  2. 【自動】 必須の条件を満たす数で社員を絞り、その中で経験の言葉が近い振り返りを探す
  3. 【自動】 Claude が、候補ごとに満たした条件・満たさなかった条件と、根拠の振り返りを引用付きで並べる
  4. 【人】 人事の担当が候補を読み、本人の現在の稼働と希望を確かめ、管理職に返す候補を選ぶ
  5. 【人】 管理職が面談する相手を決める

6番目で、満たす数で絞るのが、この設計の分かれ目です。 必須の条件を「全部」にすると、5つのうち1つの登録が漏れているだけの人が落ちます。「全部」ではなく「いくつ以上」で絞り、満たさなかった条件を候補ごとに見せます。 漏れていたのが登録だけなのか、本当に経験が無いのかは、人事が本人に確かめます。

8番目と9番目を人に残しているのは、人選が処遇に関わる判断だからです。 候補の一覧は材料で、誰に声をかけるかを決めるのは人です。

02今回想定するシステム構成

構成図
【取り込み】スキル登録/研修の受講履歴/体制表と振り返り
   ▼【トリガー】毎晩
AWS Lambda ── 社員番号で結び、スキルと資格の名前を共通のコードにそろえる
   ▼
Amazon OpenSearch Service
   ├─ 社員の索引(スキル・資格のコード、レベル、登録日、所属、対象外の印)
   └─ 経験の索引(社員×プロジェクト。振り返りの文、役割、期間、顧客の業種)

【人選の依頼】人事の担当が必須の条件と経験の言葉を入れる
   ▼
Amazon OpenSearch Service
   ├─ terms_set:必須のコードを「いくつ以上」満たす社員
   ├─ match:経験の言葉(Sudachi+synonym_graph の同義語)
   └─ 項目単位のアクセス制御:人選の役割にはスキルと経験の項目だけ
   ▼
Claude(Amazon Bedrock)── 検索結果のブロックで渡し、引用付きで候補を並べる
   ▼
人事の画面(候補、満たした条件、満たさなかった条件、根拠のプロジェクト)
役割想定する製品代替候補
検索基盤Amazon OpenSearch Service(terms_set、Sudachi、synonym_graph、細かなアクセス制御)Azure AI Search、Vertex AI Search(Agent Search)
生成AIClaude(Amazon Bedrock。候補ごとの根拠を引用付きで並べる)Gemini API、OpenAI API
連携AWS Lambda(毎晩の取り込みと名前のそろえ、検索の呼び出し)AWS Step Functions
保管Amazon S3(取り込みの記録と、人選の記録)―
人事の仕組み既存の人事・研修・プロジェクトの管理の仕組み―

人事の仕組みには、書き込みません。 スキルの登録、研修の記録、体制表は、これまでどおり各仕組みで行います。この構成は、必要な項目だけを毎晩写し、人選のときに横断して引けるようにするだけです。

必須の条件を満たす数は、terms_set クエリで数えます。 公式のドキュメントでは、terms_set は terms クエリに似ていますが、返すのに必要な一致の数を指定できるクエリです。数は、索引の数値の項目(minimum_should_match_field)か、スクリプト(minimum_should_match_script)で決めます。値は大文字小文字や空白まで完全一致なので、名前を共通のコードにそろえる前処理が前提になります。

経験の言葉の揺れは、synonym_graph で吸収します。 公式のドキュメントでは、synonym_graph は synonym の発展版で、複数の語からなる同義語を扱えるとされています。規則は設定に直接書く(synonyms)か、ファイル(synonyms_path)で渡します。

見せる項目の制限は、項目単位のアクセス制御で行います。 Amazon OpenSearch Service の細かなアクセス制御では、役割ごとに見せる項目を含める・除くの一覧で決められます。 項目の値を伏せる field masking もありますが、伏せた項目は検索できなくなるとされています。

03どうやって実装するのか

Step1

処理の起点を決める

取り込みと検索で、起点が2つあります。

取り込みは、毎晩の定時で行います。 スキルの登録、研修の受講、体制の変更は日中に少しずつ起き、人選の検索は翌日以降に使われるので、毎晩で足ります。 毎時にすると、人事の仕組みへの読み取りが増えるわりに、候補の顔ぶれは変わりません。

対象外の印は、取り込みのたびに付け直します。 休職や異動、本人の希望は日々変わります。前の晩の印を残したままにすると、復職した人が候補に出ないことになります。印の元は人事の仕組みの状態で、検索基盤の側で手で付けることはしません。

検索は、人事の担当が人選の依頼を受けて画面で始めたときに動きます。 事業部の管理職が自分で検索する形にはしません。候補の一覧を誰が見たかを人事の側で管理するためです。

Step2

入力データを集める

データ中身取得元
スキル登録社員番号、スキルのコード、レベル(1〜4)、登録日スキルの自己登録
研修の受講履歴社員番号、研修・資格の名前、受講日・取得日、有効期限研修の受講管理
体制表社員番号、プロジェクト番号、役割、期間、稼働の割合プロジェクトの管理の仕組み
振り返りプロジェクト番号、顧客の業種、使った技術、規模、本人のコメントプロジェクトの管理の仕組み
所属と状態社員番号、所属、休職・異動の状態、人選の対象とすることへの本人の希望人事の仕組み
人選の条件(検索時)必須のスキル・資格のコード、満たす数、あるとよい経験の言葉、時期人事の担当の入力

質を決めるのは、スキルと資格の名前の対応表です。 スキルの一覧と研修の資格の名前、プロジェクトの振り返りに書かれた技術の名前を、共通のコードに結ぶ表を人事と事業部で作ります。terms_set は完全一致で数えるので、対応表に無い名前は、持っていても数えられません。

入れないデータも決めておきます。 年齢、性別、国籍、家族の状況、健康に関わる配慮事項、人事評価、給与は、索引に入れません。 人選の材料に要らないうえ、検索基盤に入っていれば、設定の誤り1つで画面に出ます。

Step3

データの取得方法を決める

人事の仕組み、研修の受講管理、プロジェクトの管理の仕組みから、毎晩、必要な項目だけを書き出してもらいます。 書き出しの形は仕組みごとに違うので、Lambda で社員番号を鍵にして結びます。API で取れる仕組みは API で、取れない仕組みは毎晩のファイルの書き出しで受けます。どちらの経路でも、取り込む項目の一覧を人事と情報システムで決めて固定します。

索引は2つに分けます。

索引1件の単位主な項目
社員の索引社員1名skill_codes(keyword、複数値)、cert_codes(keyword、複数値)、スキルごとのレベルと登録日、所属、excluded(対象外の印)
経験の索引社員×プロジェクト社員番号、プロジェクト番号、役割、期間、顧客の業種、review_text(text。Sudachi+同義語)

2つに分けるのは、検索の性質が違うためです。 必須の条件は社員の単位で「いくつ満たすか」を数え、経験はプロジェクトの単位で「どの振り返りが近いか」を探します。先に社員の索引で絞った社員番号の一覧で、経験の索引を絞ります。

スキルのレベルは、コードに含めて持たせます。 「java_3」「java_4」のように、レベルごとに別のコードとしても登録します(レベル4の人には java_3 と java_4 の両方)。「Java のレベル3以上」を terms_set の1つの語として数えられるようにするためです。

Step4

AIへ渡す前に整形する

  1. 名前を共通のコードにそろえる … スキルの一覧、資格の名前、振り返りの技術の名前を、対応表で共通のコードに置き換えます
  2. レベル以上のコードを展開する … レベル4の人に、レベル3以上・レベル2以上のコードも付けます
  3. 資格の有効期限を確かめる … 期限の切れた資格は、コードを付けずに「期限切れ」として別に持ちます
  4. 振り返りから個人の評価を外す … 振り返りに他の社員への評価や、本人の体調に関わる記述があれば、取り込みで外します
  5. 対象外の印を付ける … 人事の仕組みの状態から、休職中、本人が希望しない、異動から一定期間内の社員に印を付けます
  6. 登録日の古さを記録する … スキルの登録日から何年たったかを、項目として持たせます

4番目を軽く見ないでください。 プロジェクトの振り返りには、「〇〇さんの進め方に問題があった」「途中で体調を崩した」のような記述が混ざることがあります。そのまま索引に入れると、経験を探す検索の引用として、人選の画面に出ます。 取り込みの段で、人事が決めた規則で外します。

6番目の登録日は、候補の画面に必ず出します。 3年前に「レベル3」と自己申告したスキルが、いまもレベル3とは限りません。検索の順位には使わず、読む人が判断する材料にします。

Step5

AIに処理させる

AIの仕事は、検索で出た候補を、決まった項目で引用付きで並べることだけです。 候補を絞るのも、経験を探すのも検索基盤で行います。

させること中身
満たした条件の書き出し必須の条件のうち、どれを満たしたかをコードと登録日付きで並べる
満たさなかった条件の書き出し満たさなかった条件を並べる。登録が無いのか、期限切れなのかを分ける
根拠の経験の引用経験の言葉に近い振り返りを、プロジェクト番号・役割・期間付きで引く
確かめるべき点の書き出し登録日が古いスキル、稼働の割合が高い現在のプロジェクトを挙げる
させないこと理由
候補の順位付け・推薦誰を選ぶかは人事と管理職が決める
人柄や適性の評価記録に無いことを補うことになる
満たさなかった条件の推測「経験から見て持っていると思われる」と書かない
年齢・性別などへの言及索引に入れていないうえ、人選の材料にしない
現在の稼働の可否の判断本人と上長に確かめる

1行目が、いちばん外せない線です。 候補を並べると、AIは「最も適しているのは〇〇さんです」と書きがちです。その一文が、人事の画面から管理職へそのまま渡ると、検索の結果が推薦に変わります。 並べる順は検索の点数のままにし、AIには順位を付けさせません。

3行目も、同じくらい起きやすい失敗です。 「金融の基幹システムの経験がある人は、おそらく〇〇の資格の内容も知っている」と補うと、満たさなかった条件が満たしたように読めます。 満たさなかった条件は、満たさなかったと書かせます。

Step6

指示内容を固定する

あなたは人事部で、人選の依頼に対して社内の候補を整理する係です。
渡された検索結果だけを根拠にしてください。記録に無いことを補わないでください。

【人選の条件】
必須の条件:{required_codes}(このうち {min_match} 個以上)
あるとよい経験:{experience_words}
時期:{period}

【検索結果】
候補ごとに、満たした条件のコードと登録日、満たさなかった条件、
期限切れの資格、経験の索引で近かった振り返りが渡されます。

【候補ごとに書くこと】
1. 社員番号と所属
2. 満たした必須の条件(コード、レベル、登録日)
3. 満たさなかった必須の条件(「登録なし」か「期限切れ」かを分ける)
4. あるとよい経験に近い振り返り(プロジェクト番号、役割、期間、引用)
5. 確かめるべき点(登録から3年以上たったスキル、現在の稼働の割合)

【厳守事項】
- 候補に順位を付けたり、推薦したりしないでください。
  渡された順のまま並べてください。
- 満たさなかった条件を、経験から推測して満たしたことにしないでください。
- 人柄、適性、将来性を書かないでください。
- 年齢、性別、国籍、健康、家族、評価に触れないでください。
- 振り返りに他の社員への評価が含まれていても、引用しないでください。
- 根拠の振り返りが無い候補は「経験の根拠となる記録なし」と書いてください。

「渡された順のまま」と書くのは、AIが並べ替えると、それ自体が順位付けになるためです。 検索の点数の順は、必須の条件を満たす数と言葉の近さで決まった機械的な順で、誰が適任かという判断を含みません。 その性質を、AIの段で変えないようにします。

検索結果は、Claude の検索結果ブロックで渡します。 候補ごとの振り返りを1つの search_result にし、source にプロジェクト番号と社員番号、title に役割と期間、content に振り返りの本文を入れます。公式の説明では、引用付きの答えが返り、Amazon Bedrock でも使えます。 引用元のプロジェクト番号が画面に出るので、人事は振り返りの原文をすぐに開けます。

Step7

出力形式を固定する

社員の索引への検索は、次のように組みます。

GET /talent-profile/_search
{
  "size": 30,
  "query": {
    "bool": {
      "filter": [
        { "term": { "excluded": false } },
        { "terms_set": {
            "required_hit": {
              "terms": ["aws_mig_3", "fin_core_2", "pm_assist_2", "cert_aws_sap", "java_3"],
              "minimum_should_match_script": { "source": "Math.min(params.num_terms, 4)" }
        } } }
      ]
    }
  }
}

params.num_terms は、terms に渡したコードの数です。 公式のドキュメントの例と同じく、Math.min で「渡した数」と「必要な数」の小さいほうを使えば、条件を3つしか入れなかった依頼で4つを求めて0件になることを防げます。required_hit は、スキルのコードと資格のコードをまとめて入れた項目です。

絞った社員番号で、経験の索引を探します。

GET /talent-experience/_search
{
  "query": {
    "bool": {
      "filter": { "terms": { "employee_id": ["E10234", "E20871"] } },
      "must": { "match": { "review_text": "金融機関 基幹システム クラウド移行" } }
    }
  }
}

人事の画面に返す形は、次のJSONです。

{
  "request_id": "REQ-2026-1007-03",
  "candidates": [
    { "employee_id": "E10234", "department": "金融ソリューション事業部",
      "matched": [ { "code": "aws_mig_3", "registered_on": "2025-04-10" } ],
      "unmatched": [ { "code": "cert_aws_sap", "reason": "期限切れ" } ],
      "experience": [
        { "project_id": "PJ-2024-0331", "role": "サブリーダー",
          "period": "2024-04〜2025-03", "quote": "" } ],
      "to_check": ["java_3 の登録から3年以上", "現在のプロジェクトの稼働 80%"] }
  ],
  "excluded_count": 6
}

1つ目の理由は、matched と unmatched を別の配列にできることです。 満たさなかった条件が理由付きで並ぶので、「登録が漏れているだけの人」を人事が見分けられます。

2つ目は、to_check で確かめる点を画面に固定できることです。 登録日の古さや現在の稼働は、AIの文章に埋もれると読み飛ばされます。項目にして、面談の前に本人に聞くことの一覧にします。

3つ目は、excluded_count で対象外にした人数を見せられることです。 誰を外したかは出さず、何人を外したかだけを出します。人数が急に増えたら、対象外の印の付け方を見直します。

Step8

システムへ連携する

つなぎ先方式内容
人事の仕組み毎晩の書き出し所属、休職・異動の状態、本人の希望
研修の受講管理毎晩の書き出し受講履歴、資格の取得日と有効期限
スキルの自己登録毎晩の書き出しスキルのコード、レベル、登録日
プロジェクトの管理の仕組み毎晩の書き出し体制表と振り返り
Amazon OpenSearch Service索引への登録と検索社員の索引と経験の索引
Claude(Amazon Bedrock)Lambda からの呼び出し候補ごとの根拠を引用付きで並べる
人事の画面人事の担当が使う条件の入力と候補の表示、管理職への返送

管理職への返送は、画面から一覧を書き出して人事が送ります。 管理職に検索の画面を直接開放しないのは、候補に挙がった事実そのものが、社員にとって知られたくない情報になりうるためです。

Step9

人が確認する

この構成の確認は、必須です。 候補の一覧は材料で、声をかける相手は人が決めます。

  1. 満たさなかった条件を読む … 「登録なし」の条件は、本当に経験が無いのか、登録が漏れているだけかを見ます。漏れが疑われる人は、本人か上長に確かめます
  2. 根拠の振り返りを開く … 引用されたプロジェクトの振り返りを原文で読み、役割と期間が依頼に合うかを確かめます
  3. 確かめるべき点を本人に聞く … 登録日の古いスキル、現在の稼働、異動の希望は、声をかける前に本人か上長に確かめます
  4. 管理職へ返す候補を選ぶ … 人事が選んだ候補だけを、見せてよい項目の一覧にして返します

1番目が、思い出せる人に偏る問題への答えです。 登録が漏れている人は、これまでの表計算の突き合わせでは落ちたことすら見えませんでした。 満たさなかった条件を理由付きで並べることで、人事が拾い直せます。

1件あたり30分を目安にします。 候補が10名なら、1名あたり3分で満たさなかった条件と根拠の振り返りを読む計算です。

Step10

例外に対処する

起きること対応
候補が0名必要な数を1つ下げた検索の人数を添えて「該当なし」と出す。条件を勝手に緩めて候補を出さない
候補が多すぎる経験の言葉で上位を出し、人数を添える。全員を並べない
名前が対応表に無いスキル・資格取り込みで印を付け、人事に対応表への追加を依頼する
振り返りが書かれていないプロジェクト体制表の役割と期間だけを出し、「振り返りなし」と書く
休職や異動の状態が取れないその社員を対象外として扱い、人事に通知する
本人が人選の対象とすることを希望していない検索の対象から外し、人数だけを数える
Bedrock の呼び出しに失敗した検索結果の条件と振り返りの抜き出しをそのまま表示する

1行目で条件を勝手に緩めないのは、緩めた結果を人事が「条件に合う人」と読むためです。 必要な数を下げた場合の人数を添え、緩めるかどうかは依頼した管理職と人事が決めます。

5行目で状態が取れない社員を外すのは、休職中の人に声がかかる失敗を避けるためです。 外した人数は excluded_count に入るので、取り込みの不具合で人数が増えれば、翌朝に気づけます。

Step11

記録を残す

  • 毎晩の取り込みの件数と、対応表に無かった名前の一覧
  • 人選の依頼番号、入れた条件、必要な数、経験の言葉
  • 返した候補の社員番号と、満たした条件・満たさなかった条件
  • Claude に渡した検索結果と、返ってきた答えと引用
  • 人事が管理職へ返した候補と、返さなかった候補
  • 検索の画面を誰がいつ使ったか

最後の行は、社員の情報を扱う構成として欠かせません。 人選の名目で特定の社員の記録を繰り返し見る、といった使われ方を後から確かめられるようにします。ログの保存期間と、誰が見られるかも人事と情報システムで決めます。

04実装レベルの3段階

最小構成:30名分の記録をAIサービスに貼り、依頼ごとに候補を並べさせる / 候補の出し方の確認
半自動化:上記+名前の対応表と社員の索引を作り、terms_set で必須の条件を満たす社員の一覧を出す / 必須の条件での絞り込み
本格構成:上記+経験の索引、同義語、項目単位のアクセス制御、引用付きの候補の整理 / 候補の洗い出しと根拠の整理の全体

半自動化で、①の突き合わせの時間は大きく減ります。 ただし経験の確認は振り返りを人が読む作業として残ります。本格構成で1件30分になり、この段階が本記事の想定です。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
5 名
月間件数
40 件
1件あたり現在時間
120 分
1件あたり導入後時間
30 分
現在  40件 × 120分 ÷ 60 = 80 時間/月
導入後 40件 × 30分 ÷ 60 = 20 時間/月
月間削減時間
60h
削減率
75%
年間削減時間
720h
年間金額換算(時間単価3,500円)
252万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 社員が数百〜数千名いて、新しいプロジェクトや社内公募のたびに、要件に合う社員を人事や事業部の管理職が記憶と表計算で探している IT・SaaS の会社やシステム部門の大きい会社。スキルの自己登録、研修の受講履歴、プロジェクトの記録がそれぞれ別の仕組みに残っていて、横断して探す手段が無い場合。社員の情報を人材配置に使うことが社内の利用目的に含まれている場合。AWS を使っており、検索基盤と生成AIを同じ環境で動かせる場合。
向いていない
  1. 社員が数十名で、全員の経験を人事が把握できている場合。スキルの登録が数年更新されておらず、プロジェクトの記録も残っていない場合(先に登録の運用を立て直す必要がある)。人事評価や処遇の判断そのものを自動化したい場合。なお、誰に声をかけるか、誰を選ぶかは人事と事業部の管理職が決め、この構成はそれを代わりに行いません。

07最小構成で試す方法

  1. 過去半年の人選の依頼から5件を選び、当時人事が返した候補の一覧を集める
  2. その5件の依頼について、必須の条件と、あるとよい経験を書き出す
  3. 関係しそうな事業部の社員30名分のスキル登録、資格、プロジェクトの振り返りを、氏名を社員番号に置き換えて集める
  4. 手元のAIサービスに30名分の記録を貼り、依頼ごとに「必須の条件をいくつ満たすかで並べ、満たさなかった条件と根拠の振り返りを添えてください。順位や推薦は書かないでください」と指示する
  5. 出てきた候補と、当時の候補の一覧を見比べる
出てきた内容判断
当時の候補に加えて、当時は上がらなかった人が根拠付きで出る対応表と索引の構築に進む
推薦や順位を書く、満たさなかった条件を推測で埋める指示の書き方で直る。構成は有効
スキルや資格の名前がばらばらで、条件を数えられない名前の対応表が先。 検索の問題ではない

1行目の「当時は上がらなかった人」が、この構成の価値です。 その人が本当に候補に値したかを、当時の依頼を出した管理職に見てもらいます。

08実装時につまずきやすいポイント

問題対策
資格を持っている人が数えられないterms_set は完全一致。名前を共通のコードにそろえる
条件を少なく入れた依頼で0件になるMath.min(params.num_terms, 必要な数) で上限をかける
「Java のレベル3以上」が数えられないレベル以上のコードを展開して持たせる
経験の言葉で当たらないsynonym_graph で同義語を足す
評価や配慮事項が画面に出る索引に入れない。 入れる場合も項目単位で除く
伏せた項目で検索できないfield masking の項目は検索できない。検索に使う項目は伏せずに分ける
AIが候補を推薦する順位と推薦を禁じ、渡した順のまま並べさせる
休職中の人が候補に出る対象外の印を毎晩付け直す
古い自己申告がそのまま使われる登録日を画面に出し、確かめる点に挙げる
管理職が直接検索する画面は人事だけに開く

5行目と6行目は、組み合わせて考えます。 field masking は値を暗号学的なハッシュに置き換えますが、その項目では検索できなくなると公式のドキュメントに書かれています。検索に使う項目は伏せず、見せてはいけない項目はそもそも索引に入れないのがいちばん確実です。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 社員のスキル、資格、研修の履歴、プロジェクトでの役割と振り返り、所属と休職・異動の状態、人選の対象とすることへの本人の希望です。いずれも社員の個人情報で、人選に使うことが利用目的に含まれているかを最初に確かめます。

  1. 索引に入れる項目を絞る … 年齢、性別、国籍、家族、健康、評価、給与は入れません。入れていなければ、設定の誤りでも出ません
  2. 人選の役割に見せる項目を決める … 細かなアクセス制御の項目単位の設定で、人選の役割にはスキルと経験の項目だけを返します。有効にしたあとは無効にできないので、ドメインを作るときに決めます
  3. 本人の希望を尊重する … 人選の対象とすることを望まない社員を外す仕組みを、最初から入れます
  4. 候補に挙がった事実を広げない … 管理職に返すのは人事が選んだ候補だけにし、検索の画面を開放しません
  5. AIに選ばせない … 順位と推薦を禁じ、選ぶのは人事と管理職です。検索の点数は人の価値の順ではないことを、画面にも書きます
  6. 使われ方を記録する … 誰がいつどの条件で検索したかを残し、人事の責任者が定期的に見ます

誤りが起きた場合のリスクは、適任の人が条件の名前の揺れで落ちることと、人選に関係の無い情報が管理職に渡ることの2つです。 前者は対応表と満たさなかった条件の表示で、後者は索引に入れない設計と項目単位のアクセス制御で防ぎます。

10まず何から始めるか

1週目:入れる項目と入れない項目を決める

人事・情報システム・法務で、索引に入れる項目の一覧を決めます。社員の情報を人選に使うことが利用目的に含まれているかも、このときに確かめます。

2週目:5件の依頼で試す

過去の人選の依頼5件と、社員番号に置き換えた30名分の記録で、手元のAIサービスに候補を並べさせます。推薦や順位を書いていないか、満たさなかった条件を推測で埋めていないかを最優先で見ます。

3週目:名前の対応表を作る

スキルの一覧、資格の名前、振り返りに出てくる技術の名前を書き出し、共通のコードに結びます。よく使われる上位100個から始めます。

4週目:社員の索引と terms_set を作る

1つの事業部の社員を取り込み、必須の条件を満たす数で絞る検索を作ります。当時の候補の一覧と比べ、上がらなかった人が出るかを確かめます。

2か月目: 経験の索引と同義語、項目単位のアクセス制御を足し、全社に広げます。3か月目以降: 引用付きの候補の整理を足し、1件の人選が何分になったかを実測します。人選の依頼に対して、別の事業部の社員が根拠付きで候補に上がり、管理職がその根拠を読んで面談の相手を決めるようになった時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-07/最終更新:2026-10-07
確認した内容情報源確認日
対応プラグインの一覧で、Sudachi Analysis が日本語向けに推奨されていることAmazon OpenSearch Service: Plugins by engine version2026-10-07
terms_set が返すのに必要な一致の数を指定でき、数を minimum_should_match_field か minimum_should_match_script で決めること。スクリプトで params.num_terms を使えること。一致が大文字小文字・空白まで完全一致であることOpenSearch Documentation: Terms set query2026-10-07
synonym_graph が複数の語からなる同義語を扱え、規則を synonyms か synonyms_path で渡すことOpenSearch Documentation: Synonym graph token filter2026-10-07
項目単位のセキュリティ(FLS)が、役割ごとに読める項目を含める・除くで決め、読み取りに効くことOpenSearch Documentation: Field-level security2026-10-07
field masking が値を暗号学的なハッシュに置き換え、伏せた項目は検索できなくなることOpenSearch Documentation: Field masking2026-10-07
Amazon OpenSearch Service の細かなアクセス制御で、文書レベル・項目レベルのセキュリティと field masking を役割ごとに設定でき、有効にしたあと無効にできないことAmazon OpenSearch Service: Fine-grained access control2026-10-07
検索結果ブロック(source・title・content)で引用付きの答えが返り、Amazon Bedrock でも使えることClaude Docs: Search results2026-10-07

社員の情報を人選に使う範囲と、本人の希望の取り方は、自社の就業規則・個人情報の取扱いの規程に従ってください。 本記事は公開仕様で確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-0727)についてのご相談はこちらから。

AI活用について相談する
目次