Media > AI活用ユースケース > 人事 > 希望とスキルと法令の制約を満たすシフト表の原案を作る

希望とスキルと法令の制約を満たすシフト表の原案を作る

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

工程ごとの必要人数、資格、法令の制約、本人の休み希望を入力に、条件を満たすシフト表の原案を作ります。管理者の作業は、白紙の表を埋めて何度も組み直すことから、出てきた原案を見て調整することに変わります。

サマリー
利用ツール
ChatGPT/Claude/Gemini/Python
対象業界
介護/医療/宿泊/物流/製造
対象部門
人事/生産
対象業務
書類作成/集計・分析
主な課題
人手が足りない/判断に時間がかかる/属人化している
AIで行う処理
生成
主な効果
判断支援/属人化解消/工数削減
導入難易度
★★★★☆
実装レベル
本格構成
費用感
個別開発(大)
人間の確認
条件付き
現在工数
50h/月
AI導入後
15h/月
想定削減
70%
年間削減
420h
モデル条件による試算値です。実在企業の実績ではありません。

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

導入前(Before)
  1. 翌月のシフト希望を、締め切りを決めて集める(紙の用紙、チャット、口頭)
  2. 管理者が希望をExcelに転記する
  3. 工程ごと・時間帯ごとの必要人数を確認する
  4. 資格の要る工程について、有資格者の一覧を確認する
  5. Excelの表に、人を1人ずつ割り当てていく
  6. 必要人数が足りない枠が出たら、希望を断って埋める
  7. 夜勤の回数が偏っていないかを目で確認して直す
  8. 連続勤務日数や休憩の条件を満たしているかを確認する
  9. 完成したシフト表を掲示し、変更になった人に個別に説明する
  10. 公開後の変更依頼に、その都度対応する
導入後(After)
  1. 従業員がフォームからシフト希望を出す(自由記述の欄を残す)
  2. 自動希望の自由記述を、日付と時間帯と理由の区分に変換する
  3. 自動変換に迷ったものを、確認事項として管理者に出す
  4. 管理者が変換結果を確認し、必要なら直す
  5. 自動必要人数・資格・法令・希望・公平性の条件を制約として組み立てる
  6. 自動制約を満たす割り当てを計算する
  7. 自動解が出ない場合は、どの条件が競合しているかを示す
  8. 管理者が競合する条件の優先度を決める(希望を断る/応援を頼む/必要人数を見直す)
  9. 自動再計算し、原案を出す
  10. 管理者が原案を確認し、最終判断して確定する
  11. 自動希望が通らなかった人への説明文を作る
  12. 管理者が確認して本人に伝える
各工程の詳しい説明を読む
  1. 翌月のシフト希望を、締め切りを決めて集める(紙の用紙、チャット、口頭)
  2. 管理者が希望をExcelに転記する
  3. 工程ごと・時間帯ごとの必要人数を確認する
  4. 資格の要る工程について、有資格者の一覧を確認する
  5. Excelの表に、人を1人ずつ割り当てていく
  6. 必要人数が足りない枠が出たら、希望を断って埋める
  7. 夜勤の回数が偏っていないかを目で確認して直す
  8. 連続勤務日数や休憩の条件を満たしているかを確認する
  9. 完成したシフト表を掲示し、変更になった人に個別に説明する
  10. 公開後の変更依頼に、その都度対応する

問題は5つあります。

(a)希望の読み取りに時間がかかる。 50名分の自由記述を読み、「いつ、どの時間帯が、なぜ不可なのか」を整理する作業が、毎月3時間かかります。

(b)組み直しが連鎖する。 1か所を直すと、必要人数や夜勤回数の条件が崩れ、別の場所を直すことになります。5回、6回と組み直すのが普通です。

(c)判断の基準が管理者ごとに違う。 希望を断る優先順位、夜勤回数の許容範囲、資格者の配置の考え方が、5名の管理者でばらばらです。異動すると引き継げません。

(d)法令の条件を目で確認している。 連続勤務日数、休憩時間、勤務間のインターバル、時間外労働の上限を、完成後に目で見て確かめています。見落とせばそのまま運用されます。

(e)変更の説明ができない。 「なぜ自分の希望が通らなかったのか」を聞かれても、組んだ経緯を再現できないため、納得のいく説明ができません。

  1. 従業員がフォームからシフト希望を出す(自由記述の欄を残す)
  2. 【自動】 希望の自由記述を、日付と時間帯と理由の区分に変換する
  3. 【自動】 変換に迷ったものを、確認事項として管理者に出す
  4. 【人】 管理者が変換結果を確認し、必要なら直す
  5. 【自動】 必要人数・資格・法令・希望・公平性の条件を制約として組み立てる
  6. 【自動】 制約を満たす割り当てを計算する
  7. 【自動】 解が出ない場合は、どの条件が競合しているかを示す
  8. 【人】 管理者が競合する条件の優先度を決める(希望を断る/応援を頼む/必要人数を見直す)
  9. 【自動】 再計算し、原案を出す
  10. 【人】 管理者が原案を確認し、最終判断して確定する
  11. 【自動】 希望が通らなかった人への説明文を作る
  12. 【人】 管理者が確認して本人に伝える

自動化されるのは「読み取る」「変換する」「割り当てる」「条件を確かめる」「説明文を作る」の5つです。残るのは「誰の希望を優先するか」の判断で、これは管理者の仕事です。

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

構成図
従業員(シフト希望の提出)
   │
   ▼ フォーム(日付・時間帯の選択 + 自由記述)
   │
   ▼【トリガー】締め切り翌日 朝6時(スケジュール)
Python のバッチ処理
   │
   ├──▶ LLM API ── 自由記述を制約に変換
   │                 (「夕方は難しい」→ 該当日の準夜勤を不可)
   │
   ├──▶ 制約の組み立て
   │       ├─ 必要人数(工程 × 時間帯 × 日)
   │       ├─ 資格要件(工程ごとの有資格者のみ)
   │       ├─ 法令(連続勤務日数・休憩・インターバル・時間外の上限)
   │       ├─ 本人の希望(優先度つき)
   │       └─ 公平性(夜勤回数・休日の偏り)
   │
   ├──▶ 制約プログラミングで解く(AIは使わない)
   │
   ├──▶ 解が出ない場合 ── 競合する制約を特定
   │        └──▶ LLM API ── 競合の内容を管理者に説明
   │
   ▼
シフト原案 ──【管理者が確認・調整・確定】
   │
   ├──▶ LLM API ── 希望が通らなかった人への説明文
   │
   ▼
シフト表の掲示 + 勤怠システムへの登録
役割想定する製品代替候補
実行環境Python(OR-Tools の CP-SAT ソルバー)商用の最適化ソルバー、個別実装
生成AIClaude APIOpenAI API、Gemini API
希望の受付Google フォームMicrosoft Forms、社内の申請システム
出力先Google スプレッドシートExcel、勤怠管理システム

シフト作成の機能を持つ勤怠管理システムやシフト管理SaaSがあるなら、まずそれを検討してください。 業種に特化した製品(介護の人員配置基準に対応したもの、小売の売上予測と連動するものなど)が存在します。自前で組む価値があるのは、自社固有の制約(工程と資格の組み合わせ、応援のルール、公平性の考え方)が製品の想定と合わない場合です。

Python を選んだのは、制約の記述と業務ルールを1か所に書けるためです。 OR-Tools の CP-SAT ソルバーは、制約プログラミングとSATソルバーを組み合わせたもので、従業員のシフト作成のような問題に使えます。Google の公式ドキュメントに従業員シフトの例が用意されており、より複雑な例も公開されています。

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

Step1

処理の起点を決める

希望の締め切り翌日の朝に、定時で一括実行します。 管理者が出社したときに、希望の変換結果と最初の原案が出来ている状態にします。

再計算は管理者が手動で実行できるようにします。条件の優先度を変えて解き直す操作が何度も発生するためです。1回の計算に数分かかるので、待っている間に他の作業ができる形にしてください。

規模の目安として、公開されている実装例の報告では、150名・30日・50種類のシフトの規模で2〜5分、300名以上になると10〜30分かかるとされています。240名なら数分の範囲に収まる見込みですが、制約の数によって大きく変わるため、自社のデータで必ず実測してください。

Step2

入力データを集める

データ中身取得元
シフト希望従業員ごとの休み希望、時間帯の希望、自由記述フォーム
従業員マスタ社員番号、氏名、所属課、雇用区分、勤務可能な時間帯人事システム
資格の保有状況フォークリフト、食品衛生責任者、機械の操作資格など人事システム/資格台帳
工程の必要人数工程 × 時間帯 × 曜日ごとの必要人数と、必要な資格生産計画
生産計画翌月のラインごとの稼働予定生産管理システム
過去の勤務実績夜勤回数、休日出勤、時間外労働の累計(直近12か月勤怠管理システム
法令・協定の条件連続勤務日数の上限、休憩、勤務間インターバル、36協定の上限就業規則・労使協定
公平性のルール夜勤回数の許容差、連休の配分、希望の通し方の優先順位各課の運用(文書化が必要

「公平性のルール」が、この構成でいちばん手間のかかる入力です。 現在は管理者の頭の中にあります。「夜勤は月8回まで、人による差は2回以内」「3か月連続で年末年始に出た人は次は外す」といったルールを、数字で書き出す必要があります。この作業自体が属人化の解消になります。

Step3

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

シフト希望: フォームの回答をスプレッドシートから読み込みます。自由記述の欄を必ず残してください。 選択肢だけにすると、書ききれない事情が口頭で入ってきて、結局手作業が残ります。

過去の勤務実績: 勤怠管理システムからCSVで取得します。夜勤回数の偏りと時間外労働の累計に使います。時間外労働の上限(月45時間、複数月平均80時間、年720時間など)を制約に入れるために、過去12か月分が必要です。

工程の必要人数: 生産計画から算出します。これが読めない月は、この構成は使えません。 必要人数が当日にならないと決まらない業務では、前提が成り立ちません。

Step4

AIへ渡す前に整形する

  1. 自由記述の変換 … LLMで「日付・時間帯・可否・理由の区分・強さ」に変換します(後述)
  2. 変換結果の確認 … 変換に迷ったものを管理者に見せ、確認してもらいます。ここを飛ばすと、誤った制約で解いてしまいます
  3. 制約の分類 … すべての制約を「絶対に守るもの(ハード制約)」と「できれば守るもの(ソフト制約)」に分けます
  4. 資格と工程の対応づけ … 工程ごとに、割り当て可能な有資格者の集合を作ります
  5. 過去実績の集計 … 夜勤回数、休日出勤日数、時間外労働の累計を従業員ごとに集計します

3番目の分類が、この構成の設計の核です。

種別内容
ハード制約破れない。破ると解なしとする法令(休憩・連続勤務日数・インターバル・時間外の上限)/資格の要る工程への無資格者の配置禁止/1人が同じ日に2つの勤務に入らない
ソフト制約破ってよいが、破るたびに罰点がつく本人の希望/夜勤回数の偏り/連休の配分/同じ班の組み合わせ

必要人数をハード制約にしないでください。 必要人数を絶対条件にすると、人が足りない月に解が1つも出なくなります。 現実には「必要人数を1名下回る枠がある」シフトでも運用できます。必要人数はソフト制約にして、下回った分を罰点として数え、管理者にどこが薄いかを見せるほうが使えます。

Step5

AIに処理させる

割り当ての計算は制約プログラミングで行います。 目的関数は「ソフト制約の罰点の合計を最小にする」です。罰点の重みが、そのまま優先順位になります。

LLMにさせること:

処理内容
自由記述の変換「来週は子どもの行事で夕方は難しい」→ 該当日の準夜勤を不可、強さ=強
変換の不確かさの提示日付が特定できない、強さが読み取れないものを確認事項にする
競合の説明解が出なかったとき、どの条件とどの条件がぶつかっているかを管理者に伝える
原案の要点の説明「今月は夜勤の希望が少なく、Aさんに3回集中しています」といった注意点を書く
本人への説明文希望が通らなかった人に、理由を添えた連絡文を作る

LLMにシフトを割り当てさせないでください。 240名×30日の割り当てが制約を満たしているかは、目では確認できません。制約プログラミングで解けば、出てきた解はハード制約を必ず満たしています。 これが検証可能性の差です。

「競合の説明」が実務では大きく効きます。 解が出ないとき、ソルバーは「実行不可能」としか返しません。管理者が知りたいのは「なぜ解けないのか」です。ハード制約を1つずつ外して解き直し、どれを外すと解けるようになるかを特定すれば、競合している条件が分かります。 その内容をLLMに日本語で説明させます。

Step6

指示内容を固定する

自由記述の変換(1件ずつ):

あなたは、シフト希望の自由記述を、計算に使える形に変換する担当者です。

【厳守事項】
- 書かれていない日付を補わないでください。
  「来週」「月末」のように特定できない場合は、
  dates を空にし、needs_confirmation に理由を入れてください。
- 理由の内容を、必要以上に詳しく転記しないでください。
  区分(家庭の事情 / 通院・体調 / 学業 / 私用 / 記載なし)だけを reason_category に入れ、
  原文の理由は転記しないでください。
- 強さ(絶対に不可か、できれば避けたいか)は、書かれた表現から判断してください。
  判断できない場合は "unknown" とし、needs_confirmation に入れてください。
  「できれば」と勝手に弱めないでください。
- 健康状態に関する記述があった場合は、
  health_related を true にし、内容は転記しないでください。
  管理者が本人と個別に話す対象として印を付けるだけにしてください。
- 時間帯は、下記の勤務区分の名称のみを使ってください。
  新しい区分を作らないでください。

【勤務区分】
日勤(8:00-17:00)/ 準夜勤(16:00-1:00)/ 夜勤(0:00-9:00)

【対象月】
{target_month}({start_date} 〜 {end_date})

【従業員】
{employee_name}({department})

【自由記述】
{free_text}

競合の説明:

あなたは、シフト作成の担当者を支援する担当者です。
条件を満たす割り当てが見つからなかった原因を、管理者に説明してください。

【厳守事項】
- あなたが割り当てを提案しないでください。
  「Aさんを夜勤に入れれば解決します」と書かないでください。
  どの条件とどの条件がぶつかっているかだけを説明してください。
- 入力に含まれる「外すと解けるようになった制約」の情報だけを使ってください。
  それ以外の推測を書かないでください。
- 説明には、具体的な日付・工程・人数を含めてください。
  「人手が足りません」だけでは行動できません。
- 管理者が取れる選択肢を、下記の4つから該当するものだけ挙げてください。
  新しい選択肢を作らないでください。
  (1)必要人数を見直す(2)他の課へ応援を依頼する
  (3)希望を断る(4)勤務区分の割り方を変える

【計算の結果】
{infeasibility_analysis}

【対象月の条件】
{constraints_summary}

「あなたが割り当てを提案しないでください」の1行が重要です。 LLMが提案した割り当ては、他の制約を破っている可能性があります。管理者が条件を変えて解き直すのが正しい手順です。

自由記述の変換で「理由の原文を転記しない」としているのは、意図的です。 シフト希望の理由には、通院、家族の介護、子どもの事情といった私的な情報が書かれます。これを計算に使う必要はありません。 必要なのは「その日のその時間帯が不可かどうか」と「その強さ」だけです。

Step7

出力形式を固定する

自由記述の変換:

{
  "employee_id": "",
  "requests": [
    {
      "dates": [],
      "shift_types": [],
      "availability": "unavailable | prefer_not | prefer",
      "strength": "strong | weak | unknown",
      "reason_category": "family | health | study | private | not_stated",
      "health_related": false,
      "source_text_hash": ""
    }
  ],
  "needs_confirmation": []
}

計算結果:

{
  "status": "optimal | feasible | infeasible",
  "assignments": [
    { "date": "", "shift_type": "", "process": "", "employee_id": "" }
  ],
  "hard_constraints_satisfied": true,
  "soft_constraint_penalties": {
    "understaffed_slots": [],
    "requests_denied": [],
    "night_shift_imbalance": 0,
    "consecutive_days_near_limit": []
  },
  "fairness": {
    "night_shifts_per_employee": {},
    "requests_granted_rate": 0
  },
  "solve_time_seconds": 0
}

source_text_hash を持つのは、原文そのものを保存せずに、後から「どの記述から変換したか」を照合できるようにするためです。管理者が確認するときは、原文と変換結果を並べて見ますが、計算の入力データとしては原文を持ち回りません。

soft_constraint_penalties の中身が、管理者が見る主な情報です。 「どこが人数不足か」「誰の希望を断ったか」「夜勤が偏っていないか」が並びます。罰点の合計値だけを出しても使えません。

なお、Claude API には出力をJSONスキーマに沿わせる構造化出力の機能があります(2026-09-15時点ではベータ機能として提供)。自由記述の変換のように形の崩れが後段を壊す処理では、利用できると安全です。

Step8

システムへ連携する

つなぐ先内容
フォーム/スプレッドシートシフト希望を受け取る
人事システム(読み取り)従業員マスタと資格の保有状況を取得する
勤怠管理システム(読み取り)過去の勤務実績を取得する
生産管理システム(読み取り)翌月の生産計画から必要人数を算出する
スプレッドシート原案を出す。管理者の調整もここで行う
勤怠管理システム(書き込み)確定したシフトを登録する(確定後のみ

確定前のシフトを勤怠システムに書き込まないでください。 原案の段階で書き込むと、従業員が見て混乱します。確定は管理者の操作を起点にします。

Step9

人が確認する

原案は必ず管理者が確認し、確定します。自動確定しません。

確認するのは次の点です。

確認する点見る場所
人数が薄い枠がないかunderstaffed_slots
誰の希望を断ったかrequests_denied
夜勤の回数が偏っていないかnight_shifts_per_employee
連続勤務が上限に近い人がいないかconsecutive_days_near_limit
health_related の印が付いた人の扱い変換結果の一覧
現場の事情(人間関係、教育中の組み合わせ)原案の全体

最後の項目は制約に書けません。 「この2人は同じ班にしない」「新人はベテランと組ませる」といった事情は、書けるものは制約にしますが、書ききれないものが必ず残ります。管理者が見て直す余地を残してください。

手で直したら、必ず再計算してください。 1か所を直すと法令の条件が崩れることがあります。手直し後のシフトについて、ハード制約を満たしているかを検証する処理を用意してください。 これがないと、制約プログラミングを使う意味が半減します。

Step10

例外に対処する

起きること対応
解が見つからない(実行不可能)ハード制約を1つずつ外して解き直し、競合を特定する。必要人数はソフト制約にしておく
計算が時間内に終わらない制限時間を設けて、その時点の最良解を返す。status: feasible として出す
自由記述の日付が特定できない変換せず、確認事項として管理者に出す
希望の締め切り後に変更が来る再計算する。確定後の変更は原案作成とは別の運用(交替の申し出)にする
資格者が足りず、工程に人を配置できないハード制約なので解なしになる。競合として提示し、応援の依頼を促す
時間外労働の上限に当たる人がいるハード制約として外す。法令の上限は破らせない
健康に関する記述があった内容を転記せず、管理者が本人と個別に話す対象として印を付ける
同じ人に夜勤が集中するソフト制約の重みを上げて再計算する。自動で均等化すると別の条件が崩れるので、管理者に選ばせる
生産計画が翌月分まで確定していない前月実績を暫定の必要人数として使い、確定後に再計算する
管理者が手で直した結果、法令の条件を破った手直し後の検証処理で検出し、警告する
Step11

記録を残す

  • シフト希望の原文(管理者の確認用。計算には使わない。対象月の終了後に削除する
  • 変換後の制約(source_text_hash つき)
  • 制約の設定(ハード/ソフトの分類と重み)
  • 計算結果(assignmentssoft_constraint_penalties
  • 管理者が手で直した内容と、その理由
  • 確定したシフト表
  • 本人への説明文と、その送信記録

「管理者が手で直した内容と、その理由」が、この構成の資産です。 「この工程には新人を1人までしか入れない」といった、制約に書けていなかった条件が見えてきます。それを制約として書き足していけば、手直しは減ります。

シフト希望の原文は、対象月が終わったら消してください。 理由の欄には私的な情報が書かれます。残す理由がありません。

04実装レベルの3段階

最小構成:制約を書き出し、1課分を計算で解いて、管理者の作った表と比べる / 割り当ての計算
半自動化:希望をフォームで集め、自由記述をLLMで変換し、計算で原案を作る。管理者が調整して確定する / 変換・計算・原案
本格構成:上記+解けないときの競合の説明+手直し後の検証+本人への説明文+勤怠システムへの登録 / 確定以外のすべて

この業務では本格構成に価値があります。 半自動化だけだと、解けなかったときに管理者が手作業に戻ってしまい、「結局使えない」という評価になりがちです。 競合の説明と手直し後の検証があって初めて、日常的に回ります。

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

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

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

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

AI活用について相談する

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

向いている
  1. 交替勤務またはシフト勤務が常態で、1つの単位あたり30名以上を組む企業。必要人数・資格要件・法定の休憩や連続勤務の制約が文書化できること。シフト作成に1回あたり半日以上かかっていること。
向いていない
  1. 勤務が固定で、シフトを組む必要がない場合。1単位が10名以下で、管理者が短時間で組めている場合。すでに制約を扱えるシフト作成システムを導入している場合。必要人数が日ごとに読めず、当日にならないと決まらない場合。

07最小構成で試す方法

  1. 1つの課、1か月分を対象にする(40〜60名)
  2. 現在のシフト表と、そのときのシフト希望をそろえる
  3. 必要人数、資格要件、法令の条件、公平性のルールを紙に書き出す
  4. OR-Tools の従業員シフトの例を動かし、自社の制約に置き換える
  5. 同じ入力で計算した結果と、管理者が作った実際のシフト表を比べる

見るのは次の3点です。

見る点判断
計算結果がハード制約を満たしているか満たしていなければ制約の書き方が誤っている
管理者が作った表が、実はハード制約を破っていないか破っていれば、それだけで導入の価値があります
計算結果を管理者が見て「これなら使える」と言うか言わないなら、書けていない制約がある。それを聞き出す

3番目で出てくる「使えない理由」が、設計の材料です。 「このシフトだと引き継ぎができない」「この組み合わせは教育にならない」といった条件が出てきます。書けるものは制約にし、書けないものは手直しの余地として残します。

3番目のステップ(制約を紙に書き出す)を飛ばさないでください。 ここがこの構成でもっとも時間のかかる作業で、かつ、この作業だけでも属人化は減ります。

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

問題対策
必要人数をハード制約にして、解が出ないソフト制約にして、不足枠を罰点として見せる。最頻出の失敗です
LLMに割り当てを考えさせるプロンプトで禁止する。割り当ては必ずソルバーで解く
解けない理由が分からず、手作業に戻るハード制約を1つずつ外して解き直し、競合を特定する処理を必ず作る
計算が終わらない制限時間を設け、その時点の最良解を返す。制約の数を見直す
自由記述の日付を勝手に補う特定できないものは確認事項にする
希望の理由の原文が計算データに残る区分だけを持つ。原文は管理者の確認用に分けて持ち、月末に消す
手で直した後に法令の条件が崩れる手直し後の検証処理を用意する
公平性のルールが文書化されていない先に書き出す。ここを飛ばすと、出てきた原案が「感覚と違う」と言われて終わります
管理者ごとに重みの設定がばらばら課をまたいで重みを揃える。違えるなら理由を記録する
確定前の原案が従業員に見えてしまう確定操作を起点に公開する。原案の共有範囲を管理者に限る

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

この構成で扱うデータ: 従業員の氏名、勤務可能な時間帯、資格、過去の勤務実績、シフト希望の理由。理由の欄には通院、家族の介護、子どもの事情といった私的な情報が入ります。

  1. 希望の理由を計算に使わない … 必要なのは「その日のその時間帯が不可か」と「その強さ」だけです。理由の原文をLLMに渡す必要はありますが、変換後のデータには区分だけを残し、原文は管理者の確認用に分けて保持してください
  2. 健康情報の扱い … 「腰の具合が」「通院のため」といった記述は、健康に関する情報です。内容を転記せず、管理者が本人と個別に話す対象として印を付けるだけにしてください。 要配慮個人情報に当たる可能性があります
  3. 外部AIへの入力可否 … 従業員の氏名と私的な事情が含まれます。自社の個人情報の取扱規程を確認してください。氏名を社員番号に置き換えてから渡す構成が取れます(変換に氏名は不要です)
  4. 学習利用 … 入力を学習に使わないことが契約で保証されるサービスを選びます
  5. アクセス権限 … シフト希望の原文と変換結果の閲覧を、当該課の管理者と人事部門に限定します。他の従業員が見られる状態にしないでください
  6. 不利益取扱いの防止 … 希望を断る回数や理由の区分を、人事評価に結び付けないでください。育児・介護を理由とする希望の扱いには、法令上の配慮義務があります
  7. 自動実行してよい範囲 … 原案の作成までです。シフトの確定、本人への通知、勤怠システムへの登録は、必ず管理者が行います

誤りが起きた場合のリスクは、法令違反のシフトの運用と、希望の扱いをめぐる労務問題です。計算の根拠(制約の設定と罰点の内訳)を残し、後から説明できる状態にしてください。

10まず何から始めるか

1〜2週目:制約を紙に書き出す

1つの課を選び、次を書き出します。

  • 工程 × 時間帯 × 曜日ごとの必要人数
  • 工程ごとに必要な資格と、有資格者の一覧
  • 法令と労使協定で決まっている条件(連続勤務日数、休憩、インターバル、時間外の上限)
  • 公平性のルール(夜勤回数の許容差、連休の配分、希望を断る優先順位)

この作業に2週間かけてください。 ここが曖昧なまま実装に入ると、出てきた原案が使えません。

3週目:管理者が作った表を検証する

過去3か月の実際のシフト表について、書き出したハード制約を満たしているかを機械的に確かめます。破っている箇所が見つかることが多く、それが導入の理由になります。

4〜5週目:1課で計算してみる

OR-Tools の従業員シフトの例を動かし、自社の制約に置き換えます。必要人数はソフト制約にしてください。 計算時間を実測し、管理者に結果を見せて「使えるか」を聞きます。

2か月目:自由記述の変換を試す

過去のシフト希望用紙から30件を選び、LLMで変換させます。管理者の読み取りと比べ、誤りと確認事項の数を数えます。

3か月目以降: フォームでの希望受付、競合の説明、手直し後の検証を追加し、1課で3か月運用します。600分が何分になるかを実測し、手直しの理由を集めて制約に書き足していきます。 他の課へ広げるのはその後です。


11関連ユースケース

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

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

技術仕様確認日:2026-09-15/最終更新:2026-09-15
確認した内容情報源確認日
Google OR-Tools の CP-SAT ソルバーで従業員のシフト作成(各日1シフト、連続シフトの禁止などの制約)を扱えること。公式ドキュメントに従業員シフトの例が用意されていることGoogle for Developers: Employee Scheduling(OR-Tools)2026-09-15
より複雑なシフト作成の実装例(shift_scheduling_sat.py)が OR-Tools のリポジトリに公開されていることgoogle/or-tools: examples/python/shift_scheduling_sat.py2026-09-15
時間外労働の上限が原則として月45時間・年360時間であり、特別条項を結んだ場合も年720時間以内、複数月平均80時間以内、月100時間未満、月45時間超は年6回までを満たす必要があること厚生労働省 働き方改革特設サイト:時間外労働の上限規制2026-09-15
Claude API に、出力をJSONスキーマに沿わせる構造化出力の機能があること(2026-09-15時点ではベータ機能)Claude Platform Docs: Structured outputs2026-09-15

計算時間は制約の数と規模によって大きく変わります。この部分は自社のデータでの実測が必要です。 勤務間インターバル、連続勤務日数の上限、業種ごとの人員配置基準(医療・介護など)は、自社の就業規則・労使協定および関係法令を確認してください。育児・介護を理由とする勤務時間の配慮については、育児・介護休業法の定めを確認してください。個別の法令解釈は社会保険労務士に確認してください。

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

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

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

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