흐름 배포에 대한 추적 및 수집 피드백 사용(미리 보기)
참고 항목
이 기능은 현재 공개 미리 보기로 제공됩니다. 이 미리 보기는 서비스 수준 계약 없이 제공되며, 프로덕션 워크로드에는 권장되지 않습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.
APP 개발자는 생성형 AI 앱을 프로덕션에 배포한 후 이해도를 높이고 성능을 최적화하려고 합니다. 각 요청, 집계된 메트릭 및 사용자 피드백에 대한 추적 데이터는 중요한 역할을 합니다.
이 문서에서는 흐름 배포의 유추 시간 동안 추적을 사용하도록 설정하고 집계된 메트릭과 사용자 피드백을 수집하는 방법을 알아봅니다.
필수 조건
- Azure CLI 및 Azure CLI에 대한 Azure Machine Learning 확장. 자세한 내용은 CLI(v2) 설치, 설정 및 사용을 참조하세요.
- Azure Machine Learning 작업 영역 리소스가 없으면 빠른 시작: 작업 영역 리소스 만들기 문서의 단계에서 리소스를 만듭니다.
- An Application Insights. 일반적으로 기계 학습 작업 영역에는 기본적으로 연결된 Application Insights가 있습니다. 새 리소스를 사용하려면 Application Insights 리소스를 만들 수 있습니다.
- 프롬프트 흐름에서 흐름을 빌드하고 테스트하는 방법을 알아봅니다.
- 관리형 온라인 엔드포인트에 대한 기본적인 이해가 있어야 합니다. 관리되는 온라인 엔드포인트는 기본 배포 인프라를 설정하고 관리하는 오버헤드에서 벗어나 확장 가능한 완전 관리되는 방식으로 Azure의 강력한 CPU 및 GPU 컴퓨터와 함께 작동합니다. 관리형 온라인 엔드포인트에 대한 자세한 내용은 실시간 유추를 위한 온라인 엔드포인트 및 배포를 참조하세요.
- Azure RBAC(Azure 역할 기반 액세스 제어)는 Azure Machine Learning의 작업에 대한 액세스 권한을 부여하는 데 사용됩니다. 이 문서의 단계를 수행하려면 사용자 계정에 Azure Machine Learning 작업 영역에 대한 소유자 또는 기여자 역할 또는 "Microsoft.MachineLearningServices/workspaces/onlineEndpoints/"를 허용하는 사용자 지정 역할이 할당되어야 합니다. 스튜디오를 사용하여 온라인 엔드포인트/배포를 만들기/관리하는 경우 리소스 그룹 소유자의 또 다른 "Microsoft.Resources/deployments/write" 권한이 필요합니다. 자세한 내용은 Azure Machine Learning 작업 영역 액세스 관리를 참조하세요.
실시간 유추를 위한 흐름 배포
플렉스 흐름 또는 DAG 흐름 중 하나에서 흐름을 제대로 테스트한 후에는 프로덕션 환경에서 흐름을 배포할 수 있습니다. 이 문서에서는 Azure Machine Learning 관리형 온라인 엔드포인트에 흐름 배포를 예로 사용합니다. flex 흐름의 경우 flow.dag.yaml
대신 flow.flex.yaml
파일을 준비해야 합니다.
Docker 컨테이너, Kubernetes 클러스터 및 더 많은 같은 다른 플랫폼에 배포할 수도 있습니다.
참고 항목
추적 및 피드백 수집 API를 지원하도록 최신 프롬프트 흐름 기본 이미지를 사용하여 흐름을 배포해야 합니다.
배포에 대한 추적 및 수집 시스템 메트릭 사용
배포에 스튜디오 UI를 사용하는 경우 배포 마법사의 고급 설정 -> 배포 단계에서 Application Insights 진단을 켤 수 있습니다. 이는 추적 데이터 및 시스템 메트릭이 작업 영역에 연결된 Application Insights에 수집되는 방식입니다.
SDK 또는 CLI를 사용하는 경우 작업 영역에 연결된 Application Insights에 데이터를 수집하는 배포 yaml 파일에 app_insights_enabled: true
속성을 추가할 수 있습니다. 다음과 같이 배포 yaml 파일의 환경 변수 APPLICATIONINSIGHTS_CONNECTION_STRING
에 다른 Application Insights를 지정할 수도 있습니다. Azure Portal의 개요 페이지에서 Application Insights의 연결 문자열을 찾을 수 있습니다.
# 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>
참고 항목
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 | - 흐름 - node - llm_engine - token_type: prompt_tokens : LLM API input tokens; completion_tokens : LLM API response tokens; 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 | 스트리밍 응답 전송 비용, 첫 번째 바이트 보내기부터 마지막 바이트 보내기까지 |
Azure Portal의 작업 영역 개요 페이지에서 작업 영역 기본 Application Insights를 찾을 수 있습니다.
Application Insights를 열고 왼쪽 탐색 영역에서 사용 및 예상 비용을 선택합니다. 사용자 지정 메트릭(미리 보기)을 선택하고 차원 포함을 선택한 후 변경 내용을 저장합니다.
왼쪽 탐색 영역에서 메트릭 탭을 선택합니다. 메트릭 네임스페이스에서 프롬프트 흐름 표준 메트릭을 선택하고 다양한 집계 방법을 사용하여 메트릭 드롭다운 목록에서 메트릭을 탐색할 수 있습니다.
피드백 수집 및 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://learn.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 수집기 서비스로 추적 데이터를 내보낼 수 있습니다. 고유한 범위 처리 논리 및 고유한 추적 영구 대상을 사용자 지정하려는 경우 이 내보내기 도구를 사용합니다.