次の方法で共有


フロー デプロイのトレースを有効にしてフィードバックを収集する

重要

この記事で "(プレビュー)" と付記されている項目は、現在、パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

運用環境に生成 AI アプリケーションをデプロイしたら、理解を深め、パフォーマンスを最適化することができます。 要求、集計されたメトリック、ユーザー フィードバックのトレース データは、重要な役割を果たします。

この記事では、トレースを有効にし、集計されたメトリックを収集し、フローデプロイの推論時にユーザーフィードバックを収集する方法について説明します。

展開済みアプリケーション (プロンプト フロー以外) の継続的な監視を実行する改善された方法については、Azure AI オンライン評価の使用を検討してください。

[前提条件]

この機能には ハブ ベースのプロジェクト を使用する必要があります。 Foundry プロジェクトはサポートされていません。 「 自分が持っているプロジェクトの種類を確認する方法 」と 「ハブ ベースのプロジェクトを作成する」を参照してください。

  • Azure CLI と Azure CLI に対する Azure Machine Learning の拡張機能。
  • Azure AI Foundry プロジェクト。 まだプロジェクトがない場合は、プロジェクトを 作成できます。
  • Application Insights リソース。 Application Insights リソースがまだない場合は、 作成できます。
  • Azure ロールベースのアクセス制御は、Azure Machine Learning の操作に対するアクセスを許可するために使用されます。 この記事の手順を実行するには、選択したリソース グループに対する所有者または共同作成者のアクセス許可が必要です。 詳細については、 Azure AI Foundry ポータルのロールベースのアクセス制御に関するページを参照してください。

リアルタイム推論のフローをデプロイする

フローを適切にテストした後 (フレックス フローまたは DAG フロー)、運用環境にフローをデプロイできます。 この記事では、例として リアルタイム推論のフローのデプロイ を使用します。 フレックス フローの場合は、flow.flex.yaml ではなく、flow.dag.yaml ファイルを準備する必要があります

Docker コンテナーや Kubernetes クラスターなどの他のプラットフォームにデプロイすることもできます。

最新のプロンプト フロー基本イメージを使用してフローをデプロイし、トレースとフィードバック収集 API をサポートします。

デプロイのトレースを有効にしてシステム メトリックを収集する

Azure AI Foundry ポータルを使用してデプロイする場合は、デプロイ ウィザードで デプロイ>Application Insights 診断>詳細設定 を選択します。 これにより、トレース データとシステム メトリックが Application Insights にリンクされたプロジェクトに収集されます。

SDK または CLI を使用している場合は、Application Insights にリンクされたプロジェクトにデータを収集する app_insights_enabled: true プロパティをデプロイ .yaml ファイルに追加します。

app_insights_enabled: true

デプロイ .yaml ファイルに APPLICATIONINSIGHTS_CONNECTION_STRING 環境変数によって、他のアプリケーション分析情報を指定することもできます。 Application Insights の接続文字列は、Azure portal の [概要 ] ページにあります。

environment_variables:
  APPLICATIONINSIGHTS_CONNECTION_STRING: <connection_string>

app_insights_enabled: trueのみを設定しても、プロジェクトにリンクされた Application Insights リソースがない場合、デプロイは失敗しませんが、データは収集されません。

app_insights_enabled: trueと前の環境変数の両方を同時に指定すると、トレース データとメトリックが Application Insights にリンクされたプロジェクトに送信されます。 別のアプリケーション分析情報を指定する場合は、環境変数のみを保持します。

他のプラットフォームにデプロイする場合は、環境変数 APPLICATIONINSIGHTS_CONNECTION_STRING: <connection_string> を使用して、指定したアプリケーションの分析情報に対するトレース データとメトリックを収集することもできます。

Application Insights でトレース データを表示する

トレースは、実行中に特定のイベントまたはアプリケーションの状態を記録します。 これには、関数呼び出し、変数値、およびシステム イベントに関するデータを含めることができます。 トレースは、アプリケーションのコンポーネントを個別の入力と出力に分割するのに役立ちます。 このプロセスは、アプリケーションのデバッグと理解に不可欠です。 トレースの詳細については、 この Web サイトを参照してください。 トレース データは OpenTelemetry 仕様に従います。

詳細なトレースは、指定したアプリケーション分析情報で確認できます。 次のスクリーンショットは、複数のノードを含むデプロイされたフローのイベントの例を示しています。 Application Insights>Investigate>Transaction 検索を選択し、各ノードを選択して詳細なトレースを表示します。

依存関係の種類イベントは、デプロイからの呼び出しを記録します。 イベントの名前はフロー フォルダーの名前です。 詳細については、 Application Insights でのトランザクション検索と診断に関するページを参照してください。

Application Insights でシステム メトリックを表示する

メトリック名 タイプ ディメンション 説明
token_consumption counter - flow
- node
- llm_engine
- token_type: prompt_tokens: LLM API 入力トークン; completion_tokens: LLM API 応答トークン; total_tokens = prompt_tokens + completion tokens
OpenAI トークン消費メトリック。
flow_latency ヒストグラム flowresponse_codestreamingresponse_type 要求の実行コスト ( response_type) は、完全バイトか最初のバイトか最後のバイトかを意味します。
flow_request counter flowresponse_codeexceptionstreaming フローリクエストの数。
node_latency ヒストグラム flownoderun_status ノード実行コスト。
node_request counter flownodeexceptionrun_status ノードの実行数。
rpc_latency ヒストグラム flownodeapi_call リモート手続き呼び出しのコスト。
rpc_request カウンター flownodeapi_callexception リモート プロシージャ コールのカウント。
flow_streaming_response_duration ヒストグラム flow 最初のバイトの送信から最後のバイトの送信までのストリーミング応答送信コスト。

ワークスペースの既定の Application Insights メトリックは、Azure portal のワークスペースの概要ページで確認できます。

  1. Application Insights を開き、左側のウィンドウで [使用量と推定コスト ] を選択します。 [ カスタム メトリック (プレビュー)]>[ディメンションなし] を選択し、変更を保存します。
  2. 左側のウィンドウで [ メトリック ] タブを選択します。 [メトリック名前空間] でpromptflow 標準メトリックを選択します。 メトリック のドロップダウン リスト から、さまざまな集計方法を使用してメトリックを探索できます。

フィードバックを収集して Application Insights に送信する

プロンプト フローサービスは、顧客がフィードバックを収集するのに役立つ新しい /feedback API を提供します。 フィードバック ペイロードには、任意の JSON 形式のデータを指定できます。 プロンプト フローサービスは、お客様がフィードバック データをトレーススパンに保存するのに役立ちます。 データは、顧客が構成したトレース エクスポーター ターゲットに保存されます。 プロンプト フローサービスでは、OpenTelemetry 標準トレース コンテキスト伝達もサポートされます。 要求ヘッダーで設定されたトレース コンテキストを考慮し、そのコンテキストを要求親スパン コンテキストとして使用します。 分散トレース機能を使用して、フィードバック トレースをチャット要求トレースに関連付けることができます。

次のサンプル コードは、トレースが有効になっているマネージド エンドポイントにデプロイされたフローをスコア付けし、スコアリング要求の同じトレース スパンにフィードバックを送信する方法を示しています。 フローには、入力 questionchat_historyがあります。 出力は answer になります。 エンドポイントがスコア付けされると、フローのデプロイ時に指定されたとおりにフィードバックが収集され、Application Insights に送信されます。

import urllib.request
import json
import os
import ssl
from opentelemetry import trace, context
from opentelemetry.baggage.propagation import W3CBaggagePropagator
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
from opentelemetry.sdk.trace import TracerProvider

# Initialize your tracer.
tracer = trace.get_tracer("my.genai.tracer")
trace.set_tracer_provider(TracerProvider())

# Request data goes here.
# The example below assumes JSON formatting, which might be updated
# depending on the format your endpoint expects.
data = {
    "question": "hello",
    "chat_history": []
}

body = str.encode(json.dumps(data))

url = 'https://basic-chat-endpoint-0506.eastus.inference.ml.azure.com/score'
feedback_url = 'https://basic-chat-endpoint-0506.eastus.inference.ml.azure.com/feedback'
# Replace this with the primary/secondary key, AMLToken, or Microsoft Entra ID token for the endpoint.
api_key = ''
if not api_key:
    raise Exception("A key should be provided to invoke the endpoint")

# The azureml-model-deployment header will force the request to go to a specific deployment.
# Remove this header to have the request observe the endpoint traffic rules.
headers = {'Content-Type':'application/json', 'Authorization':('Bearer '+ api_key), 'azureml-model-deployment': 'basic-chat-deployment' }

try:
    with tracer.start_as_current_span('genai-request') as span:

        ctx = context.get_current()
        TraceContextTextMapPropagator().inject(headers, ctx)
        print(headers)
        print(ctx)
        req = urllib.request.Request(url, body, headers)
        response = urllib.request.urlopen(req)

        result = response.read()
        print(result)

        # Now you can process the answer and collect feedback.
        feedback = "thumbdown"  # Example feedback (modify as needed).

        # Make another request to save the feedback.
        feedback_body = str.encode(json.dumps(feedback))
        feedback_req = urllib.request.Request(feedback_url, feedback_body, headers)
        urllib.request.urlopen(feedback_req)


except urllib.error.HTTPError as error:
    print("The request failed with status code: " + str(error.code))

    # Print the headers - they include the requert ID and the timestamp, which are useful for debugging the failure.
    print(error.info())
    print(error.read().decode("utf8", 'ignore'))

Application Insights では、要求のトレースおよび、フィードバックを表示できます。

高度な使用方法: カスタム OpenTelemetry コレクター サービスにトレースをエクスポートする

場合によっては、デプロイされた OpenTelemetry コレクター サービスにトレース データをエクスポートすることが必要になる場合があります。 このサービスを有効にするには、 OTEL_EXPORTER_OTLP_ENDPOINTを設定します。 独自のスパン処理ロジックと独自のトレース永続ターゲットをカスタマイズする場合は、このエクスポーターを使用します。