Share via


JavaScript でチャット アプリの回答を評価する

この記事では、チャット アプリの回答を正しい回答または理想的な回答 (グラウンド トゥルースと呼ばれる) のセットと比較して評価する方法について説明します。 回答に影響を与えるような方法でチャット アプリケーションを変更するたびに、評価を実行して変更を比較します。 このデモ アプリケーションでは、評価を簡単に実行できるツールを提供しています。

この記事の手順に従うことで、次の操作を行います。

  • 関心領域に合わせて調整したサンプル プロンプトを使用します。 これらのプロンプトは既にリポジトリにあります。
  • 独自のドキュメントから、ユーザーへのサンプルの質問とそれらのグラウンド トゥルースの回答を生成します。
  • 生成されたユーザーへの質問を含むサンプル プロンプトを使用して評価を実行します。
  • 回答の分析を確認します。

アーキテクチャの概要

アーキテクチャの主なコンポーネントは次のとおりです:

  • Azure ホステッド チャットアプリ: チャットアプリは Azure App Service で実行されます。 チャット アプリはチャット プロトコルに準拠しているため、このプロトコルに準拠する任意のチャット アプリに対して評価を実行できます。
  • Azure AI Search: チャット アプリは Azure AI Search を使用して、独自のドキュメントのデータを保存します。
  • サンプル質問生成ツール: ドキュメントごとに複数の質問とそれらのグラウンド トゥルースを生成できます。 質問が多いほど、評価時間は長くなります。
  • 評価ツール は、サンプルの質問とプロンプトをチャット アプリに対して実行し、結果を返します。
  • 確認ツール により、評価の結果を確認できます。
  • 差分ツール により、評価間で回答を比較できます。

前提条件

  • Azure のサブスクリプション。 無料で作成できます

  • 目的の Azure サブスクリプション内の Azure OpenAI に付与されたアクセス権。

    現時点では、このサービスへのアクセスは申請によってのみ許可されます。 Azure OpenAI へのアクセスを申請するには、 https://aka.ms/oai/accessのフォームに入力してください。

  • 前述のチャット アプリの手順 を完了して、チャット アプリを Azure にデプロイします。 この手順では、データを Azure AI Search リソースに読み込みます。 このリソースは、評価が機能するために必要です。 前の手順の「リソースのクリーンアップ」セクションを完了しないでください。

    そのデプロイ (この記事では チャット アプリ と呼んでいます) から次の Azure リソース情報が必要になります。

    • Web API URI: デプロイしたチャット アプリ API の URI。
    • Azure AI Search。 次の値が必要です。
      • リソース名: Azure AI Search リソースの名前。
      • インデックス名: ドキュメントが保存されている Azure AI Search インデックスの名前。
      • クエリ キー: Search インデックスに対してクエリを実行するためのキー。
    • チャット アプリが認証を求める場合は、評価アプリがチャット アプリにアクセスできるように、ユーザー認証を無効にしておく必要があります。

    これらの情報を収集したら、もう チャット アプリ の開発環境を使用する必要はありません。 ただし、この記事の後半で、 チャット アプリ評価アプリがどのように利用するかを示すために、チャット アプリについて言及します。 この記事の手順をすべて完了するまでは、 チャット アプリ のリソースを削除しないでください。

  • 開発コンテナー 環境は、この記事を完了するために必要なすべての依存関係と共に使用できます。 開発コンテナーは、(ブラウザーで) GitHub Codespaces で実行することも、Visual Studio Code を使用してローカルで実行することもできます。

    • GitHub アカウント

開発環境を開く

この記事を完了するため、すべての依存関係がインストールされている開発環境から始めます。 このドキュメントと開発環境の両方を同時に表示できるように、モニターのワークスペースを配置する必要があります。

GitHub Codespaces は、 Visual Studio Code for the Web をユーザー インターフェイスとして使用して、GitHub によって管理される開発コンテナーを実行します。 最も簡単な開発環境では、GitHub Codespaces を使用して、この記事を完了するために正しい開発者ツールと依存関係がプレインストールされるようにします。

重要

すべての GitHub アカウントでは、2 つのコア インスタンスで毎月最大 60 時間無料で Codespaces を使用できます。 詳細については、「GitHub Codespaces に月単位で含まれるストレージとコア時間」を参照してください。

  1. main GitHub リポジトリの Azure-Samples/ai-rag-chat-evaluator ブランチに新しい GitHub Codespace を作成するプロセスを開始します。

  2. 次のボタンを右クリックします。 [リンクを新しいウィンドウで開く] を選択して、開発環境とドキュメントを同時に表示できるようにします。

  3. [codespace の作成] ページで、codespace の構成設定を確認した後に、 [新しい codespace の作成]を選択します

    新しい codespace 作成前の構成画面のスクリーンショット。

  4. Codespace が起動するまで待ちます。 この起動プロセスには数分かかることがあります。

  5. 画面の下部にあるターミナルで、Azure Developer CLI を使用して Azure にサインインします。

    azd auth login --use-device-code
    
  6. ターミナルからコードをコピーし、ブラウザーに貼り付けます。 手順に従って、Azure アカウントで認証します。

  7. 評価アプリに必要な Azure リソース、Azure OpenAI をプロビジョニングします。

    azd up
    

    これにより、評価アプリはデプロイされませんが、開発環境で Azure OpenAI リソースが作成されます。このリソースには、評価アプリをローカルで実行するために必要な GPT-4 のデプロイが含まれます。

  8. この記事の残りのタスクは、この開発コンテナーのコンテキストで行われます。

  9. GitHub リポジトリの名前が検索バーに表示されます。 これは、この評価アプリとチャット アプリを区別するのに役立ちます。 この記事では、この ai-rag-chat-evaluator リポジトリを 評価アプリ と呼んでいます。

環境値と構成情報を準備する

評価アプリ用に 前提条件 で収集した情報を使用して、環境値と構成情報を更新します。

  1. 次のコマンドを使用して、 評価 アプリのリソース情報を .env ファイルに取り込みます。

    azd env get-values > .env
    
  2. チャット アプリ からの、その Azure AI Search インスタンスに対する次の値を .env に追加します。これらの値は、 前提条件 のセクションで収集したものです。

    AZURE_SEARCH_SERVICE="<service-name>"
    AZURE_SEARCH_INDEX="<index-name>"
    AZURE_SEARCH_KEY="<query-key>"
    

    AZURE_SEARCH_KEY 値は Azure AI Search インスタンスに対する クエリ キー です。

  3. 評価アプリ のルート フォルダーにある example_config.json ファイルを新しいファイル my_config.jsonにコピーします。

  4. my_config.json の既存の内容を次の内容に置き換えます。

    {
        "testdata_path": "my_input/qa.jsonl",
        "results_dir": "my_results/experiment<TIMESTAMP>",
        "target_url": "http://localhost:50505/chat",
        "target_parameters": {
            "overrides": {
                "semantic_ranker": false,
                "prompt_template": "<READFILE>my_input/prompt_refined.txt"
            }
        }
    }
    
  5. target_urlチャット アプリからの URI 値に変更します。この値は、 前提条件 のセクションで収集したものです。 チャット アプリはチャット プロトコルに準拠している必要があります。 URI の形式は https://CHAT-APP-URL/chat です。 プロトコルと chat ルートが URI の一部であることを確認してください。

サンプル データを作成する

新しい回答を評価するには、特定の質問に対する理想的な回答である「グラウンド トゥルース」回答と比較する必要があります。 チャット アプリ用に Azure AI Search に保存されているドキュメントから質問と回答を生成します。

  1. example_input フォルダーをmy_inputという名前の新しいフォルダーにコピーします。

  2. ターミナルで、次のコマンドを実行してサンプル データを生成します。

    python3 -m scripts generate --output=my_input/qa.jsonl --numquestions=14 --persource=2
    

質問と回答のペアが生成され、次のステップで使用される評価ツールへの入力として my_input/qa.jsonl (JSONL 形式) に保存されます。 本番の評価では、このデータセットに対してより多くの QA ペア (おそらく 200 を超える) を生成することになります。

Note

ソースごとの質問と回答の数が少ないのは、この手順をすばやく完了できるようにするためです。 これは本番の評価を意図したものではなく、本番の評価ではソースごとにより多くの質問と回答が必要になります。

調整したプロンプトを使用して最初の評価を実行する

  1. my_config.json 構成ファイルのプロパティを編集します。

    • results_dir を変更して、プロンプトの名前 my_results/experiment_refined を含めるようにします。
    • prompt_template<READFILE>my_input/experiment_refined.txt に変更して、調整したプロンプト テンプレートが評価で使用されるようにします。

    調整したプロンプトは関心領域について非常に具体的です。

    If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.
    
    Use clear and concise language and write in a confident yet friendly tone. In your answers ensure the employee understands how your response connects to the information in the sources and include all citations necessary to help the employee validate the answer provided.
    
    For tabular information return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.
    
    Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].
    
  2. ターミナルで、次のコマンドを実行して評価を実行します。

    python3 -m scripts evaluate --config=my_config.json --numquestions=14
    

    これにより、評価を含む新しい実験フォルダーが my_results に作成されました。 このフォルダーには、次のような評価結果が含まれています。

    • eval_results.jsonl: 各質問と回答、および各 QA ペアの GPT メトリック。
    • summary.json: 平均 GPT メトリックなどの全体的な結果。

質の低いプロンプトを使用して 2 つ目の評価を実行する

  1. my_config.json 構成ファイルのプロパティを編集します。

    • results_dirmy_results/experiment_weak に変更します。
    • 質の低いプロンプト テンプレートを次の評価で使用するために、 prompt_template<READFILE>my_input/prompt_weak.txt に変更します。

    その質の低いプロンプトには、関心領域に関するコンテキストがありません。

    You are a helpful assistant.
    
  2. ターミナルで、次のコマンドを実行して評価を実行します。

    python3 -m scripts evaluate --config=my_config.json --numquestions=14
    

特定の温度で 3 つ目の評価を実行する

より創造的な回答を得るためのプロンプトを使用します。

  1. my_config.json 構成ファイルのプロパティを編集します。

    • results_dirmy_results/experiment_ignoresources_temp09 に変更します。
    • prompt_template<READFILE>my_input/prompt_ignoresources.txt に変更します。
    • 新しい設定として、 "temperature": 0.9 を追加します (既定の温度は 0.7 です)。 温度が高いほど、回答はより創造的になります。

    無視を指示する短いプロンプト:

    Your job is to answer questions to the best of your ability. You will be given sources but you should IGNORE them. Be creative!
    
  2. 構成オブジェクトは次のようにしますが、 results_dirは独自のものを使用してください。

    {
        "testdata_path": "my_input/qa.jsonl",
        "results_dir": "my_results/experiment_ignoresources_temp09",
        "target_url": "https://YOUR-CHAT-APP/chat",
        "target_parameters": {
            "overrides": {
                "temperature": 0.9,
                "semantic_ranker": false,
                "prompt_template": "<READFILE>my_input/prompt_ignoresources.txt"
            }
        }
    }
    
  3. ターミナルで、次のコマンドを実行して評価を実行します。

    python3 -m scripts evaluate --config=my_config.json --numquestions=14
    

評価の結果を確認する

さまざまなプロンプトとアプリ設定に基づいて 3 つの評価を実行しました。 結果は my_results フォルダーに保存されています。 設定に基づいて結果がどのように異なるかを確認します。

  1. 確認ツールを使用して、評価の結果を確認します。

    python3 -m review_tools summary my_results
    
  2. 結果は、次のようになります。

    3 つの評価を示す評価レビュー ツールのスクリーンショット。

    各値は数値とパーセンテージとして返されます。

  3. 以下の表を使用して、値の意味を理解します。

    Value 説明
    現実性 これは、モデルの回答がどの程度、事実に基づいた検証可能な情報に基づいているかを指します。 回答が事実に基づき現実を反映している場合、その回答は根拠があると見なされます。
    関連性 これは、モデルの回答がどの程度、コンテキストまたはプロンプトに関連しているかを指します。 回答がユーザーの質問や発言に過不足なく対処している場合、関連性があると見なされます。
    一貫性 これは、モデルの回答がどの程度、論理的に一貫しているかを指します。 回答が一貫していて論理的な流れを保っている場合、矛盾しないと見なされます。
    引用 これは、モデルの回答がどの程度、プロンプトで求められた形式で返されたかを指します。
    Length これは、モデルの回答の長さを測るものです。
  4. 結果として、3 つのすべての評価で関連性が高くなったものの、 experiment_ignoresources_temp09 の関連性が最も低くなりました。

  5. 評価の構成を表示するフォルダーを選択します。

  6. Ctrl + C を入力してアプリを終了し、ターミナルに戻ります。

回答を比較する

評価から返された回答を比較します。

  1. 比較する評価を 2 つ選択し、同じ評価ツールを使用して回答を比較します。

    python3 -m review_tools diff my_results/experiment_refined my_results/experiment_ignoresources_temp09
    
  2. 結果を確認します。

    評価間の評価回答の比較のスクリーンショット。

  3. Ctrl + C を入力してアプリを終了し、ターミナルに戻ります。

さらなる評価のための提案

  • my_input のプロンプトを編集して、関心領域や長さなど、回答をカスタマイズします。
  • my_config.json ファイルを編集して、 temperaturesemantic_ranker などのパラメーターを変更し、実験を再実行します。
  • さまざまな回答を比較して、プロンプトと質問が回答の質にどのような影響を与えるかを理解します。
  • Azure AI Search インデックス内のドキュメントごとに、質問とグラウンド トゥルースの回答の個別のセットを生成します。 その後、評価を再実行して、回答がどのように異なるかを確認します。
  • プロンプトの最後に要件を追加することで、より短いまたは長い回答を示すようにプロンプトを変更します。 たとえば、 Please answer in about 3 sentences.のように指定します。

リソースをクリーンアップする

Azure リソースをクリーンアップする

この記事で作成した Azure リソースは、Azure サブスクリプションに課金されます。 今後これらのリソースが必要になるとは思わない場合は、削除して、より多くの料金が発生しないようにします。

次の Azure Developer CLI コマンドを実行して、Azure リソースを削除し、ソース コードを削除します:

azd down --purge

GitHub Codespaces をクリーンアップする

GitHub Codespaces 環境を削除すると、アカウントに対して取得するコアごとの無料時間エンタイトルメントの量を最大化できることが保証されます。

重要

GitHub アカウントのエンタイトルメントの詳細については、「 GitHub Codespaces に月単位で含まれるストレージとコア時間」を参照してください。

  1. GitHub Codespaces ダッシュボード (https://github.com/codespaces) にサインインします。

  2. Azure-Samples/ai-rag-chat-evaluator GitHub リポジトリをソースとして現在実行中の Codespaces を見つけます。

    状態とテンプレートを含むすべての実行中の Codespaces のスクリーンショット。

  3. codespace のコンテキスト メニューを開いた後に、 [削除]を選択します。

    削除オプションがハイライトされた 1 つの codespace のコンテキスト メニューのスクリーンショット。

チャットアプリの記事に戻り、それらのリソースをクリーンアップします。

次のステップ