Ragasのライブラリを使ってテストデータを作成する
やりたいこと
Ragasと言えばRAGの検索・生成精度を定量的に評価できるフレームワークですが、テストデータも作成できることを知ったので、紹介します。
背景
Ragasの公式ドキュメントを見てみましょう。
テストデータ生成におけるRagasの違いは?
Ragasは評価データ生成に斬新なアプローチをとります。理想的な評価データセットは、様々な難易度の問題を含む、本番で出題される様々なタイプの問題を網羅する必要があります。デフォルトのLLMは、共通のパスに従う傾向があるため、多様なサンプルを作成することは得意ではありません。RagasはEvol-Instructのような作品にインスパイアされ、推論、条件付け、マルチコンテクストなどの異なる特徴を持つ問題が提供されたドキュメントセットから系統的に作成される進化的生成パラダイムを採用することでこれを達成します。このアプローチは、パイプライン内の様々なコンポーネントのパフォーマンスを包括的にカバーし、よりロバストな評価プロセスを実現します。
上記は大事そうな部分の日本語訳抜粋ですが、要するにRagasを使えば素敵なデータセットができますよと言っています。それでは、どのような点で素敵なんでしょうか。公式ドキュメントによると、特に以下3点が挙げられています。
1 推論: 質問に効果的に答えるために、推論の必要性を高める方法で質問を書き換える。
2 条件付け: 質問に複雑さを加える条件要素を導入するために質問を修正する。
3 マルチコンテクスト: 答えを作成するために、複数の関連するセクションまたはチャンクからの情報を必要とする方法で質問を書き換えます。
それでは実際にデータを作成してみます。ここでは公式ドキュメントに倣う形で、PubMedにある「LLM」というキーワードを含む論文からテストデータを作成してみます。
前提
AzureOpenAIStudioでgpt-4o、text-embedding-ada-002をデプロイ済み
依存ライブラリ
pip install ragas langchain-openai xmltodict python-dotenv
実装
import os
import pandas as pd
from langchain_community.document_loaders import PubMedLoader
from langchain_openai import AzureChatOpenAI
from langchain_openai import AzureOpenAIEmbeddings
from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context
from dotenv import load_dotenv
# .envファイルから環境変数を読み込む
load_dotenv()
# Load documents
loader = PubMedLoader("llm", load_max_docs=5)
documents = loader.load()
# 環境変数からAPIキーやエンドポイントを取得
api_key = os.getenv("AZURE_OPENAI_API_KEY")
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
gpt_deployment_name = os.getenv("AZURE_OPENAI_GPT_DEPLOYMENT")
embeddings_deployment_name = os.getenv("AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT")
# generator with openai models
llm = AzureChatOpenAI(
api_key=api_key,
api_version = "2023-05-15",
azure_endpoint=azure_endpoint,
azure_deployment = gpt_deployment_name
)
embeddings = AzureOpenAIEmbeddings(
api_key=api_key,
azure_endpoint=azure_endpoint,
azure_deployment=embeddings_deployment_name
)
generator = TestsetGenerator.from_langchain(
llm,
llm,
embeddings
)
# Change resulting question type distribution
distributions = {
simple: 0.5,
multi_context: 0.4,
reasoning: 0.1
}
# Pandasの表示オプションを設定
pd.set_option('display.max_columns', None) # すべての列を表示
pd.set_option('display.max_rows', None) # すべての行を表示
pd.set_option('display.expand_frame_repr', False) # 列を折り返さない
# Testsetの生成
testset = generator.generate_with_langchain_docs(documents, 5, distributions)
test_df = testset.to_pandas()
# データフレームを表示
print(test_df)
実行結果
question contexts ground_truth evolution_type metadata episode_done
0 How were patient value profiles captured in th... [BACKGROUND: Surrogates, proxies, and clinicia... Patient value profiles were captured using thr... simple [{'uid': '39132980', 'Title': 'Incorporating P... True
1 What differences in ECG abnormalities were obs... [BACKGROUND: The role of ECG in ruling out myo... Post-hospitalised COVID-19 patients had a high... simple [{'uid': '39127146', 'Title': 'Diagnostic util... True
2 How can customizing LLMs improve alignment of ... [BACKGROUND: Surrogates, proxies, and clinicia... The answer to given question is not present in... multi_context [{'uid': '39132980', 'Title': 'Incorporating P... True
3 How did the custom GPT model's accuracy in GER... [BACKGROUND: Large Language Models (LLMs) prov... The custom GPT model, referred to as the GERD ... multi_context [{'uid': '39134725', 'Title': 'Clinical artifi... True
4 What were the accuracy rates of the GERD Tool ... [BACKGROUND: Large Language Models (LLMs) prov... The GTS provided accurate recommendations for ... simple [{'uid': '39134725', 'Title': 'Clinical artifi... True
コメントなど
questionやcontextsにはLLMやGPTといったワードが含まれており、無事にテストデータを作成できたようです。ただ、たった5件のテストデータを作成するのに10分弱かかったので、大量に生成したい場合はもう一工夫必要かもしれません。また、今回はPubMedから情報を引っ張ってきましたが、データソースは本文のテキストデータがきちんと格納されているのが必要条件のようで、arXivからは引っ張ってこれませんでした。さらに、simple、multi_context、reasoningといったパラメータによっても生成される内容は異なるため検証の余地がありそうです。
Discussion