💯

RAGを正しく評価する。ragas 入門

に公開

初めに

ここ数年で生成AIを利用したアプリケーションは急増し、内製する企業も増えています。特にRAGを利用する場合、回答精度はプロダクトの品質を決める上で重要な観点となるでしょう。
製品開発の中で、回答精度の評価をExcelシートで管理したり、調査依頼することも少なくなく、これらはプロダクトの開発速度を高める上でのボトルネックとなります。
そこで今回は、RAGシステムの品質を自動で評価するPythonライブラリのragasについて説明していきます。

ragasとは

RAGシステムなどを自動的かつ定量的に評価するためのオープンソースのライブラリです。回答がどの程度コンテキスト(参考にしたドキュメント)に基づいているのか、回答はどの程度妥当かなど、複数の観点で定量的に評価することできます。具体的には以下のような観点で精度評価をすることができます。
※ragasように大規模言語モデル(LLM)を使って 他のLLMの回答を評価する というコンセプトをLLM as a Judgeと言います。

指標名(Metric) 説明
faithfulness 回答が与えられたコンテキスト(参考資料内の情報)にどれだけ正確に基づいているかを測定。 参考資料に「東京は日本の首都」と書いてあるのに、答えが「大阪が首都」と言っていたらfaithfulnessは低い
answer_correctness 回答が質問に対して妥当で、正しい情報を含んでいるかを評価。 「パリはどこ?」という質問に、「フランスの首都です」と正確に答えたら高スコア。
context_precision 取得した文脈のうち、実際に回答に使えた情報の割合を評価。 3つの資料を取得して、1つだけが回答に有効なら precision = 1/3 = 0.33
context_recall 回答に必要なすべての情報が、コンテキストに十分含まれていたかを測定。 「パスタ」「トマトソース」「オリーブオイル」で作るパスタ。レシピに「パスタ」と「トマトソース」だけ → 情報が1つ足りない(2/3)。全部そろっていれば → 完璧(3/3 = 100%)。

使い方

それでは実際に使い方の手順紹介に移ります。ここでは大きく4つのステップに分けて解説していきます。

1. 必要なライブラリのインポート

Open AI modelを呼び出すため、API keyをセットします。
※安全のため、不要になったら削除してください。

import os

os.environ["OPENAI_API_KEY"] = "your-openai-key"

2. テストデータの作成

評価で利用するテストデータを生成します。ここでは質問・回答の生成に使う LLMや内容の表示に利用するLLM、埋め込みモデルを指定します。

from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

# generator with openai models
generator_llm = ChatOpenAI(model="gpt-3.5-turbo-16k")
critic_llm = ChatOpenAI(model="gpt-4")
embeddings = OpenAIEmbeddings()

generator = TestsetGenerator.from_langchain(
    generator_llm,
    critic_llm,
    embeddings
)

# generate testset
testset = generator.generate_with_langchain_docs(documents, test_size=10, distributions={simple: 0.5, reasoning: 0.25, multi_context: 0.25})

3. Metricsの指定

評価時に確認したいメトリックを指定します。

from ragas.metrics import (
    answer_relevancy,
    faithfulness,
    context_recall,
    context_precision,
)

4. 評価

最後に評価を実行します。指定したメトリックの内容を参照することができ、回答の正確性や正しいドキュメントを参照できているかなど、評価することができます。

from ragas import evaluate

result = evaluate(
    amnesty_qa["eval"],
    metrics=[
        context_precision,
        faithfulness,
        answer_relevancy,
        context_recall,
    ],
)

df = result.to_pandas()
df.head()

print("===== RAGAS Evaluation Results =====")
for metric, score in results.scores[0].items():
    print(f"{metric}: {score:.3f}")

# 実際の結果
===== RAGAS Evaluation Results =====
faithfulness: 1.000
answer_correctness: 0.838
context_precision: 0.333
context_recall: 1.000

おわりに

以上がragasの概要と使い方になります。LLM as a judgeのサービスは他にもあり、RAGシステム開発の高速化を図る上では重要なサービスになります。まだ情報は少ないですが、TDDのようにベストプラクティスやTipsなどを発信していきます。

参考

https://github.com/explodinggradients/ragas?tab=readme-ov-file

https://docs.ragas.io/en/stable/getstarted/

https://docs.ragas.io/en/v0.1.21/concepts/metrics/faithfulness.html

https://docs.ragas.io/en/v0.1.21/concepts/metrics/answer_correctness.html

https://docs.ragas.io/en/v0.1.21/concepts/metrics/context_precision.html

https://docs.ragas.io/en/v0.1.21/concepts/metrics/context_recall.html

Discussion