- 製造業の現場で発生する「部品の在庫は?」「発注した部品はいつ届く?」をAgentforceで自動回答する方法
- Apex InvocableMethod(Agentforceやフローから呼び出せるApexメソッド)を使った在庫検索・発注ステータス確認の実装方法
- Agent Builderでの製造管理トピック設定と動作検証の手順
はじめに — 製造業の「今すぐ知りたい」問題
製造業の現場では、部品や資材の在庫状況を即座に確認したい場面が日常的に発生します。
- 「ベアリングの在庫はあと何個?」 → 在庫管理システムにログインして検索
- 「発注したサーボモーターはいつ届く?」 → 購買担当に電話やチャットで確認
- 「安全在庫を下回っている部品は?」 → 在庫レポートを手動で確認
- 「遅延している発注はある?」 → 発注一覧を一つずつチェック
これらの確認作業は1件あたり数分で済むものの、製造ラインの稼働に直結するため、回答の遅れが生産計画全体に影響を与えることがあります。
本記事では、Salesforce Agentforceを活用して、部品の在庫照会と発注ステータスの確認をチャットで即座に行えるエージェントを構築する方法を解説します。
| 項目 | 内容 |
|---|---|
| 対象読者 | 製造業のIT担当者、Salesforce管理者、生産管理担当者 |
| 構築難易度 | ★★★☆☆(Apexの基本知識 + Salesforce管理設定の経験があれば対応可能) |
| 所要時間 | 約2〜3時間(Apex開発 + Agent Builder設定) |
| 前提環境 | Salesforce Enterprise Edition以上 + Agentforceライセンス |
完成イメージ
まず、完成したエージェントがどのように動作するかを見てみましょう。
本デモでは、既存のエージェントに製造管理用のトピックを追加して検証しています。画面上のエージェント名が異なりますが、動作に影響はありません。Agentforceでは1つのエージェントに複数のトピックを追加でき、Topic Selector(ユーザーの質問内容を判定し、適切なトピックに自動振り分ける機能)が質問に応じて使い分けます。
在庫照会
ベアリングの在庫を教えてください
ベアリング 6205ZZ(型番: BRG-6205ZZ)の現在庫は8個です。安全在庫(15個)を下回っているため「要発注」となっています。保管場所は部品庫 C-2棚です。
「ベアリングの在庫を教えてください」と質問すると、現在庫数・安全在庫・保管場所を即座に回答し、安全在庫を下回っている場合は「要発注」と警告します。
発注ステータス確認
遅延している発注はありますか?
遅延している発注は以下の通りです。
| 項目 | 内容 |
|---|---|
| 発注番号 | PO-20260315-001 |
| 部品 | ベアリング 6205ZZ(BRG-6205ZZ) |
| 数量 | 20個 |
| 仕入先 | あおば精機株式会社 |
| 納期 | 2026-03-28 |
| ステータス | 遅延 |
| 遅延理由 | 仕入先の在庫切れ |
| 新しい納期予定日 | 2026-04-02入荷予定 |
「遅延している発注はありますか?」と質問すると、遅延中の発注を検出し、発注番号・部品名・仕入先・遅延理由・新しい納期予定を回答します。
アーキテクチャ
今回のエージェントは、1つのトピック(ManufacturingSupport)に2つのアクション(在庫検索、発注ステータス確認)を持つ構成です。
処理の流れは以下の通りです。
- Topic Selector がユーザーの質問内容を解析し、在庫の質問か発注の質問かを自動判定
- 在庫の質問 → InventorySearchAction が Inventory__c をSOQLで検索
- 発注の質問 → OrderStatusAction が Purchase_Order__c をSOQLで検索
- 検索結果をテキストに整形してAgentforceに返し、ユーザーへの回答を生成
- 2アクション構成 — 在庫と発注を別アクションに分離し、ユーザーの質問内容に応じて自動で使い分け
- 安全在庫アラート — 現在庫が安全在庫を下回る部品を「要発注」として警告
- 遅延検出 — 発注ステータスが「遅延」の場合、遅延理由と新しい納期予定を自動表示
1 カスタムオブジェクトの作成
在庫データと発注データを管理するための2つのカスタムオブジェクトを作成します。設定 > オブジェクトマネージャー > 作成 > カスタムオブジェクト から、以下の2つを順に作成してください。
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 | テキストエリア | 遅延理由など |
カスタムフィールドを作成しただけでは、Apexからデータを取得できない場合があります。各フィールドのFLSを設定して、利用ユーザーのプロファイルから「参照可能」にしてください。
設定方法 — 設定 > オブジェクトマネージャー > 対象オブジェクト > 項目とリレーション > 対象項目 > 項目レベルセキュリティの設定 で、System Administratorプロファイルの「参照可能」にチェックを入れます。
Tips — 項目が多い場合は、権限セットを作成して一括設定するのが効率的です。設定 > 権限セット > 新規 > オブジェクト設定 から、対象オブジェクトの全フィールドに「参照アクセス権」「編集アクセス権」を付与し、利用ユーザーに割り当てます。
デモデータの登録
カスタムオブジェクトを作成したら、動作確認用のデモデータを登録します。以下のデータを手動入力するか、データインポートウィザード(設定 > データ > データインポートウィザード)でCSVから一括登録してください。
Inventory__c(部品在庫)のデモデータ
| 部品名 | 型番 | カテゴリ | 現在庫 | 安全在庫 | 状態 |
|---|---|---|---|---|---|
| ステンレス鋼板 SUS304 | MTL-SUS304-2B | 素材 | 45枚 | 30枚 | 適正 |
| 六角ボルト M8×30 | BLT-M8-30 | 機械部品 | 120本 | 200本 | 要発注 |
| ベアリング 6205ZZ | BRG-6205ZZ | 機械部品 | 8個 | 15個 | 要発注 |
| コンデンサ 100μF 25V | ELC-CAP100U25 | 電子部品 | 350個 | 200個 | 適正 |
| 切削油 ネオクール | OIL-NC-18L | 消耗品 | 3缶 | 5缶 | 要発注 |
| アルミフレーム 40×40 | ALF-4040-2000 | 素材 | 22本 | 10本 | 適正 |
| サーボモーター HG-KR23 | MOT-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 | はるか電機株式会社 | 発注済み |
Agentforceの価値は、このレコード画面を開かなくても「チャットで聞くだけ」で在庫・発注情報を取得できる点にあります。
2 在庫検索アクション(Apex)の作成
部品・資材の在庫を検索するApex InvocableMethodを作成します。このクラスがAgentforceのアクションとして機能し、エージェントが在庫データにアクセスする窓口となります。
設定 > 開発者コンソール > File > New > Apex Class で InventorySearchAction を作成してください。
| 機能 | 説明 |
|---|---|
| キーワード検索 | 部品名・型番をスペース区切りでOR検索 |
| カテゴリフィルタ | 機械部品、電子部品、素材、消耗品で絞り込み |
| 在庫不足フィルタ | lowStockOnly=trueで安全在庫割れの部品のみ抽出 |
| ステータス判定 | 現在庫 < 安全在庫 なら「要発注」、それ以外は「適正」 |
コード(主要部分)
以下はクラスの核心部分です。@InvocableVariable でAgentforceからの入力パラメータを定義し、動的SOQLで在庫テーブルを検索します。
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アノテーションにより、このメソッドがAgentforceのアクションから呼び出し可能になります- SOQL(Salesforce Object Query Language — SQLに似たSalesforce専用のクエリ言語)を動的に構築し、条件に応じた柔軟な検索を実現しています
CurrentStock__c < SafetyStock__cで安全在庫割れを自動判定します
Apexクラスの保存時に Invalid type: Inventory__c のエラーが出る場合、カスタムオブジェクトがまだデプロイされていません。必ずStep 1のカスタムオブジェクト作成・デプロイを先に完了してからApexクラスを保存してください。
3 発注ステータス確認アクション(Apex)の作成
発注番号・部品名・仕入先での検索に加え、未納の発注のみを抽出するフィルタ機能を持つ OrderStatusAction を作成します。
設定 > 開発者コンソール > File > New > Apex Class で OrderStatusAction を作成してください。
このクラスはStep 2の InventorySearchAction と同じパターン(SearchRequest/SearchResponse定義 + 動的SOQL構築 + レスポンス生成)で実装します。以下の差分のみが異なります。
| 項目 | InventorySearchAction | OrderStatusAction |
|---|---|---|
| 検索対象 | Inventory__c(部品在庫) | Purchase_Order__c(発注) |
| 入力パラメータ | partName, category, lowStockOnly | searchQuery, supplierName, pendingOnly |
| キーワード検索対象 | 部品名(Name) / 型番(PartNumber__c) | 発注番号(Name) / 部品名(PartName__c) / 型番(PartNumber__c) |
| フィルタ条件 | カテゴリ完全一致 / 安全在庫割れ | 仕入先部分一致 / 未納ステータス |
| ソート | Name 昇順 | DeliveryDate__c(納期)昇順 |
| 特殊処理 | 現在庫 < 安全在庫 → 「要発注」判定 | ステータスが「遅延」→ 備考(遅延理由)を自動表示 |
| 機能 | 説明 |
|---|---|
| キーワード検索 | 発注番号(PO-xxxxx)・部品名・型番でOR検索 |
| 仕入先フィルタ | 仕入先名で部分一致検索 |
| 未納フィルタ | pendingOnly=trueで「発注済み・製造中・出荷待ち・遅延」のみ抽出 |
| 遅延理由表示 | ステータスが「遅延」の場合、備考(遅延理由)を自動表示 |
4 デプロイ
カスタムオブジェクトとApexクラスをサンドボックスにデプロイします。
# カスタムオブジェクトのデプロイ 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
デプロイ後にApexからフィールドにアクセスできない場合(Invalid field PartNumber__c for Inventory__c など)、FLSの設定漏れが原因です。Step 1の「FLSの設定」を再確認してください。
デプロイ成功後、設定 > オブジェクトマネージャー で「Inventory」「Purchase Order」が表示され、設定 > Apexクラス に InventorySearchAction と OrderStatusAction が表示されていれば完了です。
5 GenAiFunctionメタデータのデプロイ
Apexクラスだけではアクション一覧に表示されません。GenAiFunction(ApexクラスをAgent Builderのアクションとして登録するためのメタデータ定義)を作成してデプロイします。
InventorySearch(在庫検索)
genAiFunctions/InventorySearch/ ディレクトリを作成し、以下のXMLを配置します。
<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 を 発注ステータス確認 に変更してください。
# GenAiFunctionメタデータのデプロイ
sf project deploy start \
--source-dir force-app/main/default/genAiFunctions \
--target-org your-sandbox
デプロイ後、Agent Builderのアクション追加画面で「在庫検索」「発注ステータス確認」が表示されていれば完了です。表示されない場合は、GenAiFunctionのXMLで invocationTarget が正しいApexクラス名と一致しているか確認してください。
6 Agent Builderでの設定
Agentforceのエージェントにトピックとアクションを追加します。設定 > Einstein > エージェント から対象エージェントを開き、Agent Builderを起動します。
トピックの作成
「New Topic」ボタンからトピックを作成します。
| 設定項目 | 値 |
|---|---|
| Topic Label | ManufacturingSupport |
| Description | 製造業の在庫管理・発注管理に関する質問に回答する |
| Scope | 在庫照会、発注ステータス確認、安全在庫アラート |
Instructionsの設定
トピックのInstructions(指示文)に以下を設定します。
- ユーザーが在庫について質問した場合は、在庫検索アクションを使用してください - 発注ステータスや納期について質問された場合は、発注ステータス確認アクションを使用してください - 安全在庫を下回っている部品がある場合は「要発注」と明確に警告してください - 発注が遅延している場合は、遅延理由と新しい納期予定日を伝えてください - 回答は日本語で、具体的な数値を含めて回答してください
アクションの追加
トピックの「Actions」セクションで、「アセットライブラリから追加」(Add from Asset Library)をクリックし、以下の2つを選択します。
| アクション名 | 対応するApexクラス |
|---|---|
| 在庫検索 | InventorySearchAction |
| 発注ステータス確認 | OrderStatusAction |
バージョンの確定と有効化
設定が完了したら、Save → Commit Version → Activate で有効化します。
Activateする前に、Agent Builderの「Preview」ボタンでテスト実行できます。「ベアリングの在庫」と入力して正しく回答が返ることを確認してからActivateしてください。
動作検証
テスト1 在庫照会
Agent BuilderのPreview画面で「ベアリングの在庫を教えてください」と入力した結果です。右側のインタラクション概要パネルで、Topic Selector → ManufacturingSupport → 在庫検索アクション の推論過程が確認できます。
| ステップ | 内容 | 処理時間 |
|---|---|---|
| 入力 | 「ベアリングの在庫を教えてください」 | - |
| 推論 Topic Selector | 質問内容を解析し、ManufacturingSupportトピックを選択 | 520ms |
| トピックに移行 | ManufacturingSupport | - |
| 推論 ManufacturingSupport | partName=「ベアリング」で在庫検索アクションを呼ぶと判断 | 395ms |
| アクション 在庫検索 | InventorySearchAction を実行、1件の結果を返却 | 586ms |
| 推論 ManufacturingSupport | 検索結果を日本語に整形して回答を生成 | 822ms |
テスト2 遅延発注の検出
続けて「遅延している発注はありますか?」と入力しました。
- Topic Selectorが同じManufacturingSupportに正しくルーティング(在庫と発注で同じトピックを使い分け)
- 発注ステータス確認アクションが
pendingOnly=trueで呼び出された - 遅延理由(備考フィールド)を自動で表示
処理時間はサンドボックス環境での参考値です。実環境ではデータ量やネットワーク状況により異なります。
本番環境への発展
ERPシステムとの連携
本記事ではSalesforceのカスタムオブジェクトにデモデータを格納し、ApexからSOQLで検索する構成としましたが、本番環境では以下のデータソースとの連携も検討できます。
| 連携先 | 方式 | メリット |
|---|---|---|
| Salesforceカスタムオブジェクト | SOQL | 標準のレポート・ダッシュボード活用可能 |
| SAP / Oracle ERP | Salesforce Connect(OData) | リアルタイムのERP在庫データを参照 |
| 自社在庫管理システム | Apex HTTPコールアウト | 既存システムのAPIを直接呼び出し |
| スプレッドシート(移行期) | CSVインポート → カスタムオブジェクト | 段階的にデジタル化 |
追加ユースケース
| ユースケース | 必要なアクション |
|---|---|
| 「在庫が少ない部品を一覧で見せて」 | 在庫検索(lowStockOnly=true) |
| 「あおば精機への発注状況は?」 | 発注ステータス確認(supplierName指定) |
| 「今月納品予定の発注は?」 | 発注ステータス確認(日付フィルタ追加) |
| 「部品Xの発注を自動で起票して」 | 発注作成アクション(新規開発) |
| 「在庫推移のグラフを見せて」 | 在庫履歴 + レポートアクション |
まとめ
本記事では、Agentforceを使って製造業向けの在庫・発注管理エージェントを構築しました。
| 要素 | 内容 |
|---|---|
| カスタムオブジェクト | Inventory__c(部品在庫 8件)、Purchase_Order__c(発注 6件) |
| Apexクラス | InventorySearchAction — 在庫検索、OrderStatusAction — 発注ステータス確認 |
| GenAiFunction | 2つのアクションをAgent Builderに登録するメタデータ |
| Agentforceトピック | ManufacturingSupport — 製造管理の質問を自動ルーティング |
- 即時回答 — 在庫や発注ステータスの確認がチャットで即座に完了(従来は在庫システムにログインして検索)
- 安全在庫アラート — 在庫不足を自動検出し、発注漏れを防止
- 遅延の早期発見 — 納期遅延を即座に把握し、製造ラインへの影響を最小化
- 現場からの直接確認 — 製造現場のスタッフがチャットで在庫を確認可能(在庫システムのアクセス権不要)
本記事はSalesforceサンドボックス環境で検証しています。デモデータの企業名はすべて架空です。本番環境での利用にあたっては、組織のセキュリティポリシーやデータガバナンスの要件を確認してください。
はてなベースでは、Salesforce Agentforceを活用した業務効率化の導入支援を行っています。在庫管理・発注管理のAI化にご興味がある方はお気軽にお問い合わせください。
無料相談はこちら