Azure AI Studio Prompt flow によるプロンプトのテストと評価ハンズオン②

Azure AI Studio の Prompt flow によるテストと評価のハンズオン第二回目は評価機能を使用してテストデータを評価します。

1. 自動評価とカスタム評価、手動評価
    1. 作成中のフローを評価したい場合
    1. 別システムからの出力結果がすでにある場合


# 1. 作成中のフローを評価したい場合
[前記事](https://qiita.com/nohanaga/items/a261b5b15bd8135650ab)で作成した標準フローに対して複数のデータを投入して結果メトリクスを比較します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/01cd096d-bfc1-9e16-8ae6-3a9907737228.png)


## 1.1. コンテキストを含まない質問と回答
今回はコンテキストを含まない質問と回答の評価を行います。コンテキストが無いということは、RAG 等でグラウンディングするための `context` データが無いデータセットの評価ということになります。特定のフロー内から評価を実行した場合、「評価するフローを選択する」設定に自動的にフローがセットされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/cae3d87e-b743-493a-4531-0d8e170bc9ab.png)

[前記事](https://qiita.com/nohanaga/items/a261b5b15bd8135650ab)で作成した標準フローのすべてのバリアントを評価対象とします。コンテキストを含む評価は以下の RAG セクションで解説します。

https://qiita.com/nohanaga/items/9cda65aee671b0b2ef74

## 1.2. テストデータの構成
評価するデータは既存のデータを選択してもいいですし、ここからアップロードすることもできます。今回はフローの出力結果を評価の対象にするため、`answer` を含まないテストデータを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/0fb05039-1a81-34b8-b1be-8100fb6ea561.png)

### テストデータ CSV
`question`: フローに渡す質問
`answer`: 不要
`ground_truth`: 専門家が作成した質問に対する真の回答（正解）
```csvs
question,answer,ground_truth
"源実朝の趣味ってなに？",,"源実朝の趣味は和歌です。源実朝は歌人としても知られ、92首が勅撰和歌集に入集し、小倉百人一首にも選ばれています。家集として『金槐和歌集』があります。小倉百人一首では鎌倉右大臣とされています。"
"源義経が活躍した戦いとは",,"源義経の最大の功績は、平氏打倒の兵を挙げる（治承・寿永の乱）とそれに馳せ参じ、一ノ谷・屋島・壇ノ浦の合戦を経て平氏を滅ぼしたことです。源義経は治承・寿永の乱の最大の功労者となりました。"
```

この作業が一番大変かと思います。LLM の支援を受けながら、業務の専門家に作成を依頼します。

https://qiita.com/nohanaga/items/652e497068fe64e1d4cb

### データセット マッピング
評価するフローへインプットするカラムをマッピングします。標準フローの入力には `${data.question}` をセットします。

## 1.3. 評価メトリックの選択
Microsoft が監修したパフォーマンスと品質メトリックは 4 種類となります。コンテキストを含まない評価ですので、このようなラインナップとなっています。コヒーレンスと流暢性は精度や必要性の点からちょっとアレなので、GPT の類似性にチェックを入れます。メトリクスの計算には LLM を使用しますので、そのための LLM 接続設定と、評価プロンプトに投入するカラムのマッピングを実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/7e159f08-6a8e-a693-3f66-e7f6646d756b.png)

今回 LLM からの答え `answer` は標準フローからの出力結果を使用したいので、**`answer` カラムのデータソースを `${run.outputs.result}` に設定**します。ここが重要です。残りの 2 カラム（`question`, `ground_truth`）は CSV のカラム名と合わせてあるので自動的にマッピングされます。

## 1.4. 自動評価全体のフロー
ここまでの設定をまとめると以下のようなフローとなります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/c7ec9295-543f-eb88-eff8-ed0d1ff1925c.png" width="400px" />


あとは内容確認して「送信」をクリックします。

## 1.5. 評価結果
評価結果を見てみましょう。1 回の評価で 2 つのバリアントを評価しているので、上の 2 つを表示状態にします。「差分のみ表示する」は 2 つの値が異なっている項目をリストに表示します。訳が微妙ですが、「差分の表示」は数値の増減を表示する機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/7a9beeef-fb45-d409-21e5-034ffd3ece48.png)

評価データセットのレコードインデックスがデータインデックス No. に対応します。最も上部の「概要」には各メトリクスの 集計値（平均値）が表示されます。

リストの下には Charts ペインがあり、比較対象のテストごと・メトリクスごとの集計値が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/914c90fa-cc24-e38a-d9de-01828fed0808.png)

# 2. 別システムからの出力結果がすでにある場合
このシナリオの場合はフローの実行を行わず、データセットのみを使用して評価します。すでに稼働中の LLM アプリケーションからの出力を評価する際に利用できます。左メニューから「評価」を選択して「新しい評価」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/ae27a1ed-02a6-1a77-b9c4-b6cfd6ce13c1.png)

この場合、評価するフローは空欄となっており、フローを使用しない評価が利用可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/4accb0de-b0c4-ad9e-71c5-ea6ff8c08450.png)

## 2.1. テストデータの構成
今度はすでに稼働しているチャットボットアシスタントなどの別システムからの出力 `answer` を挿入した CSV を作成してアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/7f0dd4b9-b548-3c70-6817-df55f344d3fa.png)

### テストデータ CSV
`question`: フローに渡す質問
`answer`: LLM アプリケーションからの回答
`ground_truth`: 専門家が作成した質問に対する真の回答（正解）
```csvs
question,answer,ground_truth
"源実朝の趣味ってなに？","源実朝は、平安時代末期の武将・文化人であり、和歌や茶道に造詣が深く、特に和歌に熱心であったことが知られています。また、彼は詩歌を愛する文芸的な側面と、武将としての勇猛果敢な側面を兼ね備えていたことから、その多彩な趣味・才能が注目されています。","源実朝の趣味は和歌です。源実朝は歌人としても知られ、92首が勅撰和歌集に入集し、小倉百人一首にも選ばれています。家集として『金槐和歌集』があります。小倉百人一首では鎌倉右大臣とされています。"
"源義経が活躍した戦いとは","源義経（みなもとの よしつね）は、平安時代末期から鎌倉時代初期にかけて活躍した武将で、特に以下の戦いでその名を知られています。１，一ノ谷の戦い（いちのたにのたたかい）：日付：1184年2月7日概要：源義経は摂津国（現在の兵庫県）一ノ谷で、奇襲攻撃を仕掛けて平家を大敗させました。この戦いでの義経の勇敢な行動は「鵯越（ひよどりごえ）の逆落とし」として知られています。２，屋島の戦い（やしまのたたかい）：日付：1185年3月22日概要：讃岐国（現在の香川県）屋島で行われた戦い。源義経は再び奇襲攻撃を成功させ、平家を敗走させました。３，壇ノ浦の戦い（だんのうらのたたかい）：日付：1185年4月25日概要：長門国（現在の山口県）壇ノ浦で行われた最終決戦。この戦いで源氏は平家を完全に打ち破り、平家は滅亡しました。これらの戦いを通じて、源義経はその軍才と勇気で歴史に名を残しましたが、後に兄の源頼朝との対立が深まり、最終的には追討を受けることになりました。","源義経の最大の功績は、平氏打倒の兵を挙げる（治承・寿永の乱）とそれに馳せ参じ、一ノ谷・屋島・壇ノ浦の合戦を経て平氏を滅ぼしたことです。源義経は治承・寿永の乱の最大の功労者となりました。"
```

## 2.2. 評価メトリックの選択
今度は CSV ファイルの `answer` カラムを自動評価のインプットとしてマッピングします。データソースは `${data.answer}` となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/65c5a948-d1b7-99a1-25d8-755e23654dec.png)

## 2.3. 自動評価全体のフロー
図示するまでもないですが、以下のように CSV のカラムはそのまま自動評価の入力にマッピングされます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/e53920fe-9808-7ce6-a4a5-1bb77ccc26d1.png" width="400px" />

## 2.4. 評価結果
メトリックダッシュボードから評価の結果を確認します。2 レコード分の平均値のグラフ、その下にレコードごとのメトリクスの値が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/843b157f-70e9-1d13-0f89-4814f9372a18.png)

# 3. コンテキストを含む質問と回答
コンテキストを含む質問と回答を選択した場合、**根拠性**と**関連性**というメトリクスが追加されます。

根拠性：回答が入力ソース（出典）からの情報とどの程度一致しているのかを判定（`context`,`answer` が必須）
関連性：回答がどの程度適切で、提示された質問に直接関連しているかどうかを判定（`context`,`answer`,`question` が必須）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/3e239877-169f-458f-d4bd-4485f29a4217.png)

### テストデータ CSV
`question`: フローに渡す質問
`answer`: LLM アプリケーションからの回答
`context`: 検索エンジン等から取得したデータの出典
```csvs
question,answer,context
"源実朝の趣味ってなに？","源実朝は、平安時代末期の武将・文化人であり、和歌や茶道に造詣が深く、特に和歌に熱心であったことが知られています。また、彼は詩歌を愛する文芸的な側面と、武将としての勇猛果敢な側面を兼ね備えていたことから、その多彩な趣味・才能が注目されています。","1,鎌倉幕府三代将軍。頼朝の二男，頼家の弟。母は北条政子。幼名，千幡せんまん。1203年将軍となるが実権は北条氏が握った。18年右大臣。翌年正月，鶴岡八幡宮社頭で甥の公暁くぎように暗殺され，頼朝直系の子孫は断絶。万葉調の和歌に秀で，家集「金槐和歌集」がある。"
"源義経が活躍した戦いとは","源義経（みなもとの よしつね）は、平安時代末期から鎌倉時代初期にかけて活躍した武将で、特に以下の戦いでその名を知られています。１，一ノ谷の戦い（いちのたにのたたかい）：日付：1184年2月7日概要：源義経は摂津国（現在の兵庫県）一ノ谷で、奇襲攻撃を仕掛けて平家を大敗させました。この戦いでの義経の勇敢な行動は「鵯越（ひよどりごえ）の逆落とし」として知られています。２，屋島の戦い（やしまのたたかい）：日付：1185年3月22日概要：讃岐国（現在の香川県）屋島で行われた戦い。源義経は再び奇襲攻撃を成功させ、平家を敗走させました。３，壇ノ浦の戦い（だんのうらのたたかい）：日付：1185年4月25日概要：長門国（現在の山口県）壇ノ浦で行われた最終決戦。この戦いで源氏は平家を完全に打ち破り、平家は滅亡しました。これらの戦いを通じて、源義経はその軍才と勇気で歴史に名を残しましたが、後に兄の源頼朝との対立が深まり、最終的には追討を受けることになりました。","治承・寿永の乱で義経は、範頼とともに平氏追討を命ぜられ、2月4日、義経は搦手軍を率いて播磨国へ迂回し、三草山の戦いで夜襲によって平資盛らを撃破し、範頼は大手軍を率いて出征した。2月7日、一ノ谷の戦いで義経は精兵70騎を率いて、鵯越の峻険な崖から逆落としをしかけて平氏本陣を奇襲する。平氏軍は大混乱に陥り、鎌倉軍の大勝となった[注釈 9]。上洛の際、名前も知られていなかった義経は、義仲追討・一ノ谷の戦いの活躍によって歴史上の表舞台に登場することとなる。 元暦2年（1185年）2月、新たな軍を編成した義経は、暴風雨の中を少数の船で出撃。通常3日かかる距離を数時間で到着し、讃岐国の瀬戸内海沿いにある平氏の拠点屋島を奇襲し、山や民家を焼き払い、大軍に見せかける作戦で平氏を敗走させた（屋島の戦い）。義経は水軍を編成して彦島に向かい、3月24日（西暦4月）の壇ノ浦の戦いで勝利して、ついに平氏を滅ぼした[注釈 13]。 宿願を果たした義経は法皇から戦勝を讃える勅使を受け、一ノ谷、屋島以上の大功を成した立役者として、平氏から取り戻した鏡璽を奉じて4月24日京都に凱旋する。"
```

# 4. カスタム評価
カスタム評価フローを作成し、独自の評価メトリクスを実装します。

https://qiita.com/nohanaga/items/4c9d20f98c388beac666

# シリーズ
https://github.com/nohanaga/aistudio-handson