適用対象:Foundry (クラシック) ポータル。 この記事は、新しい Foundry ポータルでは使用できません。
新しいポータルの詳細を確認します。
メモ
この記事のリンクは、現在表示している Foundry (クラシック) ドキュメントではなく、新しい Microsoft Foundry ドキュメントのコンテンツを開く場合があります。
重要
この記事でマークされている項目 (プレビュー) は、現在パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境のワークロードにはお勧めしません。 特定の機能がサポートされていないか、機能が制限されている可能性があります。 詳細については、「Microsoft Azure プレビューの使用条件を参照してください。
運用環境に生成 AI アプリケーションをデプロイしたら、理解を深め、パフォーマンスを最適化することができます。 要求、集計されたメトリック、およびユーザー フィードバックごとにデータをトレースすると、すべてが重要な役割を果たします。
この記事では、トレースを有効にし、集計されたメトリックを収集し、フローデプロイの推論時にユーザーフィードバックを収集する方法について説明します。
メモ
デプロイされたアプリケーション (プロンプト フローを除く) の継続的な監視を実行する改善された方法については、Azure AI オンライン評価の使用を検討してください。
前提 条件
重要
この記事では、ハブ ベースのプロジェクトのレガシ サポートを提供します。 Foundry プロジェクトでは機能しません。 「自分が持っているプロジェクトの種類を確認する方法」を参照してください。
SDK 互換性に関するメモ: コード例では、特定のMicrosoft Foundry SDK バージョンが必要です。 互換性の問題が発生した場合は、 ハブ ベースから Foundry プロジェクトへの移行を検討してください。
- アクティブなサブスクリプションを持つAzure アカウント。 お持ちでない場合は、無料試用版サブスクリプションを含む無料Azure アカウントを作成します。
- ない場合は、 ハブベースのプロジェクトを作成します。
- Azure CLIおよびAzure CLI用のAzure Machine Learning拡張機能。
- Microsoft Foundry プロジェクト。 まだプロジェクトがない場合は、プロジェクトを 作成できます。
- Application Insights リソース。 Application Insights リソースがまだない場合は、 作成できます。
- Azureロールベースのアクセス制御は、Azure Machine Learningでの操作へのアクセスを許可するために使用されます。 この記事の手順を実行するには、選択したリソース グループに対する所有者または共同作成者のアクセス許可が必要です。 詳細については、 Foundry ポータルでのロールベースのアクセス制御に関するページを参照してください。
リアルタイム推論用のフローをデプロイする
フローを適切にテストした後 (フレックス フローまたは DAG フロー)、運用環境にフローをデプロイできます。 この記事では、例として リアルタイム推論のフローのデプロイ を使用します。 フレックス フローの場合は、flow.flex.yamlの代わりにflow.dag.yaml ファイルを準備する必要があります。
Docker コンテナーや Kubernetes クラスターなどの他のプラットフォームにデプロイすることもできます。
最新のプロンプト フロー基本イメージを使用してフローをデプロイし、トレースとフィードバック収集 API をサポートします。
デプロイのトレースを有効にしてシステム メトリックを収集する
Foundry ポータルを使用してデプロイする場合は、展開ウィザードで 展開>Application Insights 診断>高度な設定 を選択します。 この方法を使用すると、Application Insights にリンクされたプロジェクトにトレース データとシステム メトリックを収集できます。
SDK または CLI を使用している場合は、デプロイ .yaml ファイルに app_insights_enabled: true プロパティを追加して、Application Insights にリンクされているプロジェクトにデータを収集します。
app_insights_enabled: true
デプロイ .yaml ファイルに APPLICATIONINSIGHTS_CONNECTION_STRING 環境変数によって、他のアプリケーション分析情報を指定することもできます。 Application Insights の接続文字列は、Azure ポータルの Overview ページにあります。
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 |
カウンタ | - flow - node- llm_engine- token_type: prompt_tokens: LLM API 入力トークン; completion_tokens: LLM API 応答トークン; total_tokens = prompt_tokens + completion tokens |
OpenAI トークン消費メトリック。 |
flow_latency |
ヒストグラム |
flow、 response_code、 streaming、 response_type |
要求の実行コスト ( response_type) は、完全バイトか最初のバイトか最後のバイトかを意味します。 |
flow_request |
カウンタ |
flow、 response_code、 exception、 streaming |
フローリクエストの数 |
node_latency |
ヒストグラム |
flow、 node、 run_status |
ノード実行コスト。 |
node_request |
カウンタ |
flow、 node、 exception、 run_status |
ノードの実行数。 |
rpc_latency |
ヒストグラム |
flow、 node、 api_call |
リモート プロシージャ コール (RPC) のコスト。 |
rpc_request |
カウンタ |
flow、 node、 api_call、 exception |
リモートプロシージャコールのカウント。 |
flow_streaming_response_duration |
ヒストグラム | flow |
最初のバイトの送信から最後のバイトの送信までのストリーミング応答送信コスト。 |
ワークスペースの既定の Application Insights メトリックは、Azure ポータルのワークスペースの概要ページで確認できます。
- Application Insights を開き、左側のウィンドウで [使用量と推定コスト ] を選択します。 [ カスタム メトリック (プレビュー)]>[ディメンションなし] を選択し、変更を保存します。
- 左側のウィンドウで [ メトリック ] タブを選択します。 [メトリック名前空間] で、promptflow 標準メトリックを選択します。 メトリック のドロップダウン リスト から、さまざまな集計方法を使用してメトリックを探索できます。
フィードバックを収集して Application Insights に送信する
プロンプト フローサービスは、顧客がフィードバックを収集するのに役立つ新しい /feedback API を提供します。 フィードバック ペイロードには、任意の JSON 形式のデータを指定できます。 プロンプト フローサービスは、お客様がフィードバック データをトレーススパンに保存するのに役立ちます。 データは、顧客が構成したトレース エクスポーター ターゲットに保存されます。 プロンプト フローサービスでは、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 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を設定します。 独自のスパン処理ロジックと独自のトレース永続ターゲットをカスタマイズする場合は、このエクスポーターを使用します。