希望とスキルと法令の制約を満たすシフト表の原案を作る
工程ごとの必要人数、資格、法令の制約、本人の休み希望を入力に、条件を満たすシフト表の原案を作ります。管理者の作業は、白紙の表を埋めて何度も組み直すことから、出てきた原案を見て調整することに変わります。
- 利用ツール
- ChatGPT/Claude/Gemini/Python
- 対象業界
- 介護/医療/宿泊/物流/製造
- 対象部門
- 人事/生産
- 対象業務
- 書類作成/集計・分析
- 主な課題
- 人手が足りない/判断に時間がかかる/属人化している
- AIで行う処理
- 生成
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 翌月のシフト希望を、締め切りを決めて集める(紙の用紙、チャット、口頭)
- 管理者が希望をExcelに転記する
- 工程ごと・時間帯ごとの必要人数を確認する
- 資格の要る工程について、有資格者の一覧を確認する
- Excelの表に、人を1人ずつ割り当てていく
- 必要人数が足りない枠が出たら、希望を断って埋める
- 夜勤の回数が偏っていないかを目で確認して直す
- 連続勤務日数や休憩の条件を満たしているかを確認する
- 完成したシフト表を掲示し、変更になった人に個別に説明する
- 公開後の変更依頼に、その都度対応する
- 従業員がフォームからシフト希望を出す(自由記述の欄を残す)
- 自動希望の自由記述を、日付と時間帯と理由の区分に変換する
- 自動変換に迷ったものを、確認事項として管理者に出す
- 人管理者が変換結果を確認し、必要なら直す
- 自動必要人数・資格・法令・希望・公平性の条件を制約として組み立てる
- 自動制約を満たす割り当てを計算する
- 自動解が出ない場合は、どの条件が競合しているかを示す
- 人管理者が競合する条件の優先度を決める(希望を断る/応援を頼む/必要人数を見直す)
- 自動再計算し、原案を出す
- 人管理者が原案を確認し、最終判断して確定する
- 自動希望が通らなかった人への説明文を作る
- 人管理者が確認して本人に伝える
各工程の詳しい説明を読む
- 翌月のシフト希望を、締め切りを決めて集める(紙の用紙、チャット、口頭)
- 管理者が希望をExcelに転記する
- 工程ごと・時間帯ごとの必要人数を確認する
- 資格の要る工程について、有資格者の一覧を確認する
- Excelの表に、人を1人ずつ割り当てていく
- 必要人数が足りない枠が出たら、希望を断って埋める
- 夜勤の回数が偏っていないかを目で確認して直す
- 連続勤務日数や休憩の条件を満たしているかを確認する
- 完成したシフト表を掲示し、変更になった人に個別に説明する
- 公開後の変更依頼に、その都度対応する
問題は5つあります。
(a)希望の読み取りに時間がかかる。 50名分の自由記述を読み、「いつ、どの時間帯が、なぜ不可なのか」を整理する作業が、毎月3時間かかります。
(b)組み直しが連鎖する。 1か所を直すと、必要人数や夜勤回数の条件が崩れ、別の場所を直すことになります。5回、6回と組み直すのが普通です。
(c)判断の基準が管理者ごとに違う。 希望を断る優先順位、夜勤回数の許容範囲、資格者の配置の考え方が、5名の管理者でばらばらです。異動すると引き継げません。
(d)法令の条件を目で確認している。 連続勤務日数、休憩時間、勤務間のインターバル、時間外労働の上限を、完成後に目で見て確かめています。見落とせばそのまま運用されます。
(e)変更の説明ができない。 「なぜ自分の希望が通らなかったのか」を聞かれても、組んだ経緯を再現できないため、納得のいく説明ができません。
- 従業員がフォームからシフト希望を出す(自由記述の欄を残す)
- 【自動】 希望の自由記述を、日付と時間帯と理由の区分に変換する
- 【自動】 変換に迷ったものを、確認事項として管理者に出す
- 【人】 管理者が変換結果を確認し、必要なら直す
- 【自動】 必要人数・資格・法令・希望・公平性の条件を制約として組み立てる
- 【自動】 制約を満たす割り当てを計算する
- 【自動】 解が出ない場合は、どの条件が競合しているかを示す
- 【人】 管理者が競合する条件の優先度を決める(希望を断る/応援を頼む/必要人数を見直す)
- 【自動】 再計算し、原案を出す
- 【人】 管理者が原案を確認し、最終判断して確定する
- 【自動】 希望が通らなかった人への説明文を作る
- 【人】 管理者が確認して本人に伝える
自動化されるのは「読み取る」「変換する」「割り当てる」「条件を確かめる」「説明文を作る」の5つです。残るのは「誰の希望を優先するか」の判断で、これは管理者の仕事です。
02今回想定するシステム構成
従業員(シフト希望の提出) │ ▼ フォーム(日付・時間帯の選択 + 自由記述) │ ▼【トリガー】締め切り翌日 朝6時(スケジュール) Python のバッチ処理 │ ├──▶ LLM API ── 自由記述を制約に変換 │ (「夕方は難しい」→ 該当日の準夜勤を不可) │ ├──▶ 制約の組み立て │ ├─ 必要人数(工程 × 時間帯 × 日) │ ├─ 資格要件(工程ごとの有資格者のみ) │ ├─ 法令(連続勤務日数・休憩・インターバル・時間外の上限) │ ├─ 本人の希望(優先度つき) │ └─ 公平性(夜勤回数・休日の偏り) │ ├──▶ 制約プログラミングで解く(AIは使わない) │ ├──▶ 解が出ない場合 ── 競合する制約を特定 │ └──▶ LLM API ── 競合の内容を管理者に説明 │ ▼ シフト原案 ──【管理者が確認・調整・確定】 │ ├──▶ LLM API ── 希望が通らなかった人への説明文 │ ▼ シフト表の掲示 + 勤怠システムへの登録
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(OR-Tools の CP-SAT ソルバー) | 商用の最適化ソルバー、個別実装 |
| 生成AI | Claude API | OpenAI API、Gemini API |
| 希望の受付 | Google フォーム | Microsoft Forms、社内の申請システム |
| 出力先 | Google スプレッドシート | Excel、勤怠管理システム |
シフト作成の機能を持つ勤怠管理システムやシフト管理SaaSがあるなら、まずそれを検討してください。 業種に特化した製品(介護の人員配置基準に対応したもの、小売の売上予測と連動するものなど)が存在します。自前で組む価値があるのは、自社固有の制約(工程と資格の組み合わせ、応援のルール、公平性の考え方)が製品の想定と合わない場合です。
Python を選んだのは、制約の記述と業務ルールを1か所に書けるためです。 OR-Tools の CP-SAT ソルバーは、制約プログラミングとSATソルバーを組み合わせたもので、従業員のシフト作成のような問題に使えます。Google の公式ドキュメントに従業員シフトの例が用意されており、より複雑な例も公開されています。
03どうやって実装するのか
処理の起点を決める
希望の締め切り翌日の朝に、定時で一括実行します。 管理者が出社したときに、希望の変換結果と最初の原案が出来ている状態にします。
再計算は管理者が手動で実行できるようにします。条件の優先度を変えて解き直す操作が何度も発生するためです。1回の計算に数分かかるので、待っている間に他の作業ができる形にしてください。
規模の目安として、公開されている実装例の報告では、150名・30日・50種類のシフトの規模で2〜5分、300名以上になると10〜30分かかるとされています。240名なら数分の範囲に収まる見込みですが、制約の数によって大きく変わるため、自社のデータで必ず実測してください。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| シフト希望 | 従業員ごとの休み希望、時間帯の希望、自由記述 | フォーム |
| 従業員マスタ | 社員番号、氏名、所属課、雇用区分、勤務可能な時間帯 | 人事システム |
| 資格の保有状況 | フォークリフト、食品衛生責任者、機械の操作資格など | 人事システム/資格台帳 |
| 工程の必要人数 | 工程 × 時間帯 × 曜日ごとの必要人数と、必要な資格 | 生産計画 |
| 生産計画 | 翌月のラインごとの稼働予定 | 生産管理システム |
| 過去の勤務実績 | 夜勤回数、休日出勤、時間外労働の累計(直近12か月) | 勤怠管理システム |
| 法令・協定の条件 | 連続勤務日数の上限、休憩、勤務間インターバル、36協定の上限 | 就業規則・労使協定 |
| 公平性のルール | 夜勤回数の許容差、連休の配分、希望の通し方の優先順位 | 各課の運用(文書化が必要) |
「公平性のルール」が、この構成でいちばん手間のかかる入力です。 現在は管理者の頭の中にあります。「夜勤は月8回まで、人による差は2回以内」「3か月連続で年末年始に出た人は次は外す」といったルールを、数字で書き出す必要があります。この作業自体が属人化の解消になります。
データの取得方法を決める
シフト希望: フォームの回答をスプレッドシートから読み込みます。自由記述の欄を必ず残してください。 選択肢だけにすると、書ききれない事情が口頭で入ってきて、結局手作業が残ります。
過去の勤務実績: 勤怠管理システムからCSVで取得します。夜勤回数の偏りと時間外労働の累計に使います。時間外労働の上限(月45時間、複数月平均80時間、年720時間など)を制約に入れるために、過去12か月分が必要です。
工程の必要人数: 生産計画から算出します。これが読めない月は、この構成は使えません。 必要人数が当日にならないと決まらない業務では、前提が成り立ちません。
AIへ渡す前に整形する
- 自由記述の変換 … LLMで「日付・時間帯・可否・理由の区分・強さ」に変換します(後述)
- 変換結果の確認 … 変換に迷ったものを管理者に見せ、確認してもらいます。ここを飛ばすと、誤った制約で解いてしまいます
- 制約の分類 … すべての制約を「絶対に守るもの(ハード制約)」と「できれば守るもの(ソフト制約)」に分けます
- 資格と工程の対応づけ … 工程ごとに、割り当て可能な有資格者の集合を作ります
- 過去実績の集計 … 夜勤回数、休日出勤日数、時間外労働の累計を従業員ごとに集計します
3番目の分類が、この構成の設計の核です。
| 種別 | 内容 | 例 |
|---|---|---|
| ハード制約 | 破れない。破ると解なしとする | 法令(休憩・連続勤務日数・インターバル・時間外の上限)/資格の要る工程への無資格者の配置禁止/1人が同じ日に2つの勤務に入らない |
| ソフト制約 | 破ってよいが、破るたびに罰点がつく | 本人の希望/夜勤回数の偏り/連休の配分/同じ班の組み合わせ |
必要人数をハード制約にしないでください。 必要人数を絶対条件にすると、人が足りない月に解が1つも出なくなります。 現実には「必要人数を1名下回る枠がある」シフトでも運用できます。必要人数はソフト制約にして、下回った分を罰点として数え、管理者にどこが薄いかを見せるほうが使えます。
AIに処理させる
割り当ての計算は制約プログラミングで行います。 目的関数は「ソフト制約の罰点の合計を最小にする」です。罰点の重みが、そのまま優先順位になります。
LLMにさせること:
| 処理 | 内容 |
|---|---|
| 自由記述の変換 | 「来週は子どもの行事で夕方は難しい」→ 該当日の準夜勤を不可、強さ=強 |
| 変換の不確かさの提示 | 日付が特定できない、強さが読み取れないものを確認事項にする |
| 競合の説明 | 解が出なかったとき、どの条件とどの条件がぶつかっているかを管理者に伝える |
| 原案の要点の説明 | 「今月は夜勤の希望が少なく、Aさんに3回集中しています」といった注意点を書く |
| 本人への説明文 | 希望が通らなかった人に、理由を添えた連絡文を作る |
LLMにシフトを割り当てさせないでください。 240名×30日の割り当てが制約を満たしているかは、目では確認できません。制約プログラミングで解けば、出てきた解はハード制約を必ず満たしています。 これが検証可能性の差です。
「競合の説明」が実務では大きく効きます。 解が出ないとき、ソルバーは「実行不可能」としか返しません。管理者が知りたいのは「なぜ解けないのか」です。ハード制約を1つずつ外して解き直し、どれを外すと解けるようになるかを特定すれば、競合している条件が分かります。 その内容をLLMに日本語で説明させます。
指示内容を固定する
自由記述の変換(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が提案した割り当ては、他の制約を破っている可能性があります。管理者が条件を変えて解き直すのが正しい手順です。
自由記述の変換で「理由の原文を転記しない」としているのは、意図的です。 シフト希望の理由には、通院、家族の介護、子どもの事情といった私的な情報が書かれます。これを計算に使う必要はありません。 必要なのは「その日のその時間帯が不可かどうか」と「その強さ」だけです。
出力形式を固定する
自由記述の変換:
{
"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時点ではベータ機能として提供)。自由記述の変換のように形の崩れが後段を壊す処理では、利用できると安全です。
システムへ連携する
| つなぐ先 | 内容 |
|---|---|
| フォーム/スプレッドシート | シフト希望を受け取る |
| 人事システム(読み取り) | 従業員マスタと資格の保有状況を取得する |
| 勤怠管理システム(読み取り) | 過去の勤務実績を取得する |
| 生産管理システム(読み取り) | 翌月の生産計画から必要人数を算出する |
| スプレッドシート | 原案を出す。管理者の調整もここで行う |
| 勤怠管理システム(書き込み) | 確定したシフトを登録する(確定後のみ) |
確定前のシフトを勤怠システムに書き込まないでください。 原案の段階で書き込むと、従業員が見て混乱します。確定は管理者の操作を起点にします。
人が確認する
原案は必ず管理者が確認し、確定します。自動確定しません。
確認するのは次の点です。
| 確認する点 | 見る場所 |
|---|---|
| 人数が薄い枠がないか | understaffed_slots |
| 誰の希望を断ったか | requests_denied |
| 夜勤の回数が偏っていないか | night_shifts_per_employee |
| 連続勤務が上限に近い人がいないか | consecutive_days_near_limit |
health_related の印が付いた人の扱い | 変換結果の一覧 |
| 現場の事情(人間関係、教育中の組み合わせ) | 原案の全体 |
最後の項目は制約に書けません。 「この2人は同じ班にしない」「新人はベテランと組ませる」といった事情は、書けるものは制約にしますが、書ききれないものが必ず残ります。管理者が見て直す余地を残してください。
手で直したら、必ず再計算してください。 1か所を直すと法令の条件が崩れることがあります。手直し後のシフトについて、ハード制約を満たしているかを検証する処理を用意してください。 これがないと、制約プログラミングを使う意味が半減します。
例外に対処する
| 起きること | 対応 |
|---|---|
| 解が見つからない(実行不可能) | ハード制約を1つずつ外して解き直し、競合を特定する。必要人数はソフト制約にしておく |
| 計算が時間内に終わらない | 制限時間を設けて、その時点の最良解を返す。status: feasible として出す |
| 自由記述の日付が特定できない | 変換せず、確認事項として管理者に出す |
| 希望の締め切り後に変更が来る | 再計算する。確定後の変更は原案作成とは別の運用(交替の申し出)にする |
| 資格者が足りず、工程に人を配置できない | ハード制約なので解なしになる。競合として提示し、応援の依頼を促す |
| 時間外労働の上限に当たる人がいる | ハード制約として外す。法令の上限は破らせない |
| 健康に関する記述があった | 内容を転記せず、管理者が本人と個別に話す対象として印を付ける |
| 同じ人に夜勤が集中する | ソフト制約の重みを上げて再計算する。自動で均等化すると別の条件が崩れるので、管理者に選ばせる |
| 生産計画が翌月分まで確定していない | 前月実績を暫定の必要人数として使い、確定後に再計算する |
| 管理者が手で直した結果、法令の条件を破った | 手直し後の検証処理で検出し、警告する |
記録を残す
- シフト希望の原文(管理者の確認用。計算には使わない。対象月の終了後に削除する)
- 変換後の制約(
source_text_hashつき) - 制約の設定(ハード/ソフトの分類と重み)
- 計算結果(
assignmentsとsoft_constraint_penalties) - 管理者が手で直した内容と、その理由
- 確定したシフト表
- 本人への説明文と、その送信記録
「管理者が手で直した内容と、その理由」が、この構成の資産です。 「この工程には新人を1人までしか入れない」といった、制約に書けていなかった条件が見えてきます。それを制約として書き足していけば、手直しは減ります。
シフト希望の原文は、対象月が終わったら消してください。 理由の欄には私的な情報が書かれます。残す理由がありません。
04実装レベルの3段階
この業務では本格構成に価値があります。 半自動化だけだと、解けなかったときに管理者が手作業に戻ってしまい、「結局使えない」という評価になりがちです。 競合の説明と手直し後の検証があって初めて、日常的に回ります。
05工数削減シミュレーション
導入後 5件 × 180分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 交替勤務またはシフト勤務が常態で、1つの単位あたり30名以上を組む企業。必要人数・資格要件・法定の休憩や連続勤務の制約が文書化できること。シフト作成に1回あたり半日以上かかっていること。
- 勤務が固定で、シフトを組む必要がない場合。1単位が10名以下で、管理者が短時間で組めている場合。すでに制約を扱えるシフト作成システムを導入している場合。必要人数が日ごとに読めず、当日にならないと決まらない場合。
07最小構成で試す方法
- 1つの課、1か月分を対象にする(40〜60名)
- 現在のシフト表と、そのときのシフト希望をそろえる
- 必要人数、資格要件、法令の条件、公平性のルールを紙に書き出す
- OR-Tools の従業員シフトの例を動かし、自社の制約に置き換える
- 同じ入力で計算した結果と、管理者が作った実際のシフト表を比べる
見るのは次の3点です。
| 見る点 | 判断 |
|---|---|
| 計算結果がハード制約を満たしているか | 満たしていなければ制約の書き方が誤っている |
| 管理者が作った表が、実はハード制約を破っていないか | 破っていれば、それだけで導入の価値があります |
| 計算結果を管理者が見て「これなら使える」と言うか | 言わないなら、書けていない制約がある。それを聞き出す |
3番目で出てくる「使えない理由」が、設計の材料です。 「このシフトだと引き継ぎができない」「この組み合わせは教育にならない」といった条件が出てきます。書けるものは制約にし、書けないものは手直しの余地として残します。
3番目のステップ(制約を紙に書き出す)を飛ばさないでください。 ここがこの構成でもっとも時間のかかる作業で、かつ、この作業だけでも属人化は減ります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 必要人数をハード制約にして、解が出ない | ソフト制約にして、不足枠を罰点として見せる。最頻出の失敗です |
| LLMに割り当てを考えさせる | プロンプトで禁止する。割り当ては必ずソルバーで解く |
| 解けない理由が分からず、手作業に戻る | ハード制約を1つずつ外して解き直し、競合を特定する処理を必ず作る |
| 計算が終わらない | 制限時間を設け、その時点の最良解を返す。制約の数を見直す |
| 自由記述の日付を勝手に補う | 特定できないものは確認事項にする |
| 希望の理由の原文が計算データに残る | 区分だけを持つ。原文は管理者の確認用に分けて持ち、月末に消す |
| 手で直した後に法令の条件が崩れる | 手直し後の検証処理を用意する |
| 公平性のルールが文書化されていない | 先に書き出す。ここを飛ばすと、出てきた原案が「感覚と違う」と言われて終わります |
| 管理者ごとに重みの設定がばらばら | 課をまたいで重みを揃える。違えるなら理由を記録する |
| 確定前の原案が従業員に見えてしまう | 確定操作を起点に公開する。原案の共有範囲を管理者に限る |
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 従業員の氏名、勤務可能な時間帯、資格、過去の勤務実績、シフト希望の理由。理由の欄には通院、家族の介護、子どもの事情といった私的な情報が入ります。
- 希望の理由を計算に使わない … 必要なのは「その日のその時間帯が不可か」と「その強さ」だけです。理由の原文をLLMに渡す必要はありますが、変換後のデータには区分だけを残し、原文は管理者の確認用に分けて保持してください
- 健康情報の扱い … 「腰の具合が」「通院のため」といった記述は、健康に関する情報です。内容を転記せず、管理者が本人と個別に話す対象として印を付けるだけにしてください。 要配慮個人情報に当たる可能性があります
- 外部AIへの入力可否 … 従業員の氏名と私的な事情が含まれます。自社の個人情報の取扱規程を確認してください。氏名を社員番号に置き換えてから渡す構成が取れます(変換に氏名は不要です)
- 学習利用 … 入力を学習に使わないことが契約で保証されるサービスを選びます
- アクセス権限 … シフト希望の原文と変換結果の閲覧を、当該課の管理者と人事部門に限定します。他の従業員が見られる状態にしないでください
- 不利益取扱いの防止 … 希望を断る回数や理由の区分を、人事評価に結び付けないでください。育児・介護を理由とする希望の扱いには、法令上の配慮義務があります
- 自動実行してよい範囲 … 原案の作成までです。シフトの確定、本人への通知、勤怠システムへの登録は、必ず管理者が行います
誤りが起きた場合のリスクは、法令違反のシフトの運用と、希望の扱いをめぐる労務問題です。計算の根拠(制約の設定と罰点の内訳)を残し、後から説明できる状態にしてください。
10まず何から始めるか
1〜2週目:制約を紙に書き出す
1つの課を選び、次を書き出します。
- 工程 × 時間帯 × 曜日ごとの必要人数
- 工程ごとに必要な資格と、有資格者の一覧
- 法令と労使協定で決まっている条件(連続勤務日数、休憩、インターバル、時間外の上限)
- 公平性のルール(夜勤回数の許容差、連休の配分、希望を断る優先順位)
この作業に2週間かけてください。 ここが曖昧なまま実装に入ると、出てきた原案が使えません。
3週目:管理者が作った表を検証する
過去3か月の実際のシフト表について、書き出したハード制約を満たしているかを機械的に確かめます。破っている箇所が見つかることが多く、それが導入の理由になります。
4〜5週目:1課で計算してみる
OR-Tools の従業員シフトの例を動かし、自社の制約に置き換えます。必要人数はソフト制約にしてください。 計算時間を実測し、管理者に結果を見せて「使えるか」を聞きます。
2か月目:自由記述の変換を試す
過去のシフト希望用紙から30件を選び、LLMで変換させます。管理者の読み取りと比べ、誤りと確認事項の数を数えます。
3か月目以降: フォームでの希望受付、競合の説明、手直し後の検証を追加し、1課で3か月運用します。600分が何分になるかを実測し、手直しの理由を集めて制約に書き足していきます。 他の課へ広げるのはその後です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 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.py | 2026-09-15 |
| 時間外労働の上限が原則として月45時間・年360時間であり、特別条項を結んだ場合も年720時間以内、複数月平均80時間以内、月100時間未満、月45時間超は年6回までを満たす必要があること | 厚生労働省 働き方改革特設サイト:時間外労働の上限規制 | 2026-09-15 |
| Claude API に、出力をJSONスキーマに沿わせる構造化出力の機能があること(2026-09-15時点ではベータ機能) | Claude Platform Docs: Structured outputs | 2026-09-15 |
計算時間は制約の数と規模によって大きく変わります。この部分は自社のデータでの実測が必要です。 勤務間インターバル、連続勤務日数の上限、業種ごとの人員配置基準(医療・介護など)は、自社の就業規則・労使協定および関係法令を確認してください。育児・介護を理由とする勤務時間の配慮については、育児・介護休業法の定めを確認してください。個別の法令解釈は社会保険労務士に確認してください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0091)についてのご相談はこちらから。
