「RAGAsを使用したRAGアプリケーションの評価」
「RAGアプリケーションにおけるRAGAsの効果検証と評価」
メトリックとLLM生成データを使用して、検索補完生成パイプラインのパフォーマンスを評価するフレームワーク
ここまで、検索補完生成(RAG)アプリケーションの概念実証は簡単ですが、製品レベルにするのは非常に困難です。特に、RAGパイプラインのパフォーマンスを満足のいく状態にすることは困難です。なぜなら、RAGパイプラインには異なるコンポーネントがあるからです:
- リトリーバーコンポーネント:LLMがクエリに答えるために外部データベースから追加のコンテキストを取得します。
- ジェネレーターコンポーネント:取得した情報をもとに、プロンプトを増強して回答を生成します。
RAGパイプラインを評価する場合、コンポーネントごとに評価し、それらを一緒に評価する必要があります。さらに、RAGアプリケーションのパフォーマンスが向上しているかどうかを理解するためには、定量的に評価する必要があります。そのためには、評価メトリックと評価データセットの2つの要素が必要です。
現在、適切な評価メトリックを決定し、良質な検証データを収集することは活発な研究分野です。この領域は急速に進展しており、RAG評価フレームワークのさまざまなアプローチが現れています。例えば、RAGメトリックの三位一体、ROUGE、ARES、BLUE、RAGAs [1]などがあります。この記事では、RAGAs [1]を使用してRAGパイプラインを評価する方法に焦点を当てます。
RAGAsとは
RAGAs(Retrieval-Augmented Generation Assessment)は、コンポーネントレベルでRAGパイプラインを評価するためのフレームワーク(GitHub、Docs)です。
評価データ
RAGAsの興味深い点は、元々「リファレンスなし」の評価フレームワークとして始まったことです。つまり、評価データセットで人間による注釈付きの正解ラベルに頼る必要がなく、評価を実施するためにLLMを利用しています。
RAGパイプラインを評価するために、RAGAsは以下の情報を必要とします:
question
:RAGパイプラインの入力となるユーザークエリ。answer
:RAGパイプラインから生成された回答。contexts
:クエリに答えるために使用される外部知識源から取得されたコンテキスト。ground_truths
:クエリに対する正解回答。これは人間による注釈情報です。この情報はメトリックcontext_recall
(評価メトリックを参照)にのみ必要です。
リファレンスなし評価においてLLMを活用することは、活発な研究トピックです。可能な限り人間による注釈データを少なく使用することは、より安価かつ迅速な評価方法となりますが、バイアスなどの課題についてはまだ議論があります。ただし、すでにいくつかの論文で有望な結果が示されています[4]。詳細は、RAGAs [1] 論文の「関連研究」セクションを参照してください。
フレームワークが拡張され、グラウンドトゥルースのラベルを必要とするメトリクスとパラダイムを提供することに注意してください(例: context_recall
および answer_correctness
、評価メトリクスを参照してください 評価メトリクス)。
さらに、フレームワークは 自動テストデータの生成 のためのツールを提供します。
評価メトリクス
RAGは、RAGパイプラインのコンポーネントごとおよびエンドツーエンドで評価するためのいくつかの メトリクスを提供します。
コンポーネントレベルでは、RAGは検索コンポーネント(context_relevancy
および context_recall
)と生成コンポーネント(faithfulness
および answer_relevancy
)を別々に評価するためのメトリクスを提供します [2]:
- コンテキスト精度は、取得されたコンテキストの信号対雑音比を測定します。このメトリクスは、
question
とcontexts
を使用して計算されます。 - コンテキスト再現率は、質問に答えるのに必要な関連情報がすべて取得されたかどうかを測定します。このメトリクスは、
ground_truth
(これは人間によって注釈付けされたグラウンドトゥルースのラベルに依存するフレームワークで唯一のメトリクスです)およびcontexts
に基づいて計算されます。 - 信頼性は、生成された回答の事実の正確性を測定します。与えられたコンテキストの正しい記述の数を生成された回答の総数で割ったものです。このメトリクスは、
question
、contexts
、およびanswer
を使用します。 - 回答の関連性は、生成された回答が質問にどれだけ関連しているかを測定します。このメトリクスは、
question
とanswer
を使用して計算されます。例えば、質問「フランスはどこにあり、首都は何ですか?」に対して「フランスは西ヨーロッパにあります」という回答は、回答の関連性が低いため、半分の質問にしか答えていないとみなされます。
すべてのメトリクスは範囲 [0, 1] にスケーリングされており、値が高いほどパフォーマンスが優れていることを示します。
RAGはまた、回答の意味的類似性や回答の正確性など、RAGパイプラインをエンドツーエンドで評価するためのメトリクスも提供します。この記事では、コンポーネントレベルのメトリクスに焦点を当てています。
RAGAsを使用したRAGアプリケーションの評価
このセクションでは、RAGAsを使用して最小限のバニラRAGパイプラインを評価し、RAGAsの使用方法と評価メトリクスについての直感を示します。
前提条件
必要なPythonパッケージがインストールされていることを確認してください:
- RAGパイプライン用の
langchain
、openai
、およびweaviate-client
- RAGパイプラインの評価用に
ragas
#!pip install langchain openai weaviate-client ragas
また、.envファイルを作成し、関連する環境変数をルートディレクトリに定義してください。OpenAIのAPIキーを取得するには、OpenAIアカウントが必要で、APIキーの下で「新しいシークレットキーを作成」する必要があります。
OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"
RAGアプリケーションのセットアップ
RAGアプリケーションを評価する前に、セットアップする必要があります。バニラのRAGパイプラインを使用します。このセクションは短く保ちますが、以下の記事で詳しく説明されている同じセットアップを使用します。
情報検索増強生成(RAG): 理論からLangChainの実装へ
原論文の理論からOpenAI、Weaviate、LangChainを使用したPythonの実装へ
towardsdatascience.com
まず、ドキュメントの読み込みとチャンキングによってデータを準備する必要があります。
import requestsfrom langchain.document_loaders import TextLoaderfrom langchain.text_splitter import CharacterTextSplitterurl = "https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/docs/modules/state_of_the_union.txt"res = requests.get(url)with open("state_of_the_union.txt", "w") as f: f.write(res.text)# データをロードdataloader = TextLoader('./state_of_the_union.txt')documents = loader.load()# データをチャンクに分割text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)chunks = text_splitter.split_documents(documents)
次に、OpenAIの埋め込みモデルを使用して各チャンクのベクトル埋め込みを生成し、ベクトルデータベースに保存します。
from langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import Weaviateimport weaviatefrom weaviate.embedded import EmbeddedOptionsfrom dotenv import load_dotenv,find_dotenv# .envファイルからOpenAI APIキーをロードload_dotenv(find_dotenv())# ベクトルデータベースのセットアップclient = weaviate.Client( embedded_options = EmbeddedOptions())# ベクトルデータベースにデータを登録vectorstore = Weaviate.from_documents( client = client, documents = chunks, embedding = OpenAIEmbeddings(), by_text = False)# ベクトルデータベースをリトリーバとして使用できるように設定retriever = vectorstore.as_retriever()
最後に、プロンプトテンプレートとOpenAI LLMをセットアップし、リトリーバコンポーネントと組み合わせてRAGパイプラインを構築します。
from langchain.chat_models import ChatOpenAIfrom langchain.prompts import ChatPromptTemplatefrom langchain.schema.runnable import RunnablePassthroughfrom langchain.schema.output_parser import StrOutputParser# LLMを定義llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# プロンプトテンプレートを定義template = """質問応答タスクのアシスタントです。次の回収された文脈の一部を使用して質問に答えてください。答えがわからない場合は、わからないと答えてください。2文までで回答を簡潔に保ちます。質問: {question} 文脈: {context} 答え:"""prompt = ChatPromptTemplate.from_template(template)# RAGパイプラインをセットアップrag_chain = ( {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() )
評価データの準備
RAGAsは、参照フリーの評価フレームワークを目指しているため、評価データセットの準備には最小限の準備が必要です。以下の推論を通じて、question
とground_truths
のペアから残りの情報を準備する必要があります:
from datasets import Datasetquestions = ["大統領はジャスティス・ブライヤーについて何と言いましたか?", "大統領はインテルのCEOについて何と言いましたか?", "大統領は銃の暴力について何と言いましたか?", ]ground_truths = [["大統領はジャスティス・ブライヤーが国家に奉仕するために一生懸命働いたことを述べ、彼の奉仕に感謝しました。"], ["大統領はパット・ゲルジンガーがインテルの投資を1000億ドルに増やす準備ができていると述べました。"], ["大統領は議会に対し、銃の暴力を減らすための実績のある措置を可決するよう求めました。"]]answers = []contexts = []# 推論for query in questions: answers.append(rag_chain.invoke(query)) contexts.append([docs.page_content for docs in retriever.get_relevant_documents(query)])# 辞書型に変換data = { "question": questions, "answer": answers, "contexts": contexts, "ground_truths": ground_truths}# 辞書型をデータセットに変換dataset = Dataset.from_dict(data)
もし context_recall
メトリックに興味がない場合、ground_truths
の情報を提供する必要はありません。この場合、準備する必要があるのは question
だけです。
RAG アプリケーションの評価
まず、ragas.metrics
から使用したいすべてのメトリックをインポートします。そして、evaluate()
関数を使用し、関連するメトリックと準備されたデータセットを単純に渡すことができます。
from ragas import evaluatefrom ragas.metrics import ( faithfulness, answer_relevancy, context_recall, context_precision,)result = evaluate( dataset = dataset, metrics=[ context_precision, context_recall, faithfulness, answer_relevancy, ],)df = result.to_pandas()
以下では、例に対する結果の RAGAs スコアが表示されます。
以下の観察結果が得られます:
context_relevancy
(取得したコンテキストの信号対雑音比): LLM は最後の質問に対してはすべてのコンテキストを関連性があると判断しますが、2番目の質問に対しては取得したコンテキストのほとんどが関連性がないと判断します。このメトリックに基づいて、ノイズを減らすために取得するコンテキストの数を調整することができます。context_recall
(質問に答えるために必要な関連情報がすべて取得された場合): LLM は取得したコンテキストに質問に答えるために必要な関連情報が含まれていると評価します。faithfulness
(生成された回答の事実の正確さ): LLM は最初と最後の質問に正しく回答されたと判断しますが、誤って大統領が Intel の CEO について言及しなかったという2番目の質問に対しては信頼性が0.5と判断します。answer_relevancy
(生成された回答が質問に関連している程度): 生成されたすべての回答は質問にかなり関連していると判断されます。
評価データ で説明されているように、LLM を参照フリー評価に使用することは活発な研究分野です。このトピックの進展が楽しみです。
まとめ
概念実証の RAG アプリケーションを構築することは簡単ですが、パフォーマンスを本番用にするのは難しいです。機械学習プロジェクトのように、RAG パイプラインのパフォーマンスを検証データセットと評価メトリックで評価する必要があります。
ただし、RAG パイプラインは個々に評価する必要がある複数のコンポーネントで構成されているため、評価メトリックのセットが必要です。さらに、人間の注釈者から高品質の検証データセットを生成することは困難で、時間と費用がかかります。
本記事では、RAGAs [1] 評価フレームワークを紹介しました。このフレームワークは、コンテキストの関連性、コンテキストリコール、信頼性、回答適合性の4つの評価メトリックからなる RAGAs スコアを提案しています。さらに、費用を節約するために RAGAs は裏側で LLM を活用して参照フリー評価を行っています。
RAG アプリケーションのパフォーマンスを評価するためのツールが揃ったので、以下の調整戦略でパフォーマンスを調整するために実験パイプラインを設定することをおすすめします:
本番用 RAG アプリケーションのための 12 の調整戦略ガイド
これらの「ハイパーパラメーター」とともに、リトリーバル-ジェネレーション (RAG) パイプラインのパフォーマンスを向上させる方法…
towardsdatascience.com
このデータセットを生成するためのコードはこのGitHubリポジトリで見つけることができます。
この記事がお気に入りですか?
新しい記事を公開した時に通知を受け取るために無料で購読してください。
Leonie Monigattiが公開するたびにメールを受け取る。
Leonie Monigattiが公開するたびにメールを受け取る。サインアップすると、VoAGIアカウントが作成されます。
VoAGI.com
LinkedIn、Twitter、Kaggleで見つけてください!
免責事項
この記事作成時点では、私はWeaviateというオープンソースのベクトルデータベースのデベロッパーアドボケートです。
参考文献
[1] エス, S., ジェームズ, J., エスピノーサ-アンケ, L., & ショッカート, S. (2023). RAGAs: 自動生成評価のためのRAG。 arXiv preprint arXiv:2309.15217.
[2] RAGAsドキュメント (2023). ドキュメント (2023年12月11日アクセス)
[3] Wang, P., Li, L., Chen, L., Zhu, D., Lin, B., Cao, Y., … & Sui, Z. (2023). 大規模言語モデルは公正な評価者ではありません。 arXiv preprint arXiv:2305.17926.
[4] Liu, Y., Iter, D., Xu, Y., Wang, S., Xu, R., & Zhu, C. (2023). G-eval:gpt-4を使用したNLG評価、ヒューマンアライメントの向上、2023年5月。 arXiv preprint arXiv:2303.16634, 6.
画像
特記されていない限り、すべての画像は著者によって作成されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles