Azure AI Studio の Prompt flow の評価メトリクス紹介 ― ChatGPT どう評価する？

Azure Machine Learning / Azure AI Studio に Prompt flow が搭載され、パブリックプレビューが開始されました。Prompt flow は大規模言語モデル (LLM) を利用した AI アプリケーションの開発サイクル全体を合理化するように設計された新時代の開発ツールです。

Prompt flow には作成したフローのパフォーマンスを評価する機能が搭載されており、現在は [9 つの評価フロー](https://learn.microsoft.com/azure/machine-learning/prompt-flow/how-to-bulk-test-evaluate-flow?view=azureml-api-2)をギャラリーテンプレートから選択可能です。


本内容は「[LLM in Production Meetup #1 LLMOps -LLMの評価・品質担保-](https://llm-in-production.connpass.com/event/290321/)」イベントで登壇した内容の詳細解説です。

https://speakerdeck.com/nohanaga/azure-machine-learning-prompt-flow-ping-jia-metorikusujie-shuo

# 自動評価メトリクス
自然言語モデルの評価をする際、人間の手作業に代わり自動的に評価するためのメトリクスがこれまで多数提案されてきました。昔ながらの *n*-gram ベースのメトリクスから、最新の LLM を評価に使うものまで様々なメトリクスがあります。これらのメトリクスは人間の判断との相関関係の高さを競ってきましたが、モデルの自動評価は困難であり完璧なメトリクスは出てきていません。一部最新の LLM ベースの評価メトリクスは、人間の判断との相関関係において既存の *n*-gram ベースのメトリクスを上回ったという[報告](https://arxiv.org/pdf/2303.04048.pdf)もあります。

ただ、最新の LLM ベースのメトリクスを用いる時の注意点として、まだ論文も少なく評価が十分になされていない分野であったり、LLM の評価を LLM でするのか？という問題も提起されているため LLM ベースのメトリクスのみを利用することには注意が必要であるということです。

# 組み込み評価メトリクス一覧
| id | 評価方法 | 簡単な解説 |LLM ベース|
|:------------:|------------|------------|:-----------:|
| ①| [QnA f1 scores Evaluation](#-qna-f1-scores-evaluation)| モデルの予測値と実測値の F1 スコアを比較|No|
| ②| [QnA Ada Similarity Evaluation](#-qna-ada-similarity-evaluation)| `text-embedding-ada-002` を使って類似性を測定         |Yes|
| ③| [QnA Relevance Evaluation](#-qna-relevance-evaluation)| モデルで予測された回答が質問とどの程度関連しているかを測定|Yes|
| ④| [QnA Fluency Evaluation](#-qna-fluency-evaluation)| モデルで予測された回答の文法的および言語的な正しさを測定         |Yes|
| ⑤| [QnA Coherence Evaluation](#-qna-coherence-evaluation)| モデルで予測された回答内のすべての文の品質と、それらの首尾一貫性を測定|Yes|
| ⑥| [QnA Groundedness Evaluation](#-qna-groundedness-evaluation)| モデルの予測回答がコンテキストに対してどの程度根拠があるかを測定。グラウンディングの評価用|Yes|
| ⑦| [QnA Relevance Scores Pairwise Evaluation](#-qna-relevance-scores-pairwise-evaluation)| ユーザーの質問にどれだけマッチしているかに基づいて各回答に関連性スコアを割り当て、異なる回答をベースラインの回答と比較し、平均勝率や関連性スコアなどのメトリクスを生成 |Yes|
| ⑧| [QnA GPT Similarity Evaluation](#-qna-gpt-similarity-evaluation)| ユーザーが提供した実測値の回答とモデルで予測された回答の類似性を測定 |Yes|
| ⑨| [Classification Accuracy Evaluation](#-classification-accuracy-evaluation)| 出力を実測値と比較することで、分類システムのパフォーマンスを測定|No|

# 1. *n*-gram ベースのメトリクス
標準的な *n*-gram ベースのメトリクスは、生成文と参照文の間のトークンの重複数を測定します。適合率、再現率、F1 スコアの値を使って比較を行います。この種類のメトリクスとして [ROUGE](https://ja.wikipedia.org/wiki/ROUGE_(%E8%A9%95%E4%BE%A1%E6%8C%87%E6%A8%99)) や [BLEU](https://learn.microsoft.com/azure/ai-services/translator/custom-translator/concepts/bleu-score) がよく知られています。これらのメトリクスはたとえ意味が似ていても、トークンが完全に一致していなければ評価が得られないという制約があります。

Prompt flow のテンプレートには存在しないので、評価フローのデフォルトテンプレートから作成する必要があります。**QnA f1 scores Evaluation** がカスタムのベースとして利用できるでしょう。

## ① QnA f1 scores Evaluation
Q&A f1_score 評価フローは、予測された回答の単語数と実測値に基づく F1 スコアを使用して、Q&A システムを評価します。

デフォルトでは Python の split 関数を利用してトークンを生成（つまり空白区切り）しているので、日本語には利用できません。*n*-gram 等のしかるべきトークン化処理を施した後に利用できます。

# 2. Embeddings ベースのメトリクス
[BERTScore](https://github.com/Tiiiger/bert_score) が有名です。LLM を使用して生成した Embeddings ベクトルのコサイン距離を比較することで類似性を比較します。Prompt flow では `text-embedding-ada-002` を利用して生成文と実測値の類似度を測る **QnA Ada Similarity Evaluation** があります。

## ② QnA Ada Similarity Evaluation
Ada 類似度評価フローでは、`text-embedding-ada-002` モデルを利用してテキスト間の類似度を測定します。

`ada_similarity`： モデル予測値と実測値の Ada Embeddings のコサイン類似度を測定します。`ada_similarity` は [0, 1] の範囲の値です。

# 3. LLM ベースのメトリクス
**ChatGPT の評価に ChatGPT を使用してしまう**というメトリクス。メトリクスの一部は「[Is ChatGPT a Good NLG Evaluator? A Preliminary Study](https://arxiv.org/pdf/2303.04048.pdf)」の論文の例を参考にテンプレートとして実装したものもあります。このメトリクスの制約条件として著者が言及している通り、特定のタスクで用いることができる決定論的なメトリクスとは異なり、プロンプトの書き方に依存してしまうため特定の条件下にしか適用できない可能性があります。また、ChatGPT の学習データに評価対象のデータが含まれている可能性もあります。

## ③ QnA Relevance Evaluation
Q&A 関連性評価フローでは、最新の大規模言語モデル（LLM）を活用してQ&A 検索拡張生成システムを評価し、回答の品質と安全性を測定します。測定を支援する言語モデルとして ChatGPT を活用することで、従来の数学的な測定と比較して、人間の評価と高い一致を達成することを目指しています。

`gpt_relevance`： モデルの予測した答えが、質問された内容にどれだけ関連しているかを測定します。関連性メトリクスは 1 から 5 のスケールで採点され、1 が最も悪く、5 が最高です。

### 評価プロンプトの日本語訳
```yaml
関連性とは、文脈に基づいて、答えが質問の主要な側面にどの程度対応しているかを測るものです。
関連性を評価する際には、重要な側面がすべて、あるいは重要な側面だけが回答に含まれているかどうか
を考慮してください。文脈と質問を考慮し、以下の評価尺度を使用して、回答の関連性を星1つから5つ
の間で採点します：
星1つ: 関連性が完全に欠けている。
星2つ: 関連性がほとんどない
星3つ: 部分的に関連性がある
星4つ: 回答はほとんど関連性がある
星5つ: 関連性が完全にある

この評価値は常に1から5の間の整数でなければなりません。
つまり、生成される評価は1または2または3または4または5でなければなりません。

コンテキスト: マリー・キュリーはポーランド生まれの物理学者・化学者で、放射能研究のパイオニアであり、女性として初めてノーベル賞を受賞した。
質問: キュリー夫人が得意とした分野は？
答え: マリー・キュリーは、主に印象派のスタイルと技法に焦点を当てた有名な画家であった。
星: 1
...
```

## ④ QnA Fluency Evaluation
Q&A 流暢性評価フローでは、モデルが予測した答えが、文法的・言語的にどれだけ正しいかを測定します。

`gpt_fluency`： 流暢さは 1 から 5 までのスケールで採点され、1 が最も悪く、5 が最も良いです。

### 評価プロンプトの日本語訳
```yaml
流暢さは解答に含まれる個々の文の質を測定し、それらがよく書かれているか、文法的に正しいかを評価します。
流暢さを評価するときは個々の文の質を考慮してください。問題と解答が与えられた場合、次の評価スケールで解答
の流暢さを星1つから5つの間で採点してください：
星1つ: 流暢さが完全に欠けている。
星2つ: ほとんどが流暢さに欠けている。
星3つ: 部分的に流暢である
星4つ: ほとんど流暢
星5つ: 完璧に流暢

この評価値は常に1から5の間の整数でなければなりません。
したがって、生成される評価は1または2または3または4または5でなければなりません。

質問: 今日の朝食は何を食べましたか?
答え: シリアルとオレンジジュースを食べました。
星: 1
...
```

## ⑤ QnA Coherence Evaluation
Q&A コヒーレンス評価フローでは、モデルの予測回答に含まれるすべての文の品質と、それらの文がどのように自然に組み合わされているかを測定します。コヒーレンスとは首尾一貫性という意味です。

`gpt_coherence`： コヒーレンスは1～5のスコアで評価され、1 が最も悪く、5 が最も良いです。

### 評価プロンプトの日本語訳
```yaml
解答の一貫性は、すべての文章がどの程度まとまっているか、全体として自然に聞こえるかによって評価されます。
首尾一貫性を評価する際には、解答全体の質を考慮してください。質問と答えが与えられたら、以下の評価尺度を
使用して、答えの一貫性を1つ星から5つ星の間で採点してください：
星1つ: 答えに一貫性が全くない。
星2つ: 答えに一貫性がほとんどない
星3つ: 答えに部分的に一貫性がある
星4つ: 回答はほぼ首尾一貫している
星5つ: 答えに一貫性がある

この評価値は常に1から5の間の整数でなければなりません。
したがって、生成される評価は1または2または3または4または5でなければなりません。

質問: 好きな室内でのアクティビティとその理由を教えてください。
答え: ピザが好きです。太陽が輝いているから。
星: 1
...
```

## ⑥ QnA Groundedness Evaluation
Groundedness 評価フローでは、モデルの予測回答が**コンテキストに対してどの程度根拠があるか**を測定します。グラウンディングを使用する RAG システムの評価に利用できます。

`gpt_groundedness`（コンテキストに対する）： LLM の回答が真であっても、コンテキストに対して検証可能でなければ、そのような回答は根拠がないとみなされます。Groundedness メトリクスは 1 から 5 のスケールで採点され、1 が最も悪く、5 が最も良い。

### 評価プロンプトの日本語訳
```yaml
文脈と質問が与えられたら、答えを星1つから5つの間で採点してください。星1つは「矛盾」を意味し、星5つは
「完全な一貫性」を意味します。一貫性とは、「答えの中の事実が文脈の中の事実と一貫しているかどうか」を
測定することに注意してください。答案が事実を正確に再現しているか、事実と異なる情報をでっち上げていない
かを検討する。回答は1～5の整数のみとする。

context: {{context}}
question: {{question}}
answer: {{answer}}
stars:
```

## ⑦ QnA Relevance Scores Pairwise Evaluation
これは質問応答システムによって生成された回答の品質を評価するフローです。ユーザーの質問にどれだけマッチしているかに基づいて各回答に関連性スコアを割り当て、異なる回答をベースラインの回答と比較し、勝敗や関連性スコアなどのメトリクスを生成するために結果を集計します。

### 評価プロンプトの日本語訳
```yaml
あなたにはランキングシステムとしての役割を担ってもらいたい。
あなたの仕事は、与えられた答えの候補が与えられた質問にどの程度マッチしているかを評価し、その答えに点数
をつけることです。
以下の評価スケールを使用します：
0-20点: 答えにまったく自信がない
20-40点: ほとんど自信がない
40-60点: 部分的に自信がある
60-80点: ほとんど自信がある
80-100点: 答えは完全に自信がある

スコアは0から100の間の整数でなければなりません。整数のみを返してください。

質問 アイアンマンの俳優は誰ですか？
答え マット・サリンジャー
スコア: 20

```

### 勝敗
ベースラインとスコアを比較し、上回っていれば勝ちと判定します。
```python
"win_lose": {
"variant_0":"baseline"
"variant_1":"lose"
"variant_2":"win"
"variant_3":"win"
}
```

## ⑧ QnA GPT Similarity Evaluation
Similarity の評価フローでは、ChatGPT の**プロンプトによって類似性を判定**します。

`gpt_similarity`： ユーザが提供した回答とモデルが予測した解答の類似度を測定します。類似度は 1 から 5 のスケールで採点され、1 が最も悪く、5 が最も良いです。

### 評価プロンプトの日本語訳
```yaml
評価指標としての等価性は、予測された答えと正しい答えの類似性を測定します。予測された答えに含まれる情報
とコンテンツが正解と似ているか同等であれば、Equivalenceメトリクスの値は高く、そうでなければ低くなります。
質問、正解、および予測された答えがある場合、次の評価スケールを使用してEquivalenceメトリクスの値を決定
します：
星1つ: 予測された答えは正解とまったく似ていません。
星2つ: 予測された答えは正解とほとんど似ていません。
星3つ: 予測された答えは正解と多少似ている。
星4つ: 予測された答えは正解とほとんど似ている。
星5つ: 予測された答えは正解と完全に似ている。

この評価値は常に1から5の間の整数でなければなりません。
つまり、生成される評価は1または2または3または4または5でなければなりません。

以下の例では、質問、正解、予測される答えの等価スコアを示しています。

質問: リボソームの役割は何ですか？
正解: リボソームはタンパク質合成を担う細胞構造体である。リボソームはメッセンジャーRNA（mRNA）が伝える遺伝情報を解釈し、それを使ってアミノ酸をタンパク質に組み立てる。
予測回答: リボソームは、複雑な糖分子から栄養素を除去することにより、糖質の分解に関与する。
星: 1
```

# 4. 分類用メトリクス
## ⑨ Classification Accuracy Evaluation
これは、分類システムのパフォーマンスを評価する方法を示すフローです。各予測を実測値と比較し、「正しい」または「正しくない」の評点を割り当て、結果を集計して、システムがデータを分類する能力がどの程度あるかを反映する精度などのメトリクスを生成します。

デフォルトは完全一致比較の結果のみを返します。

# 代替メトリクス
LLM の評価を単一のメトリクスで行うのではなく、代替メトリクスとして KPI の利用を考えることもできます。Microsoft で MLOps を推進している Ito さんによる記事も大変参考になります。

https://blog.shuntaito.net/posts/begin-thinking-llmops