
この記事は LayerX AI Agent ブログリレー 15日目の記事です。
前日は izumin(@ izumin5210) さんによる Temporal Workflow で実現する Durable な AI Agent でした。ロングタスク化しやすいAI Agentに適したWorkflow Engine、アツいですね。
こんにちは、バクラク事業部ソフトウェアエンジニアのTomoaki(@tapioca_pudd)です。 最近は、AI-BPO事業の立ち上げと筋トレに奮闘しています。
BPO(Business Process Outsourcing)とは、企業の業務プロセスの一部を外部の専門企業に委託することです。例えば、経理、人事、コールセンターなどの業務を外部に委託することで、企業は自社のコア業務に集中し、生産性を向上させられます。
私たちが取り組むAI-BPO事業は、従来のBPOにAI技術を組み合わせた新しいサービスです。AIが得意とするデータ入力、文書処理、問い合わせ対応などの定型業務を自動化することで、BPOをさらに効率化・高度化させます。 人間が一つひとつ行っていた作業をAIに任せることで、24時間365日、スピーディーかつ正確に業務を処理できるようになり、業務効率化、コスト削減、顧客体験の向上などが見込めます。
AI-BPOといっても、いきなり100%の業務をAIに任せるのは現実的ではありません。AIでは処理できなかった作業はオペレーター(人間)にフォールバックし、そのオペレーターの作業データを基にAIをさらに賢く育てていく、という人間とAIの協調が非常に重要になります。
AIの開発ももちろん大変ですが、実はそれと同じくらい、オペレーターのマネジメントも重要な業務です。特に、今回私たちのチームを悩ませていたのが「シフト管理」でした。
今回は、このシフト管理業務の効率化を実現したAI Agentの「シフト組子さん」を取材形式で紹介したいと思います。

オペレーターのシフト管理の課題
——シフト作成の業務について教えてください
はい。AI-BPO事業では専任のオペレーターが在籍しており、フルタイムで勤務する方もいれば、パートタイムで働く方もいるなど、多様な働き方をされています。 全員が毎日稼働するわけではないので、メンバーの都合に合わせてシフトを作成することが不可欠です。
シフトに対するご要望も本当に様々で、例えば、私がいつもお預かりしているご要望には、以下のようなものがあります。
- 特定の曜日は稼働できない
- 週n日以上は稼働できない
- 特定の曜日は午前のみ勤務
- 原則週4日勤務だけど、月の最終週だけは週2日にして欲しい
- 月にn日以上は最低でも稼働したい
- 月にn日以下に稼働を抑えたい
要望は毎月変わることもあるので、シフトに反映させるのは一苦労です。
また、AI-BPO事業のオペレーション責任者からも、シフト作成時の留意点として
- Googleカレンダーに別の予定がある日は入れないで欲しい
- 経験が浅い人は、ベテランの人とシフトを一緒にしてほしい
- 最低一人は現場監督として管理職の人がいるようにしたい
といった点を考慮するように依頼されています。
このように、シフト作成業務は「正解」がない中で、最低限守らなければならない組織的なルールや個人の稼働スケジュールを加味しながら、最適な組み合わせを模索する業務です。
さらに、シフトが完成した後に『やっぱりこの日、誰か代わってほしい…』といった急なご相談が舞い込んでくることもしばしばで、都度修正することも求められます。
AI Agentの導入
——大変な業務ですね。これまではどのようにシフト作成をされていたのでしょうか
これまでは、まずオペレーターに月ごとの要望をスプレッドシートへ記入してもらい、それをもとに担当者が人力でシフト表を作成していました。 この作業をしていた社員さん(人間)は、毎月1.5時間ほどの工数を割いていたそうです。
スプレッドシートで各オペレーターの要望を汲み取り、さらにGoogleカレンダーの予定も確認しながら作成する必要があり、かなり骨の折れる業務だったと聞いています。
AI-BPO事業は春先からスタートした事業で、まだ立ち上げフェーズのためオペレーターの人数もそれほど多いわけではありませんが、すでにかなり大変な業務になっていたようです。
最近は事業規模も大きくなってきたため、今後のことを考えると、なんとかシフト作成業務を効率化したいという強い要望がありました。
——確かに考慮すべきことが多いので頭がパンクしそうな仕事ですね。シフト作成の効率化はどのようにして進めたのでしょうか?
最初は無邪気に、スプレッドシートで集めた要望と1ヶ月分のGoogleカレンダーの情報をコンテキストに入れ、n8nのAgentノードを使ってどれほどの性能が出るのかを試してみました。

Googleカレンダーの情報も加わり、コンテキスト量がかなり大きくなったため処理に数分かかりましたが、Structured Output機能で出力形式を制約したため、それらしいシフト表が出力されました。
しかし、その中身をよく見てみると、渡した要件をほとんど満たしていないものでした。
週2日希望の人が週5日勤務になっていたり、月曜勤務不可の人が月曜にシフトインしていたりと、残念ながら「下書き」としても使えないレベルでした。予想はしていましたが、コンテキストに渡す情報が多すぎたようです。ちなみにモデルはOpenAIのGPT-5-miniを利用しました。
Agentのtoolの整備
——やはり、inputが多いと丸投げというわけにはいかないんですね。どのように改善したのですか?
試作での学びは、曖昧さを許容できない条件はAgentに任せてはいけないということです。
例えば、勤務不可日やカレンダーにすでに予定があるところにシフトが入ってしまうのは、絶対に避けたいですよね。 そういった要件は、プログラムで事前定義したロジックをツール(Tool)としてエージェントに呼び出させる方が、筋が良さそうです。
そこで、まずオペレーターからの要望をプログラムで処理できるよう、以下のような構造化データに変換するステップを挟みました。(スキーマやデータはイメージです)
{ "name": "tomoaki", "role": "<role>", "slack_id": "<slack_id>", "calendar_id": "<id>", "constraints": { "max_monthly_shifts": 15, // 月の最高稼働日数 "minimum_monthly_shifts": 10, // 月の最低稼働日数 "max_weekly_shifts": 3, // 週の最高稼働日数 "ideal_monthly_shifts": 12, // 月の理想的な稼働日数 "unavailableDates": ["10/31"], // 勤務できない日 "unavailableWeekdays": ["Monday"], // 勤務できない曜日 "preference": "" // その他上記のスキーマに当てはまらない個別の要望 } }
先ほども紹介しましたが、n8nにはワークフロー内部で自然言語をうまく構造化データへ変換してくれるStructured Output Parseノードというものがあるので、それを使います。便利ですね。
具体的なコードは割愛しますが、preference以外のフィールドとGoogleカレンダーの情報を使えば、preference以外の条件を考慮したシフトの下書きを作成するプログラムが作れます。これを「シフト下書きツール」と呼びましょう。
ーーなるほど。事前定義したプログラムで確実に満たした要件を満たした下書きを作るというわけですね。
そうです。ここまでくると「もうそのシフト生成プログラムだけあればいいんじゃない?」と感じるかもしれません。
しかし、preferenceフィールドのように、事前に定義したスキーマでは構造化しきれない「人間のアドホックで曖昧な要望」を汲み取り、最終的な微調整を行う部分でこそ、エージェントの真価が発揮されます。
実際にやってみて分かったのは、シフト管理とは複雑すぎる要件の中から最適な組み合わせを探す作業であり、一度に最適解を出すのはかなり難しいということです。
なので、曖昧さを許容できない条件を満たすように、まずは「下書き作成」を行い、その後の「反復的な微調整」をすることで最適解に近づけていくのが良いと考えています。
この「反復的な微調整」のプロセスを、対話形式で柔軟に対応できるエージェントに任せることで、管理コストを大幅に削減できると考えました。
具体的にはAgentノードを以下のように設定しています。「validateツール」も挟むことで、「反復的な微調整」によって曖昧さを許容できない条件が満たされなくなるリスクを防いでいます。

プロンプトは以下のように設定しました。
シフトを作成します 手順は以下 1. まずシフトの下書き作成toolで下書きを作成します 2. その後各メンバーのシフト希望表 のpreferenceを考慮しているか確認し、考慮が足りない場合は修正して 3. 修正した後にvalidate toolを実行し、エラーがある場合はエラー内容に沿って再度修正してください 全ての要件を満たすようになった場合は処理を完了して。処理を満たせない日がある場合は空白のままにしておいて。
ここではGPT-5のPrompting Guideにあるように、最低限の指示にしています。(”あなたは熟練のシフト調整マスターです”といった役割設定をプロンプトに入れていません)
モザイクを入れているので全然伝わりにくいと思いますが、結果として、最初に集めた要望をほぼ完璧に満たしたシフト表が完成しました!

ーーすごい、1.5時間かかっていた作業が自動化できちゃったんですね。元々作業を担当していた社員(人間)の反応は、いかがでしたか?
すごく喜んでくれました。毎月ノンコアな業務に1.5時間割くのは効率的ではないし、今後スケールする上でどんどん負荷が大きくなりそうな業務だったので早い段階で自動化できて嬉しいとの声をいただきました。
満たすべき要件はたくさんある一方で、正解は一つではなく組み合わせがほぼ無限にあるような業務は、人間にとって非常に負荷の大きい作業のようですね。
アドホックな修正への挑戦
ーー現場からも好評ですごいですね!月中の急な変更依頼などにも対応できるんですか?
ありがとうございます。「急用ができてしまって…!誰か代われませんか?」 といった突発的なシフト変更の依頼はつきものです。体調不良やご家族の看病などは予測できないので、シフト変更は発生する前提で考えています。

この変更依頼も、作成時と同じエージェントに依頼できます。作成時に使った「下書き作成ツール」を「既存シフトの読み込み」に置き換えるだけで、あとは対話形式で「Aさんが10/14稼働できなくなったから代役を探して」といった指示を出すだけで、制約条件を再評価しながらシフトを更新してくれます。
さいごに
ーー 取材ありがとうございました!読者の皆様にメッセージはありますか?
LayerXではAgent開発にめちゃくちゃ力を入れていて、今回はn8nでライトに実装しましたが、かなりディープダイブした取り組みも色々しているので一緒に働いていていつもワクワクする環境です!
もし興味ある方がいたら現場のいろんなメンバーがカジュアル面談を募集しているので気軽に話してみると良いと思います!本日はありがとうございました!