Salesforce 開発者向け Einstein Sentiment Analysis Apex 連携ガイド

背景と応用シナリオ

現代のビジネス環境において、顧客からのフィードバックは製品やサービスの改善に不可欠な要素です。メール、ソーシャルメディア、サポートケースのコメント、チャットログなど、企業には日々膨大な量のテキストデータが寄せられます。しかし、これらのデータを手動で一つ一つ確認し、顧客の感情(ポジティブ、ネガティブ、ニュートラル)を判断するのは非常に時間とコストがかかる作業です。ここで強力なツールとなるのが、Salesforce の Einstein Sentiment Analysis です。

Einstein Sentiment Analysis は、Salesforce Einstein Platform Services の一部であり、Natural Language Processing (NLP) (自然言語処理) を活用して、与えられたテキストから著者の感情を特定するインテリジェントなサービスです。開発者は、この機能を Apex や API を通じて Salesforce プラットフォームにシームレスに組み込むことで、ビジネスプロセスを自動化し、より深い顧客インサイトを得ることができます。

具体的な応用シナリオとしては、以下のようなものが考えられます。

  • サービスセンターの自動化: 新規作成されたケースの件名や説明文を分析し、感情が「ネガティブ」なケースを自動的に優先度を高く設定したり、専門チームにエスカレーションしたりする。
  • マーケティングキャンペーンの効果測定: キャンペーンに対する顧客からの返信メールやソーシャルメディア上のコメントを分析し、その反響がポジティブかネガティブかを定量的に評価する。
  • 製品フィードバックの分析: IdeaExchange やコミュニティフォーラムに投稿されたフィードバックを分析し、ユーザーがどの機能に満足し、どの機能に不満を持っているかを特定する。
  • 営業活動の支援: 営業担当者が記録した顧客とのやり取り(活動履歴など)を分析し、商談の健全性や顧客の関心度を測る指標として利用する。

本記事では、Salesforce 開発者の視点から、Einstein Sentiment Analysis を Apex を用いてプログラム的に利用する方法について、具体的なコード例を交えながら詳しく解説します。


原理説明

Einstein Sentiment Analysis は、Salesforce が事前にトレーニングした高度な Machine Learning (ML) (機械学習) モデルに基づいています。このモデルは、膨大な量のテキストデータとその感情ラベル(Positive, Negative, Neutral)を学習しており、未知のテキストに対しても高い精度で感情を予測することができます。

開発者がこの機能を利用する際、内部的には Salesforce のセキュアな API (Application Programming Interface) (アプリケーションプログラミングインターフェース) エンドポイントへのコールアウトが行われます。Apex からこの機能を利用する最も簡単な方法は、ConnectApi 名前空間に用意されているメソッドを使用することです。ConnectApi は、Salesforce の各種機能を Apex から型安全(type-safe)かつ簡潔に呼び出すためのラッパーとして機能します。

処理のフローは以下のようになります。

  1. 1. Apex コードの実行: 開発者が作成した Apex コード(例: Trigger, Apex Class)が実行されます。
  2. 2. 入力データの準備: 分析対象のテキストを `ConnectApi.EinsteinSentimentInput` オブジェクトに設定します。
  3. 3. API コールアウト: `ConnectApi.Einstein.predictSentiment()` メソッドを呼び出します。このメソッドが内部で Einstein Platform Services の API エンドポイントへのコールアウトを実行します。
  4. 4. 結果の受信: API は分析結果を `ConnectApi.EinsteinSentimentPredictions` オブジェクトとして返します。このオブジェクトには、予測された感情ラベル(`label`)と、その予測に対する信頼度スコア(`probability`)が含まれています。
  5. 5. 結果の活用: Apex コードは受け取った結果を解釈し、レコードの更新、通知の送信、別のプロセスの起動など、定義されたビジネスロジックを実行します。

この仕組みにより、開発者は複雑な HTTP リクエストの構築や認証処理を自身で実装する必要がなく、わずか数行の Apex コードで強力な AI 機能を利用することが可能になります。


示例代码

ここでは、特定のテキスト文字列を分析し、その感情を判断するシンプルな Apex クラスの例を示します。この例では、`ConnectApi` を使用して Einstein Sentiment Analysis を呼び出します。この静的メソッドは、Flow や他の Apex コードから簡単に呼び出すことができます。

このコードは、developer.salesforce.com の公式ドキュメントに記載されている `ConnectApi.Einstein` クラスの利用方法に基づいています。

public class EinsteinSentimentAnalyzer {

    /**
     * @description 指定されたテキストの感情を分析し、最も可能性の高い感情ラベルを返します。
     * @param textToAnalyze 分析対象のテキスト
     * @return 感情ラベル ('Positive', 'Negative', 'Neutral') またはエラーメッセージ
     */
    @InvocableMethod(label='Get Sentiment from Text' description='Analyzes the sentiment of a given text using Einstein.')
    public static List<String> analyzeSentiment(List<String> texts) {
        // 結果を格納するリスト
        List<String> results = new List<String>();
        
        // Flow から呼び出される場合、リストで渡されるためループ処理を行う
        for (String textToAnalyze : texts) {
            String sentimentResult = 'Error: Analysis failed.';
            
            // 分析対象のテキストが空でないことを確認
            if (String.isNotBlank(textToAnalyze)) {
                try {
                    // 1. Einstein Sentiment APIへの入力オブジェクトを作成
                    ConnectApi.EinsteinSentimentInput sentimentInput = new ConnectApi.EinsteinSentimentInput();
                    // 分析したいテキストを document プロパティに設定
                    sentimentInput.document = textToAnalyze;
    
                    // 2. Einstein Sentiment API を呼び出し、予測結果を取得
                    // このメソッドが実際のAPIコールアウトを実行します
                    ConnectApi.EinsteinSentimentPredictions sentimentPredictions = ConnectApi.Einstein.predictSentiment(sentimentInput);
    
                    // 3. 予測結果を処理
                    // predictions リストには、分析結果の候補が確率の高い順に含まれる
                    if (sentimentPredictions != null && !sentimentPredictions.predictions.isEmpty()) {
                        // 最も確率の高い予測(リストの最初の要素)を取得
                        ConnectApi.EinsteinSentimentPrediction topPrediction = sentimentPredictions.predictions[0];
                        
                        // ラベルと確率をデバッグログに出力
                        System.debug('Analyzed Text: ' + textToAnalyze);
                        System.debug('Predicted Label: ' + topPrediction.label);
                        System.debug('Probability: ' + topPrediction.probability);
                        
                        // 結果文字列をフォーマット
                        sentimentResult = topPrediction.label;
                    } else {
                        System.debug('Einstein Sentiment Analysis returned no predictions.');
                        sentimentResult = 'Neutral'; // 予測が返されない場合はデフォルト値を設定
                    }
    
                } catch (ConnectApi.ConnectApiException e) {
                    // APIコールアウトで発生した例外をキャッチ
                    System.debug('Error calling Einstein Sentiment API: ' + e.getMessage());
                    System.debug('Status Code: ' + e.getErrorCode());
                    System.debug('Error Body: ' + e.getResponseBody());
                    sentimentResult = 'Error: ' + e.getMessage();
                } catch (Exception e) {
                    // その他の予期せぬ例外をキャッチ
                    System.debug('An unexpected error occurred: ' + e.getMessage());
                    sentimentResult = 'Error: An unexpected error occurred.';
                }
            } else {
                sentimentResult = 'Error: Input text is empty.';
            }
            results.add(sentimentResult);
        }
        
        return results;
    }
}

コードの解説

  • `@InvocableMethod` アノテーション: このメソッドを Salesforce Flow や Process Builder から「Apex アクション」として呼び出し可能にしています。これにより、管理者もノーコード/ローコードでこの AI 機能を利用できます。
  • `ConnectApi.EinsteinSentimentInput` (16行目): API への入力データを定義するクラスです。`document` プロパティに分析したいテキストを設定します。
  • `ConnectApi.Einstein.predictSentiment()` (20行目): 実際に Einstein Sentiment Analysis API を呼び出すメソッドです。引数として `EinsteinSentimentInput` オブジェクトを取ります。このメソッドは同期的なコールアウトを実行します。
  • `ConnectApi.EinsteinSentimentPredictions` (20行目): API からのレスポンスを格納するクラスです。`predictions` プロパティは `ConnectApi.EinsteinSentimentPrediction` オブジェクトのリストです。
  • `predictions` リストの処理 (24-30行目): `predictSentiment` は通常、最も可能性の高い予測結果を1つだけ返しますが、API の仕様上リスト形式になっています。そのため、リストが空でないことを確認し、最初の要素(`[0]`)を取得して感情ラベル(`label`)と確率(`probability`)にアクセスします。
  • エラーハンドリング (35-44行目): API コールアウトは失敗する可能性があるため、`try-catch` ブロックで囲むことが不可欠です。特に `ConnectApi.ConnectApiException` をキャッチすることで、API 固有のエラー(認証失敗、リクエスト上限超過など)を詳細に把握できます。

注意事项

Einstein Sentiment Analysis を実装する際には、いくつかの重要な点に注意する必要があります。

権限設定 (Permission Settings)

API を呼び出すユーザーには、適切な権限が必要です。「Einstein Platform API User」権限を含む権限セットを作成し、API を実行するユーザーに割り当てる必要があります。これがない場合、API コールは `403 Forbidden` エラーで失敗します。

API コールアウト制限 (API Callout Limits)

Einstein Sentiment Analysis の呼び出しは、Salesforce のガバナ制限における「コールアウト」としてカウントされます。

  • Apex ガバナ制限: 1つのトランザクション内で実行できる同期コールアウトは100回までです。トリガー内から直接このメソッドを呼び出す場合、一括処理(例: Data Loader で200件のレコードを更新)によってこの制限に簡単に達する可能性があるため、非同期処理(`@future`, `Queueable`, `Batch Apex`)の利用を検討してください。
  • Einstein Platform Services の利用制限: 契約している Einstein のライセンスによって、1ヶ月あたりに呼び出せる API の回数に上限が設定されています。この上限を超えると、API はエラーを返すようになります。使用状況は組織の「組織情報」ページで確認できます。

対応言語 (Supported Languages)

Einstein Sentiment Analysis は、英語だけでなく、日本語、スペイン語、フランス語、ドイツ語、中国語など、複数の言語に対応しています。モデルはテキストの言語を自動で検出し、適切なモデルを適用します。ただし、対応言語以外や、複数の言語が混在したテキストでは、精度が低下する可能性があります。

エラーハンドリング (Error Handling)

前述のコード例のように、堅牢なエラーハンドリングは本番環境での安定稼働に不可欠です。API から返される可能性のあるエラーコードやメッセージを考慮し、ユーザーに適切なフィードバックを返すか、管理者に通知する仕組みを実装することが重要です。例えば、API の利用上限に達した場合、処理を一時停止し、管理者に通知するなどのフォールバックロジックを設計すべきです。


まとめとベストプラクティス

Einstein Sentiment Analysis は、Salesforce 開発者が最小限のコードで高度な AI 機能をアプリケーションに組み込むことを可能にする、非常に強力なツールです。顧客の感情をリアルタイムで把握し、それに基づいてビジネスプロセスを自動化することで、顧客満足度の向上と業務効率化を同時に実現できます。

開発者としてこの機能を最大限に活用するためのベストプラクティスを以下にまとめます。

  • 非同期処理の活用: トリガーなどの一括処理が想定されるコンテキストでは、API コールアウトを `@future` や `Queueable Apex` を使って非同期に実行し、ガバナ制限を回避します。
  • 結果の保存と活用: 分析結果(感情ラベルと確率スコア)は、対象オブジェクトのカスタム項目に保存することを推奨します。これにより、レポートやダッシュボードでの可視化、他の自動化ルール(Flow など)の条件としての利用が容易になります。
  • コスト意識: API コールは有限のリソースです。本当に感情分析が必要なオブジェクトや状況に限定して呼び出すように設計しましょう。例えば、一度分析したレコードを再分析しないように、フラグ管理を行うなどの工夫が有効です。
  • 信頼度スコアの活用: `probability`(確率)も重要な情報です。例えば、確率が特定のしきい値(例: 0.7 未満)を下回る場合は「判断不能」として扱い、人による確認を促すようなロジックを組むことで、システムの信頼性を高めることができます。
  • 宣言的ツールとの連携: Apex で作成した分析ロジックを Invocable Method にすることで、システム管理者は Flow Builder を使って、コーディングなしで様々なビジネスプロセスに感情分析を組み込めるようになります。開発者と管理者が協力できる、非常に柔軟なアーキテクチャを実現できます。

Einstein Sentiment Analysis を適切に設計・実装することで、あなたの Salesforce 組織は単なるデータ管理システムから、顧客の声を理解し、インテリジェントに対応する強力なプラットフォームへと進化するでしょう。

コメント