見出し画像

【第438回】 Marketing Cloud Next : パーソナライゼーション x Agentforce

最近、私が集中的に Agentforce に関する記事を書いてきたのには理由があります。それは、最終的に「この地点」に辿り着きたかったからです。
本記事では、これまでの一連の取り組みが何を目指していたのか、その伏線を回収していきます。

まだ個人的には完成形とは言えない段階ではありますが、Salesforce Personalization における Personalization Points での表示結果を、サービスエージェント上に表示することに成功しました。

この Personalization Points は、Marketing Cloud Next の「繰り返しコンポーネント」で利用されている パーソナライゼーションレコメンダー の仕組みと深く結びついています。

そこで本記事では、繰り返しコンポーネントに表示される内容と、まったく同じレコメンド結果を、顧客がサービスエージェントに「オススメの商品は何ですか?」と尋ねた際に返す、という実装にチャレンジしています。

なお、パーソナライゼーションレコメンダーの仕組みそのものについては、以下の記事で詳しく解説しています。本記事の内容は、その仕組みを事前に実装済みの SDO 環境を使って検証しています。


表示結果の確認

それでは、実際の挙動(表示結果)を見ていきます。

A さんは「Rock」を好むという属性を持っているため、Rock ジャンルの商品が、パーソナライゼーションレコメンダーの技術を用いて、繰り返しコンポーネント付きのメールとして配信されます。

一方、Agentforce のチャット上では、拡張チャット v1 において、アダプティブ応答形式 を使ったカルーセル表示を行っています。
オススメの商品は何ですか?」と尋ねて返された商品が、メールと同じ並び順になっていることも確認できました。


次に B さんの場合です。
B さんは「Jazz」を好むという属性を持っているため、Jazz ジャンルの商品がメールで送信されます。

一方、Agentforce のチャット上でも、メール版とまったく同じ順序で商品が表示されていることを確認できました。


実装のポイント

今回、実装していく中でいくつか重要なポイントが見えてきましたので、ここではその点に絞って共有します。

まず、dataspace と IndividualId は必須となります。

  • dataspace は基本的に固定値(例:default)で問題ありません

  • IndividualId は、会話中なのか、事前チャットなのかに応じて顧客情報を取得し、Salesforce ID(ContactId など)を渡す必要があります

Map<String, Object> context = new Map<String, Object>();
context.put('dataspace', 'default');
context.put('individualId', contactId);

Map<String, Object> body = new Map<String, Object>();
body.put('context', context);
body.put(
     'personalizationPoints',
     new List<Object>{
         new Map<String, Object>{
             'name' => 'PersonalizationRecommendations_9a7f'
         }
     }
);

また、パーソナライゼーションポイントは明示的に指定します。
今回はメールと完全に同じ条件にするため、繰り返しコンポーネントを含むメールで設定されているパーソナライゼーションポイントを、そのまま流用しました。

ここで指定するのは API 参照名です。
今回の例では PersonalizationRecommendations_9a7f になります。


次に Named Credential の作成です。
こちらは External Credential の設定で「認証なし」「認証あり」を選択できますが、上の図で指定している通りで、Authentication Required の設定状況に従ってください。今回、私は「認証なし」で設定しました。

あわせて、権限セットを作成し、
External Credential Principal Access に関しては、

  • 実行ユーザー

  • エージェントユーザー

の両方に付与しておくと良いです。

なお、Data Cloud のテナントエンドポイントは以下の箇所で見つかります。これを Named Credential で設定します。


実際にコンテンツを取得する際は、以下のエンドポイントを利用します。

HttpRequest req = new HttpRequest();
req.setMethod('POST');
req.setHeader('Content-Type', 'application/json');
req.setHeader('Accept', 'application/json');
req.setEndpoint('callout:Personalization/personalization/v1/decisions');
req.setBody(JSON.serialize(body));

今回の表示では Product 情報として、Goods Product DMO の各項目の API 参照名を指定しています。これはアイテムデータグラフで設定されたもので、Recommenders 側で紐付け が行われています。

ChoiceItem c = new ChoiceItem();
c.name        = asString(item.get('ssot__Name__c'));
c.imageUrl    = asString(item.get('Image_URL__c'));
c.linkUrl     = asString(item.get('Link_URL__c'));
c.mimeType    = asString(item.get('MIME_Type__c'));
c.description = asString(item.get('ssot__Description__c'));
c.price = formatPriceYen(item.get('Price_Text__c'));

このあたりは、パーソナライゼーションレコメンダーの仕組み を理解していれば、比較的スムーズに把握できると思います。

設計上のポイントとしては、最終的にアダプティブ応答形式で返すことを前提にしたレスポンス設計を行うことです。詳細は下記の記事を参考に。

また、アダプティブ応答形式では 6 件以上のアイテムを返すと、回答が不安定になるため、最大 5 件に制限する処理も必須です。

Integer maxItems =
    (inRec != null && inRec.maxItems != null && inRec.maxItems > 0)
        ? inRec.maxItems
        : 5;

設定上の注意:Apex クラスの設定を保存した後は、サービスエージェントに対して Apex Class Access を付与することも忘れないでください。これを忘れると Apex クラスをエージェントが利用できません。


いかがでしたでしょうか。

抜粋ばかりの雑なレポートにはなってしまいましたが、全体像とポイントだけはお伝えできたかと思います。
仮に、今回のコード完全版を記事に書いたとしても、私の環境でしか動かない内容になってしまうため、今回は要点だけの解説に絞りました。

私は、サービスエージェントはマーケティングツールの一部 だと考えています。マーケター自身がこの領域に踏み込むことで、Marketing Cloud Next にさらに大きな価値を加えられるはずです。
ぜひ、研究・検証してみてください。

Agentforce に関する記事は以下にまとまっています。

今回は以上です。


次の記事はこちら

前回の記事はこちら

私の note のトップページはこちら