ブログ

LLMアプリを本番投入する前に。エンジニアが押さえておくべき30の「評価」コンセプト

LLM(大規模言語モデル)を組み込んだアプリケーションを開発していると、「昨日は正しく動いたのに、今日は変な回答が返ってくる」といった不安定さに悩まされることがよくあります。今回は、そんなLLMの挙動をどう測定し、信頼性を担保すべきかを解説した 30 LLM Evaluation Concepts Every Engineer Should Know Before Shipping AI Apps という記事を参考に、実務で重要となる評価の考え方を整理してみました。

LLMアプリの評価って難しいですよね。


なぜ、これまでのテスト手法だけでは足りないのか

通常のシステム開発であれば、テストは「入力 A に対して出力 B が返るか」という決定論的な確認が中心です。しかし、LLMは同じプロンプトに対しても、実行のたびに微妙に異なる回答を返す「非決定性」を持っています。

flowchart TD
    subgraph "従来のソフトウェアテスト"
        A1["入力 (Input)"] --> B1["ロジック (Code)"]
        B1 --> C1["期待される出力 (Expected)"]
        C1 -- "一致 = Pass" --> D1["成功"]
    end

    subgraph "LLMの評価"
        A2["プロンプト (Prompt)"] --> B2["LLM"]
        B2 --> C2["出力 A (確信度高)"]
        B2 --> C3["出力 B (言い回しが違う)"]
        B2 --> C4["出力 C (ハルシネーション)"]
        C2 & C3 & C4 --> D2{"どう評価するか?"}
    end

この「どう評価するか?」を定義し、計測可能にするプロセスが 評価(Evaluation/Eval) です。本番環境でユーザーから「このAIは使い物にならない」と言われる前に、エンジニアが知っておくべき概念を、いくつかピックアップして解説します。

1. 評価の土台となる「データ」の考え方

まず必要になるのが、何を基準に「正しい」とするかを決めるためのデータセットです。

  • ゴールデンデータセット (Golden Dataset): 「この入力にはこう答えてほしい」という理想的な回答(Ground Truth)を集めた、いわばテストの正解集です。まずはここを数十件程度、手動で作ることから始まります。
  • ハルシネーション (Hallucination): モデルがもっともらしい嘘をつく現象です。これを防ぐには、回答が元データ(コンテキスト)に基づいているかをチェックする「Faithfulness(忠実性)」などの指標が使われます。

2. どうやって「質」を測定するか

LLMの出力は自然言語なので、コードで「完全一致」を判定するのは現実的ではありません。そこで、以下のような手法を組み合わせて評価します。

手法 概要 メリット デメリット
人手評価 (Human Eval) 開発者やドメインエキスパートが目視で確認する 最も正確で信頼できる コストが高く、時間がかかる
LLM-as-a-judge 性能の高いモデル(GPT-4oなど)に評価をさせる 高速でスケールしやすい 評価側モデルのバイアスに左右される
決定論的メトリクス 文字列の一致率やキーワードの有無を計算する 非常に高速で安価 文脈やニュアンスを無視してしまう

最近では、LLM-as-a-judge を採用するケースが増えています。例えば、「回答が丁寧か」「ユーザーの質問に過不足なく答えているか」といった項目を1〜5点でスコアリングさせるような仕組みです。

3. RAG(検索拡張生成)における評価

RAG構成のアプリ(社内ドキュメントを参照して回答するAIなど)では、どこに問題があるのかを切り分けるために「RAGトライアド(三要素)」という考え方がよく使われます。

flowchart LR
    Q["質問 (Query)"] --> R["検索結果 (Context)"]
    R --> A["回答 (Answer)"]

    subgraph "評価ポイント"
        direction TB
        E1["1. 適切に検索できているか?<br>(Context Relevance)"]
        E2["2. 回答は検索結果に基づいているか?<br>(Faithfulness)"]
        E3["3. 回答は質問に答えているか?<br>(Answer Relevance)"]
    end

    Q -.-> E1 -.-> R
    R -.-> E2 -.-> A
    Q -.-> E3 -.-> A

「回答が間違っている」と言っても、原因が「そもそも必要な情報を検索できていない」のか、「検索はできているがLLMが読み飛ばしている」のかで対策が変わるため、この辺りの切り分けが非常に重要になります。

4. パフォーマンスとコストの評価

精度が100点でも、回答に30秒かかったり、1リクエストで数千円かかったりするようでは、サービスとして成立しません。

  • TTFT (Time to First Token): ユーザーが送信ボタンを押してから、最初の文字が表示されるまでの時間です。ここが遅いとユーザー体験(UX)が著しく低下します。
  • トークンコスト: プロンプトが長くなればなるほどコストがかさみます。精度の高い評価用プロンプト(ジャッジ用)と、実際に本番で動かす軽量なプロンプトを使い分けるといった工夫も検討してみてください。

5. 評価をワークフローに組み込む

評価は一度やって終わりではありません。コードの単体テストと同じように、プロンプトを改善するたびに実行する必要があります。

  1. ベースラインの測定: 現在のシステムの性能を数値化する。
  2. 回帰テスト (Regression Testing): プロンプトを変えたことで、今まで正解していたパターンで失敗していないかを確認する。
  3. フィードバックループ: 実際のユーザーの「Good/Bad」ボタンのデータを収集し、それを新たな「ゴールデンデータセット」に加える。

このようなサイクルを回すことで、初めて「このAIは信頼できる」と自信を持って言えるようになります。

まとめ

LLMアプリの開発において、評価は「あればいいもの」ではなく「不可欠なエンジニアリング」の一部だと感じます。 まずは手元にある10個程度の質問からでも構いません。それらを「ゴールデンデータセット」として定義し、変更を加えるたびに結果を比較する仕組みを作ってみるのが、信頼できるAIアプリへの第一歩ではないでしょうか。

最初は少し面倒に感じるかもしれませんが、一度この仕組みができると、迷いなくプロンプトの調整やモデルの切り替えができるようになるはずです。

参照記事