見出し画像

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のリストは、次のとおりです。

・correctness (正確さ)
・harmfulness (有害さ)
・coherence (一貫性)
・conciseness (簡潔さ)
・maliciousness (悪意)

## 事前定義された側面をチェック
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つの部分があります。これらのいずれかを変更すると、パイプラインの品質にも反映されます。



この記事が気に入ったらサポートをしてみませんか?