エージェント基盤・プロトコル

エージェントのテスト|完全一致で判定したら、正しい応答を2つ不合格にした

出力が毎回変わるものをどうテストするのか何を合格の基準にすればいいのかどこまで自動化できるのか

エージェントに同じ質問をしても、返ってくる文章は毎回少しずつ違います。すると期待する答えと突き合わせる、という普通のテストが成立しません

今回は5通りの応答を用意して、2つの判定方法にかけました。完全一致と、条件を満たすかどうかの判定です。結果を先に言うと、完全一致は正しい応答を2つ不合格にしました

この記事の要点

  • エージェントの出力は毎回変わるので完全一致では判定できない
  • 実測では、完全一致が正しい応答2つを不合格にした
  • 判定は満たすべき条件で書く。含むべき事実と、含んではいけない表現
  • 全部を自動化しようとせず、機械で判定できる条件から始める

出力が毎回変わるものをどうテストするのか

答えの文章ではなく、答えが満たすべき条件を書きます。言い回しの違いを許しつつ、内容の正しさだけを見る形にします。

エージェントのテストが普通のプログラムと違うのは、同じ入力でも出力が一定でない点です。ここを踏まえないとテストが機能しません。

期待値を1つに決められない

通常のテストは、入力に対する出力を1つ決めて突き合わせます。計算の結果や変換後の値なら、これで問題ありません。

ところがエージェントの答えは文章です。「30日以内なら返品できます」も「購入から30日以内であれば返品を承ります」も、内容としては同じ正解です。文字列としては一致しません。

条件で判定するという考え方

そこで、答えそのものではなく答えが満たすべき条件を書きます。「30日という期限に触れている」「未開封という条件に触れている」といった形です。

こうすると、言い回しが違っても内容が正しければ合格になります。逆に、大事な条件が抜けていれば言い回しが自然でも不合格にできます。

テストで見るべきものは3種類

エージェントのテストで確認したいのは、答えの正しさだけではありません。どのツールを選んだか、おかしな入力に耐えるかも対象になります。

特に最後の点は重要です。OWASPは、利用者の入力がエージェントの挙動や出力を意図しない形に変えてしまう問題を最上位の弱点として挙げています。普通の質問だけでテストしても、この種の問題は見つかりません

余談 テストの目的は「同じ答えを返すこと」ではない

毎回同じ文章を返させようとすると、モデルの良さを削ることになります。求めるのは表現の固定ではなく、内容の正しさです。同じ意味なら言い方が変わってよい、と割り切ると設計が楽になると編集部は考えています。

出典OWASP Top 10 for LLM Applications「LLM01:2025 Prompt Injection」2026-08-17 確認
A Prompt Injection Vulnerability occurs when user prompts alter the LLM's behavior or output in unintended ways.
原文OWASP Top 10 for LLM Applications「LLM01:2025 Prompt Injection」 この内容の有効期限2027-02-17

完全一致で判定したら、正しい応答を2つ不合格にした

同じ質問への5通りの応答を、2つの判定方法にかけました。完全一致は言い回しの違いを不合格にし、条件判定は内容だけを見ました。

エージェントのテストの方式を比べるため、実際に判定してみました。返品条件を尋ねたときの5通りの応答を用意しています。

5通りのうち3つは内容として正しく、言い回しだけが違います。1つは未開封の条件が抜けており、1つは問い合わせ先を案内するだけで何も答えていません。

javascript
function assertions(r) {
  const checks = [
    { name: '期限30日に触れている',        ok: /30日/.test(r) },
    { name: '未開封の条件に触れている',    ok: /未開封/.test(r) },
    { name: '問い合わせに丸投げしていない', ok: !/お問い合わせください/.test(r) },
  ];
  return { pass: checks.every((c) => c.ok), failed: checks.filter((c) => !c.ok) };
}
text
同じ質問への5通りの応答を判定する

応答1: 完全一致=合格 / 条件判定=合格
応答2: 完全一致=不合格 / 条件判定=合格
応答3: 完全一致=不合格 / 条件判定=合格
応答4: 完全一致=不合格 / 条件判定=不合格
         不足: 未開封の条件に触れている
応答5: 完全一致=不合格 / 条件判定=不合格
         不足: 期限30日に触れている, 未開封の条件に触れている, 問い合わせに丸投げしていない

完全一致での合格: 1 / 5
条件判定での合格: 3 / 5

差が出ました。完全一致は1件しか合格させていません。応答2と3は内容として正しいのに、言い回しが違うだけで不合格になりました。

誤検知が続くとテストが無視される

この誤検知が問題です。正しい応答が不合格になると、失敗を見ても「またか」と流すようになります。そうなるとテストは意味を失います。

条件判定なら、応答2と3は合格します。落ちるのは本当に問題のある応答4と5だけです。落ちたときに必ず原因がある状態を保てます。

何が足りないかまで分かる

もう1つの利点が、出力の詳しさです。応答4は「未開封の条件に触れている」だけが不足と出ています。どこを直せばよいかが判定結果から分かります

応答5は3つとも不足しています。この差も意味があります。1つだけ足りない応答と、何も答えていない応答は、対応の優先度が違うためです。

完全一致は正しい応答を落としてしまう。条件判定なら内容だけで判断できる。

単位: 件条件で判定3件完全一致で判定1件−67%5通りのうち内容として正しいのは3つ。条件判定はその3つを正しく合格させ、問題のある2つだけを落とした。
図1 ── 5通りの応答に対する合格数
出典OWASP Top 10 for LLM Applications「LLM01:2025 Prompt Injection」2026-08-17 確認
While techniques like Retrieval Augmented Generation (RAG) and fine-tuning aim to make LLM outputs more relevant and accurate, research shows that they do not fully mitigate prompt injection vulnerabilities.
原文OWASP Top 10 for LLM Applications「LLM01:2025 Prompt Injection」 この内容の有効期限2027-02-17

どこまで自動化できるのか

文字列の有無で判定できる条件は機械に任せられます。判断が要る部分は残るので、そこは人が見る前提で設計します。

エージェントのテストを組むとき、全部を自動化しようとすると行き詰まります。機械で判定できるものから始めるのが現実的です。

機械で判定できるもの

  1. 特定の語が含まれるか。数値・期限・条件など、答えに必ず出るべきもの
  2. 禁止表現が含まれないか。「お問い合わせください」で逃げていないか、など
  3. 選んだツールが正しいか。記録があれば文字列の比較で済む
  4. 渡した引数が妥当か。想定した値の範囲に入っているか

機械では判定しきれないもの

一方で、説明が分かりやすいか、言い方が失礼でないかといった点は機械では測れません。ここは人が読むか、別のモデルに採点させることになります。

ただし採点させる場合、採点する側も間違えます。機械的に判定できる条件まで採点に回すと、結果が不安定になります。切り分けが重要です。

悪意のある入力もテストに入れる

普通の質問だけでテストしていると、攻撃に対する挙動が分かりません。OWASPが指摘するとおり、入力の仕方によってモデルは意図しない動きをします

指示を上書きしようとする入力、無関係な操作を要求する入力を、あらかじめテストに入れておきます。詳しくはエージェントのセキュリティの記事で扱っています。

判定の性質で担当を分ける。機械で見られるものを人に回さない。

文字列の有無で判定できるかいいえ人かモデルによる採点へ回すはい判定に業務知識が要るかいいえ自動テストに組み込むはい条件を書き出してから自動化する業務知識が要る場合も、条件として書き出せれば自動化できる。書き出せない場合だけ人が見る。
図2 ── 何を自動テストにして、何を人が見るか
モデルを更新する前に流すモデルを新しい版に変えると、出力の傾向が変わります。更新の前後で同じテストを流して比べると、性能が落ちた箇所に気づけます。この用途があるため、テストは完全一致ではなく条件で書いておく必要があります。完全一致だと、更新のたびに期待値を全部書き直すことになります。
出典OWASP Top 10 for LLM Applications「LLM01:2025 Prompt Injection」2026-08-17 確認
Prompt Injection vulnerabilities exist in how models process prompts, and how input may force the model to incorrectly pass prompt data to other parts of the model, potentially causing them to violate guidelines, generate harmful content, enable unauthorized access, or influence critical decisions.
原文OWASP Top 10 for LLM Applications「LLM01:2025 Prompt Injection」 この内容の有効期限2027-02-17

よくある質問

AIに採点させる方法はどうですか?
使われている方法ですが、採点する側も間違えます。文字列の有無で機械的に判定できる条件は機械で見て、判断が要る部分だけAIや人に任せる、という切り分けが安全です。
温度を0にすれば毎回同じ出力になりませんか?
揺れは小さくなりますが、完全に同じになる保証はありません。またモデルを更新すると出力が変わるため、完全一致に依存したテストは更新のたびに全部作り直しになります。
テストは何件くらい用意すればいいですか?
数より種類です。よくある質問、曖昧な質問、答えられない質問、悪意のある入力の4種類をそれぞれ数件ずつ用意すると、傾向がつかめます。
「答えられない」と返すのは失敗ですか?
情報がないときに正直にそう返すのは正しい動作です。ただし情報があるのに答えられない場合は失敗なので、テストではこの2つを区別できるようにしておく必要があります。

まとめ

  • 出力が毎回変わるため完全一致では判定できない
  • 実測では完全一致が正しい応答を2つ不合格にした
  • 条件判定なら言い回しの違いを許して内容だけを見られる
  • 条件は含むべき事実含んではいけない表現の両方を書く

今日から始められること

  1. よくある質問を5件選び、それぞれ「答えに必ず含まれるべき事実」を書き出す
  2. 「含まれていたら失敗」と言える表現を書き出す
  3. モデルを更新する前と後で、同じテストを流して比べる
  4. 失敗したケースをテストに追加していく

実務で組んだエージェントのテストのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る