Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AgentforceとSalesforceフローとSlackで実現する 「自走型エージェント」...

Avatar for Yoshi Yoshi
June 05, 2026
120

AgentforceとSalesforceフローとSlackで実現する 「自走型エージェント」構築手順

## Developer組織
https://www.salesforce.com/products/free-trial/developer

## インストール用パッケージ
https://login.salesforce.com/packaging/installPackage.apexp?p0=04tg50000006xmz

## Slack ワークスペース
https://slack.com/intl/ja-jp/

## Agent Script
https://x.gd/fYT0F

## フローの数式
### frmUserMessage
"次の商談をレビューしてください。" &
BR() & BR() &
"商談名: " & $Record.Name & BR() &
"取引先名: " & {!$Record.Account.Name} & BR() &
"ステージ: " & TEXT($Record.StageName) & BR() &
"金額: " & IF(ISBLANK($Record.Amount), "未設定", TEXT($Record.Amount)) & BR() &
"確度: " & IF(ISBLANK($Record.Probability), "未設定", TEXT($Record.Probability)) & BR() &
"次回アクション: " & BLANKVALUE($Record.NextStep, "未設定") & BR() &
"顧客課題: " & BLANKVALUE($Record.Description, "未記載") & BR() & BR() &
"Slackに投稿する前提で、簡潔に整理してください。"

### varExtractMessage
SUBSTITUTE(
SUBSTITUTE(
MID(
{!varAgentResponse},
FIND('"message" : "', {!varAgentResponse}) + LEN('"message" : "'),
FIND(
'",',
{!varAgentResponse},
FIND('"message" : "', {!varAgentResponse}) + LEN('"message" : "')
) - (
FIND('"message" : "', {!varAgentResponse}) + LEN('"message" : "')
)
),
'\n',
BR()
),
' ',
' '
)

## テストデータ作成
Opportunity opp = OpportunityTestDataFactory.createOpportunity();

Avatar for Yoshi

Yoshi

June 05, 2026

More Decks by Yoshi

Transcript

  1. 目次 • Salesforce組織の準備 • Slackワークスペースの準備 • SalesforceとSlackの接続 • Agentforce エージェントの作成

    • エージェント利用権限の設定 • オートメーション(フロー)の構築 • Slackへのエージェント公開 • 動作確認・まとめ 2
  2. 新規リソース作成:Agentforceへの入力テキスト(数式) 63 "次の商談をレビューしてください。" & BR() & BR() & "商談名: "

    & $Record.Name & BR() & "取引先名: " & {!$Record.Account.Name} & BR() & "ステージ: " & TEXT($Record.StageName) & BR() & "金額: " & IF(ISBLANK($Record.Amount), "未設定", TEXT($Record.Amount)) & BR() & "確度: " & IF(ISBLANK($Record.Probability), "未設定", TEXT($Record.Probability)) & BR() & "次回アクション: " & BLANKVALUE($Record.NextStep, "未設定") & BR() & "顧客課題: " & BLANKVALUE($Record.Description, "未記載") & BR() & BR() & "Slackに投稿する前提で、簡潔に整理してください。"
  3. 新規リソース作成:応答テキストの整形(数式) 65 SUBSTITUTE( SUBSTITUTE( MID( {!varAgentResponse}, FIND('"message" : "', {!varAgentResponse})

    + LEN('"message" : "'), FIND( '",', {!varAgentResponse}, FIND('"message" : "', {!varAgentResponse}) + LEN('"message" : "') ) - ( FIND('"message" : "', {!varAgentResponse}) + LEN('"message" : "') ) ), '\n', BR() ), ' ', ' ' )
  4. AgentScriptの解説(2/14) 2. config • エージェントの基本情報 • 名称:OpportunityReviewAgent • 種別:AgentforceEmployeeAgent •

    想定利用:Slack 上での営業支援 • 主な役割 ◦ 商談分析 ◦ 競合対策整理 ◦ 失注リスク整理 ◦ 次回提案ポイント提示 ◦ 次アクション案提示 • 対象外 ◦ 一般FAQ ◦ 商談と無関係な雑談 ◦ 単純な短文要約のみの依頼 93
  5. AgentScriptの解説(3/14) 3. language 基本言語:日本語 追加ロケールなし 後続指示でも日本語回答を明示 実質、日本語固定のエージェント設計 4. variables エージェント内で利用する変数定義

    主な変数カテゴリ Salesforce 画面コンテキスト currentAppName:Salesforce ア プリケーション名currentObjectApiName:Salesforce オブジェクト API 名 currentPageType:ページ種別,record / list / home currentRecordId:現在表示中レコードの Salesforce ID 94
  6. AgentScriptの解説(4/14) 4. variables エージェント内で利用する変数定義 主な変数カテゴリ 商談特定用 extractedOpportunityName:ユーザー発話から抽出した商談名 毎回入力から抽出し直す設計 user_message_text:直近ユーザー発話の正規化テキスト ルーターでの意図分類に利用

    機能フラグ enable_opportunity_coaching_routing:壁打ち用ルー ティングの有効化フラグ enable_opportunity_sf_read:Salesforce Opportunity データ取得の有効化フラグ 意図分類用 intent_category:ユーザー意図の分類結果 next_action_message:壁打ち系キーワード検出結果 summary_message:要約系キーワード検出結果 95
  7. AgentScriptの解説(5/14) 5. start_agent agent_router 最初に起動するルーター 役割:ユーザー意図の分類と遷移先決定 外部アクションは呼ばない設計 分類先: summary/coaching/unknown 6.

    agent_router.reasoning ユーザー発話をもとに意図分類 user_message_text を空文字で初期化 壁打ち系キーワード 壁打ち、コーチング、相談、対策、アクション、整理要約系 キーワード 要約、サマリー、まとめ、概要 混在時は coaching を優先 3行で は出力形式指定として扱う設計 96
  8. AgentScriptの解説(6/14) 7. ルーティング処理 • intent_category = coaching ◦ Opportunity_Coaching へ遷移

    • intent_category = summary ◦ Opportunity_Status_Summary へ遷移 • intent_category = unknown ◦ 明確化質問を返す設計 ◦ 「壁打ちの相談ですか?それとも会話の要約 が必要ですか?」 97
  9. AgentScriptの解説(7/14) 7. ルーティング処理 • intent_category = coaching ◦ Opportunity_Coaching へ遷移

    • intent_category = summary ◦ Opportunity_Status_Summary へ遷移 • intent_category = unknown ◦ 明確化質問を返す設計 8. connection slack • Slack 接続セクション • 現状は empty • Slack 上での利用を想定しつつ、具体的な接続処理は 未定義 98
  10. AgentScriptの解説(8/14) 9. subagent Opportunity_Status_Summary • 要約依頼用サブエージェント • 対象依頼 ◦ 短い要約

    ◦ 簡潔な要約 ◦ 3行要約 • 例 ◦ XX案件を要約して ◦ 商談を3行でまとめて • 現状は要約用の指示中心 • Salesforce データ取得アクションは未定義 99
  11. AgentScriptの解説(9/14) 10. subagent Opportunity_Coaching • 商談壁打ち用サブエージェント • 対象依頼 ◦ 商談の壁打ち/競合対策/次回提案の論点整理

    /失注リ スク確認/経営層向け観点整理 /見えていない論点の指 摘/商談データ取得から分析、次アクション提示までを 担当 11. Opportunity_Coaching.before_reasoning • 壁打ち実行前の安全チェック • None 値を空文字や False に補正 • 対象変数 ◦ extractedOpportunityName/currentRecordId/enabl e_opportunity_sf_read/ • intent_category = summary の場合 ◦ 要約サブエージェントへ戻す処理 100
  12. AgentScriptの解説(10/14) 12. Opportunity_Coaching.reasoning • B2B 営業壁打ち用の中核指示 • 回答方針 ◦ 日本語

    ◦ Slack 向け ◦ 簡潔 • 商談名抽出ルール ◦ 日本語名対応 ◦ 英数字混在対応 ◦ アンダースコア対応 • 商談特定の優先順位 ◦ currentRecordId ◦ extractedOpportunityName • Salesforce データ取得 ◦ get_opportunity_by_name を利用 • 取得失敗時 ◦ 一般的な壁打ちへフォールバック 101
  13. AgentScriptの解説(11/14) 13. 壁打ち出力テンプレート • 商談の見立て ◦ 現状整理/温度感/勝ち筋仮説 • 懸念点 ◦

    失注リスク/情報不足/競合リスク • 見えていない観点 ◦ 意思決定/予算/優先順位/導入時期/競合比較/ 運用負荷 • 次回提案で押さえるべきこと ◦ 提案時の重要論点 • 次アクション案 ◦ 営業担当者がすぐ動ける具体行動 102
  14. AgentScriptの解説(13/14) 14. get_opportunity_by_name アクション • Salesforce Flow 呼び出し定義 • 対象

    Flow:flowGetOpportunityByName • 入力 ◦ Input_OpportunityName • 出力 ◦ Output_AccountName ◦ Output_CloseDate ◦ Output_Description 104
  15. AgentScriptの解説(14/14) 14. get_opportunity_by_name アクション • Salesforce Flow 呼び出し定義 • 対象

    Flow:flowGetOpportunityByName • 出力 ◦ Output_Found ◦ Output_Message ◦ Output_Name ◦ Output_NextStep ◦ Output_StageName ◦ Output_Amount 105