RAGアプリケーションにおけるLLM評価のベストプラクティス

[Best Practices for LLM Evaluation of RAG Applications \| Databricks Blog](https://www.databricks.com/blog/LLM-auto-eval-best-practices-RAG)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# DatabricksドキュメントBotのケーススタディ

チャットbotは、大規模言語モデル(LLM)のパワフルなチャットと理由づけの能力を活用した最も広く導入されたユースケースです。検索拡張生成(RAG)アーキテクチャは、ハルシネーションを削減し、最新の情報を維持し、ドメイン固有の知識を活用するために、(ベクトルストアを経由した)知識ベースと生成モデル(GPT-3.5やGPT-4など)を組み合わせるため、すぐにチャットbotの開発における業界標準になりました。しかし、チャットbotのレスポンスの品質の評価は現時点でも未解決のままです。業界標準が定義されていないため、時間を浪費し、スケールしにくい人間による評点(ラベリング)に落ち着くことになりました。

我々は、LLMの自動評価のベストプラクティスを形作る助けとなるプラクティスにセオリーを適用したので、自信を持ってクイックにRAGアプリケーションをプロダクションにデプロイすることができます。本記事では、LLM評価における学びを提供するために、Databricksで実施している一連の調査の最初の部分を説明します。この記事のすべてのリサーチはDatabricksのシニアソフトウェアエンジニアであり、[Databricks Documentation AI Assistant](https://docs.databricks.com/)のクリエーターである[Quinn Leng](mailto:quinn.leng@databricks.com)によって実施されました。

# 自動評価実践における課題

最近では、LLMコミュニティは自分たちのLLMのアウトプットを評価するために、GPT-4のようなパワフルなLLMを用いた自動評価のために「審判としてのLLM」の活用を探索しています。lmsysグループの[研究論文](https://arxiv.org/abs/2306.05685)では、ライティング、数学、世界の知識における審判として様々なLLM(GPT-4, ClaudeV1, GPT-3.5) のpros/consとフィージビリティを探索しています。

このようなすべての偉大な研究に関わらず、実践としてのLLM審判の適法方法に関しては、依然として数多くの未解答の質問が存在しています:

- **人間の評点とのアラインメント:** ドキュメントのQ&Aチャットbotでは特に、回答の適切性、可読性、網羅性において、LLMの審判による評点は、実際の人間の嗜好をどの程度反映しているのでしょうか？
- **サンプルを通じた精度:** LLM審判に対していくつかの評点例を提供することの効果はどのようなものでしょうか？異なるメトリクスに対してLLM審判の信頼性と再利用性をどのように増加させるのでしょうか？
- **適切な評点のスケール:** 様々なフレームワークで様々な評点スケールが使用される(例: [AzureML](https://techcommunity.microsoft.com/t5/ai-machine-learning-blog/harness-the-power-of-large-language-models-with-azure-machine/ba-p/3828459)では0から100を使い、[langchain](https://autoevaluator.langchain.com/)ではバイナリースケールを使用)ので、どの評点スケールが推奨となるのでしょうか？
- **ユースケース横断の適用性:** 同じ評価メトリックを用いて、どの程度まで評価メトリクスを異なるユースケース(例: 日常的なチャット、コンテンツの要約、検索拡張生成)で再利用できるのでしょうか？

# RAGアプリケーションへの効果的な自動評価の適用

上述した質問に対する選択肢をDatabricksにおけるチャットbotの文脈で探索しました。我々の発見は汎化することができ、低コストかつ迅速にRAGベースのチャットbotを効果的に評価する助けになるものと信じています:

- **80%以上の判定で、審判としてのLLMは人間の評点と一致しています。** 我々のドキュメントベースのチャットbotの評価に対する審判としてのLLMは、人間の審判と同じように効果的であり、80%以上の斑点で完全にスコアがマッチし、95%以上の判定では1スコアの距離(0-3スケールを使用)となっています。
- **サンプルとGPT-3.5を用いてコストを削減します。** それぞれの評点スコアに例を提供した場合、GPT-3.5をLLM審判として活用することができます。コンテキストサイズの制限のため、低精度の評点スケールを用いることが実践的です。GPT-4ではなく、GPT-3.5とサンプルを用いることで、LLM審判のコストを10倍削減し、スピードを3倍以上に高速化します。
- **解釈を容易にするために低精度の評点スケールを使用します。** 0、1、2、3あるいはバイナリー(0、1)のような低精度の評点スケールでも、0から10.0や0から100.0のような高精度の評点スケールと同様の精度を保ちつつも、人間のアノテーターやLLM審判の両方に評点の指示を行うことが非常に簡単になることを知りました。また、低精度のスケールによって、異なるLLM審判(GPT-4やclaude2など)での評点スケールの一貫性を実現します。
- **RAGアプリケーションには自身のベンチマークが必要です。** あるモデルは公開された特定のベンチマーク(カジュアルなチャット、数式、クリエイティブな記述など)では良いパフォーマンスを示すかもしれませんが、他のタスク(特定のコンテキストにおけるQ&A)での優れたパフォーマンスを保証するものではありません。ユースケースがマッチする場合にのみベンチマークを使用すべきであり、RAGアプリケーションはRAGベンチマークによってのみ評価されるべきです。

我々の研究に基づき、LLM審判を用いる際には以下の手順を踏むことをお勧めします:

1. 1-5の評点スケールを用いる
1. 評点ルールを理解するためにサンプルなしにGPT-4をLLM審判として活用する
1. スコアごとに一つの例を用いてGPT-3.5にLLM審判をスイッチする

# ベストプラクティスを確立する我々の方法論

この記事の残りでは、これらのベストプラクティスを構成するために実施した一連の実験をウォークスルーします。

## 実験環境

![](https://cms.databricks.com/sites/default/files/inline-images/image10.png)

この実験では3つのステップがあります:

1. **評価データセットの生成:** Databricksドキュメントから100の質問とコンテキストを作成しました。このコンテキストは質問に適切なドキュメント(の塊)を表現しています。
![Screenshot 2023-10-03 at 8.09.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/de0ce5be-b259-c964-1f74-572e859df018.png)
1. **回答シートの生成:** 評価データセットを用いて、解答を生成するためにいくつかの言語モデルにプロンプトを支持し、「回答シート」と呼ばれるデータセットに質問・コンテキスト・回答ペアを格納しました。この調査では、GPT-4、GPT-3.5、Claude-v1、Llama2-70b-chat、Vicuna-33b、mpt-30b-chatを使用しました。
1. **評点の生成:** 回答シートを用いて、評点を生成し、理由づけを行うために様々なLLMを使用しました。評点は、適切性(60%の重み)、包括性(20%の重み)、可読性(20%の重み)から構成されます。生成された回答における適切性に対する嗜好を反映するためにこの重みづけスキームを選択しました。他のアプリケーションにおいては、これらの重みをチューニングするかもしれませんが、依然として適切性が重要な要素になると思います。

さらに、潜在的なバイアスを回避し、信頼性を改善するために以下の技術を用いています:

- 再現性を確保するために低いtemperature(temeratureは0.1)。
- ペアごとの比較ではなく単一回答の評点。
- 最終のスコアを出す前に評点プロセスに関する理由づけをLLMに行わせるためのCahin of thoughts。
- それぞれの要素に対する個々のスコアの評点スコアにおける、いくつかの例がLLMに示されるFew-shots生成。

## 実験1: 人間の評点とのアライン

人間のアノテーターとLLM審判の一致レベルを確認するために、人間によるラベルを得るためにgpt-3.5-turboとvicuna-33bの回答シートをラベリング企業に送付し、GPT-4の評点アウトプットの結果と比較しました。以下が得られた知見です:

- 適切性と可読性スコアにおいて、人間とGPT-4審判は80%以上の一致がありました。そして、要件を引き下げ1スコアの違いを許容するのであれば、一致レベルは95%以上となります。
![](https://cms.databricks.com/sites/default/files/inline-images/image7_1.png)

包括性メトリックのアライメントは低く、これはビジネスステークホルダーが「包括性」は適切性や可読性よりも主観的であると共有した内容とマッチしています。

## 実験2: サンプルを通じた精度

lmsysの論文では、レスポンスの有用性、適切性、精度、深さ、創造性、詳細レベルに基づいて評価を行うために、LLM審判への指示にこの[プロンプト](https://github.com/lm-sys/FastChat/blob/main/fastchat/llm_judge/data/judge_prompts.jsonl)を使用しています。しかし、この論文では評点指示の詳細は共有されていません。我々の研究では、以下のように最終スコアに大きな影響を与える要素が数多く存在することがわかりました:

- 様々な要素の重要性: 有用性、適切性、精度、深さ、創造性
- 有用性は曖昧であるというような要因の解釈
- 回答は有用だが正確でないというように、それぞれの要素の競合

以下をトライすることで、特定の評点スケールに対するLLM審判への指示を開発しました:

1. **オリジナルのプロンプト**: lmsys論文で使用されたオリジナルのプロンプトは以下の通りです:

    > Please act as an impartial judge and evaluate the quality of the response provided by an AI assistant to the user question displayed below. Your evaluation should consider factors such as the helpfulness, relevance, accuracy, depth, creativity, and level of detail of the response. Begin your evaluation by providing a short explanation. Be as objective as possible. After providing your explanation, you must rate the response on a scale of 1 to 10 by strictly following this format

    我々の適切性、包括性、可読性に関するメトリクスを反映するために、オリジナルのlmsys論文のプロンプトを適合させ、(chain-of-thoughtの理由づけを活用するために)それぞれのスコアを出す前に一行の理由づけを行うように審判にプロンプトを提供しました。以下には、サンプルを指定しないzero-shotバージョンのプロンプトと、それぞれのスコアごとに一つの例を指定するfew-shotバージョンのプロンプトを示します。そして、入力として同じ回答シートを用い、2つのプロンプトタイプの評点結果を比較しました。

1. **ゼロショットの学習**: には、LLM審判は我々の適切性、包括性、可読性を反映することが必要であり、それぞれのスコアごとに1行の理由づけを行うように審判にプロンプトを提供しています。

    > Please act as an impartial judge and evaluate the quality of the provided answer which attempts to answer the provided question based on a provided context.
    > 
    >   You'll be given a function grading_function which you'll call for each provided context, question and answer to submit your reasoning and score for the correctness, comprehensiveness and readability of the answer. 

1. **数ショットの学習**: 評点スケールにおけるそれぞれのスコアに対する明示的なサンプルを提供するためにゼロショットプロンプトを修正しました:

    >   Please act as an impartial judge and evaluate the quality of the provided answer which attempts to answer the provided question based on a provided context.
    >   
    >   You'll be given a function grading_function which you'll call for each provided context, question and answer to submit your reasoning and score for the correctness, comprehensiveness and readability of the answer. 
    >   
    >     
    >   
    >   Below is your grading rubric: 
    >   
    >   - Correctness: If the answer correctly answer the question, below are the details for different scores:
    >   
    >     - Score 0: the answer is completely incorrect, doesn’t mention anything about the question or is completely contrary to the correct answer.
    >   
    >         - For example, when asked “How to terminate a databricks cluster”, the answer is empty string, or content that’s completely irrelevant, or sorry I don’t know the answer.
    >   
    >     - Score 1: the answer provides some relevance to the question and answers one aspect of the question correctly.
    >   
    >         - Example:
    >   
    >             - Question: How to terminate a databricks cluster
    >   
    >             - Answer: Databricks cluster is a cloud-based computing environment that allows users to process big data and run distributed data processing tasks efficiently.
    >   
    >             - Or answer:  In the Databricks workspace, navigate to the "Clusters" tab. And then this is a hard question that I need to think more about it
    >   
    >     - Score 2: the answer mostly answer the question but is missing or hallucinating on one critical aspect.
    >   
    >         - Example:
    >   
    >             - Question: How to terminate a databricks cluster”
    >   
    >             - Answer: “In the Databricks workspace, navigate to the "Clusters" tab.
    >   
    >             Find the cluster you want to terminate from the list of active clusters.
    >   
    >             And then you’ll find a button to terminate all clusters at once”
    >   
    >     - Score 3: the answer correctly answer the question and not missing any major aspect
    >   
    >         - Example:
    >   
    >             - Question: How to terminate a databricks cluster
    >   
    >             - Answer: In the Databricks workspace, navigate to the "Clusters" tab.
    >   
    >             Find the cluster you want to terminate from the list of active clusters.
    >   
    >             Click on the down-arrow next to the cluster name to open the cluster details.
    >   
    >             Click on the "Terminate" button. A confirmation dialog will appear. Click "Terminate" again to confirm the action.”
    >   
    >   - Comprehensiveness: How comprehensive is the answer, does it fully answer all aspects of the question and provide comprehensive explanation and other necessary information. Below are the details for different scores:
    >   
    >     - Score 0: typically if the answer is completely incorrect, then the comprehensiveness is also zero score.
    >   
    >     - Score 1: if the answer is correct but too short to fully answer the question, then we can give score 1 for comprehensiveness.
    >   
    >         - Example:
    >   
    >             - Question: How to use databricks API to create a cluster?
    >   
    >             - Answer: First, you will need a Databricks access token with the appropriate permissions. You can generate this token through the Databricks UI under the 'User Settings' option. And then (the rest is missing)
    >   
    >     - Score 2: the answer is correct and roughly answer the main aspects of the question, but it’s missing description about details. Or is completely missing details about one minor aspect.
    >   
    >         - Example:
    >   
    >             - Question: How to use databricks API to create a cluster?
    >   
    >             - Answer: You will need a Databricks access token with the appropriate permissions. Then you’ll need to set up the request URL, then you can make the HTTP Request. Then you can handle the request response.
    >   
    >         - Example:
    >   
    >             - Question: How to use databricks API to create a cluster?
    >   
    >             - Answer: You will need a Databricks access token with the appropriate permissions. Then you’ll need to set up the request URL, then you can make the HTTP Request. Then you can handle the request response.
    >   
    >     - Score 3: the answer is correct, and covers all the main aspects of the question
    >   
    >   - Readability: How readable is the answer, does it have redundant information or incomplete information that hurts the readability of the answer.
    >   
    >     - Score 0: the answer is completely unreadable, e.g. fully of symbols that’s hard to read; e.g. keeps repeating the words that it’s very hard to understand the meaning of the paragraph. No meaningful information can be extracted from the answer.
    >   
    >     - Score 1: the answer is slightly readable, there are irrelevant symbols or repeated words, but it can roughly form a meaningful sentence that cover some aspects of the answer.
    >   
    >         - Example:
    >   
    >             - Question: How to use databricks API to create a cluster?
    >   
    >             - Answer: You you  you  you  you  you  will need a Databricks access token with the appropriate permissions. And then then you’ll need to set up the request URL, then you can make the HTTP Request. Then Then Then Then Then Then Then Then Then
    >   
    >     - Score 2: the answer is correct and mostly readable, but there is one obvious piece that’s affecting the readability (mentioning of irrelevant pieces, repeated words)
    >   
    >         - Example:
    >   
    >             - Question: How to terminate a databricks cluster
    >   
    >             - Answer: In the Databricks workspace, navigate to the "Clusters" tab.
    >   
    >             Find the cluster you want to terminate from the list of active clusters.
    >   
    >             Click on the down-arrow next to the cluster name to open the cluster details.
    >   
    >             Click on the "Terminate" button…………………………………..
    >   
    >             A confirmation dialog will appear. Click "Terminate" again to confirm the action.
    >   
    >     - Score 3: the answer is correct and reader friendly, no obvious piece that affect readability.
    >   
    >   - Then final rating:
    >   
    >       - Ratio: 60% correctness + 20% comprehensiveness + 20% readability

この実験では、いくつかのことを学びました:

- **GPT-4とFew shotsプロンプトでは、結果の一貫性大きな違いはありませんでした。** サンプルと詳細な評点手順を含めた際、様々なLLMモデルにおいてGPT-4の評点結果において大きな改善は認められませんでした。興味深いことに、スコアのレンジにおいてはわずかなブレを引き起こしました。
![](https://cms.databricks.com/sites/default/files/inline-images/image4_3.png)
![](https://cms.databricks.com/sites/default/files/inline-images/image9.png)
- **GPT-3.5-turbo-16kに対していくつかの例を含めることで、スコアの一貫性を劇的に改善し、結果が有用なものとなりました。** 詳細な評点の手順や例を含めることで、GPT-3.5の評点結果が劇的に改善されました(チャートの右側)。GPT-4とGPT-3.5(スコア3.0 vs スコア2.6)では実際の平均スコアの値はわずかなものですが、ランキングと精度は一貫性を保っています。
- 一方、評点手順なしのGPT-3.5では結果に一貫性がなく、全く使い物になりません(スクリーンショットの左)。
- プロンプトが4kトークンよりも大きくなることがあるため、GPT-3.5-turboではなくGPT-3.5-turbo-16kを使用していることに注意してください。
![](https://cms.databricks.com/sites/default/files/inline-images/image11.png)
![](https://cms.databricks.com/sites/default/files/inline-images/image5_0.png)

## 実験3: 適切な評点スケール

審判としてのLLMに関する論文では、評点スケールで非整数値(float)の0-10のスケールを用いています。言い換えると、最終スコアで高精度の手順を使用しています。これらの高精度なスケールでは、以下のような問題を後段で引き起こすことがわかりました:

- **一貫性**: 人間とLLM両方の評価者は、高精度の評点を行う際に同じスコアに対して同じ基準を持つことに苦慮しました。このため、低精度から高精度のスケールに移行した際、様々な審判においてアウトプットのスコアの一貫性が低下しました。
- **説明可能性**: さらに、人間が判断した結果を用いてLLMが判定した結果を交差検証するさいには、回答の評点方法を指示として提供しなくてはなりません。高精度の評点スケールではそれぞれの「スコア」に対する正確な指示を提供することは非常に困難です。例えば、スコア5.6と比較してスコア5.1とスコア付けされる回答の良い例とは何でしょうか？

使用するのに「ベスト」なもののガイドを提供するために、様々な低精度評点スケールで実験を行い、最終的には整数スケール0-3あるいは([Likert](https://en.wikipedia.org/wiki/Likert_scale)スケールが好きなのであれば)0-4をお勧めすることになりました。0-10、1-5、0-3、0-1をトライし、以下を学びました:

- バイナリースケールは「使いやすさ」や「良い/悪い」のようにシンプルなメトリクスでは動作します。
- 0-10のようなスケールでは、すべてのスコアで区別のつく評価基準を確立することが困難です。

![](https://cms.databricks.com/sites/default/files/inline-images/image1_6.png)
![](https://cms.databricks.com/sites/default/files/inline-images/image2_4.png)

上のプロットにあるように、GPT-4とGPT-3.5の両方は異なる低精度評点スケールを用いた結果のランキングの一貫性を維持しています。すなわち、0-3、1-5のような低精度の評点スケールを用いることで、説明可能性と精度のバランスを取ることができます。

このため、人間によるラベルとのアラインを容易にし、スコアリングの評価基準の理由づけ、レンジのそれぞれのスコアの例を提供することを容易にするためには、0-3、1-5を評点スケールとして用いることをお勧めします。

## 実験4: ユースケースに対する適用性

[審判としてのLLM](https://arxiv.org/abs/2306.05685)に関する論文では、LLMと人間の審判の両方において、GPT-3.5に匹敵するモデルとしてVicuna-13Bをランクづけしました:
![](https://cms.databricks.com/sites/default/files/inline-images/image8.png)

(この図は論文 https://arxiv.org/pdf/2306.05685.pdf の図4です)

しかし、我々のドキュメントQ&Aのユースケースの一連のモデルをベンチマークした際、コンテキストに基づく質問に回答する際、大規模なVicuna-33BモデルがGPT-3.5よりも非常に悪いパフォーマンスを示すことを発見しました。これらの発見は、GPT-4、GPT-3.5、(実験1に示したように)人間の審判によっても、GPT-3.5よりもVicuna-33Bのパフォーマンスが低いという結果によって検証されています。
![](https://cms.databricks.com/sites/default/files/inline-images/image1_6.png)

論文によって提案されているベンチマークデータセットを細かく見ていくと、[3カテゴリーのタスク](https://arxiv.org/pdf/2306.05685.pdf)(ライティング、数学、知識)が直接反映されておらず、コンテキストに基づく解答を合成するモデルの能力に貢献していませんでした。代わりに、ドキュメントQ&Aユースケースは直感的に、読解力と指示追従力に関するベンチマークを必要とします。このため、**評価結果はユースケース横断で転移することができず**、モデルがどれだけ顧客の要件に合致するのかを適切に評価するためには、ユースケース固有のベンチマークを構築する必要があります。

# ベストプラクティスを活用するためにMLflowを使用

上述の実験によって、我々はさざまな要素がどのようにチャットbotの評価に大きな影響を及ぼすのかを探索し、審判としてのLLMはドキュメントQ&Aユースケースにおいて人間の嗜好を大きく反映することを確認しました。Databricksにおいては、これらの発見に基づいてチームの皆様がLLMアプリケーションを効果的に評価できるように、MLflow Evaluation APIを進化させています。MLflow 2.4では、様々なモデルのテキスト出力を隣り合わせで比較できるように、LLM向けEvaluation APIを導入し、MLflow 2.6では毒性や複雑性のような評価のためのLLMベースのメトリクスを導入しており、近い将来に審判としてのLLMをサポートするように取り組んでいます！

同時に、我々の研究で参照しているリソースを以下にまとめました:

- [Doc\_qa repository](https://github.com/databrickslabs/doc-qa)
    - 実験を実行するために使用したコードとデータ
- [LLM\-as\-Judge Research paper from lmsys group](https://arxiv.org/abs/2306.05685)
    - この論文は、カジュアルチャットのユースケースにおいて審判としてのLLM(GPT-4、ClaudeV1、GPT-3.5)を用いた最初の研究であり、ライティング、数学、世界の知識におけるタスクの審判としてのLLMの活用における実現可能性とprosとconsを積極的に探索しています。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)