Skip to content

確率的システムの品質保証

LLM は確率的な存在である

AI エージェントを本番に載せたとき、最初にぶつかる壁は品質保証だ。

LLM は確率的な存在である。同じ質問をしても、毎回同じ答えが返る保証はない。従来のソフトウェアテストのように「期待値と一致するか」で判定できない。この不確実性にどう向き合うかで、設計は大きく2つに分かれる。

2つのアプローチ

eval の精度を極める

1つ目は、LLM の出力を事後的に評価する仕組み(eval)の精度を上げるアプローチだ。構造化された判定基準を設計し、LLM に判定させる。決定的な判定と意味的な判定を組み合わせ、検知率を上げ、過検知率を下げる。

技術的に洗練されたアプローチであり、ユースケースによっては合理的な選択だ。

しかし、この方向には構造的な限界がある。データ量と次元数が上がれば上がるほど、eval の評価基準を手書きで管理し続けることができなくなる。eval の精度を上げること自体が、スケールしない。

アーキテクチャで品質を担保する

2つ目は、eval に全賭けせず、上流の設計で品質の下限を保証するアプローチだ。

3つの原則

このアプローチを貫く原則は3つある。

1. LLM にはテキストを渡す。データは渡さない。

LLM に生データを渡して「集計して」と言えば、答えは返ってくる。しかしその答えは毎回違う。数値の見落とし、誤った合算、文脈の取り違え。

LLM はテキストの理解と要約には極めて優秀だが、数値の集計や横断比較は安定しない。だからLLM にデータの分析をさせない。ETL パイプラインが事前にデータを分析し、1つの事実を1つの構造化レポートに変換する。エージェントはそのレポートを「読んで」回答するだけだ。

同じレポートを読めば、同じ事実が出る。回答の揺らぎは「どのレポートを取得したか」に帰着する。品質の制御ポイントが、LLM の出力ではなくレポート選択に移る。

2. 曖昧さは構造で吸収する。

データを粒子化しても、大量のレポートの中から正しいものにたどり着けなければ意味がない。そしてユーザーの入力は常に曖昧だ。

この曖昧さを LLM のプロンプトで吸収するか、構造で吸収するか。ここに設計の分岐がある。

対象に紐づくあらゆる属性を「タグ」として抽出し、それぞれを独立したドキュメントとして検索エンジンに格納する。tag as document だ。タグは DB のラベルではなく、検索可能なドキュメント。曖昧な入力を正確な検索条件に変換する責務を、LLM ではなく検索エンジンが担う。LLM にやらせれば毎回ブレる処理が、検索エンジンなら確定的に動く。

3. 品質は「正しいソースを使ったか」で保証する。

正しいレポートを読めば正しい事実が出る状態と、曖昧な入力から正しいレポートに到達できる状態。この2つが揃って初めて、3番目の原則が成立する。

LLM に「回答は正しいか?」と聞く必要がない。「正しいソースを使ったか?」を静的に検証するだけで、品質の下限を保証できる。

eval がシンプルで済むのは手を抜いているからではない。上流の設計が品質を担保しているからだ。

確率を敵にするか、味方にするか

eval の精度を極めるアプローチは、確率を排除しようとする。1回の判定を確定的に正しくしたい、という思想だ。

アーキテクチャで品質を担保するアプローチは逆で、確率を受け入れる。1回の判定が完璧でなくても構わない。代わりに、複数回実行して統計で品質を見る。

同じ質問を複数のプロトコルで、複数回投げる。得られた複数の回答を比較し、「事実・数値・結論が一致しているか」を一貫性スコアとして算出する。

スコア意味
1.0全回答が同じ内容 → 信頼できる
0.5主要な事実は一致するが一部に差異 → 要調査
0.2 以下回答がバラバラ → 設計上の問題がある

重要なのは、一貫性が低いとき、それは eval の問題ではなく、上流の問題を示唆しているということだ。

一貫性スコアが低下するケースを調べると、エージェントが複数のレポートを読んで自力集約しているのが原因であることが多い。集約の仕方が毎回ブレる。解決策は eval の改善ではなく、集約済みのレポートを用意すること。

eval を改善しても、この問題は解決しない。レポートの設計が品質の上限を決める。 これがアーキテクチャで品質を担保するということだ。

多層品質保証

eval 単体に全賭けしない。検証を4つの層に分解し、各層が1つの問いだけに答える。

第1層「動いたか」 — 回答が返ったか。タイムアウトしなかったか。LLM は使わない。二値判定。

第2層「伝わったか」 — 回答がレポートの事実をきちんと伝えているか。ここだけ LLM を使う。ただし評価基準はシンプルで十分だ。上流が粒子化されているから、回答の揺らぎが小さい。eval に求められる識別力も低くて済む。

第3層「安定しているか」 — 同じ質問に対する複数回答を比較し、事実・数値・結論の一致度をスコアリングする。1回の判定精度を極めるより、複数回回して統計で見る方が信頼できる。

第4層「正しいソースを使ったか」 — LLM は使わない。「この質問なら、この種類のレポートを使うべき」という制約を正規表現でマッチングするだけだ。

第4層が、エコシステム全体の安定性を決定的に高めている。正しいレポートを使っていれば、回答に含まれる事実はレポートに書いてある通りだ。eval は「正しい事実を伝えられているか」という表現面だけ担えばいい。

エコシステムとしての循環

3つの原則と4層の検証は個別に存在するのではなく、循環している。

E2E テストの結果が悪いとき、4つの層の検証結果を突き合わせれば、「何を直すべきか」がわかる。

静的判定内容評価一貫性レポート検証示唆
NG---基本動作に問題
OKNG-OKレポート内容に問題
OKOKOKレポート粒度に問題
OKGRAY-NGレポート選択に問題

eval 単体の精度を上げても、この診断能力は得られない。問題を検知する仕組みと、問題の所在を特定する仕組みは別物だ。 前者だけでは品質は上がらない。

何層にも仕掛けがあるが、それぞれはシンプルだ。LLM に読ませるレポートが正確だから、eval の判定もシンプルで済む。曖昧な入力を構造で吸収しているから、正しいレポートにたどり着ける。正しいソースを使ったかを静的に検証しているから、LLM に品質を聞かなくていい。どれか1つが欠けても、エコシステムは成立しない。

まとめ

確率的な存在を品質保証するには、確率と戦うのではなく、確率を前提にしたエコシステムを作ること。

eval は品質保証の一部であって、全体ではない。スケールするのは eval の精度ではなく、アーキテクチャの構造だ。

設計の自由度があるなら、この3つの原則から始めてほしい。

  1. LLM にはテキストを渡す。データは渡さない。
  2. 曖昧さは構造で吸収する。
  3. 品質は「正しいソースを使ったか」で保証する。

そしてこの原則の上に、確率を受け入れた検証を重ねる。1回の完璧を目指すより、N回の安定を目指す。eval は最後に、まだ足りない部分だけ補えばいい。

Code: MIT / Content: CC BY-SA 4.0