RAG評価指標基礎
はじめに
現在多く企業様よりRagasフレームワークを用い社内RAGシステムに対して定量評価をしていると思います。以下の図のようにRagasの評価指標が提示され、その評価指標を理解するための基礎概念の理解が重要だと思います。本章では、評価フレームワークに依存せずRAG評価指標基礎のみについて、簡単例を加えならば共有したいと思います。
なお、平均逆順位(MRR)、正規化減損累積利得(NDCG)、BLEU、ROUGEなどについて簡単例で指標の計算方法を説明しているため、文章が長いが、ぜひご活用してください。
RAG 評価
RAG の有効性を評価する主な方法は、独立評価とエンドツーエンド評価の 2 つです。これらの 2 つの方法は、RAG システムのパフォーマンスを異なる角度から検証し、すべてのコンポーネントが優れていることを保証します。
独立評価
独立評価は、RAG システム内の検索モジュールと生成モジュールの個別の評価に焦点を当て、各モジュールがそのタスクを効果的に完了できることを保証します。
検索モジュール評価
検索モジュールの評価について、通常では検索エンジン、推薦システム、情報検索システムなどの測定システムのパフォーマンス指標を利用して行われます。
これらの指標は、与えられたクエリまたはタスクにおけるシステムの項目ランキングのパフォーマンスを測定し、ヒット率(Hit Rate)、平均逆順位(MRR)、正規化減損累積利得(NDCG)、精度(Precision)などが含まれます。
(1) ヒット率 (Hit Rate)
ヒット率は、検索システムが関連結果を返すことができるかどうかを測定するための単純で直接的な指標です。通常、システムが返す関連ドキュメントの数とクエリの合計数の比率として定義されます。ヒット率が高いほど、ユーザーがクエリ時に関連結果を得る可能性が高くなります。
計算方法:
例を挙げて解説
簡単な検索システムと以下のクエリ記録があると仮定します。
- 合計 10 回のクエリがあります。
- これら 10 回のクエリのうち、7 回のクエリで少なくとも 1 つの関連ドキュメントが検索されました。
この例では、ヒット率は次のように計算できます。
これは、すべてのクエリのうち 70% のクエリで少なくとも 1 つの関連ドキュメントが検索されたことを意味し、検索システムがユーザーのクエリに対して良好な応答能力を持っていることを示しています。
(2) 平均逆順位 (Mean Reciprocal Rank, MRR)
MRR は、特に最上位の結果のみに関心がある状況で、情報検索システムや質疑応答システムのパフォーマンスを評価する指標です。MRR は、すべてのクエリのランキングの逆数の平均値です。
計算方法:
ここで、Q はクエリの数、
例を挙げて解説
最初の関連ドキュメントを見つけたランキングがそれぞれ次の 3 つのクエリがあると仮定します。
クエリ 1:最初の関連ドキュメントが 1 位
クエリ 2:最初の関連ドキュメントが 3 位
クエリ 3:最初の関連ドキュメントが 2 位
MRR を計算するために、まず各クエリのランキングの逆数を計算し、次にこれらの逆数の平均値を計算します。
クエリ 1 のランキングの逆数:1/1 = 1.0
クエリ 2 のランキングの逆数:1/3 ≈ 0.333
クエリ 3 のランキングの逆数:1/2 = 0.5
上記の例に基づいて、MRR は次のように計算されます。
def mean_reciprocal_rank(rankings):
"""
平均逆順位 (MRR) を計算します。
パラメータ:
- rankings: 各内部リストに、単一のクエリの関連項目のランキングを含むリストのリスト。
ランキングは 1 から始まるものとします。
戻り値:
- MRR 値。
"""
rr_sum = 0.0
for rank in rankings:
if rank:
rr_sum += 1.0 / min(rank)
return rr_sum / len(rankings) if rankings else 0
# MRR 計算のテスト
rankings = [
[1, 2, 3], # 最初のクエリ、関連項目が 1 位
[3, 4], # 2 番目のクエリ、関連項目が 3 位
[2, 3, 4], # 3 番目のクエリ、関連項目が 2 位
]
mrr = mean_reciprocal_rank(rankings)
print(f"Mean Reciprocal Rank (MRR): {mrr:.3f}")
'''出力値
MRR: 0.611
'''
(3) 減損累積利得 (Discounted Cumulative Gain, DCG)
論文
参考資料-1
参考資料-2
CG は、情報検索分野で使用される評価指標で、検索結果の関連性を測定するために使用されます。
DCG は CG の改良版であり、検索結果の位置を考慮することで、CG が順序を考慮しないという問題を解決します。
DCG は、各位置の関連性スコアに対数関数に基づくペナルティ関数を適用します。その目的は、上位の位置に高い関連性スコアを与えるスコアに大きな重みを与え、検索結果リスト内の関連結果の位置がユーザーエクスペリエンスに与える影響を反映することです。
DCG の数式では、対数ペナルティ関数を適用して各位置の関連性スコアを低減します。
ここで、
DCG@2 の計算では、2 つの結果の関連性スコアを考慮し、同時に 2 番目の位置のスコアにログペナルティを適用します。ペナルティ関数の具体的な値は次のとおりです。
- 位置 1 の場合:
のため、ペナルティなしlog_2(1+1)=1 - 位置 2 の場合:ペナルティは
log_2(2+1)=log_2(3)=1.58 - ...など。
したがって、このペナルティ関数を使用すると、ユーザーエクスペリエンスに対する実際の影響を反映して、各位置の関連性スコアの割引を計算できます。これにより、DCG は、より詳細かつ実用的な検索結果の関連性評価指標になります。
上記の図は、位置の増加に伴って対数ペナルティがスコアの減衰を引き起こす仕組みを説明するために使用されます。グラフの X 軸はランキング位置を表し、Y 軸は保持された関連性スコアのパーセンテージを表します。位置 1 の場合、ペナルティは適用されないため、スコアは変化しません (つまり、100%)。ただし、位置 1 から位置 2 では、保持されるスコアのパーセンテージは 63% に低下し、位置 3 では 50% にさらに低下します。この減衰プロセスは指数関数的であり、対数ペナルティ関数がどのように機能し、ランキングが高いほど (つまり、ランキングの数値が大きいほど) ペナルティが大きくなることを示しています。
この例では、5 つの位置の関連性スコアはそれぞれ 3、2、3、0、および 1 です。テーブルには、各位置の関連性スコアと、対応するペナルティ項
スコアは、関連性スコアと結果の位置の複合効果を反映します。
DCG の合計値は次のように計算されます。
このように、DCG はランキングの品質を効果的に測定し、関連性の高い結果を上位にランク付けすることで、より高いスコアを獲得できるようにします。
以下の表は、k=1 から 5 までの計算された DCG 値を、前の図で提供した数値を使用してリストしたものです。
たとえば、DCG@2 は最初と 2 番目の項目の加重関連性スコアの合計で、3 + 1.2618 であり、4.2618 に相当します。
DCG@3 の場合、DCG@2 の値に 3 番目の位置の加重スコアを加算したもので、4.2618 + 1.5 = 5.7618 になります。以下同様です。
DCG の別の計算方法、つまり代替の式を以下に示します。
この式と前の DCG 式との違いは、
指数関数は線形関数よりも速く増加するためです。
上の図は、異なるクエリ結果を比較する際に DCG が遭遇する可能性のある問題を示しています。
たとえば、クエリ Q1 には 3 つの結果があり、クエリ Q2 には 5 つの結果がある場合、2 つのクエリの最初の 3 つの関連性スコアが同じであっても、クエリ Q2 のDCG@5 がクエリ Q1 の DCG@3 よりも大きくなる可能性があります。
これは、DCG の制限の 1 つを招きます。結果数が異なるクエリの DCG 値は直接比較できません。これは、結果数が多いほど、平均品質が必ずしも高くない場合でも、DCG 値が高くなる可能性があるためです。この問題を解決するために、通常、正規化された DCG (Normalized DCG または NDCG) を使用します。
この指標は、DCG の値を固定範囲 (通常は 0 ~ 1) に正規化するため、異なるクエリの結果の品質をより公平に比較できます。
(4) 正規化減損累積利得 (NDCG@k)
NDCG は DCG の正規化形式であり、異なるクエリ間で DCG 値を比較できます。NDCG は、DCG を理想的な場合の
DCG (つまり、IDCG) で割ることによって正規化を実現します。理想的な DCG とは、関連項を関連性スコアの降順で並べた場合の DCG 値を指します。
正規化操作の式は次のとおりです。
与えられた例では、すでに各 k 値の DCG を計算しました。ここで、NDCG を計算するには、各 k 値の理想的な DCG を決定する必要があります:
- まず、すべての関連性スコアを降順に並べます。
- 次に、これらの並べ替えられたスコアの DCG 値を計算します。これは IDCG になります。
- 最後に、元の DCG@k を対応する IDCG@k で割って NDCG@k を取得します。
たとえば、理想的な順序の関連性スコアが 3、3、2 の場合、DCG@3 の場合、IDCG@3 は次のようになります。
したがって、DCG@3 = 5.7618 の場合、次を取得できます。
この値は 0 から 1 の間になり、異なるクエリのパフォーマンスを比較できるようになります。NDCG の利点は、さまざまな長さのクエリ結果リストを正規化できるため、それらを公平に比較できることです。
理想的な DCG (IDCG) の計算方法と、NDCG の計算をさらに進める方法
理想的な状況での DCG、つまり IDCG の計算方法。ここで、項目は関連性スコアの降順で並べられます。計算方法は DCG と同じですが、関連性はスコアは最適な順序で並べ替えられます。
IDCG を使用して NDCG を計算する方法:
各 k 値について、対応する DCG@k、IDCG@k、および NDCG@k の計算と結果が表示されます。
NDCG は DCG を IDCG で割ることによって取得され、その値は 0 から 1 の間です。理想的なランキングでは、NDCG スコアは 1 になります。これにより、クエリを比較できます。
NDCG スコアは、正規化されたスコアであるため、クエリ間で比較できます。
たとえば、DCG@3 の場合、次のようになります。
これは、最初の 3 つの項目について、クエリのランキング品質が理想的な状況に近いことを意味します。NDCG スコアが 1 に近いほど、ランキング品質が良いことを示します。この方法では、異なる数の結果を持つクエリを公平に比較できます。
import numpy as np
def dcg_at_k(scores, k=5):
"""
DCG@k を計算します。
パラメータ:
- scores: 関連性スコアを含むリストまたは numpy 配列。
- k: 考慮するトップ要素の数。
戻り値:
- DCG@k の値。
"""
scores = np.asfarray(scores)[:k]
return np.sum((2**scores - 1) / np.log2(np.arange(2, scores.size + 2)))
def idcg_at_k(scores, k=5):
"""
IDCG@k を計算します。
パラメータ:
- scores: 関連性スコアを含むリストまたは numpy 配列。
- k: 考慮するトップ要素の数。
戻り値:
- IDCG@k の値。
"""
scores_sorted = np.sort(scores)[::-1]
return dcg_at_k(scores_sorted, k)
def ndcg_at_k(scores, k=5):
"""
NDCG@k を計算します。
パラメータ:
- scores: 関連性スコアを含むリストまたは numpy 配列。
- k: 考慮するトップ要素の数。
戻り値:
- NDCG@k の値。
"""
dcg = dcg_at_k(scores, k)
idcg = idcg_at_k(scores, k)
return dcg / idcg if idcg > 0 else 0
# 使用例
scores = [3, 2, 3, 0, 1]
k = 3
ndcg_score = ndcg_at_k(scores, k)
print(f"NDCG@{k}: {ndcg_score}")
NDCG@3: 0.9594535145926796
生成モジュール評価
- 生成モジュールの評価は、取得されたドキュメントがどのように入力を強化して、クエリに対する応答を形成するかに焦点を当てます。エンドツーエンド評価の最終的な回答/応答生成とは異なり、ここではプロセス中のコンテキストの関連性を評価することに重点が置かれています。
- 評価指標には主に BLEU や ROUGE などが含まれており、これらはテキスト生成の品質を測定するための一般的な指標です。特に、生成されたテキストの流暢さ、一貫性、および元のクエリの問題との関連性を評価できます。
BLEU
BLEU (Bilingual Evaluation Understudy) スコアの計算方法。これは、機械翻訳の品質を評価するための指標です。機械翻訳の出力を参照翻訳のセットと比較してスコアを計算します。
BLEU スコアの計算手順:
ステップ 1: BLEU スコアの定義を理解する
BLEU スコアは、機械翻訳の出力と 1 つ以上の参照翻訳間の類似性を評価する尺度です。n-gram マッチングに基づいて、機械翻訳テキストと参照翻訳テキスト間の共通 n-gram の数を計算します。スコア範囲は 0 から 1 で、1 に近いほど翻訳品質が高いことを意味します。
ステップ 2: n-gram 精度を計算する
各 n-gram について、機械翻訳の出力でその n-gram が出現する回数と、参照翻訳で出現する最大回数を計算します。計算式は次のとおりです。
ステップ 3: BLEU スコアを計算する
BLEU スコアの計算式は次のとおりです。
ここで、
ステップ 4: BP (Brevity Penalty) を計算する
機械翻訳の出力が参照翻訳よりも短い場合、BP (簡潔性ペナルティ) によってスコアにペナルティが課されます。これは、短すぎる出力が不合理な高スコアを得るのを避けるためです。
BP の計算式は次のとおりです。
ここで、
これらのステップを通じて、機械翻訳出力の BLEU スコアを計算し、翻訳品質を評価できます。BLEU スコアが高いほど、機械翻訳が人間の翻訳との一貫性が高くなります。
例を挙げて解説
具体的な例を挙げて BLEU スコアの計算プロセスを説明します。
機械翻訳された英語の文と 2 つの参照翻訳があると仮定します。
機械翻訳:the cat is on the mat
参照翻訳 1:the cat is on the mat
参照翻訳 2:there is a cat on the mat
ステップ 1: トークン化
まず、すべての文を単語 (トークン) に分割します。
ステップ 2: n-gram カウント
次に、n-gram の精度を計算します。簡単にするために、ユニグラム (1-gram) とバイグラム (2-gram) の精度のみを計算します。
ユニグラム:
- 機械翻訳:the, cat, is, on, the, mat(各単語が 1 回出現)
- 参照翻訳:最大でも各単語が 1 回出現
したがって、ユニグラムの精度は 100% です。
バイグラム:
- 機械翻訳:the cat, cat is, is on, on the, the mat
- 参照翻訳 1:the cat, cat is, is on, on the, the mat
- 参照翻訳 2:there is, is a, a cat, cat on, on the, the mat
機械翻訳の各バイグラムも、少なくとも 1 つの参照翻訳に登場しているので、バイグラムの精度も 100% です。
ステップ 3: BLEU スコアを計算する
次に、BLEU スコアを計算します。簡単にするために、すべての n-gram の重みは等しいと仮定します。つまり、ユニグラムとバイグラムの場合、
ユニグラムとバイグラムの BLEU 計算の場合:
BLEU スコアは次のとおりです。
ステップ 4: 簡潔性ペナルティ (Brevity Penalty, BP) を計算する
BP の計算は、機械翻訳出力の長さと参照翻訳の最適な長さによって異なります。この例では、機械翻訳の長さと参照翻訳の長さは
等しいため、簡潔性ペナルティはありません。つまり、BP=1 です。
最終的な BLEU スコアは、
この非常に簡単な例では、機械翻訳は参照翻訳とまったく同じであるため、スコアは最高になります。実際には、n-gram が長くなるほど、一致が難しくなるため、スコアが低下します。さらに、BLEU は通常、より長い n-gram (たとえば、4-grams) を考慮し、より複雑な重み分布を使用します。
from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction
import jieba
def bleu_score(true_answer : str, generate_answer : str, weights: tuple) -> float:
# true_anser : 標準解答、str タイプ
# generate_answer : モデル生成解答、str タイプ
true_answers = list(jieba.cut(true_answer))
generate_answers = list(jieba.cut(generate_answer))
# スムージング関数 SmoothingFunction().method4 を使用して、可能性のある 0 値の場合を処理します。
# これは、高次 n-gram の一致の欠如によるスコアが 0 になるのを防ぐのに非常に役立ちます。
smoothie = SmoothingFunction().method4
bleu_score = sentence_bleu(true_answers,
generate_answers,
weights=weights,
smoothing_function=smoothie)
return bleu_score
# 標準解答
true_answer = "there is a cat on the mat"
# モデル生成解答
generate_answer = "the cat is on the mat"
# BLEU スコアを計算する
'''重み設定
1-gram BLEU スコア:weights を (1, 0, 0, 0) に設定
2-gram BLEU スコア:weights を (0.5, 0.5, 0, 0) に設定。1-gram と 2-gram がそれぞれ半分ずつの重みを占めることを意味します。
3-gram BLEU スコア:weights を (1/3, 1/3, 1/3, 0) に設定
4-gram BLEU スコア:weights を (0.25, 0.25, 0.25, 0.25) に設定。これはデフォルト設定で、1-gram から 4-gram を均等に考慮することを意味します。
'''
weights = (0.5, 0.5, 0, 0)
score = bleu_score(true_answer, generate_answer, weights)
print(f"BLEU score: {score}")
BLEU score: 0.046689450558483385
通常、4 グラムが考慮されます。1 グラム:単語の正確さ、2 グラム:テキストの首尾一貫性、3 グラム:テキストの複雑さも考慮されます。ここで、 は機械生成の要約、 は参照要約の集合、 はテキスト内の n-gram の出現回数です。
ROUGE
ROUGE (Recall-Oriented Understudy for Gisting Evaluation) は、自動要約または機械翻訳の品質を評価するための評価指標です。
特に、要約のカバー率または再現率を評価する場合に役立ちます。ここで言う「再現率」とは、評価対象の要約が参照要約をどの程度カバーできるかを指します。ROUGE 指標は BLEU 指標と似ていますが、ROUGE は再現率に重点を置き、BLEU は精度に重点を置いています。
ROUGE のいくつかのバリアントの中で最も一般的なのは ROUGE-N で、参照要約と生成された要約の間の n-gram の重複を計算します。計算式は次のとおりです。
ここで、
ROUGE-L は ROUGE の別のバリアントであり、最長共通部分列 (LCS) を考慮します。ROUGE-L の計算は、n-gram のマッチングに依存するだけでなく、最長共通部分列によって全体的なシーケンスの類似性を測定します。その式は次のとおりです。
ここで、R は再現率 (Recall)、P は適合率 (Precision) を表し、LCS(X,Y) は参照要約 X と生成要約 Y の最長共通部分列の長さを示します。|X| は生成要約の長さ、 |Y| は参照要約の長さを表します。
具体的な例を挙げて、ROUGE-N と ROUGE-L の計算プロセスを詳細に説明します。
① ROUGE-N の計算プロセス
次の参照要約と生成要約があると仮定します。
・参照要約:The quick brown fox jumps over the lazy dog.
・生成要約:The brown fox jumped over the dog.
ROUGE-1 (ユニグラムの重複) を計算するために、まず 2 つの要約のすべてのユニグラムをリストします。
・参照要約のユニグラム:The, quick, brown, fox, jumps, over, the, lazy, dog
・生成要約のユニグラム:The, brown, fox, jumped, over, the, dog
次に、生成要約の各ユニグラムが参照要約に出現する回数を集計し、重複するユニグラムの合計数を計算します。
The (2 回)、brown (1 回)、fox (1 回)、over (1 回)、dog (1 回) = 6 回
次に、参照要約のユニグラムの合計数を計算します。9 個。
ROUGE-1 の再現率は、生成要約内の重複するユニグラムの数を、参照要約内のユニグラムの総数で割ったものです。
ROUGE-2 (バイグラムの重複) を計算するには、2 つの要約のすべてのバイグラムをリストする必要があります。
・参照要約のバイグラム:(The quick), (quick brown), (brown fox), (fox jumps), (jumps over), (over the), (the
lazy), (lazy dog)
・生成要約のバイグラム:(The brown), (brown fox), (fox jumped), (jumped over), (over the), (the dog)
重複するバイグラムは次のとおりです。
・(The brown), (brown fox), (over the) = 3 回
参照要約内のバイグラムの合計数は 8 個です。
ROUGE-2 の再現率は次のとおりです。
② ROUGE-L の計算プロセス
ROUGE-L は最長共通部分列 (LCS) に基づいています。LCS は、連続している必要はないが、順序が一致している必要がある最長の部分列を指します。
上記の例の場合、最長共通部分列は次のとおりです。
・参照要約と生成要約の LCS:The brown fox over the dog
参照要約の長さは 9、生成要約の長さは 7、LCS の長さは 6 です。
ROUGE-L の再現率 (R) と適合率 (P) はそれぞれ次のとおりです。
次に、再現率と適合率の調和平均である ROUGE-L の F1 スコアを計算できます。
数値を代入して計算します。
Discussion