こんにちは。エンジニアの和田です。
今回は、AgentforceのAgent制御のノウハウについて、社内向けAIエージェントの構築経験によって得られた知見を基に解説します。
AgentforceのAgentは、ユーザーからの問いかけに対して自律的に判断し、予め設定したTopicと、Topic別に設定したActionの中を選んで実行します。自律的な動作が大きな特徴ではありますが、この自律的な動作を目的に応じていかに制御するかが課題となります。
Agentの内部では、Salesforceによって組み込まれたシステムプロンプトと、開発者が設定するTopicやActionの説明を組み合わせてLLMを呼び出しています。この仕組みによってAgentの動作が決まるため、開発者が変更できないシステムプロンプトによって動作がかなり制約されるものの、TopicやActionの説明を工夫することで、要件に応じた制御をある程度行うことができます。
本記事では、Agent制御ノウハウの第1弾として、「特定形式での出力方法」について取り上げます。
なお、Agent制御に効果的なノウハウは、Agentforce自体のアップデートや、Agentの内部で利用されるLLMのアップデートによって変化する可能性があります。この記事の内容は、2025年4月現在のものであることにご留意ください。
AgentforceのAgentに特定の形式で回答を出力させたいとします。例えば、チケットシステム(Backlog)で関連するチケットを提示する際に、次のような統一された形式で回答してほしいケースが考えられます。
〇〇については、このチケットが参考になりそうですよ!: (リンク)
しかし、AgentforceのAgentは特定形式での出力が必ずしも得意ではありません。
これは、そもそもLLM自体が非決定的であるという影響もありますが、例えばPrompt Templateを実行した場合と比較しても、やや苦手な印象を受けます。背景には、Agentに組み込まれているシステムプロンプトの影響があると推測されます。 したがって、もし特定の形式で回答させることに強いこだわりがないのであれば、回答の形式はなるべくAgentに任せるという方法も有効でしょう。
とはいえ、実際には特定の形式で回答するという仕様が決まっていることも多いでしょう。
特定形式での出力方法について、以下の3つの方法が考えられます。
- 出力を特定形式に整形するPrompt Templateを作成し、それをActionとする。そして整形を適用したい文字列を出力するFlow、Apex、Prompt Template等のActionの次に実行するようInstructionで指示する
- 出力を特定形式に整形するPrompt Templateを作成し、整形を適用したいFlow、Apex、Prompt Template等も一緒に入れたFlowを作成する。このFlowをActionとする
- TopicのInstructionに直接整形の指示を書く
このうち、「特定形式での出力」を最も効果的に実現できる方法は3となります。
1の方法では、整形を適用したいFlow、Apex、Prompt Template等のActionが呼ばれた後、整形Actionを呼んでくれないケースが多発します。ユーザーからの応答にあたっては、最初のActionが呼ばれた時点で解決するとAgentが判断してしまうためと考えられます。Actionを実行した後は必ず整形Actionを実行するようInstructionに書いても、うまくいかないことが多いです。
2の方法では、Flowで一体的に処理をつなげているので、整形Actionだけ呼ばれないという問題は解消されます。しかし、今度は、せっかく整形した文面をその後でAgentが改変してしまうという現象がたびたび起こります。
その点、3の方法ではかなり高い精度で決まった形で出力してくれます。おそらく、TopicのInstructionはいわば「最後の砦」であり、最終結果はこのInstructionで吟味されて出力されるため、3の方法が最も効果的になるのだと考えられます。
とはいえ、3の方法でも以下の3つの弱点があります。
弱点1: Prompt Injectionの誤検出
固定語句を出力させようとすると、Prompt Injectionと誤検出されることがあります。例えば、一定の条件のときに
ごめんなさい!私の知識ではその質問に回答できません。 Help me!
と出力させたいとします。しかし、このままInstructionに記述すると、Agent BuilderのConversation Previewで実行した際、特に「Help me!」の部分においてPrompt Injectionとみなされて動作が停止してしまうことがあります。
あくまで推測ですが、Instruction自体もプロンプト(の一部)には変わりなく、この場合にはプロンプトに含まれる文字列をユーザーに表出させることになるため、Prompt Injectionとみなされてしまうようです。
しかしながら、システムプロンプトを表出させたい意図があるわけではなく、単に開発者が指定する決まった語句を返してほしいだけなので、これは誤検出であり、エラーを回避したいところです。
そのためには、例えば以下のように記載します。
Use the following format for your answer and add "Help me!" to the tail of the answer: ごめんなさい!私の知識ではその質問に回答できません。 (Additional word here)
出力の形式をそのまま書くのではなく、「ここに追加の言葉を書く」と言って、書く内容を別に記載するのがポイントです。こうすると、プロンプトそのままの表出ではなく、Agentによる処理が挟まるため、Prompt Injectionと誤検出されにくくなります。
ただし、これはアドホックな対処法であり、固定語句の数が多くなると対処が難しくなります。根本的には、Prompt Injectionと誤検出されないようにアップデートされることを期待したいところです。
弱点2: コンテキスト長の問題
Instructionに全ての出力形式を記載するわけですから、どうしてもInstructionが長くなってしまいます。Instructionが長くなると、実際にLLMを呼び出す際のコンテキスト長が長くなります。あまりに長い場合、今のLLMはうまく指示内容を処理できなくなるリスクがあります。
弱点3: Instructionと整形の指示の密結合
Instructionに整形の指示が密結合することになるため、例えば同じActionを他のTopicで使いたいとなった場合に、そのTopic毎に同じInstructionを書く必要があり、変更が生じた際に全て修正しなければならないなど保守性が低下します。
以上が弱点になります。
特定形式での出力は、現時点では基本的にTopicのInstructionに直接整形の指示を書くのが効果的ですが、ここまで見てきたようにいくつか弱点もあり、絶対的にベストな方法とは言えないのが現状です。 仮に、今後のアップデートで、整形Actionを自律的に呼び出すようになったり、Actionの結果をそのままAgentの応答として出力するようになれば、Topicの Instructionに直接整形の指示を書く「3の方法」よりも、「1の方法」「2の方法」がより良い選択肢となる可能性もあります。
AgentforceのAgentは自律型エージェントであり、状況によって自律的に回答を考えるのが基本で、特定形式で出力することはあまり想定されていないのかもしれません。 したがって、Agentの特性を考えると、特定形式を指定せず、大まかな指示だけでAgentに任せる方が合っているのかもしれません。 しかし、実際のユースケースを考えると、特定の形式で出力させたいというニーズは高いと考えられるため、特定の形式で出力させる明示的な機能が欲しいところです。
今回は、AgentforceのAgent制御ノウハウとして、「特定形式での出力方法」について取り上げました。実際にAgentを作成する際の参考になれば幸いです。
本記事はAgent制御ノウハウの第1弾となりますが、今後第2弾として「Actionの効果的な選ばせ方」などを取り上げる予定です。お楽しみに。
最後までお読みいただきありがとうございました。