入荷予定と荷卸しの実績から、翌日のバースの時間割を組んで待ち時間を減らす
翌日入ってくる便ごとに、荷卸しにかかる時間を過去の実績から見込み、その見込みをもとにバース(荷受け場)の時間割を組みます。トラックが同じ時刻に重なるのを前日のうちにならし、構内での待ち時間を短くします。
- 利用ツール
- ChatGPT/Claude/Gemini/Google Apps Script/Make/n8n/Power Automate/Python
- 対象業界
- EC/小売/物流/製造
- 対象部門
- 物流/生産
- 対象業務
- 比較検討/集計・分析
- 主な課題
- データ分析に時間がかかる/人手が足りない/判断に時間がかかる
- AIで行う処理
- 予測
- 主な効果
- 判断支援/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- ノーコード連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 前日の午後、基幹システムから翌日の入荷予定(発注残と事前出荷明細)を書き出す
- 便ごとに、仕入先・品目・数量・荷姿をスプレッドシートに並べる
- パレットかバラか、何枚・何ケースかを見て、何分かかる便かの見当をつける
- 検品が要る品目、冷蔵のバースでなければ受けられない品目に印を付ける
- 8時から17時の枠に、便を上から順に置いていく
- フォークリフトと作業者が足りるかを頭の中で確かめ、重なったら時刻をずらす
- 決まった時間割を、運送会社ごとにメールで送る
- 当日、早着・遅着・飛び込みが出るたびに、その場で枠を動かす
- 自動前日15時に定時実行が動き、翌日の入荷予定を基幹システムから取り込む
- 自動便ごとに、過去の似た便を仕入先・品目区分・荷姿・数量帯・曜日で集める
- 自動集まった実績の件数を数え、少ないものに印を付ける
- 自動便ごとの所要時間の見込み(中央値と上振れの目安)、必要な機材、検品の要否をAIが返す
- 自動返ってきた分数が上限・下限の範囲に入っているかを機械で検査する
- 自動バース数・稼働時間・機材・作業者の制約を入れて、枠への割り当てを計算する
- 自動各バースに緩衝の枠を残したうえで、翌日の時間割の案を組む
- 人荷受け責任者が案を開き、幅の広い便と初めての仕入先だけを確かめる
- 人直すところを直し、承認する
- 自動承認された時間割を運送会社ごとに配信する
- 【人/自動】 当日、変更が出た便だけ差分を連絡する
- 自動到着・荷卸し開始・終了の実績を記録し、翌月の見込みの材料にする
各工程の詳しい説明を読む
- 前日の午後、基幹システムから翌日の入荷予定(発注残と事前出荷明細)を書き出す
- 便ごとに、仕入先・品目・数量・荷姿をスプレッドシートに並べる
- パレットかバラか、何枚・何ケースかを見て、何分かかる便かの見当をつける
- 検品が要る品目、冷蔵のバースでなければ受けられない品目に印を付ける
- 8時から17時の枠に、便を上から順に置いていく
- フォークリフトと作業者が足りるかを頭の中で確かめ、重なったら時刻をずらす
- 決まった時間割を、運送会社ごとにメールで送る
- 当日、早着・遅着・飛び込みが出るたびに、その場で枠を動かす
(a)所要時間が担当者の勘で決まる。 3番は経験の塊です。同じ便を見ても、担当者によって30分と45分に分かれます。 長く見積もる日は枠が余り、短く見積もる日はトラックがたまります。どちらが正しかったのかを確かめる習慣もありません。
(b)過去の実績を開かない。 倉庫管理システムには同じ仕入先の同じ品目の荷卸しが何十回分も残っています。それでも3番で開かないのは、探すのに時間がかかるからです。 20便分を1件ずつ検索する時間はありません。
(c)制約の確認が頭の中で終わる。 6番はメモに残りません。フォークリフトが3台しかないこと、full検品の便には2名要ることを、覚えている範囲で当てています。引き継ぎで渡せるのは、時間割の紙だけです。
(d)緩衝が残らない。 枠を詰めるほど「きれいな表」に見えるため、空きを残さない割り当てになりがちです。1便が15分遅れると、その後ろが全部ずれます。 飛び込みが入る余地もなく、当日の調整が8番のような場当たりになります。
- 【自動】 前日15時に定時実行が動き、翌日の入荷予定を基幹システムから取り込む
- 【自動】 便ごとに、過去の似た便を仕入先・品目区分・荷姿・数量帯・曜日で集める
- 【自動】 集まった実績の件数を数え、少ないものに印を付ける
- 【自動】 便ごとの所要時間の見込み(中央値と上振れの目安)、必要な機材、検品の要否をAIが返す
- 【自動】 返ってきた分数が上限・下限の範囲に入っているかを機械で検査する
- 【自動】 バース数・稼働時間・機材・作業者の制約を入れて、枠への割り当てを計算する
- 【自動】 各バースに緩衝の枠を残したうえで、翌日の時間割の案を組む
- 【人】 荷受け責任者が案を開き、幅の広い便と初めての仕入先だけを確かめる
- 【人】 直すところを直し、承認する
- 【自動】 承認された時間割を運送会社ごとに配信する
- 【人/自動】 当日、変更が出た便だけ差分を連絡する
- 【自動】 到着・荷卸し開始・終了の実績を記録し、翌月の見込みの材料にする
9番目が、この設計の分かれ目です。承認する前に配信しません。 機械が出した時間割がそのままトラックに伝わる作りにすると、制約の入れ忘れが1つあった日に、20社へ実行できない時刻を送ることになります。 一度そうなると、次の月から誰も時間割を見なくなります。
6番目と7番目をAIにやらせていないのも、意図してのことです。 見込みはAIが出しますが、その分数を制約に収める作業は計算の側に置きます。 バースが1本増えたときに直すのは、数字の設定だけで済みます。
02今回想定するシステム構成
【トリガー】前日15:00(Make の定時実行/17:00にもう一度) ▼ Make ── 基幹システムと倉庫管理システムから翌日の入荷予定を取得 ▼ Python ── 便ごとの特徴をそろえ、過去の似た便を集める ├──▶ 荷姿・数量・品目区分・仕入先・曜日・季節で絞る └──▶ 件数を数え(少ない便に印)、外れ値を落とす ▼ 1日分(20便前後)をまとめて投入 Claude API(構造化出力)── 便ごとの所要時間の見込みと幅、機材、検品の要否をJSONで返す ▼ Python ── 返り値の検査 → 制約を入れて枠へ割り当てる ├──▶ バース4本(うち冷蔵1本)/8:00-17:00/昼1時間停止 ├──▶ フォークリフト3台/作業者3名/full検品は2名 └──▶ 各バースに緩衝の枠を残す ▼ 【荷受け責任者が承認】幅の広い便と初回の仕入先だけ確認 ▼ Make ── 運送会社ごとに時間割を配信/当日の変更は差分だけ連絡 ▼ 実績の記録(到着・開始・終了)──▶ 翌月の見込みの材料へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | Make | Power Automate、n8n |
| 集計 | Python | Google Apps Script |
| 処理 | Claude API | OpenAI API、Gemini API |
倉庫管理システムと基幹システムは、この表に入れません。どちらも既にあるもので、読み取り専用でデータを出すだけだからです。 新しく足すのは、実績を集める部分、見込みを出す部分、枠に収める部分の3つです。
定時実行は Make のスケジュールで組みます。 選べる種類は「At regular intervals」「Once」「Daily」「Weekdays (Mon–Fri)」「Weekly」「Monthly」「Specified dates」「On demand」です。既定では15分ごとに実行されますが、今回は「Daily」を選びます。 1日の中に実行時刻を必要なだけ追加できるため、15時と17時の2回を登録します。間隔で指定する場合は分で書き、最小の間隔は契約しているプランによります。 開始日と終了日は詳細設定(show advanced settings)で指定します。
便の一覧を扱うところでは、フロー制御のモジュールを使います。 Iterator は配列を1件ずつのバンドルに分けるモジュールで、各要素が別々のバンドルとして出力されます。 戻すときは Array aggregator で1つにまとめます。使うときはどのモジュールから集計を始めるか(Source Module)を指定する必要があり、Group by の式で出力を分けられます。
ここに1つ注意があります。 Array aggregator では、Source Module から出たバンドルの項目を、集計より後ろから参照できません。 便番号のように後段で要る項目は、集計する側に含めます。また既定では、1件も届かなくても集計結果を出力します。 便が0件の日に空の時間割が飛ばないよう、件数のフィルタを置きます。
03どうやって実装するのか
処理の起点を決める
前日15時の定時実行を起点にします。 入荷予定が固まるのは仕入先の出荷指示が出そろった後で、この事業所では午後の早い時間です。朝に動かすと、まだ確定していない便を入れて計算することになります。
17時にもう一度動かします。 15時の回で案を作り、17時の回で追加・取り消しを反映して確定させます。Make の「Daily」では1日の中に実行時刻を必要なだけ追加できるので、2つの時刻を同じシナリオに登録します。
既定の15分ごとのままにはしません。 そのたびに計算すると、承認する側がどの案を見ているのか分からなくなります。 予定の更新で即時に動かさないのも同じ理由です。Make の即時起動には1分あたりの起動数の上限(maximum runs to start per minute、既定は100)もありますが、上限より承認の単位のほうが効きます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 翌日の入荷予定 | 便番号、仕入先、到着予定時刻、品目、数量、荷姿、事前出荷明細の有無 | 基幹システム(発注残)、倉庫管理システム |
| 荷卸しの実績 | 到着時刻、荷卸しの開始・終了時刻、バース番号、作業者数、機材 | 倉庫管理システム(直近18か月) |
| 品目マスタ | 荷姿、入数、1パレットあたり枚数、重量、温度帯、検品の要否 | 品目マスタ |
| 仕入先マスタ | 取引開始日、過去の便数、遅着の傾向、出発地 | 仕入先マスタ |
| バースと機材の台帳 | バース数と冷蔵対応、稼働時間、フォークリフトの台数 | 自社で用意する一覧 |
| 作業者の体制 | その日に荷受けに入れる人数(個人名は渡さない) | シフト表から人数だけ集計 |
質を決めるのは2行目です。 荷卸しの開始・終了時刻が記録されていなければ、この構成は成り立ちません。到着時刻しか残っていない場合は、終了時刻を記録するところから始めます。 3か月分たまれば試せます。5行目の台帳はどのシステムにも入っておらず、これを作る作業がいちばん時間のかかる準備です。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 翌日の便の一覧 | 基幹システムの発注残と事前出荷明細 | 見込みを出す対象 |
| 同じ仕入先・同じ品目の実績 | 倉庫管理システムの荷卸し記録 | 見込みの土台 |
| 同じ品目区分・同じ荷姿の実績 | 同上(仕入先をまたいで集める) | 実績が少ない便の材料 |
| 待ち時間の実績 | 到着時刻と荷卸し開始時刻の差 | 効果の測定と、混む時間帯の確認 |
| 翌日の枠の空き | バースと機材の台帳+稼働時間 | 割り当ての制約 |
似た便の集め方には順番があります。 まず「同じ仕入先の同じ品目」で探し、足りなければ「同じ仕入先」、次に「同じ品目区分と同じ荷姿」、最後に「同じ荷姿の全体」へと条件を緩めます。どの段で見つかったかを記録します。 basis は、この段の名前です。
件数は必ず数えます。 この事業所では12件を境にし、届かない便は実績が少ない便として扱います。 平均を当てても意味のある幅にならないためです。なお、どちらのシステムからも読み取るだけで、時間割を書き戻す経路は作りません。
AIへ渡す前に整形する
- 便の単位をそろえる … 同じ仕入先から1日に2便あるものを、1件ずつに分けます
- 数量の単位をそろえる … パレット枚数、ケース数、バラの個数を別の列に分けます
- 外れ値を落とす … 設備が止まった日、災害の日、棚卸しの日の実績を除きます
- 似た便を集める … 前の小見出しの順で条件を緩め、段の名前を付けます
- 件数を数える … 集まった実績の件数を
sample_nとして持ちます - 待ち時間を計算する … 到着時刻と荷卸し開始時刻の差を、過去の便ごとに出します
- 翌日の枠を分に直す … バース4本 × 8時間から昼の停止を引き、分で表します
3番目を飛ばすと、見込みが長いほうへ引っ張られます。 設備が止まった日の1便は、通常の3倍かかっていることがあります。記録は残し、見込みを出す材料からだけ外します。
2番目も効きます。 パレット10枚とケース200個を「210」とまとめると、荷姿の違いが消えます。荷卸しの時間を決めるのは数より荷姿です。
AIに処理させる
させるのは、便ごとに「何分かかりそうか」を幅付きで出すことと、その根拠を書くことだけです。
| 出させるもの | 中身 | 判断できないときの扱い |
|---|---|---|
| 所要時間の中央値 | 似た便の実績の真ん中の分数 | 実績が無ければ既定値を使い basis に明記 |
| 上振れの目安 | 混雑・検品・機材待ちを含めた長めの分数 | 実績が少ないほど中央値との差を広げる |
| 必要な機材 | フォークリフトが要るか、何台か | 決まらなければ「要る」側に倒す |
| 検品の要否 | 不要/抜き取り/全数 | 品目マスタに無ければ「抜き取り」 |
| 根拠 | どの段で似た便を集めたか、何件あったか | 段の名前と件数をそのまま書く |
| 確からしさ | low/medium/high の3段 | 件数が12件未満なら low |
大事なのは、中央値と上振れの2つを出させることです。 1つの数字だけを返させると、実績の少ない仕入先に平均が当たり、見た目は同じで中身のまるで違う数字が並びます。
実績の少ない便では、幅を広げるのが正解です。 30分から75分と出てくるほうが、45分と言い切られるより現場では扱えます。 広い幅は、枠に余裕を取る行動に変わります。
| させないこと | 理由 |
|---|---|
| 時間割そのものを作る | バース番号と開始時刻を書かせると、実行できない割り当てが混ざる |
| 実績の無い仕入先に平均を当てる | 幅を広げるべきところが、もっともらしい1点になる |
| 品目名の似たものを同じとみなす | 「牛乳」と「牛乳飲料」で荷姿が違うことがある |
| 待ち時間を予測する | 待ち時間は割り当ての結果であって、便の性質ではない |
| 遅着するかを断定する | 傾向は渡すが、来る・来ないの判断はしない |
| 作業者を個人で指名する | 渡すのは人数だけ。勤務の割り当ては現場が決める |
1行目が、この構成でいちばん守るべき線です。 20便分の分数が手元にあると、ついでに時刻まで書かせたくなります。混ざった1件の不整合を見つけるほうが、計算で組むより時間がかかります。
指示内容を固定する
あなたは物流センターの荷受け担当として、翌日の入荷便それぞれについて
荷卸しにかかる時間を見込む立場です。時間割は作らないでください。
【出すもの】便ごとに次の6つ
1. minutes_p50 … 似た便の実績の真ん中にあたる分数
2. minutes_p80 … 混雑・検品・機材待ちを含めて長めに見た分数
3. equipment … 必要な機材(forklift / pallet_jack / none)と台数
4. inspection … 検品の区分(none / sampling / full)
5. basis / sample_n … どの段で集めたか、何件あったか
6. confidence … low / medium / high
【厳守事項】
- バース番号、開始時刻、終了時刻を書かないでください。時間割は作りません。
- sample_n が12件未満のときは confidence を low にし、
minutes_p80 を minutes_p50 の1.5倍以上にしてください。
実績が少ないことを、幅の広さで表してください。
- 実績が0件のときは basis を default とし、荷姿ごとの既定の分数を使ってください。
他の仕入先の平均を当てないでください。
- 品目名が似ていることを根拠に、別の品目の実績を使わないでください。
使ってよいのは、渡した「似た便の実績」に入っているものだけです。
- 待ち時間、遅着の確率、当日の混み具合を書かないでください。
- 作業者を個人名で指名しないでください。人数だけを書いてください。
- minutes_p50 は5分以上240分以下、minutes_p80 は minutes_p50 以上にしてください。
- evidence には、根拠にした実績の件数と分数の範囲を書いてください。
- 渡した便の数と、返す要素の数を必ず一致させてください。
【翌日の便の一覧】{shipments}
【過去の似た便の実績】{history}
【荷姿ごとの既定の分数】{defaults}
「実績が少ないときは幅を広げる」を数字で書いているのが要点です。 「余裕を持って」と書くだけでは、minutes_p80 が minutes_p50 の5分増しで返ってきます。1.5倍以上という形にして初めて、枠の取り方が変わります。
「時間割は作りません」を2か所に書いているのも理由があります。 冒頭の1回だけでは、便の一覧を見ているうちに時刻を振り始めます。
最後の行の「数を一致させる」も省かないでください。 20便渡して19件返ると、落ちた1便は時間割に現れず、当日その場で枠を探すことになります。
出力形式を固定する
構造化出力を使い、次の形のJSONで受け取ります。 output_config.format に type: "json_schema" とスキーマを指定します。
{
"date": "2026-10-01",
"shipments": [
{
"shipment_id": "",
"vendor_code": "",
"minutes_p50": 0,
"minutes_p80": 0,
"equipment": { "kind": "forklift", "count": 1 },
"inspection": "none",
"basis": "same_vendor_same_item",
"sample_n": 0,
"confidence": "low",
"evidence": ""
}
]
}
basis は same_vendor_same_item / same_vendor / item_class / pack_type / default の5つです。
スキーマで縛れるものと、縛れないものがあります。 enum は文字列・数値・真偽・null に限られます。const、anyOf、$ref、$defs が使え(外部の $ref は不可)、オブジェクトには additionalProperties を false と明示する必要があります。 便1件分の定義は $defs に置いて参照します。再帰するスキーマは使えません。
ここが設計に直接効きます。 数値の範囲を表す minimum、maximum、multipleOf はサポートされていません。 「minutes_p50 は5分以上240分以下」を縛れず、文字列の minLength、maxLength も同じです。配列の minItems も 0 と 1 しか使えないため、「20件ちょうど返す」も表せません。これらの検査は、受け取った後に自分の側で行います。
| 縛る場所 | 何を縛るか |
|---|---|
| スキーマ | 項目の有無、型、basis や confidence の取りうる値、余計な項目を入れないこと |
| 受け取った後の検査 | 分数の範囲、minutes_p80 が minutes_p50 以上か、sample_n が12未満なら confidence が low か、便の数が渡した数と一致するか |
初回だけ少し遅くなります。 文法のコンパイルのぶん遅延が乗り、コンパイル済みの文法は24時間キャッシュされます。 毎日同じスキーマで回す使い方とは相性がよい仕組みです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 基幹システム | 読み取り(CSVまたはAPI) | 翌日の入荷予定と発注残 |
| 倉庫管理システム | 読み取り | 荷卸しの実績、品目マスタ、仕入先マスタ |
| Python | 集計と計算 | 似た便の収集、返り値の検査、枠への割り当て |
| Claude API | API呼び出し | 便ごとの所要時間の見込み |
| Make | 定時実行と配信 | 15時・17時の起動、承認後の送信 |
| 共有スプレッドシート/メール | 書き込みと送信 | 運送会社ごとの時間割 |
割り当ての計算は、次の制約を入れて行います。 数字は設定ファイルに置きます。
| 制約 | この事業所での値 |
|---|---|
| バース数 | 4本(うち冷蔵対応1本) |
| 稼働時間 | 8:00-17:00、12:00-13:00は停止 |
| フォークリフト | 3台。同時に使えるのは3便まで |
| 作業者 | 3名。inspection が full の便は2名 |
| 枠の長さ | minutes_p80 を使う |
| 緩衝 | 各バースに合計60分以上を、連続しない形で残す |
| 到着可能時刻 | 出発地から見て早すぎる時刻には置かない |
枠に置く手順は単純で構いません。 minutes_p80 の長い便から順に、置ける最も早い時刻へ置きます。機材と人が重なったら次のバース、それも埋まっていれば次の時刻へずらします。全部置けたら、緩衝が1本に偏っていないかを見て入れ替えます。 中央値で詰めると半分の便がはみ出し、その後ろが全部ずれます。
人が確認する
承認するのは荷受け責任者です。承認していない時間割は配信しません。 見るのは全20便ではなく、次の4種類だけです。
confidenceがlowの便 … 実績が12件に満たない便。初めての仕入先はここに入りますminutes_p80とminutes_p50の差が大きい便 … 幅が広いのは、実績がばらついているということですinspectionがfullの便 … 作業者が2名要るため、他の便と重なると当日に破綻します- 緩衝を削って置いた便 … 制約は満たしているが、余裕の無い置き方になったもの
責任者が枠を動かしたときは、動かした前後を記録します。 同じ直しが毎日出ている箇所は、見込みではなく制約の設定が間違っています。
目標は、440便をならして1便1分です。 開くのは2割前後という想定で、それより多い月は confidence: low が多すぎます。 似た便を集める条件が細かすぎるのです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 便が早く着いた | 空いているバースがあれば入れる。無ければ緩衝の枠へ。組み直さない |
| 便が遅れた | 後ろの便と入れ替える。結果はその場で運送会社へ差分連絡 |
| 飛び込みの便が来た | 緩衝の枠で受ける。埋まっていたら、翌日へ回すかを責任者が決める |
| 予定の便が来ない | 枠を空けたまま次へ進む。前に詰めない |
| 返り値の便の数が合わない | 結果を捨てて呼び直す。2回続いたら15時の案を使う |
| 分数が範囲の外 | 検査で弾き、既定値に置き換える。印を付けて責任者に見せる |
| 実績が0件の仕入先 | basis が default。幅を広く取り、当日は様子を見て実績を取る |
| バースが1本使えない | 制約の設定を変えて計算し直す。作り直しは17時までに限る |
| 作業者が足りない日 | 人数の設定を下げて計算し直す。full 検品の便が先にあふれる |
| 入荷予定が17時に固まらない | 固まっている便だけで配信し、残りは飛び込み扱いにする |
| 配信が運送会社に届かない | 送信の結果を記録し、返信の無い先には電話で確かめる |
上から3行が当日の大半です。 どれも時間割の作り直しではなく、緩衝の枠をどう使うかという話に収めています。 1便ずれるたびに組み直すと、送った紙と運用が食い違います。
4行目を見落としがちです。 来なかった便のぶんを前に詰めると、後ろの便が「伝えた時刻より早く呼ばれる」ことになります。 それは守れません。
記録を残す
- 翌日の入荷予定の、その時点での写し(15時と17時の両方)
- 便ごとの見込み(
minutes_p50、minutes_p80、basis、sample_n、confidence、evidence) - 割り当ての結果と、そのとき使った制約の値(バース数、人数、機材、緩衝)
- 承認者と承認時刻、人が動かした枠の前後
- 配信した時間割と、送信先・送信時刻。当日の差分連絡の記録
- 実際の到着時刻、荷卸しの開始・終了時刻、使ったバースと機材
- 待ち時間(到着時刻と荷卸し開始時刻の差)
3つ目で制約の値を残すのは、設定が変わるためです。 作業者が2名だった日の時間割を3名の前提で読み返すと、なぜこの置き方だったのかを追えません。
最後の2行が、毎月の見直しの材料です。 見込みと実績の差を便ごとに出し、差の大きい仕入先・品目・荷姿を並べます。 偏りがあれば、荷姿ごとの既定値か似た便を集める条件を直します。待ち時間は分布で見ます。平均だけでは、長く待たせた数便が消えます。
なお、荷待ち時間は運送会社の側でも記録される項目です。 国土交通省は、荷主の都合により30分以上待機した場合に、「集貨地点等」「到着・出発時刻」「積込み・取卸しの開始・終了時刻」の記録が必要としています(貨物自動車運送事業輸送安全規則)。到着時刻の押し方を先にそろえてください。
04実装レベルの3段階
最小構成は確かめるための段階です。 1日分でも実績集めに数時間かかるため、毎日は回せません。幅の取り方が機能するかだけを見ます。 半自動化で、1便5分が3分程度になります。 実績を探す時間がなくなるためです。ただし枠への割り当てと運送会社への連絡が残ります。 本格構成で2分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の一覧を1か月分ためると、見込みと実績の差が大きい仕入先と、confidence: low が続く品目が先に分かります。そこを直してから割り当てに進むほうが、承認で止まりません。
05工数削減シミュレーション
導入後 440件 × 2分 ÷ 60 = 14.7 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- バースが数本しかなく、1日20便前後のトラックが朝と夕方に集中している荷受け場。倉庫管理システムか基幹システムに、入荷予定と荷卸しの開始・終了時刻が1年分以上たまっていて、読み取り専用で取り出せる場合。運送会社や仕入先へ前日のうちに時間割を伝える連絡手段(メールや共有の表)がすでにある場合。
- 便が1日数本でバースが常に空いており、待ち時間がそもそも発生していない荷受け場。荷卸しの開始・終了時刻を記録しておらず、残っているのが到着時刻だけの場合は、記録を始めるところからになります。到着時刻を自社側で動かせない取引で、時間割を伝えても守られる見込みがない場合。なお、運送会社との契約や待機料の取り決めは、この構成では代替できません。
07最小構成で試す方法
- 先月の入荷実績から、便の多かった1日を選ぶ(20便前後が入っている日)
- その日の20便について、荷卸しの開始・終了時刻を書き出す
- 同じ仕入先・同じ品目の過去の実績を、1便あたり10件ほど手で集める
- 手元のAIサービスに、便の一覧と過去の実績を貼り付ける
- 「この便それぞれについて、荷卸しにかかる分数を、真ん中の値と長めに見た値の2つで出してください。実績が12件に満たない便は、長めの値を真ん中の値の1.5倍以上に。バース番号と時刻は書かないでください」と指示する
- 出てきた分数を、その日の実際の所要時間と並べる
6番を必ずやってください。 当てることが目的ではありません。実績が2つの値の間に入っているかを見ます。
| 出てきた内容 | 判断 |
|---|---|
| 実績が2つの値の間に入る便が8割以上 | 構成に進んでよい。 幅の取り方が機能している |
| 真ん中の値は近いが、実績が長めの値を超える便が多い | 1.5倍では足りない。倍率を上げて試し直す |
| バース番号や時刻が書かれて返ってきた | 指示の書き方で直る。構成は有効 |
| 過去の実績を集めるのに1便10分以上かかる | 記録の持ち方が先。 AIの問題ではない |
4行目が出たら、そこで止めてください。 実績を探すのに時間がかかるのは、荷卸しの記録を条件付きで取り出せていないということです。 取り出し方を整えるほうが先です。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIが時間割まで作ってしまう | 出すものの定義と厳守事項の両方に「時刻を書かない」と明記する。返り値に時刻の項目を置かない |
| 実績の少ない便に平均が当たる | sample_n が12未満なら confidence を low にし、幅を1.5倍以上に広げる |
| 分数の範囲と件数をスキーマで縛れない | minimum/maximum はサポートされず、minItems は 0 と 1 のみ。受け取った後に検査する |
| 中央値で枠を詰めてしまう | 枠には minutes_p80 を使う。半分の便がはみ出す設計にしない |
| 緩衝を残さない | 各バースに合計60分以上を、連続しない形で確保する |
| 承認せずに配信が飛ぶ | 承認を通らない経路を作らない。Make の送信は承認後のフラグで動かす |
| 集計の後ろで便番号が引けない/空の表が飛ぶ | Array aggregator はSource Module のバンドルの項目を後段から参照できず、0件でも出力する。集計側に含め、件数のフィルタを置く |
| バースと機材の台帳が無い | どのシステムにも入っていない。紙で作るところから始める |
| 荷卸しの終了時刻が記録されていない | 見込みの土台が無い。記録を始めて3か月ためる |
| 運送会社が時間割を見ない | 前日配信と、当日の差分連絡をセットにする。片方だけでは守られない |
上の2行が、この構成の失敗のほとんどです。 どちらも「もっともらしい数字が出てくる」という同じ形をしています。幅が広いまま出てくることを失敗と思わないでください。 実績が少ないという事実が、幅として見えているだけです。
下の3行は、AIの外側の話です。 台帳が無い、記録が無い、伝わらない。この3つが片付いていない場所では、見込みの精度を上げても時間割は機能しません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 仕入先の名称と品目、便ごとの数量、運送会社の名称、荷受け場の体制(バース数・機材・人数)です。仕入先ごとの数量が並んだ一覧は、取引の規模が読めます。
- 仕入先はコードに置き換えて渡す … 見込みに必要なのは、荷姿・数量・品目区分・過去の実績であって、仕入先の社名ではありません。 社名との対応表は自社の側に置いたままにします
- 作業者の勤務情報を外に出さない … 渡すのはその日に荷受けへ入れる人数だけです。誰がどのシフトかは、見込みにも割り当てにも要りません
- 承認していない時間割を配信しない … 時間割は社外の運送会社へ出ていきます。一度送った時刻は、相手の当日の運行計画になります。 訂正の連絡は、最初から出さないより手間がかかります
- 無理な枠を機械に決めさせない … 枠の長さを短く取りすぎると、現場は守れず、待ち時間が別の場所に移るだけです。
minutes_p80と緩衝は、安全側に倒すための設計です - 待ち時間の記録は、運送会社側の記録と突き合わせられる … 国土交通省は、荷主の都合により30分以上待機した場合の記録を求めています。食い違うと、待機の有無そのものが争点になります
- 見込みを外した便を、仕入先の評価に使わない … このデータは時間割を組むためのものです。遅着の傾向を取引条件の話に転用するなら、人が場を分けて行うことです
誤りが起きた場合のリスクは、実行できない時間割を配信することと、待たせる時刻を配信することの2つです。 前者はAIに時間割を作らせたときに、後者は枠を詰めすぎたときに起きます。どちらも「機械に決めさせる範囲」の引き方から出ています。
10まず何から始めるか
1週目:バースと機材の台帳を作る
バースの本数と冷蔵の対応、稼働時間、フォークリフトの台数、荷受けに入れる人数、検品の区分ごとに要る人数を、1枚の表に書き出します。 紙でかまいません。ここが埋まらないうちは先へ進めません。
2週目:1日分で試す
便の多かった1日を選び、20便分の過去の実績を手で集めて、手元のAIサービスに貼り付けます。見込みが実績を挟めているかだけを見ます。 当てにいかないでください。
3週目:似た便の集め方を決める
同じ仕入先の同じ品目から始めて、どこまで条件を緩めるかの順番を決めます。件数の下限(この記事では12件)は、自社の実績のばらつきを見て決めます。 荷姿ごとの既定の分数も置きます。
4週目:見込みの作成までを自動にする
Make の「Daily」で15時に起動し、実績を集め、見込みの一覧を書き出すところまで作ります。この時点では割り当てをしません。 見込みの一覧と、担当者が組んだ時間割を1か月並べます。
2か月目: 割り当ての計算を足し、案を出します。配信はまだしません。 責任者が毎日案を見て、動かした箇所を記録し、同じ直しが続く箇所は設定を直します。3か月目以降: 承認後の配信を足し、運送会社への前日連絡を始めます。待ち時間を毎月集計し、見込みと実績の差の大きい仕入先を洗い出した時点で、この構成は回り始めます。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 実行スケジュールの8種類(At regular intervals/Once/Daily/Weekdays (Mon–Fri)/Weekly/Monthly/Specified dates/On demand)。既定が15分ごとであること。1日の中に実行時刻を必要なだけ追加できること。間隔は分で指定し、最小の間隔は契約プランによること。詳細設定で開始日・終了日を指定できること。即時起動に1分あたりの起動数の上限(既定100)があること | Make: Schedule a scenario | 2026-09-23 |
| Iterator が配列を1件ずつのバンドルに分けること。Array aggregator が Source Module の指定を必要とし、Group by で出力を分けられること。1件も届かなくても既定で集計結果を出力すること。Source Module のバンドルの項目を、集計より後ろから参照できないこと | Make: Flow control | 2026-09-23 |
構造化出力を output_config.format の type: "json_schema" で使うこと。オブジェクトに additionalProperties を false と明示する必要があること。minimum/maximum/multipleOf、minLength/maxLength、再帰するスキーマが非対応で、配列の minItems が 0 と 1 のみであること。enum が文字列・数値・真偽・null に限られ、$defs/$ref が使える(外部の $ref は不可)こと。文法が24時間キャッシュされること | Claude Docs | 2026-09-23 |
| 荷主の都合により30分以上待機した場合に、「集貨地点等」「集貨地点等への到着・出発時刻」「積込み・取卸しの開始・終了時刻」の記録が必要とされること。根拠が貨物自動車運送事業輸送安全規則(平成2年運輸省令第22号)であること | 国土交通省: 荷待時間・荷役作業等の記録 | 2026-09-23 |
記録の対象や運用は見直されることがあります。 自社の取引で何がどう記録されているかは、国土交通省のページで確かめてください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0191)についてのご相談はこちらから。
