RAGの回答精度、どうやって測る?ExcelとPythonで実現するAI回答の自動評価システム
こんにちは!AI開発に取り組んでいる皆さん、RAG(Retrieval-Augmented Generation)の精度評価に頭を悩ませていませんか?
RAGは、社内文書やマニュアルなどの専門知識をAIに与え、ユーザーの質問に正確に答えさせる強力な技術です。しかし、「AIが本当に正しい答えを返せているか?」「なぜその答えになったのか?」を一つひとつ確認するのは、非常に手間がかかる作業ですよね。😅
そこで今回は、このRAGの回答評価と分析を自動化するPythonスクリプトを作成しましたので、その仕組みと使い方を詳しくご紹介します!
🎯 このコードで何ができるのか?
一言で言うと、**「RAG版AIのテストとデバッグを自動化するツール」**です。
このツールを使えば、Excelに用意した「質問」と「模範解答」のリストを使って、以下のことを自動で行えます。
- 一斉テストの実施: 大量の質問をAIに一気に投げかけ、その回答を生成させます。
- AIによる自動採点: AIが生成した回答を、あらかじめ用意した「模範解答」と照らし合わせ、その一致度をAI自身が評価します。
- 思考プロセスの可視化: AIが回答を生成する際に、どの情報を参照したのか(引用元)、どのような検索を行ったのか(検索クエリ)といった、いわば"思考の足跡"を記録します。
これにより、単に回答の正しさを確認するだけでなく、「なぜ回答が間違っていたのか?」の原因分析まで効率的に行えるようになります。
⚙️ 具体的な仕組み
このシステムは、主に3つの要素で構成されています。
- Excelファイル 📖: テスト問題集兼成績表の役割をします。「プロンプト」「質問」「想定回答」をここに記述し、実行後はAIの回答や評価結果が自動で書き込まれます。
- Pythonスクリプト 司令塔: ExcelとOpenAI APIの間を取り持ち、データの読み込み、APIへのリクエスト、結果の解析と書き込みなど、すべての処理を制御します。
-
OpenAI API (RAG) 🤖: テストを受ける生徒役のAIです。
file_search機能を使って、指定されたVector Store(PDFなどのナレッジベース)から情報を検索し、質問に答えます。
処理の流れは以下の通りです。
-
問題の読み込み: スクリプトがExcelから「質問」と「想定回答」を一行ずつ読み込みます。
-
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 ) -
回答と"思考の足跡"の取得: AIは回答テキストだけでなく、回答の根拠となった引用情報(
annotations)や、内部で実行した検索クエリ(queries)なども返します。 -
【新機能】引用元の詳細情報を取得:
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}") -
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が参照したチャンクの中にきちんと含まれていたかを「◎/×」で評価させます。
-
-
結果をExcelに記録: 上記で取得・評価したすべての情報を、元のExcelファイルの対応する行に書き込み、保存します。
📝 具体例:社内規定に関する質問で見てみよう
例えば、社内の福利厚生規定に関するRAGシステムを評価するケースを考えてみましょう。
Step 1: Excelにテストデータを準備
まず、Excelに以下のようなデータを用意します。
| 列C (質問) | 列D (想定回答) |
|---|---|
| テレワークの交通費は支給されますか? | 原則として、会社が定めた出社日の交通費は支給されます。自己都合での出社や、在宅勤務に伴う通信費・光熱費は対象外です。 |
Step 2: スクリプトを実行!
このExcelファイルを指定してスクリプトを実行すると、先ほどのコードが動き、裏側では以下のような処理が進行します。
- AIが「テレワークの交通費は支給されますか?」という質問を受け、Vector Storeを検索します。
- 内部で「テレワーク 交通費 規定」のような検索クエリが生成されます。(→ G列に記録)
- 検索結果から、交通費に関する規定のチャンク(テキスト断片)を取得し、それを基に回答を生成します。
- 生成された回答と、引用したチャンクの詳細、そして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サービス作りの一助となれば幸いです。
ぜひ、皆さんのプロジェクトでも試してみてください!