フロー デプロイのトレースを有効にしてフィードバックを収集する (プレビュー)
Note
現在、この機能はパブリック プレビュー段階にあります。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。
生成 AI アプリを運用環境にデプロイした後、アプリ開発者は理解を深めて、パフォーマンスを最適化しようとします。 各要求のトレース データ、集計されたメトリック、およびユーザー フィードバックは重要な役割を果たします。
この記事では、フロー デプロイの推論時にトレースを有効にし、集計されたメトリックとユーザーフィードバックを収集する方法について説明します。
前提条件
- Azure CLI と Azure CLI に対する Azure Machine Learning の拡張機能。 詳しくは、CLI (v2) のインストール、設定、使用に関するページをご覧ください。
- Azure Machine Learning ワークスペース。 所有していない場合は、クイック スタート: ワークスペース リソースの作成に関する記事の手順に従って作成してください。
- Application Insights。 通常、Machine Learning ワークスペースには、既定のリンクされた Application Insights があります。 新しい Application Insights を使用する場合は、Application Insights リソースを作成することができます。
- プロンプト フローでフローを構築してテストする方法を確認します。
- マネージド オンライン エンドポイントに関する基本事項を理解している。 マネージド オンライン エンドポイントは、Azure の強力な CPU マシンおよび GPU マシンと連携して、スケーラブルでフル マネージドな方法で動作し、基になるデプロイ インフラストラクチャの設定と管理のオーバーヘッドからユーザーを解放します。 マネージド オンライン エンドポイントの詳細については、「オンライン エンドポイントとリアルタイム推論のデプロイ」 を参照してください。
- Azure ロールベースのアクセス制御 (Azure RBAC) は、Azure Machine Learning の操作に対するアクセスを許可するために使用されます。 この記事の手順を実行するには、ユーザー アカウントに、Azure Machine Learning ワークスペースの所有者か共同作成者ロール、または "Microsoft.MachineLearningServices/workspaces/onlineEndpoints/" を許可するカスタム ロールを割り当てる必要があります。 Studio を使用してオンライン エンドポイントやデプロイを作成または管理する場合は、リソース グループの所有者からの別のアクセス許可 "Microsoft.Resources/deployments/write" が必要です。 詳細については、「Azure Machine Learning ワークスペースへのアクセスの管理」を参照してください。
リアルタイム推論のフローをデプロイする
フレックス フローまたは DAG フローのどちらかを適切にテストした後、そのフローを運用環境にデプロイできます。 この記事では、例として、Azure Machine Learning マネージド オンライン エンドポイント (プレビュー) にフローをデプロイします。 フレックス フローの場合は、flow.dag.yaml
の代わりに flow.flex.yaml
ファイルを準備する必要があります。
Docker コンテナー、Kubernetes クラスターなど、他のプラットフォームにデプロイすることもできます。
Note
トレースとフィードバック収集 API をサポートするために、フローをデプロイするには最新のプロンプト フロー ベース イメージを使用する必要があります。
デプロイのトレースを有効にしてシステム メトリックを収集する
Studio UI を使用してデプロイしている場合は、デプロイ ウィザードの [詳細設定] -> [デプロイ] ステップで [Application Insights 診断] を有効にすることができます。これにより、ワークスペースにリンクされた Application Insights にトレース データとシステム メトリックが収集されます。
SDK または CLI を使用している場合は、ワークスペースにリンクされた Application Insights にデータを収集するプロパティ app_insights_enabled: true
をデプロイ yaml ファイルに追加することができます。 次のように、デプロイ yaml ファイル内の環境変数 APPLICATIONINSIGHTS_CONNECTION_STRING
で他の Application Insights を指定することもできます。 Application Insights の接続文字列は、Azure portal の [概要] ページにあります。
# below is the property in deployment yaml
# app_insights_enabled: true
# you can also use the environment variable
environment_variables:
APPLICATIONINSIGHTS_CONNECTION_STRING: <connection_string>
Note
app_insights_enabled: true
のみを設定したものの、リンクされた Application Insights がワークスペースにない場合、デプロイは失敗しませんが、データは収集されません。
app_insights_enabled: true
と上記の環境変数の両方を同時に指定すると、ワークスペースにリンクされた Application Insights にトレース データとメトリックが送信されます。 したがって、別の Application Insights を指定する場合は、環境変数を保持するだけで済みます。
他のプラットフォームにデプロイする場合は、環境変数 APPLICATIONINSIGHTS_CONNECTION_STRING: <connection_string>
を使用してトレース データとメトリックを収集し、Application Insights を指定することもできます。
Application Insights でトレース データを表示する
トレースは、実行中に特定のイベントまたはアプリケーションの状態を記録します。 これには、関数呼び出し、変数値、システム イベントなどに関するデータが含まれる場合があります。 トレースは、アプリケーションのコンポーネントを個別の入力と出力に分解するのに役立ちます。この情報は、アプリケーションのデバッグと理解に不可欠です。 詳細については、トレースの OpenTelemetry トレースを参照してください。 トレース データは OpenTelemetry 仕様に従います。
指定した Application Insights で詳細なトレースを表示できます。 次のスクリーンショットは、複数のノードを含むデプロイされたフローのイベントの例を示しています。 Application Insights ->[調査]>- トランザクション検索で、各ノードを選択して詳細なトレースを表示できます。
[依存関係の種類] のイベントは、デプロイからの呼び出しを記録します。 そのイベントの名前はフロー フォルダーの名前です。 「Application Insights でのトランザクション検索と診断」の詳細を参照してください。
Application Insights でシステム メトリックを表示する
メトリック名 | Type | ディメンション | 説明 |
---|---|---|---|
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 | histogram | flow、response_code、streaming、response_type | 要求の実行コスト (response_type は full/firstbyte/lastbyte かどうかを意味します) |
flow_request | counter | flow、response_code、exception、streaming | フロー要求数 |
node_latency | histogram | flow、node、run_status | ノード実行コスト |
node_request | counter | flow、node、exception、run_status | ノードの実行数 |
rpc_latency | histogram | flow、node、api_call | rpc コスト |
rpc_request | counter | flow、node、api_call、exception | rpc 数 |
flow_streaming_response_duration | histogram | flow | ストリーミング応答の送信コスト (最初のバイトの送信から最後のバイトの送信まで) |
ワークスペースの既定の Application Insights は、Azure portal のワークスペース ページで確認できます。
Application Insights を開き、左側のナビゲーションから [使用とコストの見積もり] を選びます。 [カスタム メトリック (プレビュー)] を選択し、[With dimensions] (ディメンションを含む) を選択し、変更を保存します。
左側のナビゲーションで [メトリクス] タブを選択します。 [メトリック名前空間] から [promptflow standard metrics] (promptflow 標準メトリック) を選択して、さまざまな集計方法で [メトリック] ドロップダウン リストからメトリックを確認できます。
フィードバックを収集して Application Insights に送信する
プロンプト フロー サービスは、お客様がフィードバックを収集するのに役立つ新しい /feedback
API を提供します。フィードバック ペイロードは任意の json 形式データにすることができます。PF サービスは、お客様がフィードバック データをトレース スパンに保存することを支援します。 データは、顧客が構成したトレース エクスポーターのターゲットに保存されます。 また、OpenTelemetry 標準のトレース コンテキストの伝播もサポートしています。つまり、要求ヘッダーで設定されたトレース コンテキストが尊重され、それが要求の親スパンのコンテキストとして使用されます。 分散トレース機能を利用して、フィードバック トレースをチャット要求のトレースに関連付けることができます。
次に示すのは、デプロイされたフローでマネージド エンドポイントが有効なトレースをスコア付けし、スコアリング要求の同じトレース スパンにフィードバックを送信する方法を示すサンプル コードです。 フローには、入力 question
と chat_hisotry
および、出力 answer
があります。 エンドポイントをスコア付けした後、フィードバックを収集し、フローをデプロイしたときに指定した Application Insights に送信します。 api_key
値を入力するか、ユース ケースに応じてコードを変更する必要があります。
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 may be updated
# depending on the format your endpoint expects.
# More information can be found here:
# https://docs.microsoft.com/azure/machine-learning/how-to-deploy-advanced-entry-script
data = {
"question": "hello",
"chat_history": []
}
body = str.encode(json.dumps(data))
url = 'https://basic-chat-endpoint.eastus.inference.ml.azure.com/score'
feedback_url = 'https://basic-chat-endpoint.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 コレクター サービスにトレースをエクスポートする
場合によっては、"OTEL_EXPORTER_OTLP_ENDPOINT" を設定して有効にしたデプロイ済みの OTel コレクター サービスにトレース データをエクスポートすることもあります。 独自のスパン処理ロジックと独自のトレースの永続ターゲットをカスタマイズする場合は、このエクスポーターを使用します。