フロー デプロイのトレースを有効にしてフィードバックを収集する
重要
この記事で "(プレビュー)" と付記されている項目は、現在、パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。
運用環境に Generative AI アプリをデプロイすると、理解を深め、パフォーマンスを最適化することができます。 要求、集計されたメトリック、ユーザー フィードバックのトレース データは、重要な役割を果たします。
この記事では、トレースを有効にし、集計されたメトリックを収集し、フロー デプロイの推論時にユーザーフィードバックを収集する方法について説明します。
Note
展開済みアプリケーション (プロンプト フロー以外) の継続的な監視を実行する改善された方法については、Azure AI オンライン評価の使用を検討してください。
前提条件
- Azure CLI と Azure CLI に対する Azure Machine Learning の拡張機能。
- Azure AI Foundry プロジェクト。 プロジェクトがまだない場合は、こちらから作成できます。
- Application Insights。 Application Insights リソースがまだない場合は、こちらから作成できます。
- Azure ロールベースのアクセス制御は、Azure Machine Learning の操作に対するアクセスを許可するために使用されます。 この記事の手順を実行するには、選択したリソース グループに対する所有者または共同作成者のアクセス許可が必要 です。 詳しくは、Azure AI Foundry ポータルでのロールベースのアクセス制御に関するページを参照してください。
リアルタイム推論のフローをデプロイする
フレックス フローまたは DAG フローでフローを適切にテストしたら、運用環境にそのフローをデプロイできます。 この記事では、例としてリアルタイム推論用フローのデプロイを使用します。 フレックス フローの場合は、flow.dag.yaml
ではなく、flow.flex.yaml
ファイルを準備する必要があります。
Docker コンテナー、Kubernetes クラスターなど、他のプラットフォームにデプロイすることもできます。
Note
トレースとフィードバック収集 API をサポートするために、フローをデプロイするには最新のプロンプト フロー ベース イメージを使用する必要があります。
デプロイのトレースを有効にしてシステム メトリックを収集する
Azure AI Foundry ポータルを使用してデプロイする場合は、デプロイ ウィザードの [詳細設定]>[デプロイ] ステップで [Application Insights 診断] を有効にすることで、トレース データとシステム メトリックを Application Insights にリンクされたプロジェクトに収集されるようになります。
SDK または CLI を使用している場合は、Application Insights にリンクされたプロジェクトにデータを収集するデプロイ yaml ファイルにプロパティ app_insights_enabled: true
を追加できます。
app_insights_enabled: true
デプロイ yaml ファイル内の環境変数 APPLICATIONINSIGHTS_CONNECTION_STRING
によって、次のように他の Application Insights を指定することもできます。 Application Insights の接続文字列は、Azure portal の [概要] ページにあります。
environment_variables:
APPLICATIONINSIGHTS_CONNECTION_STRING: <connection_string>
Note
app_insights_enabled: true
のみを設定したものの、プロジェクトにリンクされた Application Insights リソースがない場合、デプロイは失敗しませんが、データは収集されません。
app_insights_enabled: true
および上記の環境変数を同時に指定すると、トレース データとメトリックが、アプリケーションの分析情報にリンクされたプロジェクトに送信されます。 そのため、別の Application Insights を指定する場合は、環境変数を保持するだけで済みます。
他のプラットフォームにデプロイする場合は、環境変数 APPLICATIONINSIGHTS_CONNECTION_STRING: <connection_string>
を使用してトレース データとメトリックを収集し、Application Insights を指定することもできます。
Application Insights でトレース データを表示する
トレースは、実行中に特定のイベントまたはアプリケーションの状態を記録します。 これには、関数呼び出し、変数値、システム イベントなどのデータを含めることができます。 トレースは、アプリケーションのコンポーネントを個別の入力と出力に分解するのに役立ちます。これは、アプリケーションのデバッグと理解に不可欠です。 トレースの詳細については、こちらで学習できます。 トレース データは 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_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 may 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 コレクター サービスにトレースをエクスポートする
場合によっては、"OTEL_EXPORTER_OTLP_ENDPOINT" を設定して有効にしたデプロイ済みの OTel コレクター サービスにトレース データをエクスポートすることもあります。 独自のスパン処理ロジックと独自のトレース永続ターゲットをカスタマイズする場合は、このエクスポーターを使用します。