はじめての Azure AI Studioの評価機能：苦戦したポイントと解決策

Azure AI Studioで自動評価機能を初めて使ってみたので、
使い方と、はまった所について紹介します。


## Azure AI Studioの評価機能について
Azure AI Studioの評価機能について
Azure AI Studioには、手動評価機能と自動評価機能があります。
どちらも自前のデータセットを使って、プロンプトの精度を評価することができます。
詳しくは、([こちら](https://learn.microsoft.com/ja-jp/azure/ai-studio/how-to/evaluate-generative-ai-app)）
当記事では、上記のリンク先の内容を参考に、自動評価の機能を使ってみた手順と苦戦した部分も併せて紹介します。

# 今回評価するプロンプト
今回は、文章の誤字を検知してくれるプロンプトを用意しました。
出力結果は、シンプルに"true"or"false"とします。
```
入力された文章に誤字があるかないかを判定してください。
誤字がない場合、trueを、
誤字がある場合、falseを出力してください。
```

# 手順
1. プロンプトフロー作成
任意のプロンプトフローを作成します
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620257/5518188b-bb27-b4b3-c9ed-19e4587bd931.png)
1. 評価作成
[評価]>[新しい評価]開きます
今回は、 [コンテキストを含まない質問と回答]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620257/c35489ad-4f9a-80dc-ae00-08f097d9d1b4.png)

1. データセットの追加

    ```
    {"content":"昨日は友達と営画を見ました。","ground_truth":"false","chat_history":"[]"}
    {"content":"彼女は毎朝ジョギングをしていまう","ground_truth":"false","chat_history":"[]"}
    {"content":"図書館で本を狩りる","ground_truth":"false","chat_history":"[]"}
    {"content":"彼はとても賢しい人です。","ground_truth":"false","chat_history":"[]"}
    {"content":"その映画はとてもかんどうしました。","ground_truth":"false","chat_history":"[]"}
    {"content":"彼女は毎朝ジョギングをしています。","ground_truth":"true","chat_history":"[]"}
    {"content":"私の趣味は写真を撮ることです。","ground_truth":"true","chat_history":"[]"}
    {"content":"その映画はとても感動しました。","ground_truth":"true","chat_history":"[]"}
    {"content":"彼女は音楽を聴くのが好きです。","ground_truth":"true","chat_history":"[]"}
    {"content":"今日はたくさんの宿題があります。","ground_truth":"true","chat_history":"[]"}
    ```
    "content" が、入力したい文章です。
    "ground_truth"が、正解の出力です。
    "chat_history"は、今回は必要ないですが、こちらの列も定義します。
    データセットを追加後、データセットをマッピングします。
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620257/c3a7955c-083b-8d2f-3d0b-e446a12e6e93.png)
    
    正解との違いを評価したいので、【GPTの類似性】を選択します。
    任意のモデル（今回は、gpt-4o）を接続します。
    また、データセットもマッピングします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620257/5d704863-0975-42e2-9eb9-192fb9cb5f18.png)

1. 評価
データを確認し、送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620257/f0b96c7b-80b5-d567-d051-5bb68fa3ba31.png)
しばらくすると、以下のような評価結果が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620257/93b2490a-957e-1f42-f908-e72d0f640cfd.png)


# 苦戦した所
最初、上記のデータセットのchat_historyは、**chat_history:""** と設定していたため、
ログには、以下のエラーが発生していました。
```
 "debugInfo": {
    "type": "InputMappingError",
    "message": "The input for batch run is incorrect. Input from key 'run.outputs' is an empty list, which means we cannot generate a single line input for the flow run. Please rectify the input and try again.",
    "stackTrace": "Traceback (most recent call last):\n  File \"/azureml-envs/prompt-flow/runtime/lib/python3.9/site-packages/promptflow/runtime/runtime.py\", line 1146, in execute_bulk_run_request\n    batch_result: BatchResult = batch_engine.run(\n  File \"/azureml-envs/prompt-flow/runtime/lib/python3.9/site-packages/promptflow/batch/_batch_engine.py\", line 271, in run\n    raise e\n  File \"/azureml-envs/prompt-flow/runtime/lib/python3.9/site-packages/promptflow/batch/_batch_engine.py\", line 243, in run\n    batch_inputs = batch_input_processor.process_batch_inputs(input_dirs, inputs_mapping)\n  File \"/azureml-envs/prompt-flow/runtime/lib/python3.9/site-packages/promptflow/batch/_batch_inputs_processor.py\", line 36, in process_batch_inputs\n    return self._validate_and_apply_inputs_mapping(input_dicts, inputs_mapping)\n  File \"/azureml-envs/prompt-flow/runtime/lib/python3.9/site-packages/promptflow/batch/_batch_inputs_processor.py\", line 129, in _validate_and_apply_inputs_mapping\n    resolved_inputs = self._apply_inputs_mapping_for_all_lines(inputs, inputs_mapping)\n  File \"/azureml-envs/prompt-flow/runtime/lib/python3.9/site-packages/promptflow/batch/_batch_inputs_processor.py\", line 192, in _apply_inputs_mapping_for_all_lines\n    merged_list = self._merge_input_dicts_by_line(input_dict)\n  File \"/azureml-envs/prompt-flow/runtime/lib/python3.9/site-packages/promptflow/batch/_batch_inputs_processor.py\", line 210, in _merge_input_dicts_by_line\n    raise InputMappingError(\n",
    "innerException": null
  }
```
データセットを **chat_history:"[]"** と設定したら、解決しました。
このエラーメッセージから原因にたどり着くのは、時間がかかりました・・・


# まとめ
データセットの形式によるエラーで少し苦戦しましたが、
この機能を使うことで、プロンプトのテストを繰り返し行うことができるようになりました。
評価機能を使う場合は、以下の点に注意が必要でした。

・ 自動評価に使うカラムがデータセットに存在しているか
　(question,ground_truth,chat_history)  
・ chat_history は正しく定義しているか
    ```
    NG:chat_history:""
    ```
    ```
    OK:chat_history:"[]"
    ```


評価機能を使い、より精度の高いプロンプトを書けるように頑張ろうと思います。

# 参考
Azure OpenAI Service のドキュメント - クイックスタート、チュートリアル、API リファレンス - Azure AI サービス | Microsoft Learn
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/

【技術Tips】Prompt Flow（Azure AI Studio）を使用したRAG入門　第２回 - TECH Street (テックストリート)
https://www.tech-street.jp/entry/2024/07/01/152113