背景
以前いくつかのAIAgentでRAGシステムとメモリレイヤを構築しました。今回はこのRAGシステムとメモリレイヤを評価する必要があります。評価は以下の指標で行います:正確率(accuracy_score)、適合率(precision_score)、再現率(recall_score)、平均カバレッジ(avg_coverage)、平均応答遅延時間(avg_latency)。
データソースのサンプル構造
データソース構造:
evalution_examples =
[
{
"query": "user_question",
"context": [
"RAG chunk1",
"RAG chunk5",
"Memory short 1",
"Memory short 5",
"Memory long 1",
"Memory long 3",
......
],
"generated_answer": "True answer or False answer",
"reference_answer": "True answer or False answer"
},
......
]
- query: ユーザーの入力
- context: コンテキストデータ(RAGデータまたはMemoryデータ)
- generated_answer: LLMの回答
- reference_answer: 実際の正解
評価の計算方法
| generated | generated | |
|---|---|---|
| reference | [1, 1] | [1, 0] |
| reference | [0, 1] | [0, 0] |
- generated = 0: LLMの回答が誤り、1: LLMの回答が正解
- reference = 0: 実際の答えが誤り、1: 実際の答えが正解
LLMの回答の正誤判定基準:
データソース構造に基づき、「キーワード重複率」を用いてgenerated_answerとreference_answerの平均キーワード重複率を計算します。
疑似コード
Count(Set(reference_keyWords)) & Count(Set(generated_keyWords))
avg_keyWords = ------------------------------------------------------------------
Count(Set(reference_keyWords))
avg_keyWords > 0.7 の場合、LLMの回答は✅と判定します。
実際の回答の正誤判定基準:
データソースを作成する際に人為的にラベル付けを行い、実際の回答を✅か❌の2種類に分類しています。
accuracy_score(正確率)
正確率:予測が正しいデータの全体に占める割合。
疑似コード
Count([1, 1]) + Count([0, 0])
accuracy_score = --------------------------------------------------------------
Count([1, 1]) + Count([1, 0]) + Count([0, 1]) + Count([1, 1])
- LLMの回答と実際の回答がともに正しい、またはともに誤りであれば、それは正しく予測されたデータを指します。
- LLMの回答と実際の回答が異なる場合は、見逃しや誤判定があったことを意味します。
precision_score (適合率)
適合率:LLMの回答が正しい場合に、実際の回答も正しい割合。
疑似コード
Count([1, 1])
precision_score = -------------------------------
Count([1, 1]) + Count([0, 1])
recall_score (再現率)
再現率:実際の回答が正しい場合に、LLMの回答も正しい割合。
疑似コード
Count([1, 1])
recall_score = -------------------------------
Count([1, 1]) + Count([1, 0])
avg_coverage (平均カバレッジ)
データソース構造に基づき、「キーワード重複率」を用いてcontextとgenerated_answerの平均キーワード重複率を計算します。
疑似コード
Count(Set(context_keyWords)) & Count(Set(generated_keyWords))
avg_coverage = Sum( ------------------------------------------------------------------ ) / Count(evalution_examples)
Count(Set(generated_keyWords))
avg_latency (平均応答時間)
RAGシステムにおいて、Total = T(embed) + T(retrieve) + T(rerank) + T(llm)となるが、ここでは各データの応答時間の平均値で表します。
疑似コード
Sum(end_time - start_time)
avg_latency = ------------------------------
Count(evalution_examples)
F1スコア
RAG評価ではaccuracy_scoreは信頼性に欠ける傾向があります。precision_scoreとrecall_scoreは逆相関の関係にあるため、両者のバランスを取るためにF1スコアを用います。
疑似コード
2 * Count([1, 1])
f1_score = ---------------------------------------------------
2 * Count([1, 1]) + Count([0, 1]) + Count([1, 0])
GitHubコードアドレス
https://github.com/LuochuanAD/Evaluation_RAG_Memory
今後の展望
次のステップとして、より高度な評価指標を導入します:
- MRR(Mean Reciprocal Rank)
- nDCG(並び替えの品質評価)
- Hit@K
- BLEU / ROUGE(生成評価)
- LLM-as-a-Judge(現在最も主流の手法)