SalesforceのAgentforceは、基本的にSalesforceのオブジェクトに関連するデータの取得をサポートしていますが、特定の返答を得るためにはカスタムアクションの実装が必要です。一般的にカスタムアクションはフローで実装することが多いですが、APEXを使ってプロンプトを作成するとすごく楽でした!
フローとAPEXの比較
Agentforceを使用する際、フローとAPEXの両方でカスタムアクションを実装することができますが、実際の利用シーンに応じて適切な選択をすることが重要です。
フローの利点:
- 直感的なビジュアルプログラミングで、複雑なロジックを理解しやすい。
- シンプルなデータ処理や基本的なロジックに適している。
APEXの利点:
- テキストデータの処理や高度なビジネスロジックを迅速に実装できる。
- データベース操作や複雑なクエリを効率的に処理できる。
APEXに向いている処理、フローが向いている処理
APEXは特に以下のような処理に向いています:
- 大規模なデータ集計や処理
- 複雑な条件分岐やデータベース操作
- 外部APIとの統合や高度なテキスト処理
一方、フローは次のようなシンプルなプロセスや基本的なロジックに向いています:
- ビジュアルでのプログラム設計が要求される場合
- 単純なデータ変換や自動化プロセス
APEXでの実装
今回は営業別の活動数を集計しました。フローより直接SOQLが使えるAPEXのほうが向いていました。また最近の生成AIの加速によりローコードよりコードのほうが生産性が高くなってきている気がします。
ヘルプはこちら
public with sharing class SalesActivityCount {
public class Request {
@InvocableVariable
public Opportunity opportunity;
}
public class Response {
@InvocableVariable
public String Prompt;
public Response(String prompt) {
this.Prompt = prompt;
}
}
@InvocableMethod
public static List<Response> getEventCounts(List<Request> reqs) {
List<AggregateResult> ars = [
SELECT OwnerId , Owner.name na , COUNT(Id) cnt
FROM Event
WHERE IsDeleted = false
GROUP BY OwnerId,Owner.name
];
String body = '';
for (AggregateResult ar : ars) {
body += '\n' + ((Id)ar.get('OwnerId'))
+ ' : ' + ar.get('na') + ' san '
+ ' : ' + ar.get('cnt') + ' 件';
}
Response r = new Response(body);
return new List<Response>{ r };
}
}
このAPEXクラスは、Eventオブジェクトから営業担当者ごとの活動件数を取得し、Agentforceにテキストデータとして返します。フローと比較して、このような高度な集計処理を実現する際には、APEXがより効率的である場合があります。
エージェントアクション登録
作成したAPEXはエージェントアクションとして追加することができます。
こちらは直接Agentforceから実行できるアクションとして登録しました。
また、APEXの結果を元に生成AIを使って処理したい場合はプロンプトテンプレートに埋め込むこともできます。(こちらのほうが使い勝手いいかも)
余談ですが、APEXの実行は、システム権限です。
規定では実行ユーザーに関係なくシステムアクセスできるデータにアクセス可能になります。
セキュリティ担保のためにWith Sharingの実装などをご検討ください。
まとめ
SalesforceのAgentforceを使用したカスタムアクションの実装において、ローコードであるフローをファーストチョイスにしがちですが、プロンプトへのテキストを作成する場合はAPEXで記載したほうが目的を速く達成できるケースもあります。テキスト処理など柔軟に扱えますし、必要な情報をSOQLで直接取得できるので作業効率は高いです。