こんにちは、サイオステクノロジーの遠藤です。
今回は、Azureのプロンプトフローを利用して生成AIコンテンツを評価する方法について確認していきます。
どのように生成AIコンテンツの評価を行っていますか?
突然ですが、みなさんは生成AIアプリケーションの評価をどのように行っていますか?
個人的には、生成AIアプリを作って「いい感じに動けばOK!」という状態でも良いのかなと思ったりしますが、実際にアプリを評価しようとすると、その難しさに気づかされます。
この評価の難しさについて理解を深めるため、AIを使用しないアプリとAIを使用するアプリを比較しながら確認していきたいと思います。
生成AIを使用しないアプリケーションの場合

まず、生成AIを使用しないアプリケーション、つまりデータベースに登録された情報をもとに、Pythonアプリがデータを取得して出力するようなケースを考えます。
例えば、ユーザーが「ふじりんごの親品種は?」という質問をした場合、アプリケーションはデータベースから事前に登録された情報を検索し、正しい答えとして「国光、デリシャス」と返すでしょう。
このアプリが正しく動作しているかを評価するには、事前に想定していた出力と実際の出力が一致しているかを確認します。一致していれば正しく動作しており、異なる答えが返ってくれば何らかの問題があると判断できます。
生成AIを使用するアプリケーションの場合

次に、同じ質問を生成AIを用いたアプリケーションに投げた場合を考えてみます。
予想される出力の一例として、従来と同様に「国光とデリシャス」と返ってくることが考えられます。この場合、評価方法としては、出力が「国光とデリシャス」ならOK、「ジョナゴールド」ならNG、というように単純な一致判定が可能です。
しかし、生成AIは多様な回答を生成するため、次のような別のパターンが考えられます。
- パターン1:「国光とデリシャス」とシンプルに正しい答えを返す。 → これは従来の評価方法でも正しく判定できます。
- パターン2:「国光とデリシャス。国光は日本で古くから栽培されていた品種で、デリシャスはアメリカ原産のりんごです」といった説明が付与される。 → 想定していた出力とは異なるものの、正しい情報が含まれているため、評価方法を工夫する必要があります。
- パターン3:「ふじりんごの親品種の一つである国光は、紅玉の親でもあります」といった、質問の意図から少し外れた情報を返す。 → これは情報としては正しいものの、求めている回答とは異なるため、プロンプトを調整し、「親品種のみを答えてください」と指示を追加することで、より適切な出力を得られるようにできます。
このように、生成AIを用いたアプリケーションでは、単純な「想定された答えと一致するかどうか」だけでなく、「回答の妥当性」や「情報の過不足」なども考慮しながら評価を行う必要があります。
生成AIアプリケーションの評価の難しさ
ここまでの例で見たように、生成AIを用いたアプリケーションは確率分布を利用して新しいコンテンツを生成するため、どのような出力がなされるかを正確に予測することが困難です。
また、先ほどの例では「ふじりんごの親品種は?」という固定された入力に対して出力のバリエーションを考えましたが、生成AIアプリケーションは一般に「多様な入力を受け付ける」ことを前提とするケースが多くなります。そのため、入力のパターンが増えれば増えるほど、出力結果の予測はさらに難しくなります。
その結果、**「A = Bのときにアプリケーションは正しく動作している」**という従来のルールベースの評価方法が適用しづらくなります。たとえば、出力が「国光とデリシャス」なら正しいが、「国光とデリシャス(国光は日本発祥)」と補足説明が入ると間違いと判定される、という評価方法では、生成AIの柔軟な出力を適切に判断できません。
生成AIコンテンツの評価方法
では、どのようにして生成AIコンテンツを評価すればよいのでしょうか?
さまざまな手法が考えられていますが、そのうちの一つに**「生成AIを使って出力を評価する」**という方法があります。
つまり、生成AIが生成した出力を別の生成AIを用いて評価することで、従来の「単純な一致判定」ではなく、「内容の妥当性」や「説明の適切さ」 などを考慮した評価を行うことが可能になります。
このアプローチを簡単に実現できるのが、「プロンプトフロー」というツールです。
プロンプトフローとは?
プロンプトフロー(Prompt Flow)は、Azureが提供している生成AIのプロンプト開発・評価・管理を効率化するためのツールです。複数のプロンプトやデータ処理のステップを視覚的に組み合わせ、ワークフローとして設計・実行できる点が特徴です。作成できるワークフローとしては以下のようなものがあります。
- 標準フロー: 標準フローは一般的なアプリケーション開発用に設計されており、LLM ベースのアプリケーションを開発するための幅広い組み込みツールを使ってフローを作成できます。 さまざまなドメインのアプリケーションを開発できる柔軟性と汎用性を備えています。
- チャット フロー: チャット フローは会話型アプリケーション開発用に調整され、標準フローの機能に基づいて構築されており、チャットの入力/出力とチャット履歴管理の高度なサポートを提供します。 ネイティブ会話モードと組み込み機能により、会話コンテキストの中でシームレスにアプリケーションの開発とデバッグを行うことができます。
- 評価フロー: 評価フローは評価シナリオ用に設計されており、以前のフロー実行の出力を入力として受け取るフローを作成できます。 このフローの種類を使って以前の実行結果のパフォーマンスを評価し、関連するメトリックを出力できるので、モデルやアプリケーションの評価と改善が容易になります。
プロンプトフローの最大の特徴は「ノード」と言われる処理の単位の流れをグラフィカルに表示し、フローの流れを追える点にあります。例えば以下の画像の例では、inputノードでアプリの入力を受け取り、LLMノードで入力された質問を処理し、それをpythonできれいな形に整形して最終的にアプリケーションの出力として吐き出している様子が表現されています。

公式サイト : Azure Machine Learning プロンプト フローとは
プロンプトフローを利用してアプリを作成する
ではさっそくプロンプトフローを利用して評価を行う対象であるチャットアプリを作成してみましょう。プロンプトフローはAzure AI FoundryまたはAzure Machine Learning Studio上で構築することが可能です。今回はAzure AI Foundryを利用してプロンプトフローを利用する方法について確認していきます。
まず最初に、Azure AI Foundryを作成していきます。MarketplaceでAzure AI Foundryと検索し、手順に沿ってAzure AI Foundryを作成しましょう。

リソースが出来たら、「Launch Azure AI Foundry」をクリックします。

クリックすると、Azure AI Foundry 管理センターが表示されます。「新しいプロジェクト」をクリックします。そうするとポップアップでプロジェクト名が求められるので入力します。

完了後、プロジェクト画面に遷移します。遷移後の左のタブの「プロンプトフロー」を選択することでプロンプトフローを利用することが出来ます。

画面が遷移したら、「作成」をクリックします。

そうするとポップアップが表示されるので「チャットフロー」を選択します。

フォルダー名でフローの名前を決めます。今回は評価のときにわかりやすいように「Flow-created-for-blog」という名前にしました。

そうするとプロンプトフローの画面が表示されます。画像の①で各ノードに対する入力値や、出力の設定を行います。そして①に定義されたノード同士の関係が②に表示されています。今回作成したチャットフローは作成した段階でチャット履歴と質問を入力として受け付け、それをLLMで処理し、解答として出力するというフローが完成していて、すでに使うことができるものになっています。この画面からこのフローを動かすこともできるので早速チャットとして動かしてみましょう。動かすためには③の「コンピュータセッションの開始」をクリックします。

コンピュータセッションの開始が出来たら、①のLLMノードの接続先の設定を行います。私は接続先としてAzure Open AIのリソースを利用して設定を行いました。もし接続先として何も表示されない場合は②の管理センターからこのプロジェクトに対するAzure Open AIのモデルの紐づけや新しく作成といった設定を行うことが出来ます。設定が完了したら、③の「チャット」をクリックしましょう。そうすると、chatgptのようなチャット欄が現れるので動作しているのか確認を行ってみます。今回は「東京について教えて」というプロンプトを送ってみましたが、しっかりと解答をしてくれました。

作成したアプリを利用して評価を行う
では作成したチャットアプリケーションの評価をプロンプトフローを用いて行ってみましょう。評価を行うにはAzure AI Foundryの画面左の「評価」をクリックします。その後、画面が遷移したら「新しい評価を作成する」をクリックします。

そうするとポップアップが表示されるので一番下の「プロンプトフロー」をクリックします。

画面遷移語、「どのフローを評価しますか?」から先ほど作成したフローを選択します。完了後画面下部の「次へ」をクリックします。

画面遷移すると、評価データを求められる画面となります。データセットのファイル形式としてはcsvまたはJSONL形式を利用することが可能です。今回は事前にJSONL形式の評価用のデータセットを作成しておいたのでこれを利用して評価を行ってみましょう。データセットの内容としては上3つの質問についてはは事実に基づいたものを設定し、下2つについては誤っている答えを設定してみました。これで評価がどうなるのか確認してみましょう。
{"question":"富士山の標高は何メートルですか?", "ground_truth": "3776メートル", "chat_history": "[]"}
{"question":"日本の通貨は何ですか?", "ground_truth": "日本円(JPY)", "chat_history": "[]"}
{"question":"水の化学式は何ですか??", "ground_truth": "H2O", "chat_history": "[]"}
{"question":"アメリカの首都はどこですか?", "ground_truth": "誤った答えを設定", "chat_history": "[]"}
{"question":"地球の自転周期は何時間ですか?", "ground_truth": "約560時間", "chat_history": "[]"}
ではAI Foundryの画面に戻ってデータセットを登録する方法を確認していきます。「データセットの追加」をクリックし、「ファイルをアップロードする」からJSONLファイルを登録します。

ファイルのアップロードが完了すると、①にデータセットのプレビューが表示されます。また、②でプロンプトフローのデータセットマッピングを行いましょう。ちなみにこれはプロンプトフローのInput名とJSONLのパラメータ名が一致している場合、自動でマッピングを行ってくれます。便利ですね。もちろんInput名とパラメータ名が違う場合、手動で設定することも可能です。設定が完了したら画面下部の「次へ」を押しましょう。

画面が遷移するとどのようなメトリックで評価が行われるかが聞かれます。評価できる項目としてはプレビューなものも含めて以下の16種類の項目から評価することが出来ます。(2024/02時点)
プロンプトフローの評価項目
AI品質(AI支援)
項目 | 評価内容 |
---|---|
根拠性 | 生成 AI アプリケーションで生成された回答が、入力ソースからの情報とどの程度一致しているかを計測します。 |
関連性 | 生成 AI アプリケーションで生成された回答がどの程度適切で、提示された質問に直接関連するかを計測します。 |
コヒーレンス | 生成 AI アプリケーションが、スムーズに流れ、自然に読み取られ、人間のような言語に似た出力を生成できる程度を測定します |
流暢性 | 生成 AI アプリケーションの予測応答の言語習熟度を測定します。 |
類似性 | ソース データ (グラウンド トゥルース) 文と生成 AI アプリケーションで生成された応答の間の類似性を計測します。 |
AI品質(NLP)
項目 | 評価内容 |
---|---|
F1スコア | F1 スコアは、生成 AI アプリケーションの予測とソース データ (グラウンド トゥルース) の間で共有される単語の数の比率を測定します。 |
BLEUスコア | BLEU スコアは、1 つ以上の高品質の参照翻訳と比較することによって測定して、生成されたテキストの品質を測定します。 |
GLEUスコア | GLEU スコアは、精度と再現率の両方に焦点を当てて、生成されたテキストと参照テキストの類似性を測定し、n-gram の重複を評価します。 |
METEORスコア | METEOR スコアは、1 つ以上の参照テキストと比較して、生成されたテキストの品質を測定します。 |
ROUGEスコア | ROUGE は、モデルの出力を参照サマリと比較してテキスト生成の品質を測定します。 |
リスクと安全性のメトリック(AI支援)【プレビュー】
項目 | 評価内容 |
---|---|
自傷行為に関連するコンテンツ | 自傷行為に関連したコンテンツを生成する生成 AI アプリケーションの性質を測定します。 |
悪意ある不平等なコンテンツ | ヘイトを含む不公平なコンテンツを生成する生成 AI アプリケーションの性質を測定します。 |
暴力的なコンテンツ | 暴力的なコンテンツを生成する生成 AI アプリケーションの性質を測定します。 |
性的な内容 | 性的なコンテンツを生成する生成 AI アプリケーションの性質を測定します。 |
保護された素材 | 保護された素材が AI システムの応答に存在するかどうかを検出します。 |
間接攻撃 | 間接攻撃 (または XPIA、クロス ドメイン インジェクション攻撃) が AI システムでジェイルブレイクに成功したかどうかを検出します。 |
今回の評価対象は単純なチャットボットの評価のため、「関連性」と「類似性」について評価を行ってみます。画面から「関連性」と「類似性」にチェックをつけたら、その下の「接続」と「デプロイ名/モデル」を選択します。

画面を下にスクロールすると評価に必要な項目のマッピング画面があるのでマッピングを行います。今回はresponseとしてアプリケーションのanswer、queryとしてデータセットのquestion、ground_truthとしてデータセットのground_truthとマッピングを行いました。マッピングが完了したら、次へを押します。

ちなみにこのマッピングで求められるものは評価項目によっても変わります。生成 AI アプリケーションで生成された回答が、入力ソースからの情報とどの程度一致しているかを計測する「根拠性」を項目として設定した場合は以下のように入力ソースであるcontextが求められるようになります。評価したい内容に応じてこのデータソースの値は設定していく必要があります。

その後評価の確認画面が表示されるので画面下部の「送信」をクリックすると評価が始まります。

評価が完了したら、評価レポートを見てみましょう。メトリックダッシュボードから評価項目として設定したグラフを見ることが出来ます。今回入れたデータだと関連度は全体的に高く、類似性については2つのデータセットで1が出ているようです。

個別の評価結果を見る方法についても確認しましょう。各データに対する評価内容を詳しく見るには画面上部の「データ」タブをクリックすることで見ることが出来ます。
まず、①では、クエリに対して作成したアプリがどのような結果を返したのかを見ることが出来ます。
②では「生成 AI アプリケーションで生成された回答がどの程度適切で、提示された質問に直接関連するかを計測」してくれる関連度の点数と、関連度の理由が取り上げられています。今回の答えでは質問と応答の内容がしっかり関連度が高い状態でアプリが動作しているため全体的に点数が高くなっています。
③では「ソース データ (グラウンド トゥルース) 文と生成 AI アプリケーションで生成された応答の間の類似性を計測」してくれる類似性の点数が表示されています。今回は下2つのデータに対して、わざとground truthに誤った値を設定したことにより応答の内容と大きくground truthが大きくかけ離れた事により下2つの値が1になっています。
このような形で作成した生成AIアプリケーションの評価を行うことが出来ます。

まとめ
生成AIコンテンツの評価は従来のアプリケーションとは異なり、品質やリスクの測定が難しい課題です。しかし、プロンプトフローを活用することで、評価プロセスを効率化し、より信頼性の高い生成AIアプリケーションを開発できます。本記事で紹介したように、プロンプトフローは評価基準を明確にし、AIの品質やリスクを定量的に分析する強力なツールです。
生成AIを活用するシステムでは、評価を継続的に行いながらモデルやプロンプトを最適化していくことが重要です。プロンプトフローを活用し、より精度が高く、安全性の高いAIアプリケーションの開発に役立てていただければ幸いです。
ではまた~