ApexによるSalesforce Einstein Language API活用術:開発者向けNLPガイド

背景と応用シナリオ

Salesforce 開発者 (Salesforce Developer) の皆さん、こんにちは。日々の業務で、Salesforce内に蓄積される膨大な非構造化テキストデータに頭を悩ませていませんか?例えば、顧客からの問い合わせメール、サポートチャットのログ、ソーシャルメディアへの投稿、アンケートの自由回答欄など、これらのテキストデータにはビジネスを成長させるための貴重な洞察が眠っています。しかし、その内容を人手で一つずつ確認し、分類・分析するのは非現実的です。

ここで強力な味方となるのが Einstein Language です。Einstein Language は、Salesforce Platform が提供する Natural Language Processing (NLP、自然言語処理) サービスであり、APIを通じて高度なテキスト分析機能を利用することができます。これにより、これまで手作業で行っていた煩雑なタスクを自動化し、データに基づいた迅速な意思決定を支援します。Einstein Language の主な機能は以下の通りです。

  • Einstein Intent: テキストの内容を分析し、事前に定義したカテゴリ(意図)に自動で分類します。例えば、「請求に関する問い合わせ」「技術的な不具合報告」「製品への要望」といったラベルを、受信したメールに自動で付与できます。
  • Einstein Sentiment: テキストに含まれる感情(ポジティブ、ネガティブ、ニュートラル)を判定します。これにより、顧客満足度の測定や、炎上リスクのあるコメントの早期発見が可能になります。

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

  • サービス業務の効率化: Service Cloud に届いたケース(問い合わせ)の件名や説明文を Einstein Intent API で分析し、内容に応じて適切なスキルを持つエージェントやキューに自動でルーティングする。
  • 顧客体験の向上: アンケートの自由回答や製品レビューを Einstein Sentiment API で分析し、ネガティブなフィードバックを即座に検知。担当者が迅速にフォローアップすることで、顧客満足度の低下を防ぐ。
  • マーケティング分析: ソーシャルメディア上の自社製品に関する投稿を収集し、Sentiment 分析を行うことで、キャンペーンの効果測定やブランドイメージの把握に役立てる。

本記事では、Salesforce 開発者の視点から、Apex を用いて Einstein Language API を呼び出し、これらの強力な機能を Salesforce のカスタムロジックに組み込む方法を、具体的なコード例と共に詳しく解説していきます。


原理説明

Einstein Language API は、裏側で高度な機械学習モデルが稼働しています。開発者は、複雑なモデルの構築や管理を意識することなく、シンプルな API Callout を通じてその恩恵を受けることができます。基本的な仕組みは以下の通りです。

1. データセット (Dataset) の作成とモデル (Model) のトレーニング

まず、API がテキストを正しく分類・判定できるように「お手本」となるデータを与える必要があります。これをデータセットと呼びます。例えば Einstein Intent の場合、「この文章はこのカテゴリに分類されるべき」という例を大量に含んだ CSV ファイルなどを用意します。

このデータセットを Einstein Platform にアップロードすると、Salesforce はそのデータセットを基に機械学習モデルをトレーニングします。トレーニングが完了すると、そのモデルを識別するためのユニークな Model ID が発行されます。この Model ID は、後ほど Apex から API を呼び出す際に使用する重要な識別子となります。

2. Apex からの API 呼び出し

Salesforce 開発者にとって最も便利な点は、Einstein Language API が Connect API の一部として Apex からネイティブに呼び出せるようになっていることです。これにより、REST API のエンドポイントや認証(OAuth)の複雑な処理を自身で実装する必要がありません。

Apex では ConnectApi.Einstein クラスが提供されており、このクラスのメソッドを使用することで、簡単に Einstein Language の機能を利用できます。

  • Intent の予測: ConnectApi.Einstein.predictIntent(modelId, document) メソッドを使用します。引数には、先ほど取得した Model ID と、分析したいテキスト (document) を渡します。
  • Sentiment の予測: ConnectApi.Einstein.predictSentiment(modelId, document) メソッドを使用します。基本的な使い方は Intent と同様です。Sentiment の場合は、汎用的なモデルが用意されているため、独自のモデルをトレーニングせずに利用することも可能です。

3. 予測結果 (Prediction) の受け取り

API を呼び出すと、戻り値として予測結果が格納されたオブジェクトが返却されます。例えば、Intent の場合は ConnectApi.EinsteinIntentPrediction オブジェクトが返されます。このオブジェクトには、予測されたラベルとその確信度(Probability)のリストが含まれています。

開発者は、この確信度を考慮してビジネスロジックを組むことが重要です。例えば、「確信度が 80% 以上の場合のみ、ケースを自動でクローズする」といった条件分岐を実装することで、より精度の高い自動化が実現できます。


示例代码

ここでは、Salesforce の公式ドキュメントに基づいた Apex コードを用いて、Einstein Intent API と Einstein Sentiment API を呼び出す具体的な方法を解説します。

前提条件: 事前に Einstein Platform 上で Intent または Sentiment のデータセットを作成し、モデルのトレーニングを完了させて Model ID を取得している必要があります。

Einstein Intent API の呼び出し例

以下のコードは、指定したテキストがどのカテゴリに分類されるかを予測する Apex メソッドの例です。例えば、ケースが作成された際にトリガからこのメソッドを呼び出すことで、ケースのカテゴリを自動で設定する、といった応用が考えられます。

public class EinsteinIntentController {
    // ApexメソッドをAura/LWCコンポーネントから呼び出せるように @AuraEnabled アノテーションを付与
    // cacheable=true は、データ変更を伴わない読み取り専用の操作であることを示す
    @AuraEnabled(cacheable=true)
    public static ConnectApi.EinsteinIntentPrediction predictIntent(String document) {
        // 'MyFirstIntentModel' は、Einstein PlatformでトレーニングしたモデルのIDに置き換える必要があります。
        // このIDは、モデルの詳細ページで確認できます。
        String modelId = 'MyFirstIntentModel';

        // 入力ドキュメントが空またはnullでないことを確認
        if (String.isEmpty(document)) {
            // ドキュメントが空の場合は例外をスロー
            throw new AuraHandledException('Document cannot be null or empty.');
        }

        try {
            // ConnectApi.Einstein.predictIntentメソッドを呼び出し、予測を実行
            // 第一引数:トレーニング済みのモデルID
            // 第二引数:分析対象のテキスト
            // 戻り値は ConnectApi.EinsteinIntentPrediction オブジェクト
            ConnectApi.EinsteinIntentPrediction prediction = ConnectApi.Einstein.predictIntent(modelId, document);
            
            // 予測結果をコンソールに出力して確認(デバッグ用)
            System.debug('Prediction result: ' + prediction);

            // 予測結果を返す
            return prediction;

        } catch (ConnectApi.ConnectApiException e) {
            // APIコールでエラーが発生した場合の例外処理
            System.debug('Error calling Einstein Intent API: ' + e.getMessage());
            // エラー情報をフロントエンドに伝えるためにAuraHandledExceptionをスロー
            throw new AuraHandledException('Error from Einstein Intent API: ' + e.getMessage());
        }
    }
}

このメソッドが返す ConnectApi.EinsteinIntentPrediction オブジェクトには、probabilities というプロパティが含まれています。これは ConnectApi.EinsteinIntentProbability オブジェクトのリストであり、各要素には予測されたラベル (label) とその確信度 (probability) が格納されています。最も確信度の高い結果を利用するのが一般的です。

Einstein Sentiment API の呼び出し例

次に、テキストの感情を分析する例です。これは、顧客からのフィードバックのトーンを自動で判定するのに役立ちます。

public class EinsteinSentimentController {
    @AuraEnabled(cacheable=true)
    public static ConnectApi.EinsteinSentimentPrediction predictSentiment(String document) {
        // Sentiment APIの場合、Salesforceが提供する汎用コミュニティモデルを使用できます。
        // その場合のモデルIDは 'CommunitySentiment' となります。
        // 独自のデータでトレーニングしたモデルを使用する場合は、そのモデルIDを指定します。
        String modelId = 'CommunitySentiment';

        if (String.isEmpty(document)) {
            throw new AuraHandledException('Document cannot be null or empty.');
        }

        try {
            // ConnectApi.Einstein.predictSentimentメソッドを呼び出し、感情分析を実行
            // 第一引数:モデルID
            // 第二引数:分析対象のテキスト
            // 戻り値は ConnectApi.EinsteinSentimentPrediction オブジェクト
            ConnectApi.EinsteinSentimentPrediction prediction = ConnectApi.Einstein.predictSentiment(modelId, document);

            // デバッグログに結果を出力
            System.debug('Sentiment prediction result: ' + prediction);
            for(ConnectApi.EinsteinSentimentProbability prob : prediction.probabilities) {
                System.debug('Label: ' + prob.label + ', Probability: ' + prob.probability);
            }

            return prediction;

        } catch (ConnectApi.ConnectApiException e) {
            System.debug('Error calling Einstein Sentiment API: ' + e.getMessage());
            throw new AuraHandledException('Error from Einstein Sentiment API: ' + e.getMessage());
        }
    }
}

Sentiment の場合も同様に、probabilities プロパティに "Positive", "Negative", "Neutral" の各ラベルに対する確信度が含まれたリストが返されます。


注意事項

Einstein Language API を本番環境で安定して利用するためには、以下の点に注意する必要があります。

権限 (Permissions)

API を呼び出すユーザーには、適切な権限セットが必要です。通常は「Einstein Platform」権限セットライセンスをユーザーに割り当て、必要な権限(例: 「Einstein API にアクセス」)を付与した権限セットを作成・割り当てます。

API 制限 (API Limits)

Einstein Language API の呼び出しは、Salesforce の標準的な API 制限とは別の、独自のガバナ制限に従います。組織ごとに月間のコール数に上限が設定されています。大量のデータを処理するバッチ処理などを実装する場合は、この制限を超えないように設計することが不可欠です。現在の使用状況と制限値は、Salesforce の [設定] > [組織情報] などで確認できます。

エラー処理 (Error Handling)

API コールは、ネットワークの問題、無効な Model ID、API 制限超過など、様々な理由で失敗する可能性があります。コード例で示したように、API 呼び出しは必ず try-catch ブロックで囲み、ConnectApi.ConnectApiException を適切に捕捉してください。エラー発生時には、ログを記録したり、代替処理を実行したり、ユーザーにエラーメッセージを通知するなどの堅牢なエラーハンドリングを実装することが重要です。これにより、予期せぬエラーでビジネスプロセス全体が停止するのを防ぎます。

非同期処理 (Asynchronous Processing)

トリガなど、同期的なコンテキストから API Callout を行う場合、処理時間が長引くと Salesforce の governor limits に抵触する可能性があります。一件のレコード更新に対して一度だけ API を呼び出す程度であれば問題ありませんが、複数のレコードを一度に処理する場合や、レスポンスタイムが重要でない処理の場合は、@future メソッドや Queueable Apex、Batch Apex といった非同期パターンを利用することを強く推奨します。これにより、トランザクションの分離と governor limits の緩和が図れ、よりスケーラブルなソリューションを構築できます。


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

Einstein Language は、Salesforce 内の非構造化テキストデータに価値をもたらすための、開発者にとって非常に強力なツールです。Apex と Connect API を利用することで、AI による高度なテキスト分析機能を、既存の業務プロセスやカスタムアプリケーションにシームレスに統合することができます。

最後に、Einstein Language を活用する上でのベストプラクティスをいくつか紹介します。

  1. ビジネス課題から始める: テクノロジーありきではなく、「どの業務を自動化したいのか」「どのようなインサイトを得たいのか」という明確なビジネス課題からスタートしましょう。
  2. 高品質なデータセットが成功の鍵: 特にカスタムモデルをトレーニングする場合、モデルの精度はデータセットの質と量に大きく依存します。ノイズが少なく、ビジネスの文脈を正しく反映した、バランスの取れたデータセットを用意することに時間を投資してください。
  3. 確信度 (Probability) を活用する: API の応答に含まれる確信度は非常に重要な情報です。最も可能性の高いラベルを鵜呑みにするのではなく、「確信度が 90% 未満の場合は、人による確認を必要とする」といった閾値を設けることで、AI の判断ミスによるリスクを低減できます。
  4. 継続的なモデルの改善: ビジネス環境や使われる言葉は時間と共に変化します。一度作成したモデルを放置するのではなく、定期的にパフォーマンスを監視し、新しいデータで再トレーニングすることで、精度を維持・向上させましょう。
  5. コストと制限を意識した設計: API コールにはコストと制限が伴います。本当に API を呼び出す必要があるシナリオを見極め、不要な呼び出しを避ける設計(例: 特定の条件を満たすレコードのみ分析対象とする)を心掛けてください。

本記事が、皆さんの Salesforce 開発プロジェクトにおいて、Einstein Language を活用する一助となれば幸いです。ぜひ、テキストデータの自動化とインテリジェントな分析に挑戦してみてください。

コメント