0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RAGの回答精度、どうやって測る?

Posted at

RAGの回答精度、どうやって測る?ExcelとPythonで実現するAI回答の自動評価システム

こんにちは!AI開発に取り組んでいる皆さん、RAG(Retrieval-Augmented Generation)の精度評価に頭を悩ませていませんか?

RAGは、社内文書やマニュアルなどの専門知識をAIに与え、ユーザーの質問に正確に答えさせる強力な技術です。しかし、「AIが本当に正しい答えを返せているか?」「なぜその答えになったのか?」を一つひとつ確認するのは、非常に手間がかかる作業ですよね。😅

そこで今回は、このRAGの回答評価と分析を自動化するPythonスクリプトを作成しましたので、その仕組みと使い方を詳しくご紹介します!

🎯 このコードで何ができるのか?

一言で言うと、**「RAG版AIのテストとデバッグを自動化するツール」**です。

このツールを使えば、Excelに用意した「質問」と「模範解答」のリストを使って、以下のことを自動で行えます。

  • 一斉テストの実施: 大量の質問をAIに一気に投げかけ、その回答を生成させます。
  • AIによる自動採点: AIが生成した回答を、あらかじめ用意した「模範解答」と照らし合わせ、その一致度をAI自身が評価します。
  • 思考プロセスの可視化: AIが回答を生成する際に、どの情報を参照したのか(引用元)、どのような検索を行ったのか(検索クエリ)といった、いわば"思考の足跡"を記録します。

これにより、単に回答の正しさを確認するだけでなく、「なぜ回答が間違っていたのか?」の原因分析まで効率的に行えるようになります。


⚙️ 具体的な仕組み

このシステムは、主に3つの要素で構成されています。

  1. Excelファイル 📖: テスト問題集兼成績表の役割をします。「プロンプト」「質問」「想定回答」をここに記述し、実行後はAIの回答や評価結果が自動で書き込まれます。
  2. Pythonスクリプト 司令塔: ExcelとOpenAI APIの間を取り持ち、データの読み込み、APIへのリクエスト、結果の解析と書き込みなど、すべての処理を制御します。
  3. OpenAI API (RAG) 🤖: テストを受ける生徒役のAIです。file_search機能を使って、指定されたVector Store(PDFなどのナレッジベース)から情報を検索し、質問に答えます。

処理の流れは以下の通りです。

  1. 問題の読み込み: スクリプトがExcelから「質問」と「想定回答」を一行ずつ読み込みます。

  2. AIへの質問: 読み込んだ質問を基に、RAGを有効にしたOpenAIのAPIを呼び出します。ここがRAGシステムの中核部分です。

    # 2. AIへの質問 (RAG呼び出し)
    response = client.responses.create(
        model="gpt-4o-mini",
        instructions=prompt,
        input=question,
        tools=[{
            "type": "file_search",
            "vector_store_ids": [vector_store_id], # ここで知識ベースを指定
            "max_num_results": 10
        }],
        include=["file_search_call.results"], # 検索結果を含める
        temperature=0.3
    )
    
  3. 回答と"思考の足跡"の取得: AIは回答テキストだけでなく、回答の根拠となった引用情報(annotations)や、内部で実行した検索クエリ(queries)なども返します。

  4. 【新機能】引用元の詳細情報を取得: annotationsには引用元のファイルIDしか含まれていないため、RAGの検索結果全体から、実際に引用されたチャンク(テキストの断片)の具体的な内容を突き合わせ、取得します。これがデバッグの重要な鍵となります。

    # 4. 引用されたfile_idに一致する詳細情報を取得
    get_use_tyanku_detail = []
    try:
        # 引用情報(get_use_tyanku)と検索結果(results)の両方が存在するかチェック
        if get_use_tyanku and hasattr(response.output[0], 'results'):
            # 引用されたfile_idの集合(set)を作成し、検索を高速化
            cited_file_ids = {citation.file_id for citation in get_use_tyanku}
    
            # file_search の全結果をループ
            for result in response.output[0].results:
                # 結果のfile_idが、引用されたIDの集合に含まれているかチェック
                if result.file_id in cited_file_ids:
                    # 含まれていれば、その結果をリストに追加
                    get_use_tyanku_detail.append(result)
    except Exception as e:
        print(f"Row {row}: 'get_use_tyanku_detail' の作成に失敗しました: {e}")
    
  5. AIによる自動評価(答え合わせ):

    • 回答の正確さチェック: 「AIの回答」と「想定回答」を別のAIに見せ、「◎+(完全一致)~×(全く違う)」の5段階で評価させます。プロンプトで評価基準を細かく指示するのがポイントです。

      # 5. AIによる回答の自動評価
      comparacion_answer = client.responses.create(
          model="gpt-4o-mini",
          instructions=f"""【AIからの回答】
      -----
      {text}
      -----
      上記「AIからの回答」を想定回答と比較します。
      【想定回答】
      -----
      {created_answer}
      -----
      比較内容
      -----
      同じ内容で回答⇒◎+、ほとんど同じ回答⇒◎、ポイントは押さえている⇒○、情報が不足している、△、全く異なる回答をしている⇒×で評価します。
      -----
      # 注意事項
      出力するのは◎+、◎、○、△、×のどれかです。この記号以外の値は、どんなテキストも不要です。
      """,
          input="AIからの回答と想定回答の内容を比較し、AIからの回答の評価をしてください",
          temperature=0.3
      )
      answer_comparacion = comparacion_answer.output_text
      
    • 引用元の妥当性チェック: 「想定回答」に必要な情報が、AIが参照したチャンクの中にきちんと含まれていたかを「◎/×」で評価させます。

  6. 結果をExcelに記録: 上記で取得・評価したすべての情報を、元のExcelファイルの対応する行に書き込み、保存します。


📝 具体例:社内規定に関する質問で見てみよう

例えば、社内の福利厚生規定に関するRAGシステムを評価するケースを考えてみましょう。

Step 1: Excelにテストデータを準備

まず、Excelに以下のようなデータを用意します。

列C (質問) 列D (想定回答)
テレワークの交通費は支給されますか? 原則として、会社が定めた出社日の交通費は支給されます。自己都合での出社や、在宅勤務に伴う通信費・光熱費は対象外です。

Step 2: スクリプトを実行!

このExcelファイルを指定してスクリプトを実行すると、先ほどのコードが動き、裏側では以下のような処理が進行します。

  1. AIが「テレワークの交通費は支給されますか?」という質問を受け、Vector Storeを検索します。
  2. 内部で「テレワーク 交通費 規定」のような検索クエリが生成されます。(→ G列に記録)
  3. 検索結果から、交通費に関する規定のチャンク(テキスト断片)を取得し、それを基に回答を生成します。
  4. 生成された回答と、引用したチャンクの詳細、そしてAIによる評価結果がExcelに書き出されます。

Step 3: 結果をExcelで確認・分析

実行後、Excelは以下のようになっています。(抜粋)

列E (AIの回答) 列I (引用チャンク詳細) 列J (回答評価) 列K (チャンク評価)
はい、テレワーク時の交通費は支給されます。 {"file_id": "file-xxxx", "text": "第X条 交通費...出社を命じられた場合の交通費は実費を支給する..."} "△" "×"

分析タイム 🔍

この結果から、何がわかるでしょうか?

  • AIの回答 (E列) は、「支給される」という点は合っていますが、「対象外のケース」など重要な条件が抜け落ちています。
  • そのため、回答評価 (J列) は「△(情報が不足している)」という結果になりました。
  • なぜ情報が不足したのか?そのヒントは チャンク評価 (K列) にあります。評価が「×」ということは、AIが参照した引用チャンク (I列) の中に、「想定回答」に書かれている「自己都合での出社」や「通信費」に関する記述が含まれていなかったことを示唆しています。

このように、**「回答の精度が低かった原因は、RAGが参照すべき情報を正しく、かつ網羅的に検索できなかったためだ」**という仮説を立てることができます。次のアクションとしては、Vector Storeに登録しているドキュメントの分割方法(チャンキング戦略)を見直したり、検索性能を上げるためのチューニングを検討したりすることになります。


✨ このツールの"推しポイント"と今後の展望

推しポイント 👍

  • RAGの「なぜ?」がわかる: 回答の良し悪しだけでなく、その根拠まで追跡できるため、デバッグが格段にしやすくなります。
  • 大量テストの自動化: Excelに質問を書き溜めておけば、あとは実行するだけ。評価プロセスが劇的に効率化します。
  • 柔軟な評価基準: 評価を依頼する際のプロンプト(instructions)を調整することで、独自の評価基準を設けることが可能です。

今後の改善点(やりたいことリスト)🚀

このツールはまだ発展途上です。今後は以下のような改善を考えています。

  • 評価精度の向上: 現在、評価も汎用モデルに任せていますが、評価基準がブレることもあります。評価専用のファインチューニングモデルを育成し、より安定した評価を目指します。
  • 原因分析の自動化: 「評価が×の場合、原因は『検索失敗』の可能性が高いです」のように、考えられる原因までAIに推測させ、レポートさせる機能。
  • フィードバックループの構築: 評価結果が悪いものを自動で収集・分類し、それを基にナレッジベースの改善点リストや、ファインチューニング用のデータセットを自動生成する仕組み。
  • 脱Excel?: 結果をもっと視覚的・対話的に分析できるWebアプリケーション(StreamlitやGradioを使ったダッシュボード)の構築も夢見ています。

おわりに

RAGは非常に強力な技術ですが、その性能を最大限に引き出すためには、このような地道な評価と改善のサイクルが不可欠です。今回ご紹介したコードが、皆さんのRAG開発を少しでも楽にし、より良いAIサービス作りの一助となれば幸いです。

ぜひ、皆さんのプロジェクトでも試してみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?