どんな取り組みか
Salesforce開発の現場では、「Agentforceの標準UIを使わず、独自の画面で生成AIを動かしたい」というニーズが増加しています。このような場面で活用できるのがAgentforce Models APIです。このAPIを利用することで、ApexやLWCといった既存の開発スキルを活かし、Anthropic、Google、OpenAIなど複数のプロバイダーが提供するLLMをSalesforceアプリケーションから呼び出すことが可能になります。また、@InvocableMethodを介してFlowからも利用できるため、ノーコードやローコードの構成にも生成AI機能を組み込むことができます。
この記事では、Models APIの基本的な構造から、Apex、LWC、Flowそれぞれでの具体的な呼び出し方、バックエンドで動作するEinstein Trust Layerの処理、そして実装時に注意すべきポイントまでを包括的に解説します。
使われた技術スタック
この取り組みでは、主に以下の技術スタックが活用されています。
- Salesforceプラットフォーム: Apex、Lightning Web Components (LWC)、Flow
- Agentforce Models API: Salesforceが提供するLLM呼び出し用のAPI。名前空間は
aiplatform、中心クラスはModelsAPI。 - LLMプロバイダー: Anthropic、Google、OpenAIなど、複数の外部LLMサービス。
- Einstein Trust Layer: Models APIのすべての呼び出しに自動的に適用されるセキュリティ・コンプライアンス機能。
実装のポイント
Models APIの概要
Models APIは、複数のLLMプロバイダーのモデルをApexから統一されたインターフェースで呼び出せるように設計されています。開発者はaiplatform.ModelsAPIクラスが提供する以下の4つの主要メソッドを利用して、生成AI機能をアプリケーションに組み込むことができます。
createGenerations(): テキスト生成(プロンプトに対する回答生成)createChatGenerations(): チャット生成(メッセージ履歴を元にした回答生成)createEmbeddings(): 埋め込みベクトルの生成submitFeedback(): 生成テキストへのフィードバック送信
submitFeedback()以外のメソッドでは、呼び出し時にモデルのAPI名を指定します。これにより、コード側で利用するLLMを動的に切り替えることが可能です。例えば、GPT-4o Miniを使用する場合はsfdc_ai__DefaultOpenAIGPT4Omniを、Claude Sonnet 4.6を使用する場合はsfdc_ai__DefaultBedrockAnthropicClaude46Sonnetを指定します。これにより、GPT系からClaude系への切り替えもAPI名を変更するだけで対応できます。
Einstein Trust Layerを経由するとは
Models APIへのすべての呼び出しは、開発者が意識的に設定することなく、自動的にEinstein Trust Layerを経由します。このレイヤーは、以下の主要な保護機能を提供します。
- 機密データのマスキング: プロンプトに含まれる個人情報などをLLMに渡す前にマスク処理を行います。
- ゼロリテンション: LLMプロバイダー側にデータが保持されないことを保証します。
- 有害性検出: 生成されたテキストに有害なコンテンツが含まれていないかをチェックします。
- 監査証跡: すべてのやり取りを記録し、トレーサビリティを確保します。
Einstein Trust Layerを経由することによる体感的な遅延は少なく、特にセキュリティ要件が厳しい本番環境での利用において安心感を提供します。ただし、データマスキングがONの状態では、コンテキストウィンドウが65,536トークンに制限されるため、非常に長いテキストを処理する際にはこの上限を考慮した設計が必要です。
ApexからModels APIを呼び出す
テキスト生成(createGenerations)
ModelsAPI.createGenerations()は、与えられたプロンプトに対してLLMがテキストを生成する機能を提供します。基本的な呼び出しパターンは以下の通りです。
// リクエストオブジェクトを作成
aiplatform.ModelsAPI.createGenerations_Request request = new aiplatform.ModelsAPI.createGenerations_Request();
// モデルを指定
request.modelName = 'sfdc_ai__DefaultGPT4Omni';
// ボディを作成してプロンプトをセット
aiplatform.ModelsAPI_GenerationRequest requestBody = new aiplatform.ModelsAPI_GenerationRequest();
requestBody.prompt = 'Salesforceの特徴を3つ教えてください。';
request.body = requestBody;
try {
// 実行
aiplatform.ModelsAPI modelsAPI = new aiplatform.ModelsAPI();
aiplatform.ModelsAPI.createGenerations_Response result = modelsAPI.createGenerations(request);
// 生成されたテキストを取得
String generatedText = result.Code200.generation.generatedText;
System.debug(generatedText);
} catch(aiplatform.ModelsAPI.createGenerations_ResponseException e) {
System.debug('Response code: ' + e.responseCode);
System.debug('The following exception occurred: ' + e);
}
リクエストが成功した場合、生成されたテキストはCode200.generation.generatedTextに格納されます。エラー発生時にはModelsAPI.createGenerations_ResponseExceptionがスローされるため、適切なエラーハンドリングが必要です。
チャット生成(createChatGenerations)
チャット形式の対話にはcreateChatGenerations()を使用します。過去のメッセージ履歴を渡すことで、文脈を考慮した応答を得ることができます。
// チャットメッセージのリストを組み立てる
List<aiplatform.ModelsAPI_ChatMessageRequest> messages = new List<aiplatform.ModelsAPI_ChatMessageRequest>();
// システムプロンプト(エージェントの振る舞いを定義)
aiplatform.ModelsAPI_ChatMessageRequest systemMsg = new aiplatform.ModelsAPI_ChatMessageRequest();
systemMsg.role = 'system';
systemMsg.content = 'あなたはSalesforceの専門家です。簡潔に回答してください。';
messages.add(systemMsg);
// ユーザーのメッセージ
aiplatform.ModelsAPI_ChatMessageRequest userMsg = new aiplatform.ModelsAPI_ChatMessageRequest();
userMsg.role = 'user';
userMsg.content = 'Agentforceとは何ですか?';
messages.add(userMsg);
// リクエスト作成
aiplatform.ModelsAPI.createChatGenerations_Request request = new aiplatform.ModelsAPI.createChatGenerations_Request();
request.modelName = 'sfdc_ai__DefaultBedrockAnthropicClaude46Sonnet';
// ボディを作成してメッセージをセット
aiplatform.ModelsAPI_ChatGenerationsRequest body = new aiplatform.ModelsAPI_ChatGenerationsRequest();
body.messages = messages;
request.body = body;
try {
// 呼び出し
aiplatform.ModelsAPI modelsAPI = new aiplatform.ModelsAPI();
aiplatform.ModelsAPI.createChatGenerations_Response result = modelsAPI.createChatGenerations(request);
System.debug('Models API response: ' + result.Code200.generationDetails.generations);
} catch(aiplatform.ModelsAPI.createChatGenerations_ResponseException e) {
System.debug('Response code: ' + e.responseCode);
System.debug('The following exception occurred: ' + e);
}
チャット形式は、ユーザーとの連続した会話や、システムプロンプトを用いてAIの振る舞いを細かく制御したい場合に特に有効です。
LWCからModels APIを呼び出す構成
LWCからModels APIを直接呼び出すことはできません。LWCからModels APIを利用する場合、LWC → Apex → Models APIという3層構成が一般的なパターンとなります。この構成では、LWCがUIとプロンプトの組み立てを担当し、ApexがModels APIとの通信を担当するという役割分担が重要です。
Apexクラスの作成
LWCから呼び出せるApexメソッドを作成するには、@AuraEnabledアノテーションを付与します。
public with sharing class ModelsApiController {
@AuraEnabled
public static String getGeneratedText(String prompt, String modelName) {
try {
// リクエスト作成
aiplatform.ModelsAPI.createGenerations_Request request = new aiplatform.ModelsAPI.createGenerations_Request();
request.modelName = modelName;
// ボディにプロンプトをセット
aiplatform.ModelsAPI_GenerationRequest requestBody = new aiplatform.ModelsAPI_GenerationRequest();
requestBody.prompt = prompt;
request.body = requestBody;
// 呼び出し
aiplatform.ModelsAPI modelsAPI = new aiplatform.ModelsAPI();
aiplatform.ModelsAPI.createGenerations_Response result = modelsAPI.createGenerations(request);
return result.Code200.generation.generatedText;
} catch (aiplatform.ModelsAPI.createGenerations_ResponseException e) {
throw new AuraHandledException('生成エラー: ' + e.getMessage());
}
}
}
LWCのJavaScript側
Apexメソッドは、LWCのJavaScript側からimperative(命令型)で呼び出します。
import { LightningElement } from 'lwc';
import getGeneratedText from '@salesforce/apex/ModelsApiController.getGeneratedText';
// ... LWCコンポーネントのロジック ...
// 例: ボタンクリックでApexメソッドを呼び出す
handleGenerateClick() {
const prompt = 'Salesforceについて教えてください。';
const modelName = 'sfdc_ai__DefaultGPT4Omni';
getGeneratedText({ prompt: prompt, modelName: modelName })
.then(result => {
console.log('Generated Text:', result);
// UIに結果を表示する処理
})
.catch(error => {
console.error('Error:', error);
// エラーハンドリング
});
}
FlowからModels APIを呼び出す
FlowからModels APIを利用する場合、Apexクラスに@InvocableMethodアノテーションを付与したメソッドを作成し、それをFlowから呼び出すことで実現できます。これにより、ノーコード/ローコード開発の担当者でも生成AI機能を活用できるようになります。
得られた成果や学び
Agentforce Models APIを活用することで、Salesforceプラットフォーム上でLLMを柔軟に統合できることが明らかになりました。既存のApexやLWCのスキルセットをそのまま利用できるため、開発者は新しい学習コストを抑えつつ、生成AI機能をアプリケーションに組み込むことが可能です。特に、Einstein Trust Layerが自動的に適用されることで、セキュリティやコンプライアンスの要件が厳しいエンタープライズ環境においても安心してLLMを利用できる点が大きなメリットです。
また、複数のLLMプロバイダーを統一されたインターフェースで扱えるため、将来的なモデルの切り替えや、異なるユースケースに応じた最適なモデルの選択が容易になります。ただし、データマスキング時のコンテキストウィンドウの制限など、一部の制約を理解し、設計に反映させることが重要です。
まとめ
Agentforce Models APIは、Salesforce開発者が生成AI機能をアプリケーションに組み込むための強力なツールです。Apex、LWC、FlowといったSalesforceの主要な開発要素からLLMを呼び出すことができ、Einstein Trust Layerによるセキュリティとコンプライアンスの確保も自動で行われます。このAPIを活用することで、Salesforceアプリケーションの可能性を広げ、より高度なユーザー体験を提供できるでしょう。
出典: https://qiita.com/ubakichi_sr_mc_ai_06/items/b52caf3c818390f4c546
Related Certifications
この記事に関連する技術領域の認定資格
Salesforce 関連資格
- Salesforce Certified Administrator
- Salesforce Certified Platform Developer I
- Salesforce Certified Platform Developer II
- Salesforce Certified Application Architect
- Salesforce Certified System Architect
- Salesforce Certified Technical Architect
AWS 関連資格
- AWS Certified Cloud Practitioner
- AWS Certified Solutions Architect – Associate
- AWS Certified Developer – Associate
- AWS Certified Solutions Architect – Professional
- AWS Certified DevOps Engineer – Professional
- AWS Certified Machine Learning – Specialty
※ 認定資格は技術スキルの体系的な学習に役立ちます。試験の出題範囲や受験要件は変更される場合があるため、受験前に必ず公式サイトで最新情報をご確認ください。
PR / Recommended
AI開発・画像生成のためのGPUサーバー
画像生成AIや機械学習モデルをローカルで動かすには高性能GPUが必要ですが、ConoHaのGPUサーバーなら月額制で気軽に高性能環境を構築できます。Stable Diffusion等の画像生成や、Bedrockのプロトタイピングにも最適です。
PR / Recommended
生成AIを体系的に学べるスクール
生成AIやプロンプトエンジニアリングを実務で活かしたいエンジニア・ビジネスパーソンには、専門スクールでの体系的な学習が効率的です。DMM 生成AI CAMPは月額定額で学び放題、無料セミナーも開催中です。
PR / Recommended
プライバシー保護に役立つVPNサービス
公衆Wi-Fi利用時の通信保護やプライバシー確保にはVPNが効果的です。NordVPNは世界中で利用されている定番VPNサービスで、強力な暗号化と高速接続を両立しています。
SF Tech & Win
Salesforce × AWS × AI 連携の実装ノウハウ
SIer・スタートアップ・中小企業のDX推進に役立つアーキテクチャ事例・実装パターン・最新アップデート情報を毎朝配信。
コメント