RAG評価ツール ragas を試す
RAG評価ツール「ragas」を試したので、まとめました。
1. ragas
「ragas」は、「RAG」 (Retrieval Augmented Generation) パイプラインを評価するためのフレームワークです。「RAG」は外部データを使用してLLMのコンテキストを拡張するLLMアプリケーションです。「ragas」はこのパイプラインを評価して、パフォーマンスを定量化します。
2. Colabでの実行
Colabでの実行手順は、次のとおりです。
(1) RAGパイプラインの準備。
今回は、以下の記事で作成した、ELYZAのRAGパイプラインを使います。
(2) パッケージのインストール。
# パッケージのインストール
!pip install ragas datasets
(3) 環境変数の準備。
「ragas」は「OpenAI API」で評価します。
import os
import openai
# 環境変数の設定
os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"
openai.api_key = os.environ["OPENAI_API_KEY"]
(4) 質問、文脈、回答 のリストの準備。
今回は、10個の「質問」を用意して、RAGパイプラインで「文脈」と「回答」を生成します。
# 質問
questions = [
"後藤ひとりの得意な楽器は?",
"後藤ひとりの妹の名前は?",
"後藤ひとりが加入したバンド名は?",
"ギターヒーローの正体は?",
"喜多郁代の髪の色は?",
"伊地知虹夏が通う学校の名前は?",
"山田リョウの趣味は?",
"廣井きくりが所属するバンド名は?",
"ライブハウス「STARRY」の店長の名前は?",
"ぼっちちゃんが文化祭で披露した演奏法は?",
]
# 質問からの文脈と応答の生成
contexts = []
answers = []
for question in questions:
response = query_engine.query(question)
contexts.append([x.node.get_content() for x in response.source_nodes])
answers.append(str(response))
(5) データセットの準備。
「question」「answer」「contexts」の3カラムでデータセットを作成します。
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import answer_relevancy, faithfulness
# データセットの準備
ds = Dataset.from_dict(
{
"question": questions,
"answer": answers,
"contexts": contexts,
}
)
(6) 評価の実行。
from ragas import evaluate
from ragas.metrics import answer_relevancy, faithfulness
# 評価
result = evaluate(ds, [answer_relevancy, faithfulness])
print(result)
{'ragas_score': 0.8578, 'answer_relevancy': 0.8195, 'faithfulness': 0.9000}
今回は、「answer_relevancy」(回答が質問の関連性)と「faithfulness」 (文脈に対する回答の事実の一貫性) の2つのメトリックスを使いました。ragas_score は、個々のメトリックスコアの調和平均です。
3. メトリックス
3-1. Faithfulness (忠実さ)
特定の文脈に対する回答の事実の一貫性を測定します。 これは、回答からテキストを生成し、これらの各テキストを文脈に照らして検証することを含む、複数ステップを使用して行われます。 値の範囲は 0 〜 1 で、高いほど良いです。
from ragas.metrics.factuality import Faithfulness
faithfulness = Faithfulness()
# Dataset({
# features: ['question','contexts','answer'],
# num_rows: 25
# })
dataset: Dataset
results = faithfulness.score(dataset)
3-2. ContextRelevancy (文脈関連性)
文脈が質問 (プロンプト) にどの程度関連しているかを測定します。これは、OpenAI モデルとクロスエンコーダーモデルの組み合わせを使用して行われます。スコアを改善するには、文脈の情報量を調整する必要があります。
from ragas.metrics.context_relevancy import ContextRelevancy
context_rel = ContextRelevancy(strictness=3)
# Dataset({
# features: ['question','contexts'],
# num_rows: 25
# })
dataset: Dataset
results = context_rel.score(dataset)
3-3. Context Recall (文脈呼び出し)
注釈付きの回答をグラウンドトゥルースとして使用して、文脈の再現率を測定します。 注釈付きの回答は、グラウンドトゥルース コンテキストの代理として使用されます。
from ragas.metrics.context_recall import ContextRecall
context_recall = ContextRecall()
# Dataset({
# features: ['contexts','ground_truths'],
# num_rows: 25
# })
dataset: Dataset
results = context_recall.score(dataset)
3-4. AnswerRelevancy (回答関連性)
回答が質問 (プロンプト) に対してどの程度関連しているかを測定します。回答が不完全であるか、冗長な情報が含まれている場合、スコアは低くなります。これは、回答を使用して LLM が特定の質問を生成する可能性を計算することで定量化されます。 値の範囲は 0 〜 1 で、大きいほど良いです。
from ragas.metrics.answer_relevancy import AnswerRelevancy
answer_relevancy = AnswerRelevancy()
# Dataset({
# features: ['question','answer'],
# num_rows: 25
# })
dataset: Dataset
results = answer_relevancy.score(dataset)
3-5. AspectCritique (アスペクト批評)
Aspect Critiques は、提供されたAspectを使用して提出物を評価する LLM 評価者です。Ragas Critiques には、正しさ、有害さなどいくつかのAspectが事前定義されています。 独自のAspectを定義することもできます。
strictness パラメータは、予測における自己一貫性のレベル 2 ~ 4 (理想的な範囲) を保証するために使用されます。
出力は常にバイナリで、提出物が特定のAspect定義に準拠しているかどうかを示します。これらのスコアは非連続のため、最終的な ragas_score には反映されません。
事前定義されているAspectのリストは、次のとおりです。
## 事前定義された側面をチェック
from ragas.metrics.critique import SUPPORTED_ASPECTS
print(SUPPORTED_ASPECTS)
from ragas.metrics.critique import conciseness
from ragas
# Dataset({
# features: ['question','answer'],
# num_rows: 25
# })
dataset: Dataset
results = conciseness.score(dataset)
## 自分の批評を定義
from ragas.metrics.critique import AspectCritique
mycritique = AspectCritique(name="my-critique", definition="Is the submission safe to children?", strictness=2)
4. 利用状況の追跡
「ragas」では、非常に基本的な利用状況を追跡しています。個人や会社を特定できるような情報は追跡しません。収集したデータをすべてオープンソースにしています (詳しくはこちらを参照)。何をトラッキングしているかは、コードで確認できます。
利用状況の追跡を無効にするには、RAGAS_DO_NOT_TRACK に true を指定してください。
5. FAQ
Q. 調和平均は何を意味する?
A. 調和平均は、極端な値にペナルティを与えます。たとえば、生成された回答が文脈と完全に事実と一致している (忠実度=1) が、質問とは無関係である (関連性=0) 場合、単純平均では 0.5 のスコアが得られますが、Harmonic-Meanでは 0.0 になります。
Q. ragas でパイプラインを改善するには?
A. 「測定は制御につながり、最終的には改善につながる最初のステップです」 - James Harrington
ここでは、RAGパイプラインの準備がすでに整っていることを前提としています。RAGパイプラインには、主に「Retriever」と「Generator」の2つの部分があります。これらのいずれかを変更すると、パイプラインの品質にも反映されます。
この記事が気に入ったらサポートをしてみませんか?