【Agentforce実践】製造業の在庫・発注管理をAgentforceで効率化 — チャットで在庫確認・納期追跡

「ベアリングの在庫はあと何個?」「発注した部品はいつ届く?」——製造現場の即答ニーズに、システムを開かずチャットで答えるエージェントを構築します。Salesforce Agentforceを使い、Apex InvocableMethodによる在庫検索・発注ステータス確認の実装から、Agent Builderでのトピック設定・動作検証までを手を動かして解説します。

在庫・発注照会の実装範囲

  • 部品在庫と発注状況をAgentforceから照会する構成です。
  • 検索処理はApexの@InvocableMethodで呼び出します。
  • Agent Builderには、製造管理の質問を受けるManufacturingSupportトピックを設定しました。

現場からの在庫・納期の問い合わせ

想定した問い合わせは、次のようなものです。

  • ベアリングの在庫は何個ありますか?
  • 発注したサーボモーターはいつ届きますか?
  • 安全在庫を下回る部品はありますか?
  • 遅延している発注はありますか?

Salesforce Agentforceで試したかったのは、質問の言葉から検索条件を渡せるかどうかです。部品名で在庫を調べた後、そのまま登録済みの発注状況を尋ねました。

項目内容
対象読者製造業のIT担当者、Salesforce管理者、生産管理担当者
前提知識ApexとSalesforceの管理設定
作業範囲Apex開発とAgent Builder設定
環境の想定Salesforce Enterprise Edition以上とAgentforceライセンスを想定しています。画面・操作名は2026年4月のものです。

完成イメージ

既存のエージェントに製造管理用のトピックを追加して検証しました。

在庫照会

ユーザー

ベアリングの在庫を教えてください

エージェント

ベアリング 6205ZZ、型番BRG-6205ZZの現在庫は8個です。安全在庫15個を下回っているため「要発注」となっています。保管場所は部品庫C-2棚です。

発注データには、この部品の未入荷発注20個が登録されています。在庫検索の「要発注」は現在庫と安全在庫の比較による表示で、手配済みの20個を判定に含めていません。

発注ステータス確認

ユーザー

遅延している発注はありますか?

エージェント

「遅延」として登録されている発注が見つかりました。

項目内容
発注番号PO-20260315-001
部品ベアリング 6205ZZ / BRG-6205ZZ
数量20個
仕入先あおば精機株式会社
納期項目の登録値2026-03-28
ステータス遅延
遅延理由仕入先の在庫切れ
備考の入荷予定2026-04-02入荷予定

遅延理由と入荷予定は、発注の備考に登録した内容です。「遅延」は登録されたステータスです。

システムの構成

在庫はカテゴリや安全在庫割れ、発注は仕入先や未納状態で絞ります。この入力条件の違いに合わせて、私は在庫検索と発注照会のアクションを分けました。

  • Topic Selectorが質問に応じてManufacturingSupportを選択します。
  • InventorySearchActionの検索先はInventory__cです。
  • OrderStatusActionはPurchase_Order__cを検索します。
  • Agentforceは検索結果のテキストを受け取り、日本語の回答に整えます。
  • 在庫データには、部品の型番、数量、単位、保管場所を持たせます。
  • 在庫判定に使う値は、現在庫数と安全在庫数です。
  • 発注データは、発注番号ごとに部品と仕入先を持つ構成です。

1. 在庫・発注用のカスタムオブジェクトを作成する

設定 > オブジェクトマネージャー > 作成 > カスタムオブジェクトから、Inventory__cとPurchase_Order__cを作成します。

Inventory__c(部品在庫)

項目名API参照名データ型説明
部品名Nameテキスト部品の名称。例はベアリング 6205ZZ
型番PartNumber__cテキスト(50)型番コード。例はBRG-6205ZZ
カテゴリCategory__c選択リスト機械部品 / 電子部品 / 素材 / 消耗品
現在庫数CurrentStock__c数値現在の在庫数量
安全在庫数SafetyStock__c数値需要や供給の変動に備える在庫数
単位Unit__cテキスト(20)個 / 本 / 枚 / 缶 / 台 など
保管場所Location__cテキスト(100)倉庫・棚番号。例は部品庫C-2棚

Purchase_Order__c(発注)

項目名API参照名データ型説明
発注番号NameテキストPO番号。例はPO-20260315-001
部品名PartName__cテキスト(100)発注した部品の名称
型番PartNumber__cテキスト(50)発注した部品の型番
数量Quantity__cテキスト(50)数量と単位。例は20個
仕入先Supplier__cテキスト(100)仕入先企業名
発注日OrderDate__c日付発注した日付
納期DeliveryDate__c日付納品予定日
ステータスStatus__c選択リスト発注済み / 製造中 / 出荷待ち / 納品済み / 遅延
備考Note__cテキストエリア遅延理由など

Quantity__cは数量と単位を合わせた表示用の文字列です。

項目のアクセス権

FLS(項目レベルセキュリティ)では、エージェントの実行ユーザーに参照を許可する項目を設定します。

プロファイルからの設定は、設定 > オブジェクトマネージャー > 対象オブジェクト > 項目とリレーション > 対象項目 > 項目レベルセキュリティの設定で行います。

権限セットを使う場合は、設定 > 権限セット > 新規 > オブジェクト設定で参照権限を付与し、Apexクラスへのアクセスも設定します。

デモデータの登録

登録には手入力か、設定 > データ > データインポートウィザードを使います。在庫の数値と単位は別項目、発注の遅延理由と入荷予定は備考に入れる構成です。

Inventory__cのデモデータ

部品名型番カテゴリ現在庫安全在庫表示用の判定結果
ステンレス鋼板 SUS304MTL-SUS304-2B素材45枚30枚安全在庫以上
六角ボルト M8×30BLT-M8-30機械部品120本200本安全在庫割れ
ベアリング 6205ZZBRG-6205ZZ機械部品8個15個安全在庫割れ
コンデンサ 100μF 25VELC-CAP100U25電子部品350個200個安全在庫以上
切削油 ネオクールOIL-NC-18L消耗品3缶5缶安全在庫割れ
アルミフレーム 40×40ALF-4040-2000素材22本10本安全在庫以上
サーボモーター HG-KR23MOT-HGKR23機械部品2台3台安全在庫割れ
エンドミル φ10 4枚刃TLS-EM10-4F消耗品6本10本安全在庫割れ

Purchase_Order__cのデモデータ

発注番号部品仕入先ステータス・備考
PO-20260315-001ベアリング 6205ZZあおば精機株式会社遅延。仕入先在庫切れのため4/2入荷予定
PO-20260318-002六角ボルト M8×30みどり金属工業株式会社納品済み
PO-20260320-003サーボモーター HG-KR23はるか電機株式会社製造中。4/10予定
PO-20260322-004エンドミル φ10 4枚刃こだま工具販売株式会社出荷待ち
PO-20260325-005切削油 ネオクールみどり金属工業株式会社発注済み
PO-20260326-006コンデンサ 100μF 25Vはるか電機株式会社発注済み

2. 在庫検索アクションの入力と検索条件

機能説明
キーワード検索部品名・型番を検索。入力を空白で分割して条件を作成
カテゴリフィルタ機械部品、電子部品、素材、消耗品で絞り込み
在庫不足フィルタlowStockOnly=trueで安全在庫割れの部品のみ抽出
安全在庫割れ判定現在庫と安全在庫を比較

コード(主要部分)

@InvocableVariableで入力を受け取り、部品名と型番の検索条件を組み立てる部分です。

String.escapeSingleQuotesで引用符を処理しています。入力に含まれる%と_は、LIKEのワイルドカードとして働きます。

plain
public with sharing class InventorySearchAction {

    // ── Agentforceからの入力パラメータ定義 ──
    public class SearchRequest {
        @InvocableVariable(required=false label='部品名・型番'
            description='検索したい部品名または型番')
        public String partName;

        @InvocableVariable(required=false label='カテゴリ'
            description='カテゴリでフィルタ(機械部品、電子部品、素材、消耗品)')
        public String category;

        @InvocableVariable(required=false label='在庫少フラグ'
            description='trueの場合、安全在庫を下回っている部品のみ表示')
        public Boolean lowStockOnly;
    }

    // ── 動的SOQLの構築 ──
    @InvocableMethod(label='在庫検索' description='部品・資材の在庫数量を検索します。')
    public static List<SearchResponse> searchInventory(List<SearchRequest> requests) {
        SearchRequest req = requests[0];
        String query = 'SELECT Name, PartNumber__c, Category__c, '
            + 'CurrentStock__c, SafetyStock__c, Unit__c, Location__c '
            + 'FROM Inventory__c';

        List<String> conditions = new List<String>();

        // キーワード検索
        if (String.isNotBlank(req.partName)) {
            for (String token : req.partName.trim().split('\\s+')) {
                String escaped = String.escapeSingleQuotes(token);
                conditions.add('(Name LIKE \'%' + escaped + '%\' OR PartNumber__c LIKE \'%' + escaped + '%\')');
            }
        }
        // ... WHERE句の結合、クエリ実行、レスポンス生成
        // 検索結果をテキストに整形し、現在庫 < 安全在庫 なら「要発注」と判定して返却
    }
}

在庫検索の実装上の要点

  • @InvocableMethodを付けたこのメソッドは、requests[0]を処理します。
  • 各検索語をNameとPartNumber__cの部分一致条件にしています。
  • CurrentStock__c < SafetyStock__cが在庫の判定条件です。

3. 発注ステータス確認アクションの設計

OrderStatusActionには、発注番号・部品名・仕入先による検索と、未納状態での絞り込みを持たせます。

項目InventorySearchActionOrderStatusAction
検索対象Inventory__cPurchase_Order__c
入力パラメータpartName, category, lowStockOnlysearchQuery, supplierName, pendingOnly
キーワード検索対象部品名 Name / 型番 PartNumber__c発注番号 Name / 部品名 PartName__c / 型番 PartNumber__c
フィルタ条件カテゴリ完全一致 / 安全在庫割れ仕入先部分一致 / 未納ステータス
ソートName昇順納期 DeliveryDate__c昇順
特殊処理現在庫と安全在庫を比較ステータスが「遅延」なら備考の遅延理由を表示
機能説明
キーワード検索発注番号・部品名・型番で検索
仕入先フィルタ仕入先名で部分一致検索
未納フィルタpendingOnly=trueで「発注済み・製造中・出荷待ち・遅延」のみ抽出
遅延理由表示ステータスが「遅延」の場合、備考を回答に使用

4. デプロイ

ローカルのDXプロジェクトに取得済みの設定を、認証済みのサンドボックスへ配備するコマンドです。カスタムオブジェクトを先に、Apexクラスを後にデプロイします。

plain
# カスタムオブジェクトのデプロイ
sf project deploy start \
  --source-dir force-app/main/default/objects/Inventory__c \
  --source-dir force-app/main/default/objects/Purchase_Order__c \
  --target-org your-sandbox

# Apexクラスのデプロイ
sf project deploy start \
  --source-dir force-app/main/default/classes \
  --target-org your-sandbox

5. GenAiFunctionをデプロイする

アクションの登録にはGenAiFunction(Agentforceのアクションを定義するメタデータ)を使います。

InventorySearch(在庫検索)

genAiFunctions/InventorySearch/にXMLと、入出力用のinput/schema.json、output/schema.jsonを配置します。

plain
<GenAiFunction xmlns="http://soap.sforce.com/2006/04/metadata">
    <description>部品・資材の在庫数量を検索します。</description>
    <developerName>InventorySearch</developerName>
    <invocationTarget>InventorySearchAction</invocationTarget>
    <invocationTargetType>apex</invocationTargetType>
    <isConfirmationRequired>false</isConfirmationRequired>
    <masterLabel>在庫検索</masterLabel>
</GenAiFunction>

OrderStatus(発注ステータス確認)

genAiFunctions/OrderStatus/ディレクトリにも同様のXMLを作成します。developerNameをOrderStatus、invocationTargetをOrderStatusAction、masterLabelを発注ステータス確認に変更してください。

plain
# GenAiFunctionメタデータのデプロイ
sf project deploy start \
  --source-dir force-app/main/default/genAiFunctions \
  --target-org your-sandbox

6. Agent Builderでの設定

設定 > Einstein > エージェントから対象エージェントを開き、Agent Builderを起動します。

トピックの作成

「New Topic」ボタンからトピックを作成します。

設定項目値
Topic LabelManufacturingSupport
Description製造業の在庫管理・発注管理に関する質問に回答する
Scope在庫照会、発注ステータス確認、照会時の安全在庫割れ表示

Instructions(指示文)の設定

plain
- ユーザーが在庫について質問した場合は、在庫検索アクションを使用してください
- 発注ステータスや納期について質問された場合は、発注ステータス確認アクションを使用してください
- 安全在庫を下回っている部品がある場合は「要発注」と明確に警告してください
- 発注が遅延している場合は、遅延理由と新しい納期予定日を伝えてください
- 回答は日本語で、具体的な数値を含めて回答してください

アクションの追加

トピックの「Actions」で「Add from Asset Library」を開き、在庫検索と発注ステータス確認を選択します。

アクション名対応するApexクラス
在庫検索InventorySearchAction
発注ステータス確認OrderStatusAction

バージョンの確定と有効化

設定を保存し、Previewで「ベアリングの在庫」と入力して検索対象と回答の数値を照合します。その後、Save、Commit Version、Activateの順に操作します。

動作検証

テスト1:在庫照会

Previewで「ベアリングの在庫を教えてください」と入力しました。インタラクション概要には、トピック選択、在庫検索、回答生成の順で処理が表示されました。表の処理時間は、この在庫照会1回の各区間に表示された値です。

ステップ内容処理時間
入力「ベアリングの在庫を教えてください」-
推論Topic Selector質問内容を解析し、ManufacturingSupportトピックを選択520ms
トピックに移行ManufacturingSupport-
推論ManufacturingSupportpartName=「ベアリング」で在庫検索アクションを呼ぶと判断395ms
アクション 在庫検索InventorySearchActionを実行、1件の結果を返却586ms
推論ManufacturingSupport検索結果を日本語に整形して回答を生成822ms

テスト2:遅延として登録された発注の照会

続けて「遅延している発注はありますか?」と入力しました。

発注照会で確認した動作

  • 発注の質問を受けたトピックもManufacturingSupportでした。
  • 発注ステータス確認アクションへの入力はpendingOnly=trueです。この条件はデモ表の6件中、納品済みを除く5件を対象にするため、遅延だけを求める質問とは範囲がずれます。
  • 回答には備考の遅延理由が含まれていました。

本番環境への発展

ERPとの連携

ERPへ接続する場合は、在庫検索の取得先を変更する設計になります。

データの所在方式照会方法
SalesforceカスタムオブジェクトSOQLSalesforce内の在庫データを検索
SAP / Oracle ERPのOData公開データSalesforce ConnectでOData接続接続先で更新されたERP在庫データを参照
自社在庫管理システムApex HTTPコールアウト既存システムのAPIを直接呼び出し
移行期のスプレッドシートCSVをカスタムオブジェクトにインポート既存の表をSalesforceへ取り込んで照会

照会条件の追加と機能拡張

ユースケース対応するアクション・追加開発
「在庫が少ない部品を一覧で見せて」在庫検索のlowStockOnly=true
「あおば精機への発注状況は?」発注ステータス確認のsupplierName指定
「今月納品予定の発注は?」発注ステータス確認に日付フィルタを追加
「部品Xの発注を自動で起票して」発注作成アクションを新規開発
「在庫推移のグラフを見せて」在庫履歴 + レポートアクション

今回の構成

要素内容
カスタムオブジェクトInventory__cに部品在庫8件、Purchase_Order__cに発注6件
ApexクラスInventorySearchActionが在庫検索、OrderStatusActionが発注状況確認を担当
GenAiFunction2つのアクションをAgent Builderに登録するメタデータ
AgentforceトピックManufacturingSupportで製造管理の質問に対応

デモデータの企業名はすべて架空です。

Agentforceの導入・構築についてお気軽にご相談ください

はてなベースでは、Salesforce Agentforceを活用した業務効率化の導入支援を行っています。在庫管理・発注管理のAI化にご興味がある方はお気軽にお問い合わせください。