動かない在庫を毎月洗い出して、処分・返品・値引きの候補に仕分ける
何か月も動いていない在庫を毎月洗い出し、滞留の理由を区分して、値引き・返品・転送・廃棄・保有継続のどれを検討すべきかの候補を出します。担当者の作業は、探すことから、示された候補を確かめて処理を決めることに変わります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/n8n/Power Automate/Python
- 対象業界
- EC/医療/小売/製造/飲食
- 対象部門
- 物流/購買
- 対象業務
- 分類・仕分け/集計・分析
- 主な課題
- データ分析に時間がかかる/人手が足りない/判断に時間がかかる
- AIで行う処理
- 分類
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 棚卸の時期に、在庫管理システムから在庫数と最終出庫日を書き出す
- 最終出庫日の古い順に並べ、動きが止まっていそうなものに印を付ける
- 印を付けた品目について、品目マスタで終売か仕様変更の対象かを調べる
- 購買システムで発注の履歴を見て、買いすぎたものかどうかを確かめる
- 他拠点の在庫と、受注に引き当てられているかを、別の画面で1件ずつ見る
- 保守部品として意図的に持っているものかどうかを、設計や保守の担当者に聞く
- 仕入先に返品できるかを、契約書のファイルを探して確かめる
- 値引き・返品・転送・廃棄・保有継続のどれにするかを一覧にし、在庫の責任者に諮る
- 決まったものを経理に回し、評価損の処理を相談する
- 自動毎月1日、在庫管理システムから在庫の一覧と、直近24か月の出庫の履歴を取り出す
- 自動基準表を引き、区分ごとの日数・保管期間・回転率のしきい値に当てて滞留の候補を出す
- 自動除外リストに当たるもの(引当あり、保守部品、法定保有、預り在庫)を候補から外す
- 自動残った候補に、終売と仕様変更、季節性、発注の履歴、他拠点の在庫を付ける
- 自動在庫金額を計算し、大きい順に並べる
- 自動AIが滞留の理由を区分し、取るべき手の候補を挙げ、根拠にした材料を書き出す
- 自動契約台帳を引き、返品に関する条項があるかどうかの事実だけを候補に添える
- 人在庫の責任者が、金額の大きいものから候補を確かめる
- 人値引き・返品・転送・廃棄・保有継続のどれにするかを決め、承認する
- 人返品の可否は購買が仕入先に確かめる。評価損の会計処理は経理に回す
- 自動決めた結果と理由を台帳に残し、翌月の除外リストと基準表に反映する
各工程の詳しい説明を読む
- 棚卸の時期に、在庫管理システムから在庫数と最終出庫日を書き出す
- 最終出庫日の古い順に並べ、動きが止まっていそうなものに印を付ける
- 印を付けた品目について、品目マスタで終売か仕様変更の対象かを調べる
- 購買システムで発注の履歴を見て、買いすぎたものかどうかを確かめる
- 他拠点の在庫と、受注に引き当てられているかを、別の画面で1件ずつ見る
- 保守部品として意図的に持っているものかどうかを、設計や保守の担当者に聞く
- 仕入先に返品できるかを、契約書のファイルを探して確かめる
- 値引き・返品・転送・廃棄・保有継続のどれにするかを一覧にし、在庫の責任者に諮る
- 決まったものを経理に回し、評価損の処理を相談する
(a)見つかったときには手が打てない。 年1回なので、終売から1年以上たった在庫が出てきます。その時点では値引きでも動かず、返品の期限も過ぎています。 早ければ返品や転送ができたものが、廃棄しか残らない状態で見つかります。遅れているのは発見であって、判断ではありません。
(b)「動いていない」の基準が人によって違う。 先へ進む品目を選んでいるのは2番の目視です。半年出ていないものを滞留とみなす担当者と、3か月で滞留とみなす担当者がいます。 区分ごとの基準が文書になっていないため、誰が担当したかで出てくる件数が変わります。
(c)引当や保守部品を誤って候補に入れる。 5番と6番は、触ってはいけないものを外す作業です。受注に引き当てられている在庫、保守用に意図して持っている部品、法定で保有が決まっているもの。 動いていないのが正常です。人の記憶に頼っているため、担当が代わると誤って処分候補に入ります。
(d)金額に関係なく、古い順に見ている。 最終出庫日の古い順に並べると、単価の低い部品が上に並びます。数百円の部品を何十件も調べたところで時間が尽き、数十万円の在庫が手つかずで残ります。 金額の大きいものから出さないと、調べた時間が効いてきません。
- 【自動】 毎月1日、在庫管理システムから在庫の一覧と、直近24か月の出庫の履歴を取り出す
- 【自動】 基準表を引き、区分ごとの日数・保管期間・回転率のしきい値に当てて滞留の候補を出す
- 【自動】 除外リストに当たるもの(引当あり、保守部品、法定保有、預り在庫)を候補から外す
- 【自動】 残った候補に、終売と仕様変更、季節性、発注の履歴、他拠点の在庫を付ける
- 【自動】 在庫金額を計算し、大きい順に並べる
- 【自動】 AIが滞留の理由を区分し、取るべき手の候補を挙げ、根拠にした材料を書き出す
- 【自動】 契約台帳を引き、返品に関する条項があるかどうかの事実だけを候補に添える
- 【人】 在庫の責任者が、金額の大きいものから候補を確かめる
- 【人】 値引き・返品・転送・廃棄・保有継続のどれにするかを決め、承認する
- 【人】 返品の可否は購買が仕入先に確かめる。評価損の会計処理は経理に回す
- 【自動】 決めた結果と理由を台帳に残し、翌月の除外リストと基準表に反映する
9番目が、この設計の分かれ目です。決めるのは人です。 AIが出すのは6番までの区分と候補で、処分するかどうかはそこに含まれません。 取り消せない決定を自動化しない、という一点で設計しています。
3番目をAIに渡す前に置いているのも、意図してのことです。 引当が入っているものと保守部品を、機械的に外します。 後段で外す設計にすると、除外すべきものが候補一覧に一度は並びます。並べば、承認の画面で見落とす可能性が残ります。除外は、目に触れる前に終わらせます。
7番目は、判断ではなく事実の付加です。 返品の可否は仕入先との契約の条件次第で、AIに判断させるものではありません。 契約台帳に条項があるかという事実だけを添え、実際に返品できるかは10番目で購買が確かめます。
02今回想定するシステム構成
【トリガー】毎月1日の定時実行 │ ▼ Python ── 在庫の一覧と出庫の履歴を取り出す ├──▶ 基準表を引く(区分ごとの日数・保管期間・回転率) ├──▶ 除外リストを当てる(引当あり/保守部品/法定保有/預り在庫) ├──▶ 動きの指標を計算し、滞留の候補を確定する ▼ 在庫金額の大きい順に並べ、上位から渡す ▼ OpenAI API ── 滞留の理由の区分と、取るべき手の候補 │ ① 理由の区分 ② 手の候補 ③ 根拠にした材料 ▼ Python ── 契約台帳を引き、返品条項の有無を事実として添える ▼ 一覧(在庫金額の大きい順/理由の区分ごと) ▼ Power Automate ── 在庫の責任者へ承認を依頼 ├──▶ 承認 ──▶ 処理の台帳へ記録し、担当部署へ回す └──▶ 却下 ──▶ 保有継続として記録し、翌月の基準に反映する
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | OpenAI API | Claude API、Gemini API |
| 集計 | Python | Google Apps Script |
| 連携 | Power Automate | Make、n8n |
在庫管理システムと購買システムは、新しく足すものではありません。 どちらも読み取るだけで、書き込みません。会計システムにも一切つなぎません。 評価損の処理は経理の仕事で、この構成が出すのは候補の一覧までです。
AIに渡す前の計算を、すべてPythonに寄せているのが要点です。 日数、保管期間、回転率、在庫金額。どれも四則演算で出るもので、AIに計算させる理由がありません。 AIが受け取るのは、計算し終わった数値と、終売や季節性といった文脈の情報だけです。
理由の区分と手の候補は、決められた選択肢から選ばせます。 ここで効くのが Structured Outputs です。公開ドキュメントでは、供給したJSON Schemaに常に従う応答を生成し、必須キーを省略したり無効な enum 値を生成したりすることがないと説明されています。JSON mode は有効なJSONであることだけを保証し、スキーマへの準拠は保証しません。 区分を enum に固定する設計では、この差がそのまま運用の差になります。
利用の形は、text の format に type: "json_schema" を指定し、strict: true とスキーマを渡すものです。安全上の理由で応答を拒否した場合は、refusal フィールドで拒否を示すとされています。
03どうやって実装するのか
処理の起点を決める
毎月1日の定時実行です。 前月の締めが終わり、月末時点の在庫と出庫の履歴が確定したところで動かします。
年1回の棚卸のときだけ動かす形にもしません。月次にすることが、いちばん大きな変更点です。 終売から時間がたつほど値引きでも動かなくなり、返品の相談も難しくなります。発見が早いほど、選べる手が多く残ります。
処理の単位は品目コードと保管場所の組み合わせです。品目だけで見ると、動いている拠点の実績に隠れて滞留が見えません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 在庫の一覧 | 品目コード、保管場所、在庫数、単価、最終入庫日、最終出庫日 | 在庫管理システム |
| 出庫の履歴 | 直近24か月の出庫の日付と数量 | 在庫管理システム |
| 品目マスタ | 品目の区分、終売、仕様変更と後継品、季節性の区分 | 品目マスタ |
| 発注の履歴 | 直近の発注日、発注数、発注の理由 | 購買システム |
| 他拠点の在庫 | 同じ品目の他拠点での在庫数と直近の出庫 | 在庫管理システム |
| 引当の情報 | 受注に引き当てられている数量 | 在庫管理システム |
| 基準表 | 品目の区分ごとの、日数・保管期間・回転率のしきい値 | 自社で用意する表 |
| 除外リスト | 保守部品、法定保有、預り在庫、試作の保管 | 自社で用意する表 |
| 契約台帳 | 仕入先ごとの返品条項の有無と期限 | 自社で用意する表 |
下の3つが、この構成の質を決めます。 基準表が無ければ全品目を同じ日数で測ることになり、保守部品が全部滞留になります。除外リストが無ければ、触ってはいけないものが並びます。
基準表は、区分ごとに3つの数値を持ちます。
| 品目の区分 | 最終出庫日からの日数 | 保管期間 | 回転率 |
|---|---|---|---|
| 消耗品・部品 | 90日 | 6か月 | 年2回未満 |
| 完成品(通年) | 120日 | 6か月 | 年2回未満 |
| 完成品(季節もの) | 300日 | 18か月 | 年1回未満 |
| 保守部品 | 730日 | 36か月 | — |
どれをいくつ超えたときに候補とするかも、区分ごとに決めます。 季節ものを日数だけで測ると、毎年同じ時期に全件が候補になります。
データの取得方法を決める
在庫管理システムと購買システムからは、APIで取れるならAPIで、取れないなら書き出しファイルで受け取ります。 月1回の処理なので、夜間バッチのCSVを読む形で十分です。
| 取るもの | 使い方 |
|---|---|
| 在庫数と単価 | 掛けて在庫金額にする。並べ替えの基準 |
| 最終出庫日 | 基準日との差を日数にする |
| 最終入庫日 | 保管期間にする。日が浅いものを外すためにも使う |
| 出庫の履歴 | 期間の出庫数を平均在庫で割り、回転率にする |
| 引当の数量 | 1以上なら、その時点で候補から外す |
| 他拠点の在庫と出庫 | 転送が成り立つかの材料 |
基準表と除外リストと契約台帳は、スプレッドシートを読むだけで足ります。契約台帳から引くのは、返品条項の有無と期限だけです。 契約の全文は読みません。
AIへ渡す前に整形する
- 単位をそろえる … 品目コードと保管場所の組み合わせを行の単位にし、在庫数を換算します
- 除外リストを当てる … 保守部品、法定保有、預り在庫、試作の保管に当たるものを外します
- 引当を確かめる … 引当の数量が1以上のものを外します
- 日の浅いものを外す … 初回入庫から保管期間に満たないものは候補にしません
- 指標を計算する … 最終出庫日からの日数、保管期間、回転率をPythonで計算します
- 基準表に当てる … 区分ごとのしきい値と比べ、候補かどうかを決めます
- 在庫金額を計算し、並べる … 在庫数と単価を掛け、大きい順に並べます
- AIに渡す件数を絞る … 金額の大きいほうから、その月に扱える件数までを渡します
AIに処理させる
させるのは、滞留の理由を区分し、取るべき手の候補を挙げ、その根拠にした材料を書き出すことだけです。
| 理由の区分 | 判断の材料 | 対応して出やすい手 |
|---|---|---|
| 終売 | 品目マスタの終売の区分、後継品の有無 | 値引き、廃棄の検討 |
| 仕様変更 | 品目マスタの仕様変更と後継品、変更の日付 | 仕入先への返品の相談、廃棄の検討 |
| 季節外れ | 季節性の区分、過去の出庫の履歴の形 | そのまま保有、他拠点へ転送 |
| 発注が多すぎた | 発注の履歴と、その後の出庫の量の差 | 仕入先への返品の相談、値引き |
| 需要が落ちた | 出庫の履歴が段階的に減っている | 値引き、他拠点へ転送 |
| サンプル・試作の残り | 発注の理由、入庫が1回だけ | 廃棄の検討、そのまま保有 |
| 材料からは決められない | 上のどれにも当たらない | 材料が足りない |
| させないこと | 理由 |
|---|---|
| 廃棄するかどうかの決定 | 取り消せない。在庫の責任者が決める |
| 返品できるかどうかの判断 | 仕入先との契約の条件次第。台帳の事実だけを添える |
| 評価損など会計処理の判断 | 経理と会計士に委ねる領域 |
| 値引きの金額を決めること | 売価の決定は営業と経営の判断 |
| 在庫金額や回転率の計算 | Pythonで計算済み。数字を作り直させない |
| 除外すべきかどうかの判断 | リストとの照合で決まる。前処理で終えている |
指示内容を固定する
あなたは物流部門で、動きの止まった在庫の滞留の理由を区分する立場です。
渡された材料だけを見て判断してください。材料に無いことを推測で補わないでください。
【理由の区分(この7つから1つ選ぶ)】
- discontinued ..... 終売になった製品またはその部材
- spec_change ...... 仕様変更で使えなくなった
- seasonal ......... 季節を外しただけで、次の季節に動く見込み
- over_order ....... 発注が実際の使用量より多すぎた
- demand_drop ...... 需要が段階的に落ちている
- sample_leftover .. 展示会・試作・サンプルの残り
- unknown .......... 渡された材料では区分を決められない
【取るべき手の候補(この6つから1つ以上挙げる)】
- markdown ......... 値引きして販売する
- return_to_vendor . 仕入先への返品を相談する
- transfer ......... その品目が動いている他拠点への転送
- scrap ............ 廃棄を検討する
- hold ............. そのまま保有する
- need_info ........ 判断の材料が足りない
【厳守事項】
- 廃棄するかどうかを決めないでください。scrap は「検討する候補」であり、
決定ではありません。決めるのは在庫の責任者です。
- 仕入先に返品できるかどうかを判断しないでください。契約の条件は
渡していません。return_to_vendor は相談する候補という意味です。
- 評価損など会計上の処理や、値引きの金額・率を書かないでください。
- 在庫金額、回転率、日数を計算し直さないでください。
- 終売とも仕様変更とも読めないときは unknown を選び、reason_evidence に
「何が分かれば決められるか」を書いてください。迷ったときに
discontinued を選ばないでください。
- reason_evidence には、判断の根拠にした材料の値をそのまま写してください。
「終売フラグ = 1」「直近24か月の出庫 = 0」のように、値で書いてください。
【この品目の材料】
品目コード / 保管場所 / 品目の区分 / 在庫数 / 在庫金額 .. {item}
最終出庫日からの日数 / 保管期間 / 回転率 ................ {metrics}
終売の区分 / 仕様変更の有無 / 後継品 / 季節性 ........... {master}
直近の発注日 / 発注数 / 発注の理由 ...................... {po}
他拠点の在庫数 / 他拠点の直近の出庫 ..................... {other_sites}
「迷ったときに discontinued を選ばない」を書いておかないと、unknown がほとんど出ません。 終売は材料が分かりやすく、逃げ場所になります。unknown が出ないほうが困ります。 材料が足りないという事実が見えなくなり、品目マスタが更新されていないことに気づけなくなります。
出力形式を固定する
次の形のJSONで受け取ります。
{
"item_code": "",
"location": "",
"reason": "discontinued | spec_change | seasonal | over_order | demand_drop | sample_leftover | unknown",
"reason_evidence": "",
"confidence": "high | medium | low",
"actions": [
{ "action": "markdown | return_to_vendor | transfer | scrap | hold | need_info",
"rationale": "" }
],
"missing_info": ""
}
スキーマは strict: true で渡し、すべてのフィールドを required に入れ、オブジェクトには additionalProperties: false を付けます。公開ドキュメントでは、Structured Outputs は必須キーを省略したり無効な enum 値を生成したりすることがないとされています。enum に固定しているのは、後段の集計が区分の文字列に依存するからです。 自由文が1件でも混ざると、その月の集計が合いません。
安全上の理由で応答が拒否された場合は、refusal フィールドで拒否が示されるとされています。空のJSONとして後段に流れないよう、検出して人へ回す経路を作ります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 在庫管理システム | APIまたはファイルの読み取り | 在庫、出庫の履歴、引当 |
| 購買システム | APIまたはファイルの読み取り | 発注の履歴 |
| 基準表・除外リスト | スプレッドシートの読み取り | しきい値と除外の照合 |
| OpenAI API | API呼び出し | 理由の区分と手の候補 |
| 契約台帳 | スプレッドシートの読み取り | 返品条項の有無と期限 |
| Power Automate | 承認の依頼と結果の受け取り | 在庫の責任者の承認 |
| 処理の台帳 | 書き込み | 決めた結果と理由の記録 |
書き込むのは処理の台帳だけです。在庫数を動かす操作が経路に一切無い状態を保ちます。 実際の出庫や廃棄の登録は、承認のあとに担当部署が既存の手順で行います。
ツール利用(function calling)を使う設計も考えられます。 公開ドキュメントでは、ツールを含めてリクエストし、呼び出しを受け取り、アプリケーション側で実行し、その出力を含めて再度リクエストし、最終応答を得る流れが示されています。今回は前処理で材料をそろえてから1回で渡す形にしています。 使う場合は20個未満に抑えることが推奨されています。
人が確認する
Power Automate では、承認ワークフローを作るには「承認 - 開始して承認を待機」アクションを追加するとされています。承認の種類を選び、タイトル、割り当て先、詳細を指定する形です。承認者は承認センターか電子メールの受信ボックスから返信できると説明されています。
confidenceがlowのものとmissing_infoのあるものを先に見る … 多くは品目マスタの更新漏れです- 在庫金額の大きいものから候補と根拠を確かめる …
reason_evidenceの値を見て、区分が合っているかを判断します - 手を決める … 値引き・返品・転送・廃棄・保有継続のどれにするかを、責任者が選びます
- 返品と会計は別の人に回す … 返品の可否は購買が仕入先に確かめ、評価損の処理は経理に回します
3番目は、AIの候補をそのまま承認する場ではありません。 候補が scrap でも、責任者が hold を選べる形にします。選び直した記録が、翌月の基準表と除外リストを直す材料になります。 AIが scrap を出したものに hold が選ばれ続けるなら、候補の出し方が業務と合っていません。
承認の詳細の欄には、品目コード、保管場所、在庫数、在庫金額、日数、区分、根拠、候補を並べます。Markdown を使って詳細フィールドの書式を設定することができるとされているので、一覧の形で読める状態にしておきます。 承認者が在庫管理システムを開かずに判断できるかで、確認に使う時間が変わります。条件分岐は、承認者の応答が「承認」と等しいかで分けます。
フローの実行期間が30日を超える可能性がある場合については、承認データを Microsoft Dataverse に保存する方法が示されています。2つのフローに分け、「承認の作成 (v2)」アクションで応答側の処理を行う形です。在庫の判断は仕入先への確認待ちで数週間止まることがあるため、この形を前提にしておくと止まりません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 最終出庫日が空 | 最終入庫日からの保管期間だけで測り、missing_info を付けて人へ |
| 品目マスタの終売が更新されていない | AIは unknown を返す。更新漏れとして担当へ戻す |
| 引当が処理中に入った | 承認の前にもう一度確かめ、入っていれば一覧から落とす |
| 除外リストに無い保守部品が出た | 承認の場で hold を選び、除外リストへ追加する |
| 同じ品目が複数の保管場所で出る | 品目単位でまとめて1件として承認に出す |
| 単価が未設定で在庫金額が0になる | 並べ替えから外し、別の一覧に出す |
| 契約台帳に仕入先が無い | 返品条項は「不明」とし、購買に確かめてもらう |
| 応答がスキーマに合わない | strict で防ぐ。失敗した回は再試行し、2回失敗したら人へ |
| 承認が30日を超えて返らない | Dataverse に保存し、フローのタイムアウトと切り離す |
| 同じ品目が毎月候補に出続ける | 保有継続と決めたものは、次に見る月まで出さない |
下2行が、運用に乗るかを決めます。 承認が返らないまま月が変わると同じものが翌月も並び、やがて誰も一覧を開かなくなります。
記録を残す
- 毎月の候補の一覧(品目、保管場所、在庫数、在庫金額、日数、保管期間、回転率)
- AIが返したJSONの全文(
reason、reason_evidence、confidence、actions、missing_info) - そのとき使った基準表と除外リストの内容
- 承認の結果(誰が、いつ、どの手を選んだか)と、AIの候補と違う手を選んだ記録
- 決めたあとの実際の処理(値引きの開始日、返品の可否、転送先、廃棄の日)
- 滞留している在庫金額の合計の、月ごとの推移
3つ目を残すのは、基準表が後から変わるためです。 しきい値を変えると、過去に候補にならなかった品目の意味が変わります。当時の基準が無いと、見直しの範囲が決まりません。
04実装レベルの3段階
本記事が想定するのは半自動化です。 抽出と区分が自動で回り、一覧が毎月出てくる状態になれば、第10章の8.0時間に届きます。 承認は既存の会議や回覧でも成り立つため、まずここで止めて構いません。 本格構成に進む価値があるのは、決めたことが記録に残る点です。 誰がいつどの手を選んだかと、AIの候補と違う手を選んだ記録が台帳にたまると、基準表と除外リストを直す材料になります。 半自動化のままだと、この記録が担当者の手元にしか残りません。 最小構成から半自動化へは、一足飛びに進めます。 最小構成で作った30品目の表が、そのまま入力の定義になるからです。逆に、最小構成を飛ばして半自動化から始めると、基準表のしきい値を決める根拠がありません。
05工数削減シミュレーション
導入後 240件 × 2分 ÷ 60 = 8 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 品目数が数千を超え、終売品・仕様変更品・季節品が混ざる製造業、小売業、EC事業者。年1回の棚卸のときにしか滞留在庫を見ておらず、見つかったときには値引きでも動かなくなっている場合。倉庫や店舗が複数あり、他拠点に在庫があるかどうかを都度画面で確かめている場合。品目の区分ごとに「動いていない」の基準が違い、担当者の感覚で判断されている場合。
- 品目数が数十で、担当者が全品目の動きを覚えていられる場合。受注生産で在庫をほとんど持たない場合。在庫管理システムに最終出庫日と出庫の履歴が残っておらず、動きを機械的に測る材料が無い場合。なお、廃棄するかどうかの決定と、評価損に関わる会計処理の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の在庫の一覧から、在庫金額の大きい順に30品目を選ぶ(手を打ち終えたものを数件入れる)
- その30品目について、去年の棚卸のときに何を調べ、どう決めたかを聞き取る
- 30品目それぞれの材料(在庫数、在庫金額、最終出庫日からの日数、終売の区分、仕様変更、季節性、直近の発注、他拠点の在庫)を、表にまとめる
- 手元のAIサービスの画面に表を貼り、第7章のプロンプトの区分と候補の部分をそのまま指示する
- 出てきた区分と候補を、去年の判断と突き合わせる
30品目は表を手で作ってください。 ここで作る表が、そのままAIに渡す材料の一覧になります。 手で集めてみると、どの材料がシステムから取れて、どれが人の記憶にしか無いかが分かります。
| 出てきた内容 | 判断 |
|---|---|
| 去年の判断と同じ区分が出た | 材料はそろっている。自動化に進む |
unknown が多い | 品目マスタの終売と仕様変更の区分が古い。マスタの整備が先 |
| 終売でないものを終売と区分した | 指示の書き方で直る。構成は有効 |
| 引当のある品目が候補に出た | 除外リストを先に作る。 AIの問題ではない |
2行目が出ても失敗ではありません。 年1回の棚卸に時間がかかっていた理由の1つが、そこで分かったということです。 マスタが古いまま自動化しても、毎月 unknown が並ぶだけになります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 全品目を同じ日数で測る | 保守部品が全部滞留になる。 品目の区分ごとの基準表を先に作る |
| 引当のある在庫が候補に出る | 前処理で外す。 いちばん新しい引当の値を取る |
| 保守部品を誤って処分候補にする | 除外リストを先に持つ。候補に並べてから外す設計にしない |
| AIが廃棄を決めた形の出力を返す | scrap は候補であると明記する。決定は承認の場で人が選ぶ |
| 返品できると書かれる | 契約の条件はAIに渡さない。台帳の条項の有無だけを後段で添える |
| 会計上の処理まで書かれる | 指示で禁じる。評価損の判断は経理と会計士に委ねる |
| 件数の多い順に並べてしまう | 在庫金額の大きい順に並べる。 全件並べても手が回らない |
unknown が出ない | 迷ったときに終売を選ばせない。材料不足が見えなくなる |
| 品目マスタの終売が古いまま | unknown が多い月は、判定ではなくマスタを疑う |
| 同じ品目が毎月出続ける | 保有継続と決めたものは、次に見る月を記録して抑える |
| 承認が返らず月が変わる | Dataverse に保存する形にし、「承認の作成 (v2)」で応答側を分ける |
| 季節ものが毎年同じ時期に全件出る | 季節性の区分を持ち、日数だけで測らない |
上の3行が、この構成の失敗のほとんどです。 どれも「動いていないように見えるが、動かなくてよいもの」を候補に入れる型です。一度これが起きると、現場は一覧を信用しなくなります。
中ほどの3行は、AIに決めさせてはいけない3つです。 廃棄、返品の可否、会計処理。どれも間違えたときの戻し方が無いか、他の部署の責任の範囲です。 指示で禁じるだけでなく、出力の形からも外しておきます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 品目コードと品名、在庫数、単価と在庫金額、仕入先の名称、発注の履歴、拠点ごとの在庫です。単価と在庫金額は原価に直結します。
- 外部へ渡す範囲を、区分に必要な材料までに限る … 理由の区分に仕入先の名称は要りません。在庫金額も、並べ替えはPython側でできます。 渡すのは日数、保管期間、回転率、終売と仕様変更の区分、季節性、発注の量といった材料に絞れます
- 廃棄の決定をAIに含めない … 出力の
scrapは候補であって決定ではありません。在庫の責任者が承認の場で選びます。 廃棄は物が消え、元に戻せません - 返品の可否を判断させない … 仕入先との契約の条件次第です。契約台帳に条項があるという事実までを添え、実際に返品できるかは購買が仕入先に確かめます
- 会計処理の判断をさせない … 処分の判断は評価損につながります。その会計処理の判断は経理と会計士に委ねてください。 この構成が出すのは、動いていないという事実と、その理由の区分までです
- 仕入先ごとの発注の履歴を、まとめて外へ出さない … 1品目ずつ渡すのと、仕入先ごとの取引の全体を渡すのとでは意味が違います。取引条件が読み取れる形の一覧にしないでください
- 一覧の共有範囲を決めておく … 動かない在庫の一覧は、発注の判断が適切だったかが読み取れる資料でもあります。 責任を問う材料ではなく、手を打つための材料として使うという位置づけを、始める前に共有してください
誤りが起きた場合のリスクは、動かしてはいけない在庫を処分することと、滞留を見落として持ち続けることの2つです。 前者は除外リストの不備から、後者は基準表のしきい値の緩さから起きます。どちらも人の確認では防ぎきれないので、表の整備で守ります。
10まず何から始めるか
1週目:基準表を作る
品目の区分ごとに、最終出庫日からの日数、保管期間、回転率のしきい値を決めます。全品目を一度に決める必要はありません。 在庫金額の大きい区分から埋めます。担当者によって違っていた基準を、ここで1つに決めます。
2週目:除外リストを作る
保守部品、法定で保有が決まっているもの、預り在庫、試作の保管。動いていないのが正常なものを、名前で挙げて一覧にします。 設計と保守の担当者に聞き、「動かなくてよい」と言われたものを全部入れます。
3週目:30品目で試す
在庫金額の大きい順に30品目を選び、材料の表を手で作って、AIの画面で区分と候補を出させます。去年の棚卸での判断と突き合わせ、unknown がどれくらい出るかを見ます。
4週目:抽出と区分をPythonでつなぐ
在庫と出庫の取り出し、基準表と除外リストの照合、AIの呼び出しまでを書きます。この時点では承認のフローを作らず、一覧を書き出すだけにします。
2か月目: 契約台帳の返品条項を添え、在庫金額の大きい順の一覧として関係者に配ります。候補と違う手を選んだ件数を数えます。3か月目以降: Power Automate で承認のフローをつなぎ、台帳への記録と翌月の基準への反映を足します。滞留している在庫金額の合計を毎月並べ、その推移が読めるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
JSON Schemaに常に従う応答が生成され、必須キーの省略や無効な enum 値の生成が起きないこと。JSON mode はスキーマ準拠を保証しないこと。format に type: "json_schema" と strict: true を指定すること。拒否が refusal で示されること | OpenAI: Structured Outputs | 2026-09-28 |
ツール利用が学習データ外のデータへアクセスする方法であること。ツールを含めてリクエストし、呼び出しを受け取り、実行し、出力を含めて再度リクエストし、最終応答を得る流れであること。定義が type / name / description / parameters / strict から成り、最初は20個未満に抑えることが推奨されること | OpenAI: Function calling | 2026-09-28 |
| 「承認 - 開始して承認を待機」アクションで承認ワークフローを作り、承認の種類・タイトル・割り当て先・詳細を指定すること。承認者が承認センターまたは電子メールから返信できること。詳細を Markdown で書式設定できること。応答が「承認」と等しいかで条件分岐すること。30日を超える場合は Dataverse に保存し「承認の作成 (v2)」で処理すること | Microsoft Learn: 承認ワークフロー | 2026-09-28 |
廃棄の決定と、評価損に関わる会計処理の判断は、この構成の外です。 前者は在庫の責任者が、後者は経理と会計士が行います。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0269)についてのご相談はこちらから。
