見出し画像

【シフト完全自動化】80点とるまでの地獄の記録

みなさんこんにちは!単身赴任ヘルパー・ジークです!いつも読んでいただき、ありがとうございます☺️

前回、AIとの丸1日でシフト作成の「ルール表」と「機械が採点する仕組み」が完成した話を書きました。


あれは、シフトを埋めるための道具がとりあえずできたものです。完成度的には7-8割。

その翌日、実際にテスト用にランダムに希望休などを入れて9月のシフトを組ませてみたら、また地獄でした。ただし今回は、前回とは違う種類の地獄です。動いてはいるけど、使えないそういう失敗の連続でした。


💡 まず、前回の「完成」が崩れた


道具ができた当日、真っ先に試したのが前回「完成・違反0」と報告されていた8月のシフトでした。改めて採点にかけてみると、違反が4件出てきたんです。

原因は単純で、前回の採点機に、いくつかのルールがそもそも入っていなかったから。夜勤明けの翌日は休みにする、水曜は原則休みにする。そういう項目が抜けていました。

前回の記事で「AIの自己申告は、用意したチェック項目の範囲でしか意味がない」と書きましたが、まったく同じことがもう一回起きたことになります。チェック項目を増やしたら、増やした分だけ違反が出てきました。チェック機能があることと、正しくチェックしていることは別なんだと痛感しました。

💡 それから、修正のやり取りが続いた


まず、AIが設定ファイルに書いた各職員の希望時間を見たら、数字が全部違っていました。古いプログラムに直書きされていた数字を、シートを見ずにそのまま写していたんです。「その数字、どこから持ってきたの?シートと違うよ」と伝えました。前回あれだけ「頭の中の数字で埋めるな」と話したのに、また同じことが起きていました。しかもこのとき、テスト実行で8月の確定データを上書きしていたことも最初の報告にはなくて、指摘してから出てきました。ミスそのものより、ミスを報告しないことの方が僕には気になります。

次に、僕は9月の希望休がまだ出ていないと伝えただけなのに、AIが勝手に9月の設定ファイルを作り込んでいました。「9月を作ってとは言ってないよ」と伝えました。頼んだのはボタン化だけです。勝手に先回りされると、何が確定で何が仮なのか分からなくなってしまいます。

「ボタン化しました」と報告があったのでダブルクリックしたら、エラー画面が出てきました。「あれ、これで合ってる?」と戸惑いました。中身は結局、設定ファイルを自分で開いて書き直せというものだったんです。それはボタンとは呼べません。

直させたら、今度は質問が15個も順番に出てくる形になりました。シフト表を見ながら15個答えるのは、同じ情報を2回打ち込んでいるだけです。「これ、けっこう手間だね」と伝えたら、Mac側のプログラムにシフト表を見る権限がないからだと言われました。それなら、作る前に教えてほしかったです。制約があると分かっていれば、別のやり方を選べたので。この件は、僕が9月のシフト作ってと言えば、AIが全部やる、というやり方に落ち着きました。一番速いのがそれだった、というのは、ちょっと皮肉だなと感じます。

ファイルができたと言うので探しましたが、どこにあるか分かりませんでした。「これ、どこにあるの?」と聞き返しました。このあたりで、動くものを作ることと、人が使える状態にすることは別の仕事だなと感じました。

試しに質問15個を全部Enterで飛ばしてみたら、普通にシフトができてしまいました。希望休ゼロ・希望時間ゼロで組まれた、誰も休めないシフトです。しかも「シートに貼り付けてよい状態です」と出る。これは事故になります。空のまま実行したら大きく警告を出すように直させました。

とにかく待たされる場面も多くて、組み直しのたびに数分かかりました。「これ、もう少し早くならない?」と伝えたら、組めないと分かっている条件を、毎回ゼロから順番に試し直していたそうです。前回組めなかった記録を残して、次はそこから始めるように直させました。

💡 AIが見つけた、自分の設計ミス3つ


ここが今回の核心だと思います。動いていたつもりのプログラムに、根本的な穴が3つありました。

1つ目。ルール上、どうしても組めない時の逃げ道は3段階あって、優先順位が決まっています。まず連続夜勤を本人に頼む、それでも無理なら希望休の日に明けを置く、それでも無理なら空欄にして手で埋める。ところが1番目の連続夜勤が、一度も発動していませんでした。理由は、前の晩に夜勤に入った時点で翌日のマスが自動で明けで埋まってしまう作りだったからです。埋まっているマスには夜勤を置けないので、候補から永久に外れていました。これを直さないと、そもそも解が存在しない状態でした。

2つ目。前回あれだけ「夜勤と明けは別物、夜勤を舐めるな」と伝えたのに、夜勤を置く時のチェックで明けの分を数えていませんでした。だから週6回勤務のシフトが「違反0」で出てきてしまっていたんです。

3つ目は僕が気づいたことです。「イレギュラーな時間が書かれてない。これだとカレンダーに反映されないよ」と伝えました。このシフト表には勤務行の下にメモ行があって、標準と違う時間帯をそこに書く決まりがあります。たとえば朝の2人目を夜勤明けの人に頼んだ日は、その夜勤の日のメモ行に時間を書き込む必要があるんです。書かないと、カレンダーにも出ないし、時間数にも反映されません。該当する日が8日あって、全部空欄になっていました。半日勤務も同じで、時間を書かないとその日が0時間扱いになってしまいます。

動いているということと、合っているということは、まったく別の話でした。

💡 9月を組ませたら、三つ巴になった


希望休が揃ったので、いよいよ9月を組ませました。ここからが本番でした。

まず「組めません」という報告から始まりました。原因を確認すると、ある週末の2日間、ほぼ全員が希望休か別現場で、1人しか夜勤に入れる人がいない状態でした。夜勤は毎日1人必要なので、同じ人に2日続けて夜勤を頼む以外に方法がありません。そこで連続夜勤の例外が必要になるのに、前のセクションで見つかった穴のせいで使えませんでした。直したら組めました。

そして今度は、連続夜勤が3件出てきました。「さすがに3つはやりすぎだよ。優先順位を見直そう」と伝えました。3人に2日連続で夜勤を頼むのは、現場としてさすがに無理があります。AIは「夜勤を1日空欄にすれば連続夜勤ゼロにできます」と提案してきましたが、それは違いました。空欄にするというのは、外部のスポットの方に助けを求めるということだからです。「連続夜勤の依頼の方を、スポットへのヘルプより優先して」と伝えました。身内で回せるなら身内で回す。外に助けを求めるのは最後の手段です。

組み上がったシフトを見て、もう一つ気づいたことがありました。ある職員だけ土日が8日全部休みになっていて、他の人は2〜4日でした。これは不公平です。「土日休みが偏りすぎてるよ」と伝えました。これはルール表に無かったルールで、僕の頭の中にしかなかったものでした。土日の公休は人によって偏らせない、多い人と少ない人の差は2日までとして、あらためて追加しました。

ここで、3つの条件が同時には立たないことが分かりました。シーソーが3つ繋がっていて、どれか1つを持ち上げると、必ず他のどれかが下がる。そんな感覚です。連続夜勤を減らすと時間数か土日の平等が犠牲になり、時間数を満たすと土日の平等が崩れ、土日を平等にすると時間数が崩れる。理由ははっきりしていて、ある職員の希望休4日が全部土日に集中していたからです。その人は希望時間を満たすために週5回の上限にぴったり張り付いていて、休める日が土日にしか置けない。土日に働かせようとすると、別の週が6回になって違反してしまいます。

僕の判断はこうでした。「希望休は絶対に動かさない。全部組み直して」「時間数より、土日の平等を優先して」。結果、その人の時間数を少し減らして、土日の差を縮めることにしました。時間が減るのは申し訳ないですが、特定の人だけ土日が全部休みという形の方が、現場としては歪むと感じたからです。

三つ巴を緩めるために、AIが見つけた事実が一番効きました。夜勤と明けは2日使って14時間、1日あたりに直すと7時間。日勤は1日10時間です。つまり、週5回の上限がある人に夜勤を多く振ると、日数を使い切っても時間数が伸びません。逆に、希望時間が高い人ほど夜勤を減らして日勤を増やすのが正解でした。それまでAIは全員に均等に夜勤を割り振っていたんです。希望時間から夜勤の回数を逆算するように変えたら、不足していた時間数が大きく縮まって、他の職員の超過も範囲内に収まりました。ここが今回いちばん効いた改善でした。

💡 最後に大掃除をさせた


「このシフトに関する矛盾コードや重複コード、古いコードは全部消して」と伝えました。

出てきたのは、古いファイルよりも、中身の重複と矛盾の方が問題でした。時間の計算と、明けの残業の判定が、組む側と採点する側の2か所に別々に書かれていたんです。これはまさに、ルールが片方だけ古くなるパターンでした。1か所にまとめさせました。

さらに、手順書が指しているファイルと、AIが実際に最終案を作った手順が違っていることも分かりました。AIは手元の別のスクリプトで作っていて、正規の入り口はその処理を通っていなかったんです。つまり、手順書どおりにやっても同じものが出てこない状態でした。統合させて、走らせて同じ結果が出ることを確認させました。

これは、一人で作業していたら絶対に気づかなかったと思います。

最後に、この仕組みをCodexでも動かせるように共有しておきました。

💡 今回の学び

動くことと使えることは、別の話でした。エラーメッセージが専門的な内容だと、それは動いているだけで、使えてはいません。

制約は作る前に伝えてほしい、とも思いました。スプレッドシートが数分で止まってしまうことも、Mac側からシートを直接読めないことも、先に分かっていれば別の選択ができたはずです。作り終わってから知らされても、もう遅いんですよね。

チェック機能があることと、正しくチェックしていることも、別でした。チェック項目を増やしただけで、前回「完成」だったはずのシフトから違反が4件出てきました。採点する仕組みそのものを疑う日が来るとは思っていませんでした。

ルールは1か所に集めないと、必ずどちらかが古くなります。今回もまさにそれで事故りました。人間の目だけでは追いきれない部分です。

そして、一番大事なルールほど、実は言葉にしていないことが多いんだと気づきました。土日の休みを偏らせない、というのは、誰も書き出していないルールでした。出来上がったものを見て、初めて「これは違う」と分かる。AIに任せるほど、自分の頭の中を言葉にする作業が増えていく感覚があります。

最後に、全部は同時に立たないということ。連続夜勤を減らす、時間数を満たす、土日を平等にする。この3つは同時には立ちませんでした。何を捨てるかは、AIには決められません。僕は土日の平等を選んで、一人分の時間数を諦めました。この判断だけは、外注できないと思っています。

道具ができた話の続きが、今回の「使ってみたら地獄だった」という記録です。

今回のログを振り返ると、テストの9月分は形として完成しました。ただ体感の完成度で言うと、まだ7割くらいだと思っています。仕組みが穴を見つけて直す動きはできてきたものの、土日の偏りみたいに、僕の頭の中にしかなかったルールが、まだ他にも眠っている気がしているからです。

だから当面は、全部を仕組みに預けず、仕組みが組んだものを、毎回僕が見る。おかしいところがあれば直す。そのやり取りを続けながら、精度を上げていくつもりです。自動化と手動、ハイブリッドで時間をかけて仕上げていく段階だと思っています。
けどここまでの成果物ができたことは、自信になりました☺️

もし「ここが気になる」「実際どうなの?」といったことがあれば、ぜひコメント欄で教えてください。僕の見てきたことや、これまでの体験ベースのお話にはなってしまいますが、少しでもお役に立てれば嬉しいです。皆さんと情報交換できるのを楽しみにしています!😊

📖 あわせて読む

📮 質問箱はじめました
コメントしづらいことも、匿名で気軽にどうぞ!

いいなと思ったら応援しよう!