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

[Azure AI Studio](https://ai.azure.com/) はプロンプトのテストと評価の機能が充実しており、テストについては複数の LLM を同時に実行して結果を比較したり、プロンプトのバリエーションを簡単に比較することができます。評価機能では様々な組み込み評価機能が搭載されており、評価データセットを用いて作成中のチャットアシスタントのフローや外部アシスタントからの出力結果をインポートして評価することができます。これらを Azure 上でフルマネージドかつブラウザ UI から簡単に行えるので、面倒な環境構築やサーバー運用は必要ありません。

### ①テスト
単一のデータを使用してフローの実行結果のみを取得します
1. プロンプト/LLM の実行結果を比較したい
    1. 同じプロンプトで LLM を比較したい
    1. 同じ LLM でプロンプトを比較したい

### ②評価
複数のデータを使用して評価メトリクスを算出します。必ずしもフローの実行結果を使用しなくても評価可能。
1. 自動評価とカスタム評価、手動評価
    1. 作成中のフローを評価したい場合
    1. 別システムからの出力結果がすでにある場合


# ①テスト：プロンプト/LLM の実行結果を比較したい

シンプルに LLM の実行結果を比較したい場合、標準フローを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/92e8200d-515a-ccf2-9ef9-d3afebcd75eb.png)

## 事前準備
Azure AI Studio ハブ、プロジェクトを作成します。

https://github.com/nohanaga/aistudio-handson/blob/main/README.md#%E6%BA%96%E5%82%99

1. [Azure AI Studio ハブの作成](https://github.com/nohanaga/aistudio-handson/blob/main/1_create_hub.md)
1. [Azure AI Studio プロジェクトの作成](https://github.com/nohanaga/aistudio-handson/blob/main/2_create_project.md)
1. [MaaS サーバーレス API の作成](https://github.com/nohanaga/aistudio-handson/blob/main/3_create_maas.md)


### 1. サンプルの Python フローを削除
フローをシンプル化するためにデフォルトの Python フローを削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/7e3e4e44-b590-fd67-03d9-acbd0063dc58.png)

### 2. LLM ノードの名前を変更
デフォルトのノード名を任意のノード名に変更できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/9d21135f-65e7-ae88-e46c-c5ced6f5b379.png)

### 3. 出力結果に接続する
ひとつ前のノードを削除したので、最終出力 `outputs` との接続が切れてしまっています。これを `prompt` ノードと接続し直せば OK です。デフォルトの名前 `joke` も任意の名前に変更してしまいましょう。最終的に結果 JSON に反映されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/ea7c0a3f-5224-02ca-ba42-e276dfc4454a.png)



# 1. 同じプロンプトで LLM を比較したい
### 1.1. 接続済みモデルのセット
Azure AI Studio では別リージョンにデプロイされている Azure OpenAI Service エンドポイントも使用することができます。また、[MaaS デプロイ](https://learn.microsoft.com/azure/ai-studio/how-to/deploy-models-serverless?tabs=azure-ai-studio)したモデルについても[接続設定](https://learn.microsoft.com/azure/ai-studio/how-to/deploy-models-serverless-connect?tabs=azure-ai-studio#create-a-serverless-api-endpoint-connection)を行うことで Studio 上で使用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/ef60fc6f-caa7-11bf-9ec3-3812e33c9e9f.png)

### 1.2. バリアントの生成
LLM ノードで「バリアントの生成」ボタンをクリックすると、生成ペインが表示されます。ここで比較したい別パターンのプロンプトを入力することもできますし、別の OpenAI モデルを選択することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/0f3a35f3-ce35-3552-2dfe-43a9e8dca369.png)

### 1.3. バリアント #1 に別の LLM をセット
「バリエーションを表示する」ボタンをクリックすると、生成されたバリアント #1 が表示されます。デフォルトのバリアントは #0 となります。右のフローの LLM ノードが複数表記になりました。ここでは、モデルカタログで Maas デプロイした [Phi-3-medium-4k-instruct](https://ai.azure.com/explore/models/Phi-3-medium-4k-instruct/version/3/registry/azureml) エンドポイントを指定します。MaaS の[サーバーレス API](https://learn.microsoft.com/azure/machine-learning/concept-model-catalog?view=azureml-api-2#model-deployment-managed-compute-and-serverless-api-pay-as-you-go) は **OpenAI API と同じインターフェースを持つ**ため、既存の LLM ノードで OpenAI と同様に扱うことができます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/c225b749-5b93-e8e9-00ea-87a1716fa2a0.png)

LLM が気を利かせて？新しいバリアントのプロンプトを変更してくれてますが、気にせずコピペします。

### 1.4. コンピューティングセッションの実行
フローの実行には[コンピューティングセッション](https://learn.microsoft.com/azure/ai-studio/how-to/create-manage-compute-session)の実行が必要です。デフォルトでは、`Standard_E4s_v3` が実行されますが、詳細設定から別の VM を選択することもできます。ここは有料ですが、デフォルトで非アクティブ状態が 1 時間続くと自動でシャットダウンされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/00f7f448-a13d-a8ec-5b7a-886d126d12d2.png)

### 1.5. フロー実行の送信
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/ac43e244-a95e-28f2-ff14-9e73cd00990b.png" width="400px" />

### 1.6. テスト結果の表示
実行結果はバリアントごとに「トレースの表示」ボタンを押して遷移してもいいですし、「テスト結果の表示」を押して一覧を表示することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/083e91d3-6fea-92f4-9109-301e19e11a39.png)

### 1.7. トレース一覧
バリアントごとの実行結果は実行順のトレース一覧に表示されます。`gpt-4o` と `Phi-3-medium-4k-instruct` の実行結果が表示されています。より詳細な結果は名前をクリックします。残念ながらこの一覧ではバリアント No. が表示されていませんね。今後の改善に期待しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/32e01b8c-7c90-b4c4-24d9-b2dbd30b0832.png)

### 1.8. バリアントの実行結果のトレース
実行結果の詳細は「トレース」機能によって可視化されます。トレース機能は複雑な LLM コールを階層化して表示する新しい機能です。モデル名は LLM 階層の右上に表示されています。結果がおかしいなとすぐ気づくことができますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/c5aa51dd-35aa-a6ae-6481-8d706df86e8b.png)

このトレース機能は Prompt flow SDK からも利用可能です。

https://qiita.com/nohanaga/items/58d9b82e8b4d741f6a4e



# 2. 同じ LLM でプロンプトを比較したい
この場合は簡単です。モデル接続はバリアント #0 と同じものをセットして、プロンプトを書き換えるだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/2a872d6f-d1e2-5258-5e1a-a170d262aba6.png)

はい、以下のように結果が変わりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/73ed59dd-d135-933d-93c4-4ec0f614dd5b.png)

# チャットフローのテスト
**チャットフロー**ではチャット履歴 `chat_history` が考慮されます。これは毎回のリクエストで蓄積した過去のチャットデータを送信することで実現しています。「💭チャット」ボタンでチャット UI 上でフローのテストが可能ですが、バリアントについては既定のバリアントのみが使用される仕様となっているため、別のバリアントの出力結果を参照したい場合は評価機能を使用する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/c80cc734-23b0-d695-7d94-efc68dcc6ba4.png)

本記事は最もシンプルなフローで試していますが、フロー内に RAG のためのフローを挿入した場合も当然テスト可能です。

# ②評価
自動評価とカスタム評価、手動評価機能が用意されています。評価データセットを用いて以下の用途に分けて評価を実施します。

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

長くなりますので、続きは別記事で！

https://qiita.com/nohanaga/items/ceccd4678f9c22fb7a0b


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