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