
みなさんこんにちは。エンジニアの佐藤です。今回はローカル実行の大規模言語モデル(LLM)を使ったAgentforceエージェントの評価の試みについてのお話です。
従来のコンピューターとは基本的に異なるLLMの動作
ChatGPTが登場し生成AIブームが起こってから、本稿執筆時点で2年弱が経過しました。世間の反響の大きさについては言うまでもありませんが、このLLMなるモノ、固有の魅力と切なさを併せ持つ存在です。
固有の魅力は、何といっても人間の思考を模倣する機能です。そして切なさとは、何といっても決定論的に動作してくれないところではないでしょうか。筆者はこの道の専門家ではないので下手な説明は避けますが、この性質により、時として生成結果が期待外れのことがあります。そしてその期待外れの動作を、あらかじめ予見することは大変難しいのです。いえ、多くの場合は大丈夫なのですよ。しかし、さまざまな期待が積み重なった場面で、ふっと、コケるわけです。「ああすれば、必ずこうなる。プログラミングコードの正しさは、永遠だ!」という前提を信じて複雑なシステムを組み上げることを生業にしてきた筆者にとっては、大きなパラダイムシフトです。
それだけではない、LLM応用開発の問題
これだけではありません。以下のような変動要因も、LLMの動作に影響を与えます。
- モデル自体の更新
- Agentforceなどに埋め込まれているシステムプロンプトや、その他パラメターの調整
つまり、LLM応用機能を開発した技術者は、「今使っているモデルが利用不能になるのではないか」とか、「システムのバージョンアップで開発機能が不具合を起こすのではないか」という心配を抱えることになります。このような問題はLLM登場以前もありましたが、今回は、相手(LLMの動作)がもともと完全には制御できないものであるだけに、品質保証に何らかの新しい方法が必要です。
ローカル実行のLLMに評価させるのはどうか
Agentforceエージェントをチャットボットとして使った場合、ユーザーが目にする出力結果にはLLMが生成した自然言語が含まれると思います。この出力をどうやって評価したら良いでしょうか。さまざまな方法が考えられますが、難しいのは「一字一句同じではなく、使用している単語も違うが、意味は同じで、有効」なケースをどうやって少ない労力で評価するかです。従来のテストコードのアプローチでは、このようなケースは取り扱えません。また、毎回全部人間が読むと言うのも、現実的ではありません。
そこでLLMに評価させるという考えが出てくるわけですが、OpenAIなどのAPIで提供されているLLMは、手軽に始められて高性能というメリットがあるものの、「使っているモデルの廃止」や「パラメター調整による動作の変化」という例の問題があります。
そこで考えられるのが、LLMのローカル実行です。この方法では、モデルと実行系を全てローカルコンピューターに収容して評価を行います。こうすることにより、以下のメリットが得られると思います。
- 実行系を保存する限り、無期限で同じ評価が実行できる。
- コンピューターを調達する限り、無制限に評価が繰り返せる。
ただし、ローカル実行できるLLMは一般的に性能が低く、また比較的高性能のモデルは高価なコンピューターを要求します。そこで、評価に要する自然言語的な能力水準をなるべく下げ(つまり課題を平易にして)、なるべく小さい(コンピューターへの性能要求が低い)モデルを選択する必要があります。
よくある質問に自動回答するチャットボットの場合には、以下のような工夫ができると思います。
- 質問と模範回答を用意する。
- チャットボットに質問を送信し、解答案を得る。
- 模範回答と解答案を比較する。
このうち3(いわゆるマル付け)は、2つの文章の比較なので、比較的狭い知識ドメインに閉じた判断であるため、小さいモデルで実行できる可能性があると思います。記述式試験の答案を、先生がごく短時間で次々と採点していくイメージでしょうか。
前置きが長くなりましたが、以下にこの手順の検証例を説明させていただきます。
LLMローカル実行系の選択
各種の方法がありますが、最も廉価なのがCPUに実行させる方法です。ただしそのままでは遅いので、以下の工夫をします。
CPUのAI支援命令の利用
この点を満たすライブラリとして、OpenVINO Gen AIがあります。IntelやAMDが製造するx86_64系のCPUのAI支援命令を活用するものです。こちらの手順で手軽にインストールすることができ、今回の検証例でもこちらのサンプルを流用しました。
量子化モデルの利用
できるだけサイズが小さく、しかし高性能で、CPUのAI支援命令の効果が大きいものが望ましいです。今回はOpenVINOでサポートされるモデルの中からQwen3-1.7B-int8-ovを選択しました。
これらのライブラリと量子化モデルだと、今回利用したOracle Cloud E6インスタンス(AMD 第5世代 EPYCプロセッサ)ではメモリ使用量は約4GBでした。後述の検証時の生成速度は設問1問(数百文字程度)あたり4-6秒となり、手軽な範囲です。
もう一つ、LLMによる生成結果が生成のたびに変化しないように、以下の設定を行います。
config = openvino_genai.GenerationConfig()
config.do_sample = False
この設定は、モデルが毎ステップで最も確率の高いトークンを選ぶ「グリーディデコーディング」を使う設定です。ランダム性がなく、同じ入力に対して常に同じ出力が得られますので、テストのような一定の視点からの繰り返しの評価に適しています。(試しに「春について100文字以内で説明して。」のような抽象的なプロンプトで数十回の生成試行を行いましたが、毎回完全に同じ出力結果が得られました。)
「個人情報保護法FAQ」を題材にした検証環境の実装
質問回答形式のチャットボットの題材として、今回は個人情報保護委員会ホームページの「『個人情報の保護に関する法律についてのガイドライン』 に関するQ&A」を選びました。多数のFAQが掲載されていますので、この中から100問ほどを選びました。
また、これを題材に60問の設問と、それらの模範回答を調整しました。60の設問は3つのレベルで各20問出題し、それぞれのレベルは以下のように設定しました。
| レベル | 説明 | 例 |
|---|---|---|
| LEVEL-1 | 一般的な概念や基本的な定義に関するもの。社会通念上明らかであり、FAQのテキストをそのまま検索・抽出するだけで直感的かつ一意に回答可能なレベル。 | 「特定の個人を識別できる」の意味、一般的な個人情報の該当性など |
| LEVEL-2 | 法令やガイドラインの明文ルール・原則を単一のコンテキストから適用して回答できるもの。一般的な実務における定型的な取り扱いや、基本的な義務に関する説明で事足りるレベル。 | 利用目的の特定の程度、データの消去期間の考え方、基本的な同意取得のタイミングなど |
| LEVEL-3 | 具体的な個別業務事例に対し、複数の条件分岐やルールの解釈を当てはめて推論する必要があるもの。システム構成や業務フロー(クラウド利用、カメラ設置、委託先管理など)に応じた具体的な判断が求められるレベル。 | 顔識別カメラの留意点、クラウドサービスが第三者提供に該当するかどうかの判断など |
Agentforceエージェントの実装方法
今回はテスト用ですので、以下のように簡易的に実行します。
- プロンプトテンプレートに選んだ約100問をそのまま貼り付け、これを題材に回答するようにプロンプトを書く。
- この質問回答を行うエージェントを定義する。
また、外部クライアントアプリケーションを定義してこのAgentforceエージェントを接続し、Agent API経由で利用できるように設定します。(詳細手順については、Salesforceのヘルプなどをご覧ください。)
Agentforceエージェントに要求される知的なタスクは以下のような内容です。
- プロンプトテンプレートに貼り付けられたFAQを理解する。
- 質問を理解する。
- FAQの内容に沿って回答する。
プロンプトテンプレートを実行するLLMはGemini 2.5 Flashに設定しました。上記のタスクをこなすには十分の性能でしょう。
テストプログラムの作成
テストプログラムの処理は、「ローカル実行のLLMに評価させるのはどうか」で述べた手順を素直に実装するものです。
- 「質問と模範回答」から1問取り出す。
- Agent APIを使ってAgentforceエージェントに質問を送信し、解答案を得る。
- 模範回答と回答を比較する。(ここでローカル実行のLLMを利用する。)
比較にあたっては以下のプロンプトを使用しました。
以下の質問に対して、モデル回答とエージェント回答が意味的に同一かどうかを判定してください。
質問: {question}
モデル回答: {model_answer}
エージェント回答: {agent_answer}
意味的に同一であれば score: 1、異なれば score: 0 として、以下の形式のみで回答してください。
score: <0 or 1>
reason: <簡潔な理由>
テスト対象となるAgentforceエージェントには十分な回答能力があると考えられますので、実行に際して気になる点は以下の2点になります。
- 「正解」を正しく判断できるか。scoreの選択が妥当で、reasonに納得感があるか。
- 2回繰り返し実行した時、安定感があるか。
検証結果
それぞれの設問に関する結果は以下のようになりました。
| レベル | 設問番号 | score(第1回実行) | score(第2回実行) |
|---|---|---|---|
| LEVEL-1 | 1 | 1 | 1 |
| LEVEL-1 | 2 | 1 | 1 |
| LEVEL-1 | 3 | 1 | 1 |
| LEVEL-1 | 4 | 1 | 1 |
| LEVEL-1 | 5 | 1 | 1 |
| LEVEL-1 | 6 | 1 | 1 |
| LEVEL-1 | 7 | 0 | 0 |
| LEVEL-1 | 8 | 1 | 1 |
| LEVEL-1 | 9 | 1 | 1 |
| LEVEL-1 | 10 | 1 | 1 |
| LEVEL-1 | 11 | 1 | 1 |
| LEVEL-1 | 12 | 1 | 1 |
| LEVEL-1 | 13 | 1 | 1 |
| LEVEL-1 | 14 | 1 | 1 |
| LEVEL-1 | 15 | 1 | 1 |
| LEVEL-1 | 16 | 1 | 1 |
| LEVEL-1 | 17 | 1 | 1 |
| LEVEL-1 | 18 | 1 | 1 |
| LEVEL-1 | 19 | 1 | 1 |
| LEVEL-1 | 20 | 1 | 1 |
| LEVEL-2 | 1 | 1 | 1 |
| LEVEL-2 | 2 | 1 | 1 |
| LEVEL-2 | 3 | 1 | 1 |
| LEVEL-2 | 4 | 1 | 1 |
| LEVEL-2 | 5 | 1 | 1 |
| LEVEL-2 | 6 | 1 | 1 |
| LEVEL-2 | 7 | 1 | 1 |
| LEVEL-2 | 8 | 1 | 1 |
| LEVEL-2 | 9 | 1 | 1 |
| LEVEL-2 | 10 | 1 | 1 |
| LEVEL-2 | 11 | 1 | 1 |
| LEVEL-2 | 12 | 1 | 1 |
| LEVEL-2 | 13 | 1 | 1 |
| LEVEL-2 | 14 | 1 | 1 |
| LEVEL-2 | 15 | 1 | 1 |
| LEVEL-2 | 16 | 1 | 1 |
| LEVEL-2 | 17 | 1 | 1 |
| LEVEL-2 | 18 | 1 | 1 |
| LEVEL-2 | 19 | 1 | 1 |
| LEVEL-2 | 20 | 1 | 1 |
| LEVEL-3 | 1 | 1 | 1 |
| LEVEL-3 | 2 | 1 | 1 |
| LEVEL-3 | 3 | 1 | 1 |
| LEVEL-3 | 4 | 1 | 1 |
| LEVEL-3 | 5 | 1 | 0 |
| LEVEL-3 | 6 | 1 | 1 |
| LEVEL-3 | 7 | 1 | 1 |
| LEVEL-3 | 8 | 1 | 1 |
| LEVEL-3 | 9 | 1 | 1 |
| LEVEL-3 | 10 | 1 | 1 |
| LEVEL-3 | 11 | 1 | 1 |
| LEVEL-3 | 12 | 1 | 1 |
| LEVEL-3 | 13 | 1 | 1 |
| LEVEL-3 | 14 | 1 | 1 |
| LEVEL-3 | 15 | 0 | 1 |
| LEVEL-3 | 16 | 1 | 1 |
| LEVEL-3 | 17 | 1 | 1 |
| LEVEL-3 | 18 | 1 | 1 |
| LEVEL-3 | 19 | 1 | 1 |
| LEVEL-3 | 20 | 1 | 1 |
概ね期待結果(score=1)となっており、reasonをいくつか標本的に読んだ限りは妥当な内容に思いましたが、LEVEL-1の設問7は常に期待とな異なる結果になりました。第1回実行の結果を見てみましょう。
設問: 個人情報に該当しない事例を教えてください。
模範回答: 企業の財務情報などの法人等の団体そのものに関する情報(団体情報)や、複数人の情報から共通要素を集計した統計情報などが考えられます。
Agentforceエージェントの回答: 個人情報に該当しない事例は以下の通りです。\n\n企業の財務情報など、法人や団体そのものに関する情報(団体情報)\n統計情報(複数人の情報から共通要素を抽出し、分類ごとに集計した情報)\n機械学習の学習済みパラメータ(重み係数)で、特定の個人との対応関係が排除されている場合\nオンラインゲームの「ニックネーム」や「ID」は、通常は特定の個人を識別できないため個人情報に該当しません。ただし、他の情報と照合して個人を識別できる場合や、有名なニックネーム等で個人が特定できる場合は個人情報に該当します。\n通話内容から特定の個人を識別できない録音記録。ただし、他の情報と照合して個人を識別できる場合は個人情報に該当します。\nカメラ画像から抽出した性別や年齢などの属性情報や、全身シルエット画像等に置き換えた移動軌跡データ(人流データ)は、特定の個人を識別できる情報と容易に照合できない限り個人情報に該当しません。\n\n他にも知りたい事例や、具体的なケースがあれば教えてください。
score: 0
reason: モデル回答は「個人情報に該当しない事例」の例を示していますが、エージェント回答は「個人情報に該当しない事例」の例を述べています。両回答は同じ内容を述べていますが、エージェント回答はさらに詳細に例を挙げており、意味的に同一です。ただし、エージェント回答は「個人情報に該当しない事例」の例を述べているのに対し、モデル回答は「個人情報に該当しない事例」の例を述べています。したがって、両回答は意味的に同一です。
reasonが理由になっていません。プロンプトテンプレートには多数のFAQが収録されているので、該当情報を収集するとAgentforceエージェントの回答が長くなった結果、非力なローカルLLMは判定に窮したようです。ここはローカルLLMの能力の限界を示すもののように思います。
同じ設問の第2回実行はどうでしょうか。
(設問と模範回答は同じ)
Agentforceエージェントの回答: 個人情報に該当しない事例は、以下の通りです。\n\n企業の財務情報など、法人や団体そのものに関する情報(団体情報)\n統計情報(複数人の情報から共通要素を抽出し、分類ごとに集計した情報)\n複数人の個人情報を機械学習の学習用データセットとして用いて生成した学習済みパラメータ(重み係数)は、特定の個人との対応関係が排除されている限り「個人情報」には該当しません\nオンラインゲームの「ニックネーム」や「ID」が公開されていても、通常は特定の個人を識別できないため個人情報には該当しません\n通話内容から特定の個人を識別できない場合、録音記録は基本的に個人情報に該当しません\nカメラ画像から抽出した性別や年齢などの属性情報や、人物を全身のシルエット画像等に置き換えて作成した移動軌跡データ(人流データ)のみであれば、特定の個人を識別できる情報と容易に照合できる場合を除き、個人情報には該当しません\n\n他にも知りたい具体的なケースがあれば教えてください。
score: 0
reason: モデル回答は「個人情報に該当しない事例」の例として「企業の財務情報」「団体情報」「統計情報」などを挙げています。一方、エージェント回答は「個人情報に該当しない事例」の例として「法人情報」「統計情報」「学習済みパラメータ」「ニックネーム」「ID」「通話内容」「カメラ画像から抽出された属性情報」などを挙げています。両回答は内容上ほぼ同一であり、意味的に同一と判断できます。ただし、エージェント回答は「個人情報に該当しない事例」の例をより詳細に説明しており、モデル回答よりもさらに明確に「個人情報に該当しない事例」を示しています。そのため、意味的にほぼ同一であると判断できます。
reasonの文章表現は異なりますが、間違えているポイントは同じです。意味的に同一といっておきながら、意味的な同一性を問うプロンプトに対してscore:0を決定している間違いも同じです。
ただし、この設問を含む合計3問を除けば、概ね妥当な結果だと思います。たった1.7BパラメターのLLMにここまでの能力があるなんて、これはなかなか有益な検証だったと思うのですが、どうでしょうか。
追加検証 - 間違いには正しく反応するか?
プロンプトテンプレートの内容に意図的に間違った回答を設定し、ローカルLLMが模範回答とAgentforceエージェントの解答案の食い違いを正しく判定できるかも検証してみましょう。
以下のような誤った回答を仕込みました。
元
{
"Q1-3": "住所や電話番号だけで個人情報に該当しますか。",
"A1-3": "個別の事例ごとに判断することになりますが、他の情報と容易に照合することにより特定の個人を識別することができる場合、当該情報とあわせて全体として個人情報に該当することがあります。"
}
間違い挿入後
{
"Q1-3": "住所や電話番号だけで個人情報に該当しますか。",
"A1-3": "個人情報に該当することはありません。"
}
元
{
"Q1-6": "外国に居住する外国人の個人情報についても、個人情報保護法による保護の対象になりますか。",
"A1-6": "居住地や国籍を問わず、日本にある個人情報取扱事業者及び行政機関等が取り扱う個人情報は、個人情報保護法による保護の対象となり得ます。(令和4年4月更新)"
},
間違い挿入後
{
"Q1-6": "外国に居住する外国人の個人情報についても、個人情報保護法による保護の対象になりますか。",
"A1-6": "個人情報保護法による保護の対象になりません。"
},
該当箇所の回答は以下のようになり、scoreは0と、期待通り判定されました。
設問: 住所や電話番号だけでも個人情報になりますか?
模範回答: 個別の事例によりますが、他の情報と容易に照合して特定の個人を識別できる場合は、全体として個人情報に該当することがあります。
Agentforceエージェントの回答: 住所や電話番号のみでは、個人情報に該当しません。他に知りたいことや具体的なケースがあれば教えてください。
score: 0
reason: モデル回答は「個人情報に該当する場合がある」と述べており、エージェント回答は「住所や電話番号のみでは個人情報に該当しない」と述べています。両者が矛盾しているため、意味的に同一ではありません。
設問: 外国に住む外国人の情報も、個人情報保護法で保護されますか?
模範回答: はい。居住地や国籍を問わず、日本にある個人情報取扱事業者等が取り扱う個人情報は保護の対象となり得ます。
Agentforceエージェントの回答: 外国に居住する外国人の個人情報は、個人情報保護法による保護の対象になりません。他に知りたいことはありますか?
score: 0
reason: 二者の回答は矛盾しています。モデル回答は「保護の対象となり得る」と述べており、エージェント回答は「保護の対象になりません」と述べています。したがって、意味的に同一ではありません。
明らかな間違いの検出は任せられるように思います。
振り返って、どうか
完璧とはいきませんでしたが、概ね期待通りの結果が得られたと思います。コンピュータの性能を積み増してより高度なローカルLLMを使えば、今回誤判定した設問も正解し、より自動テストの信頼性が上がるのではないでしょうか。
なお、全60問のテストに要した時間は7~10分で、それなりの時間はかかりました。また、ローカルLLMの実行にクォータはありませんが、Agentforce側は相応のクレジット消費があることに留意するべきでしょう。
最後までお読みいただきありがとうございました。