倉庫の保管場所を出荷実績から見直して、取り出しの短い配置案を出す
倉庫のどの棚に何を置くかの見直しを対象にします。直近12か月の出荷実績と棚の条件を渡すと、出荷が多い品目を手前へ、一緒に出る品目を近くへ動かす配置案が、移動の手間と効果を添えて出ます。集計と可否の判断の時間が減ります。
- 利用ツール
- ChatGPT/Claude/Gemini/Google Apps Script/Python
- 対象業界
- EC/小売/物流/製造/飲食
- 対象部門
- 物流/生産
- 対象業務
- 比較検討/集計・分析
- 主な課題
- データ分析に時間がかかる/人手が足りない/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- SaaS追加(小)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 月初に、倉庫管理システムから前月の出荷実績をCSVで書き出す
- Excelで品目ごとの出荷件数と出荷数量を集計し、多い順に並べる
- 前月と区分が変わった品目を拾い、見直しの対象一覧を作る
- 対象の品目について、現在のロケーション(通路・間口・段)を倉庫管理システムで1件ずつ開いて確認する
- 棚の寸法と耐荷重を別のExcelで確認し、候補の間口に入るかを見る
- 温度帯・危険物・通路をふさぐかどうかを、担当者の記憶と紙の一覧で確かめる
- 動かす候補を現場のリーダーに口頭で相談し、了解が取れたものだけ移動指示の紙に書く
- 移動後に棚札を張り替え、倉庫管理システムのロケーションを更新する
- 自動毎月1日の未明に、倉庫管理システムから直近24か月の出荷明細・現在のロケーション・在庫を取得する
- 自動品目ごとの出荷伝票数と数量、同じ伝票に並んだ組み合わせの回数を集計する
- 自動直近12か月と直近3か月、前年の同じ時期を比べ、次の3か月で上がってくる品目と落ちてくる品目を区別する
- 自動区分が変わった品目だけを見直しの対象に絞り、現在のロケーションからの距離と移動の見積もり時間を計算する
- 自動対象をゾーン単位に分け、棚の条件と運用メモを添えてAIに渡す
- 自動AIが制約を1つずつ確認し、動かしてよい品目には配置案と理由を、動かせない品目には理由を返す
- 人倉庫の担当者が、優先度の高い順に配置案を見て可否を判断する
- 人作業導線・通路の幅・応援の入りやすさといった現場の事情を加味して、当月に動かすものを選ぶ
- 人移動計画として確定し、現場に渡す
- 人移動を1件ずつ実施し、棚札の張り替えとシステムのロケーション更新を、その都度記録する
各工程の詳しい説明を読む
- 月初に、倉庫管理システムから前月の出荷実績をCSVで書き出す
- Excelで品目ごとの出荷件数と出荷数量を集計し、多い順に並べる
- 前月と区分が変わった品目を拾い、見直しの対象一覧を作る
- 対象の品目について、現在のロケーション(通路・間口・段)を倉庫管理システムで1件ずつ開いて確認する
- 棚の寸法と耐荷重を別のExcelで確認し、候補の間口に入るかを見る
- 温度帯・危険物・通路をふさぐかどうかを、担当者の記憶と紙の一覧で確かめる
- 動かす候補を現場のリーダーに口頭で相談し、了解が取れたものだけ移動指示の紙に書く
- 移動後に棚札を張り替え、倉庫管理システムのロケーションを更新する
(a)集計そのものに時間がかかる。 2から3は毎月同じ手順の繰り返しですが、出荷実績は明細行で数十万行あり、Excelで開いて集計するだけで午前中が終わります。判断は何もしていません。
(b)一緒に出る品目を数えられていない。 「この2つはいつも同じ注文で出る」という感覚はありますが、数えるには出荷明細を伝票単位で見る必要があります。 品目ごとに合計したExcelの表からは、どの品目とどの品目が同じ伝票に並んだのかが原理的に出てきません。 そのため近くに置く判断は、ベテランの記憶だけが頼りです。
(c)制約の確認が人に付いている。 耐荷重も温度帯も、表としてそろっているのは寸法だけで、残りは「この品目は冷蔵」「この棚は上に重いものを載せない」という申し送りです。その申し送りを知っている人が休むと、見直しはその日に止まります。
(d)移動の手間と効果が並んでいないので、後回しになる。 「この品目を手前に」という提案だけを持っていくと、現場からは「今それをやる価値があるのか」と返ります。月に2回しか出ない品目を手前に動かす提案が混じっていれば、一覧そのものが信用されなくなります。
- 【自動】 毎月1日の未明に、倉庫管理システムから直近24か月の出荷明細・現在のロケーション・在庫を取得する
- 【自動】 品目ごとの出荷伝票数と数量、同じ伝票に並んだ組み合わせの回数を集計する
- 【自動】 直近12か月と直近3か月、前年の同じ時期を比べ、次の3か月で上がってくる品目と落ちてくる品目を区別する
- 【自動】 区分が変わった品目だけを見直しの対象に絞り、現在のロケーションからの距離と移動の見積もり時間を計算する
- 【自動】 対象をゾーン単位に分け、棚の条件と運用メモを添えてAIに渡す
- 【自動】 AIが制約を1つずつ確認し、動かしてよい品目には配置案と理由を、動かせない品目には理由を返す
- 【人】 倉庫の担当者が、優先度の高い順に配置案を見て可否を判断する
- 【人】 作業導線・通路の幅・応援の入りやすさといった現場の事情を加味して、当月に動かすものを選ぶ
- 【人】 移動計画として確定し、現場に渡す
- 【人】 移動を1件ずつ実施し、棚札の張り替えとシステムのロケーション更新を、その都度記録する
5番目のゾーン単位が、この設計の分かれ目です。 200件を1回でAIに渡しません。通路のまとまりごとに分け、1回あたり数十件にします。理由は第6章で述べる仕様上の制限ですが、現場にとっても意味があります。 移動作業はゾーンごとにまとめたほうが少ない歩数で終わるからです。
7番目と8番目を自動化しないことが、もう一つの分かれ目です。 配置案は案であり、動かすのは人です。 とくに作業導線は図面に出てきません。「そこに置くと台車がすれ違えない」は、その場で作業している人しか分かりません。
02今回想定するシステム構成
【トリガー】毎月1日 ▼ Python ── 倉庫管理システムから直近24か月の出荷明細・ロケーション・在庫を取得 ├──▶ 品目ごとの出荷頻度と数量を集計 ├──▶ 同時に出荷される組み合わせを伝票単位で数える ├──▶ 現在のロケーションと棚の条件(重量・寸法・温度帯)を取得 ├──▶ 動かす候補を絞る(区分が変わった品目だけ) └──▶ 移動の手間と効果を見積もる ▼ ゾーン単位に分割して投入 Gemini(構造化出力)── 制約を確認し、配置案と理由をJSONで返す ▼ Python ── 数値の突合/優先度の並べ替え/配置案の一覧を組む ▼ 【倉庫の担当者が可否を判断】現場の事情を加味して当月分を選ぶ ▼ 移動計画 ──▶ 移動の実施(1件ずつ記録)──▶ 倉庫管理システムのロケーション更新
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Gemini(Gemini API の構造化出力) | Claude API、OpenAI API |
| 集計 | Python | Google Apps Script |
倉庫管理システムと棚のExcelは、この表には含めません。どちらも既にあるもので、新しく足すのは集計を回す部分と、制約の確認をさせる部分の2つだけだからです。倉庫管理システムからは読み取り専用でデータを出し、書き戻しは行いません。 棚の寸法と荷姿のExcelは、列名を固定して読み込む対象にします。
土台は Gemini API の構造化出力です。 レスポンス形式に MIME タイプ application/json とJSONスキーマを指定すると、応答がそのスキーマに従います。使える型は string、number、integer、boolean、object、array、null で、null を許すときは {"type": ["string", "null"]} のように type を配列で書きます。 オブジェクトには properties、required、additionalProperties が、配列には items、minItems、maxItems が指定できます。
この記事の設計の要は、数値に minimum と maximum を指定できることです。 優先度は1から5、移動の見積もり時間は0以上、といった範囲をスキーマ側で縛れば、ありえない数値が返ってくること自体を構造で防げます。 文字列側には enum があり、分類のように取りうる値が決まっている項目は、候補を列挙して縛れます。 制約の確認結果を「問題なし/不可/不明」の3つに限るのはこのためです。日付には format として date-time、date、time などの構文が指定できます。
もう一点、制限も設計に効きます。 すべてのJSONスキーマの機能が使えるわけではなく、非常に大きい、または深くネストされたスキーマは拒否されることがあります。 200件分の配置案を1つのスキーマで受けようとすると、この制限に触れます。ゾーン単位に分けて回すのは、ここが理由です。
03どうやって実装するのか
処理の起点を決める
毎月1日に動かします。 出荷の傾向は1日では変わりませんし、棚札の張り替えとシステムの更新を伴う以上、配置は毎日変えられません。
月初にする理由は2つあります。前月末までの出荷実績がそろうこと、そして移動作業を当月の作業計画に組み込めることです。
例外として、大型の販促や新規取引が決まったときのために、ゾーンを指定した手動起動を用意します。対象は指定したゾーンだけに限ります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 出荷明細 | 伝票番号、出荷日、品目コード、出荷数量、出荷単位 | 倉庫管理システム |
| 現在のロケーション | 品目コード、通路番号、間口番号、段数、保管数量 | 倉庫管理システム |
| 在庫と荷姿 | 品目コード、在庫数量、入数、1パレットあたりの数量、外装の寸法、重量 | 倉庫管理システム/Excel |
| 棚の条件 | 間口の寸法、段ごとの耐荷重、段の高さ、温度帯、危険物の可否 | 棚のExcel |
| 運用メモ | 「通路をふさぐので奥」「この棚は応援が入りにくい」などの現場の申し送り | 倉庫グループ |
この構成の質を決めるのは、上から4つ目の棚の条件です。 出荷実績とロケーションは倉庫管理システムに必ずありますが、耐荷重と温度帯は表としてそろっていないことがほとんどです。整っていないとAIは制約を「不明」と返すしかなく、人の確認時間は減りません。
出荷明細は、伝票番号を落とさずに取ります。 集計済みのデータでは第3章の(b)と同じ状態になり、一緒に出る品目を数える手立てが無くなります。
データの取得方法を決める
読み取り専用のビューまたはCSV出力を用意し、月初の未明に1回だけ取得します。期間は直近24か月です。次の3か月を見るのに使うのは直近12か月ですが、前年の同じ時期と比べるために、その前の12か月も要ります。
棚の条件のExcelは、列名と並びを固定して読み込みます。更新日の列を持たせ、更新が3か月以上前なら警告を出します。 古い表のまま計算すると、入らない間口を提案し続けることになります。
取得したデータは、ゾーン単位に分けて保持します。 ゾーンは通路のまとまりで、常温・定温・冷蔵の区画をまたぎません。区画をまたぐ移動はそもそも提案の対象外なので、最初から分けておけば、ありえない案が出る経路を閉じられます。1回の取得は数十万行、AIへの1回の投入は数十件が目安です。
AIへ渡す前に整形する
この構成では、数える仕事とAIの仕事を分けます。 数えるほうはプログラムで行い、計算式を残します。以下は本記事が設定する手順で、区切りの値、歩行速度、1パレットあたりの移動時間は、倉庫ごとに実測して決めてください。
まず、品目ごとに5つの値を計算します。
- 出荷頻度 … その品目が現れた出荷伝票の数 ÷ 対象月数 = 月あたりの取り出し回数
- 出荷数量 … 対象期間の出荷数量の合計 ÷ 対象月数 = 月あたりの出荷数量
- 同時出荷回数 … 品目Aと品目Bが同じ伝票番号に並んだ伝票の数。明細を伝票単位で走査して数えます
- 現在地の往復距離 … 通路の入口を起点に、通路番号と間口番号から片道の距離を求め、2倍します
- 移動の見積もり時間 … (移動するパレット数 × 1パレットあたりの移動時間)+ 棚札の張り替え時間 + システム上のロケーション変更の時間
次に、区分を作ります。直近12か月の出荷伝票数で降順に並べ、累積構成比が70%までをA、70%から90%までをB、残りをCとします。 同じ区切りで出荷数量の側の区分も作り、2つを並べて持ちます。数量が多くても伝票数が少ない品目は、取り出しの回数が少ないからです。手前・腰の高さに置く候補になるのは、伝票数のAです。
次に、3か月先の見込みを出します。ここが「予測」にあたる部分です。
- 伸び率 = 直近3か月の月平均伝票数 ÷ 直近12か月の月平均伝票数
- 季節係数 = 前年の同じ3か月の月平均伝票数 ÷ 前年12か月の月平均伝票数
- 見込み伝票数 = 直近3か月の月平均伝票数 × 季節係数
見込みの区分が現在の区分と違う品目だけが、見直しの対象に上がります。 これが月200件の中身です。見込みは配置の優先順位を決めるための目安であり、数字そのものを当てにいくものではありません。 どの程度合うかは品目によって異なります。
最後に、効果を見積もります。
- 月間歩行距離 = 見込み伝票数 × 現在地の往復距離
- 削減距離 = (現在地の往復距離 - 提案先の往復距離)× 見込み伝票数
- 回収の目安(月数)= 移動の見積もり時間 ÷(削減距離 ÷ 歩行速度)
回収の目安が、(d)への答えです。 月に2回しか出ない品目を手前に動かす提案は削減距離が小さく、回収の目安が何十か月にもなって、一覧の下のほうへ自然に落ちます。
AIに処理させる
| 誰がやるか | やること |
|---|---|
| 機械(集計) | 出荷頻度・出荷数量・同時出荷の回数・現在のロケーションからの距離・移動の見積もり時間 |
| AI | 制約(重量・寸法・温度帯・危険物)と現場の運用メモを読んで動かしてよいかを判断し、動かす理由を文章にする |
| 人 | 最終の可否。とくに現場の事情(作業導線、通路の幅、応援の入りやすさ)は人が見る |
AIに数を数えさせません。 出荷頻度も距離も移動時間も、計算式が決まっている以上プログラムで出せます。計算させると検算ができなくなり、案の信用が一度で落ちます。
AIにさせるのは3つです。①棚の条件と品目の寸法・重量・温度帯を突き合わせ、候補の間口に入るかを判断する ②文章で書かれた運用メモを読み、そこにある制約を拾う ③なぜ動かすのかを、数字を根拠に文章にする。
| させないこと | 理由 |
|---|---|
| 出荷頻度・距離・移動時間の計算 | 機械が計算した値を渡す。AIが計算すると検算できない |
| 棚の条件の推測 | 記載が無い項目は「不明」と書かせる。 埋めさせない |
| 移動の実行と、システムのロケーション更新 | 案は案。動かすのは人 |
| 取引先を見た判断 | 取引先名はそもそも渡さない(第13章) |
| 精度の主張 | 「この配置で何%短縮できる」と書かせない。出すのは計算した削減距離だけ |
指示内容を固定する
あなたは倉庫の保管場所の見直しを支援する立場です。
渡された数値は集計済みです。自分で計算し直さないでください。
【渡すもの】品目コード、寸法、重量、温度帯、危険物の区分、現在のロケーション、
見込み伝票数、区分の変化、移動の見積もり時間、削減距離、同じゾーンの棚の条件と空き間口の一覧、
現場の運用メモ。
【判断の手順】
1. 品目ごとに、候補の間口を上から順に見て、
寸法・耐荷重・温度帯・危険物の4つを1つずつ確かめてください。
2. 4つすべてが問題なければ proposed_location に間口を書いてください。
3. 1つでも合わないときは proposed_location を null にし、
blocked_by に「どの制約が、どう合わないか」を書いてください。
4. 運用メモにその品目や棚への記載があれば、必ず読んで判断に含めてください。
【厳守事項】
- 渡されたデータに記載が無い項目は「不明」としてください。
寸法、耐荷重、温度帯、危険物のいずれかが分からない品目や棚は、
constraints_checked の該当項目を unknown にし、
needs_human を真にして、何が分からないかを note に書いてください。
分からない値を、似た品目や近くの棚から補わないでください。
- move_minutes と expected_gain は、渡された値をそのまま書いてください。
四捨五入も、単位の変換も、概算への言い換えもしないでください。
- reason には、なぜ動かすのかを渡された数値を挙げて書いてください。
「効率が上がる」「最適化される」とだけ書いてはいけません。
何%短くなる、何割改善する、といった割合を書かないでください。
- priority は次の基準で付けてください。
5 = 見込み伝票数が多く、回収の目安が3か月以内
3 = どちらかが当てはまる
1 = 回収の目安が12か月を超える
基準に当てはめられないときは3にし、その理由を reason に書いてください。
- 移動の作業手順、実施日、担当者を書かないでください。
【ゾーン】{zone}
【見直し対象】{items}
【棚の条件と空き間口】{locations}
【現場の運用メモ】{notes}
「記載が無ければ不明とする」を独立した項目にしているのは、ここが最も埋められやすいからです。 棚の耐荷重が空欄のとき、同じ通路の別の棚の値を持ってくる、という補い方をされると、出力は自然に見えるのに現場で棚がたわみます。 不明のまま返れば、人はその棚を測りに行けます。
優先度の定義を指示文に書いているのは、スキーマだけでは足りないからです。 minimum と maximum は1から5の外を防ぎますが、全件が5になることは防げません。 何を5とするかは、この文章の側で決めます。
出力形式を固定する
レスポンス形式に MIME タイプ application/json と、次のスキーマを指定します。
{
"type": "object",
"properties": {
"zone": { "type": "string" },
"generated_for": { "type": "string", "format": "date" },
"proposals": {
"type": "array",
"maxItems": 60,
"items": {
"type": "object",
"properties": {
"item_id": { "type": "string" },
"current_location": { "type": "string" },
"proposed_location": { "type": ["string", "null"] },
"priority": { "type": "integer", "minimum": 1, "maximum": 5 },
"reason": { "type": "string" },
"constraints_checked": {
"type": "object",
"properties": {
"weight": { "type": "string", "enum": ["ok", "ng", "unknown"] },
"size": { "type": "string", "enum": ["ok", "ng", "unknown"] },
"temperature": { "type": "string", "enum": ["ok", "ng", "unknown"] },
"hazardous": { "type": "string", "enum": ["ok", "ng", "unknown"] }
},
"required": ["weight", "size", "temperature", "hazardous"],
"additionalProperties": false
},
"blocked_by": { "type": ["string", "null"] },
"move_minutes": { "type": "number", "minimum": 0, "maximum": 480 },
"expected_gain": { "type": "number", "minimum": 0 },
"needs_human": {
"type": "object",
"properties": {
"flag": { "type": "boolean" },
"note": { "type": "string" }
},
"required": ["flag", "note"],
"additionalProperties": false
}
},
"required": ["item_id", "current_location", "proposed_location", "priority",
"reason", "constraints_checked", "blocked_by", "move_minutes",
"expected_gain", "needs_human"],
"additionalProperties": false
}
}
},
"required": ["zone", "generated_for", "proposals"],
"additionalProperties": false
}
構造化する理由の1つ目は、ありえない数値を構造で止めることです。 優先度に minimum: 1 と maximum: 5 を、移動時間と削減距離に minimum: 0 を指定しているため、0や9の優先度も、負の移動時間も返ってきません。 制約の確認結果を enum で3つに限っているのも同じで、「おおむね問題なし」という中間の答えが入りません。
2つ目は、blocked_by を持たせるためです。 「動かせない」も答えとして価値があります。理由が記録に残らなければ、翌月も同じ品目が候補に上がります。 保存しておけば次回の集計で外せます。動かせる場合は null を返すため、type を配列で書いて null を許しています。
3つ目は、優先度の順に並べ替えて現場に渡せることです。文章で返ってくると、この並べ替えが人の作業に戻ります。
maxItems を60にしているのは、非常に大きい、または深くネストされたスキーマが拒否されることがあるためです。1ゾーンあたりの対象がこれを超えるときは、通路単位までさらに分けて回します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 倉庫管理システム | 読み取り専用のビューまたはCSV出力 | 出荷明細、ロケーション、在庫、荷姿を返す |
| 棚の条件のExcel | 列名を固定した読み込み | 間口の寸法、耐荷重、段の高さ、温度帯、危険物の可否 |
| Gemini API | 構造化出力 | ゾーン単位で制約を確認し、配置案をJSONで返す |
| 配置案の一覧 | 表計算またはWebの画面 | 優先度順に並べ、担当者が可否を入力する |
| 移動の記録 | 倉庫管理システムへの手入力 | 移動後のロケーションを1件ずつ更新する |
最後の行を自動化しません。 配置案の確定と同時にシステムのロケーションを書き換えると、実際には動かしていない品目が、動いたことになります。
人が確認する
全件、人が確認します。確認せずに移動計画にする設計にしません。
- 優先度の高い順に案を見る …
reasonに挙げられた数値と、move_minutes、expected_gainを見て、その移動を当月にやる価値があるかを判断します - 現場の事情を当てる … 作業導線、通路の幅、台車のすれ違い、応援の人が入りやすいかどうか。この4つはデータに無く、人にしか分かりません
needs_humanが真の案を先に見る … 制約がunknownの品目は、棚か品目のどちらかを実際に測りに行く必要があります
2番目が、この構成の中心の作業です。 機械は距離を計算し、AIは寸法と温度帯を照合しますが、「そこに置くと台車が止まる」は図面にも実績にも出てきません。 そこに担当者の時間を使うのがねらいです。
確認の目標は1件3分です。 それ以上かかるなら、reason に数値が入っていないか、unknown が多すぎます。unknown が多い場合に直すのは、指示文ではなく棚の条件の表のほうです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 棚の条件が空欄 | unknown を返させ、needs_human を真にする。推測で埋めさせない |
| 空いている間口が無い | 配置案を出さず、blocked_by に「空き間口なし」と書く。既に入っている品目を勝手に押し出させない |
| スキーマが拒否される | ゾーンを通路単位までさらに分けて再実行する |
| 渡した値と違う数値が返る | move_minutes と expected_gain を入力と突き合わせ、一致しない案は自動で差し戻す |
| 同じ品目が毎月ふさがれて上がる | blocked_by を保存し、同じ理由で3回続いたら候補から外す |
| 移動が途中で止まった | 未完了のロケーションを一覧に残す。次回の集計は移動前の位置で行う |
4行目を軽く見ないでください。 渡した数値が書き換わることがあり、そのまま現場に出ると「AIの出した数字は当てにならない」という評価が定着します。
記録を残す
- 集計に使った期間、行数、品目数、ゾーンごとの対象件数
- 品目ごとの計算結果(出荷頻度、同時出荷の組み合わせ、往復距離、移動の見積もり時間、回収の目安)
- AIへ渡した入力と、返ってきたJSONの全文
- 担当者が見送った案と、その理由(とくに現場の事情によるもの)
- 実際に移動した品目、移動日、移動前後のロケーション
- 移動後3か月の、その品目の出荷伝票数と往復距離
4つ目と6つ目が、この構成を育てる材料です。 見送りの理由が同じ言葉で何度も出てくるなら、それは制約として表に入れるべきものです。
04実装レベルの3段階
最小構成でも1件9分が7分程度にはなりますが、集計の4分が残るため、対象を広げられません。半自動化で9分が3分程度になり、200件を毎月回せるようになります。この段階の効果がいちばん大きく、本記事が想定するのもここです。 本格構成では工数はほとんど変わりませんが、同時出荷の数え方が妥当だったかを確かめられるようになります。 提案どおり動かしたのに距離が縮んでいなければ、直すのは集計の前提のほうです。
05工数削減シミュレーション
導入後 200件 × 3分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 自社倉庫でピッキングを行っており、保管品目が1,000を超える企業。季節や販促で出荷の顔ぶれが変わるのに、保管場所が入庫順のまま固定されている場合。倉庫管理システムに出荷実績とロケーションの記録があり、棚の寸法・耐荷重・温度帯を表にできる場合。
- 保管品目が数十で、置き場所を作業者全員が覚えている場合。自動倉庫が入っていて、機械が保管場所を決めている場合。出荷実績がシステムに残っておらず、紙の出荷指示で運用している倉庫では、先に出荷記録の電子化を行うほうが、配置の見直しよりも効果が大きくなります。
07最小構成で試す方法
- 倉庫の1ゾーンを選ぶ(品目数が50から100程度のところ)
- そのゾーンの直近12か月の出荷明細を、伝票番号を残したままCSVで書き出す
- 表計算で、品目ごとの出荷伝票数と、同じ伝票に並んだ品目の組み合わせの回数を数える
- そのゾーンの棚の条件(間口の寸法、耐荷重、段の高さ、温度帯)を手で表にする
- 集計結果と棚の条件をAIの画面に貼り付ける
- 「この品目を、どの間口に移してよいか。寸法・耐荷重・温度帯・危険物を1つずつ確かめ、合わないものは理由を書いてください。分からない項目は不明としてください」と指示する
- 出てきた案を、現場のリーダーに見せて反応を聞く
3番の組み合わせの集計は、必ず手でやってください。 ここが数えられるかどうかで、この構成が成立するかが決まります。
| 出てきた内容 | 判断 |
|---|---|
| 制約の判定が合っており、現場のリーダーが「これはやる価値がある」と言う | 自動での集計とゾーン単位の実行に進む |
| 判定は合うが「今はやらない」と言われる | 移動の見積もり時間と回収の目安を足す。構成は有効 |
| 「不明」ばかりが返る | 棚の条件の整備が先。 AIの問題ではない |
3行目が出ることは珍しくありません。 失敗ではなく、見直しが進まない本当の理由が分かったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 棚の条件がそろわず「不明」ばかり返る | 先に棚を測る。 AIの指示文をいくら直しても変わらない |
| 品目ごとに集計したデータを渡してしまう | 伝票番号を残したまま取得する。 集計済みでは同時出荷が数えられない |
| 同時出荷を品目単位で数えてしまう | 同じ伝票に並んだ回数を数える。同じ日に出た回数ではない |
| スキーマが拒否される | 1回の投入をゾーン単位に絞る。 大きい、または深くネストされたスキーマは拒否されることがある |
| AIが数値を作る | 計算は機械で行い、渡した値と突き合わせて一致しない案を差し戻す |
| 優先度が全件5になる | minimum/maximum では偏りを防げない。5の条件を指示文で定義する |
| 季節品を「伸びている」と誤認する | 前年の同じ時期を必ず見る。直近3か月だけで判断しない |
| 動かせない品目が毎月上がってくる | blocked_by を保存し、同じ理由が3回続いたら候補から外す |
| 案は出るが移動が実行されない | 移動の見積もり時間と回収の目安を必ず添える。手間の見えない案は採用されない |
| 移動したのにシステムを更新し忘れる | 移動を1件ずつ記録する。 まとめて更新すると所在が分からなくなる |
| 効果が出たのか分からない | 移動後3か月の歩行距離を測る。測らないと集計の前提を直せない |
上から2行目と3行目は、同じ原因から出ます。 出荷実績を「品目別の月次合計」として受け取る習慣が強いためで、その形で受け取った時点で、この構成の半分は成立しなくなります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 出荷明細(伝票番号、出荷日、品目コード、数量、出荷先コード)、在庫、ロケーション、棚の条件。このうち出荷明細は、取引先ごとの販売数量が分かるデータです。
- 取引先名を外部AIに渡さない … この構成でAIに渡す必要があるのは、品目コードと数量、そして棚の条件だけです。出荷先コードは集計の段階で使い、AIへの入力からは落とします。 誰に何をいくつ売っているかは、外へ出す必要がありません。渡す範囲をあらかじめ狭めておけば、後から止める必要がありません
- 同時出荷の組み合わせも、品目コードのまま渡す … どの品目とどの品目が一緒に出るかは、取引先の仕入れの仕方を示す情報です。 品目コードで渡し、品目名も落とせるなら落とします
- 移動の実行を自動化しない … 配置案は案であり、動かすのは人です。 システムのロケーションを先に書き換える設計にすると、途中で作業が止まったときに在庫の所在が分からなくなります。 移動は1件ずつ、動かしてから記録します
- 入力を学習に使わないサービスを選ぶ … 品目コードだけでも、出荷の量と季節の動きは読み取れます
- 棚の条件を安全上の記録として扱う … 耐荷重の表が誤っていると、提案どおりに動かした結果として棚がたわみます。表の更新日を持たせ、古いまま使わない運用にしてください
- 配置案の根拠を残す … どの数値から、どの制約の確認を経て出た案かを記録します。事故が起きたときに、判断の経路をたどれる形にしておきます
そして、提案どおりに動かした後、歩行距離が本当に縮んだかを3か月測ってください。 移動前後のロケーションと、その品目の出荷伝票数から、往復距離の合計を月ごとに出します。縮んでいなければ、直すのは集計の前提、とくに同時出荷の数え方です。 同じ伝票に並んだ回数で数えるのか、同じ出荷便でまとめられる範囲で数えるのかで、近くに置くべき組み合わせは変わります。測らずに毎月提案を出し続けると、前提の誤りに気づく機会がありません。
10まず何から始めるか
1週目:1ゾーンの棚を測る
品目数が50から100程度のゾーンを1つ選び、間口の寸法、段ごとの耐荷重、段の高さ、温度帯を表にします。 ここで「耐荷重が分からない棚」が何割あるかが分かります。その割合が、この構成が動き出すまでの距離です。
2週目:出荷明細を伝票単位で出せるかを確かめる
倉庫管理システムから、そのゾーンの直近12か月の出荷明細を伝票番号を残したまま書き出します。書き出せなければ、先にそこを解決します。品目別の月次合計しか出ないシステムでは、この構成は成立しません。
3週目:同時出荷を数えてみる
同じ伝票に並んだ品目の組み合わせを数え、回数の多い順に並べます。上位の組み合わせが現在どれだけ離れて置かれているかを見ます。 ここで現場のリーダーの感覚と合うかを確かめてください。
4週目:AIに制約の確認をさせる
集計結果と棚の条件を貼り付け、配置案を出させます。制約の判定が正しいかを、現物と照らして全件見ます。
2か月目: 集計をプログラムにし、ゾーン単位で毎月回せる形にします。移動の見積もり時間と回収の目安を足し、一覧を優先度順に並べます。3か月目以降: 実際に移動した品目の移動前後のロケーションを記録し、3か月後に歩行距離を測ります。 縮んでいることが確かめられた時点で、対象のゾーンを広げます。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
構造化出力が、レスポンス形式に MIME タイプ application/json とJSONスキーマを指定して応答をスキーマに従わせる仕組みであること。使える型が string、number、integer、boolean、object、array、null であり、null を許すときは {"type": ["string", "null"]} のように type を配列に含めること。オブジェクトに properties、required、additionalProperties が指定できること。文字列に、分類のように取りうる値が決まっている場合の enum と、date-time/date/time などの構文を指定する format が使えること。数値に enum、minimum、maximum が使えること。配列に items、minItems、maxItems が使えること。すべてのJSONスキーマ機能がサポートされるわけではなく、非常に大きい、または深くネストされたスキーマは拒否されることがあること | Gemini API: 構造化出力 | 2026-09-23 |
倉庫管理システムからの出荷明細の取り出し方は製品によって異なるため、伝票番号を残したまま書き出せるかは導入前にベンダーへ確認してください。 本文に示した区分の作り方、同時出荷の数え方、移動の見積もり時間と回収の目安の計算式は、この記事が設定した手順です。区切りの値や歩行速度は自社の倉庫で実測して決めてください。また、危険物や温度帯の取り扱いは法令や取引先との取り決めで定まるため、自社の物流部門と品質保証部門への確認が必要です。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0180)についてのご相談はこちらから。
