見出し画像

【第397回】 Agentforce : ナレッジを使ったサービスエージェントの実装方法

今回の記事では、Agentforce のサービスエージェントを使って、Salesforce 標準機能である 「ナレッジ」を活用し、「よくある質問(FAQ)」を回答するサービスエージェントの実装方法を紹介します。

今回は Agentforce 入門の記事としたいので、Agentforce データライブラリ(ADL)を利用してシンプルに構築します。


データライブラリを使うメリット

ナレッジで Agentforce データライブラリを利用すると、わずか数分の作業で RAG(Retrieval-Augmented Generation) を用いたエージェントを構築できます。

Salesforce における RAG の説明は以下の記事をご確認ください。

データライブラリで利用できるデータ

  • Salesforceナレッジ記事

  • PDF(最大 100 MB)

  • HTML(最大 4 MB)

データライブラリを作成すると、Data Cloud 内に以下の要素が自動的に生成されます。

  • データストリーム

  • データレイクオブジェクト

  • データモデルオブジェクト

  • オブジェクト間のマッピング

  • 検索インデックス

  • レトリーバー

つまり、データライブラリを作成するだけで、レトリーバーまで一気通貫で自動生成されるため、非常にスピーディーにセットアップできるわけです。

検索インデックスとは、ナレッジ記事などのテキストデータをベクトル化(住所付け)して保存し、意味的な類似度に基づいて高速に検索できるようにする仕組みです。これにより、単純なキーワード一致ではなく、「意味の近い文脈」を理解した上で関連情報を検索できます。RAG の構成の中では、「検索対象のデータベース」に相当します。

レトリーバーとは、ユーザーの入力(質問など)をもとに、検索インデックスに登録されたコンテンツの中から意味的に最も類似度の高いレコードを特定し、プロンプトに入れて生成 AI(LLM)に情報として渡す役割を担います。つまり、RAG 構成の中では、「関連情報の検索担当」のパートになります。

例えば「返品ポリシーを教えて」と質問すると、レトリーバーはまず、検索インデックスに登録されているナレッジ記事の中から、「返品」「返金」「注文キャンセル」などの語や意味的に関連する内容を持つレコードを特定します。検索インデックスは、あらかじめテキストをベクトル化して意味的に検索できるようにしているため、単なるキーワード一致ではなく、文脈的に近い情報を高速に見つけ出すことができます。

そして、レトリーバーは検索インデックスから抽出した関連レコードの内容をプロンプトに組み込み、生成 AI(LLM)に渡します。これにより、AI は「返品ポリシー」に関する最も関連性の高い情報を参照しながら、自然で文脈に沿った回答を生成します。


データライブラリのデメリットについて

一方で、データライブラリで検索インデックスを作成すると、自動的にハイブリッド検索(ベクトル検索+キーワード検索)が採用されます。

このため、単純なベクトル検索を利用する場合と比べて、① コストが高くなる点 や ② 回答までの処理時間が長くなる点 には注意が必要です。これは、Salesforce 曰く、単純に約 2 倍近くかかると想定しても良い模様です。

ハイブリッド検索が効果を発揮するケース

  • 製品名やブランド名、専門用語、業界用語などが検索精度に影響する場合

  • 特定の用語や型番が含まれる質問に対する回答を求める場合

よって、専門用語などが含まれず、誰もが理解できる日常的な質問や回答だけで構成されているようなナレッジ記事であれば、データライブラリを使わずに、ベクトル検索のみの方を設定できる手動設定 のほうがと言えますので設計時に検討してみてください。


ナレッジ記事の準備

今回、ナレッジ記事の準備については、今回は割愛します。以下の Trailhead 等を参考にしてデータを用意してください。

私が今回利用している SDO 環境(Salesforce パートナー用のデモ環境)の場合は、「Knowledge オブジェクト」に、以下の 4 つの長文項目が存在していましたので、そちらをそのまま利用します。

  • Title(タイトル)

  • Summary(概要)

  • Question(質問)

  • Detail(回答・詳細)

もし現在の環境に存在していなければ、例えば Question(質問)や Detail(詳細)に該当する箇所はカスタム項目で作成して、「Knowledge Article Version データモデルオブジェクト」にマッピングしてください。
ちなみに、同じ内容を持つフィールドを複数選びすぎると、検索結果が偏る原因になるので注意が必要です。

なお、誰もが利用可能な『Developer Edition』でも試せます。

ステータスが Ready(準備完了)になると利用を開始できます。

私の環境では、今回、以下のテキストを「英語」のまま入力しましたが、もちろん「日本語」で入力しても問題ないです。お任せします。

タイトル(Title)
英語:Changing vehicles on the day
日本語:当日の車両変更について

概要・説明(Summary)
英語:If there is availability, you can change vehicles on the day.
日本語:空きがある場合は当日変更も可能です。

質問(Question)
英語:Can I change vehicles on the day?
日本語:当日車両を変更することはできますか?

詳細(Detail)
英語:If you would like to change vehicles, please let a store staff member know. We will reserve a vehicle that is available on your desired schedule on the day.
日本語:車両の変更を希望される場合は、店舗スタッフにお申し出ください。ご希望のスケジュールで空きのある車両で当日予約をお取りください。


サービスエージェントの作成

前提条件:この手順を始める前に、Data Cloud が有効化 されている必要があります。

準備:Einstein と Agentforce の有効化

1. Einstein 設定Einstein を有効化します。

2. 一度 F5 を押して画面を更新したら、「Agentforce エージェント」と検索して Agentforce を有効化し、「新しいエージェント」をクリックします。

3. サービスエージェントを選択して、「次へ」をクリックします。

4. トピックの選択では「General FAQ」だけを 追加済み にし、他のトピックは解除して「次へ」をクリックします。

5. 今回はテストのため、「会社」セクションには任意の文字列を入力します。「ログ機能の有効化」にチェックを入れて「次へ」をクリックします。


データライブラリの作成

6. 新規データライブラリを作成します。ここで Data Cloud が有効化されていない場合は作成を開始できません。

7. データライブラリ名を入力し、「ナレッジ」を選択します。今回の名前は「Knowledge Data Library」で登録してあります。

8. 項目設定タブで、「識別項目」に「タイトル(Title)」と「概要(Summary)」を設定します。

9. 「内容項目」では、「Question(質問)」や「Detail(回答・詳細)」を選択します。
これらは 長文テキストフィールド であることがポイントです。
不要な項目は選択せず、ナレッジの構成に合わせて設定してください。

10. 今回は「ナレッジの設定」タブで、公開済みナレッジ記事のみに絞り込みました。
必要に応じてデータカテゴリでフィルターをかけることも可能です。
すべて完了したら「作成」をクリックします。保存されるまで、しばらく、ページがグルグルなると思います。

データライブラリの保存中に システムエラーが発生して「Not Started」から「In Progress」や「Ready」のステータスに変更されない場合は、データライブラリを一度削除して、再度一から作成してみてください。


データ生成と構成の確認

11. 「作成」をクリックすると、次の要素が自動的に生成されます。処理には数分かかります。

  • データストリーム

  • データレイクオブジェクトデータモデルオブジェクト

  • オブジェクト間のマッピング

  • 検索インデックス

  • レトリーバー

12. 完了したら、検索インデックスを確認します。
作成直後はレコードがまだ生成されていませんので、数分 ~ 15 分ほど待ちます。

13. データ生成が完了すると、データが表示されるようになります。
この記事を執筆している時点では、15 分に 1 回程度、CRM 側のナレッジデータが自動的に連携・チャンク化されます。


Prompt Builder でリトリーバーを組み込み

14. 続いて、Prompt Builder を開き、「ナレッジを使用して質問に回答(Answer Questions with Knowledge)」を選択します。

プロンプトテンプレートのリストが表示されない場合は、Prompt Builder Manager の権限セットがあることを確認してください。

15. 新しいバージョンとして保存します。

16. プロンプト内の KNOWLEDGE セクションの既存リトリーバーを削除し、「リソースを追加」をクリックします。

17. 「Search(日本語設定の場合:Einstein Search)」を選択します。

18. 「Knowledge Article Version」を選択します。

19. データライブラリーにより作成されたリトリーバーを設定します。ここで、複数表示された場合「KA_」が頭に付いているものが、データライブラリ経由で作成されたリトリーバー です。

20. 埋め込んだリトリーバーをクリックし、検索パラメーターセクションの「検索テキスト」を表示します。

21. 検索窓から「自由テキスト」を選択します。

22. 「クエリ」を選択します。

23. 「Input:Query」が入力されたら、「保存&プレビュー」をクリックします。

24. プロンプトテンプレート上にて、日本語で「当日車両を変更することはできますか?」のような質問を入力して、回答が返ることを確認します。
必須項目のリトリーバー ID は、一旦「a」など任意の文字列で問題ありません。回答を日本語で確認したい場合は、返答言語を「日本語」にします。

25. プロンプトテンプレートを有効化します。


権限セットの作成と設定

26. 続いて、エージェントに戻って、日本語で「当日車両を変更することはできますか?」という同じ質問を入力して、プレビューを実行してみます。エージェントでも必要に応じて、言語設定を「日本語」にしてください。

この時点ではエージェントは、まだ回答を返しません。

これは、このエージェントに対して割り当てられているユーザー権限が不足しているためです。

27. 新しい権限セットを作成します。
「権限セット」に移動し、「新規」をクリックします。

28. 名前を決めて保存します。
今回の例では、「Knowledge Service Agent (Custom)」と入力しています。

29. 「割り当ての管理」をクリックします。

30. 「EinsteinServiceAgent User」を探して割り当てます。
この EinsteinServiceAgent User とは、サービスエージェント作成時のフローの中で自動生成されたユーザーです。

31. 続いて、作成した権限セットのトップから「オブジェクト設定」をクリックします。

32. 「Knowledgeオブジェクト API 参照名:Knowledge__kav)」を選択します。

33. オブジェクト権限で、「参照」「すべてのレコードの参照」「すべての項目の表示」を選択して保存します。

34. 権限セットのトップに戻り、「アプリケーション権限」をクリックします。

35. 「ナレッジの参照を許可」にチェックを入れて保存します。

36. 権限セットのトップから「Data Cloud データスペース管理」をクリックします。

37. 「編集」をクリックします。

38. 利用する データスペースにチェック を入れて保存します。


動作確認

※ 上記の権限の反映に時間がかかる場合がありますので、少し時間を空けてから確認することをオススメします。

39. 再度エージェントの プレビュー に戻り、質問を入力します。

40. サービスエージェントが、想定通りの回答を返しました。成功です。
これで、ナレッジを活用したサービスエージェントの作成が完了しました。


トラブルシューティングについて

なお、今回のように データライブラリー を利用した際に、プロンプトビルダーのプレビューで回答が返ってこない場合は、以下を確認してみてください。

  • ナレッジが「ドラフト」状態の場合は、「公開」する

※ 作成されたリトリーバーのコード内に
KnowledgePublicationStatus__c = ''Online''」が記載されているのが原因です。

Publication Status(KnowledgePublicationStatus__c)
Visible In Public Knowledge Base
(IsVisibleInPublicKnowledgeBase__c)
との違い

① KnowledgePublicationStatus__c = 'Online' は何?
公開状態(Publish 状態) の条件です。
- Online:その言語版が公開されている(閲覧可能な状態)
- Draft / Archived など:未公開・アーカイブ等で、基本的に参照対象外
👉 つまり、これは 「そもそも公開されてる記事だけ」 に絞るためのフィルタで、下書きやアーカイブのものは除外されます。データライブラリーではデフォルトの設定になっています。

② IsVisibleInPublicKnowledgeBase__c = 'true' は何?
Public Knowledge Base(公開知識ベースに公開)に表示してよいか の条件です。
- true:外部(Public KB / Experience Cloud / Web)に出してOK
- false:社内専用(コンソールでは見せるが外には出さない)など
👉 つまりこれは 「外部に見せても良い記事だけ」 に絞るためのフィルタであり、データライブラリーの以下の箇所で設定できます。トグルで有効化すると、IsVisibleInPublicKnowledgeBase__c = 'true' が追加されます


また一方で、プロンプトビルダーのプレビューでは回答が返るものの、エージェント側のプレビューで試すとエラーが発生する場合は、以下の対応を試してみてください。

  • 現在設定されているデータライブラリーを一度外して保存し、再度同じものを追加して保存する

または、

  • エージェントの「デフォルトの言語」を Knowledge Article Version DMO の Language 項目の言語に合わせる。

以下の場合は、en_US なので「英語(English)」にします。

※ これは作成されたリトリーバーのコード内に
Language__c=''{!$_LANGUAGE}''」が記載されているためです。

私の経験上、これらの対応で問題は解決するはずです。
参考にしてください。


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

今回は、ナレッジを活用したシンプルなサービスエージェント を作成してみました。これらの手順は Developer Edition 環境でも実行可能 ですので、ぜひ試してみてください。

また、作成したサービスエージェントを外部 Web サイトに設置する方法は、以下の記事で紹介しています。

私の場合は Marketing Cloud Engagement の CloudPages を利用していますが、同様の環境がある方はすぐに試せますのでお試しください。

今回は以上です。


次の記事はこちら

前回の記事はこちら

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