흐름 배포에 대한 추적 사용 및 피드백 수집
Important
이 문서에 표시된 항목(미리 보기)은 현재 퍼블릭 미리 보기에서 확인할 수 있습니다. 이 미리 보기는 서비스 수준 계약 없이 제공되며, 프로덕션 워크로드에는 권장되지 않습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.
프로덕션 환경에서 생성 AI 앱을 배포한 후 이해를 높이고 성능을 최적화할 수 있습니다. 각 요청, 집계된 메트릭 및 사용자 피드백에 대한 추적 데이터는 중요한 역할을 합니다.
이 문서에서는 흐름 배포 유추 시간 동안 추적을 사용하도록 설정하고, 집계된 메트릭을 수집하고, 사용자 피드백을 수집하는 방법을 알아봅니다.
필수 조건
- Azure CLI 및 Azure CLI에 대한 Azure Machine Learning 확장.
- AI Studio 프로젝트입니다. 프로젝트가 아직 없는 경우 여기에서 프로젝트를 만들 수 있습니다.
- An Application Insights. Application Insights 리소스가 아직 없는 경우 여기에서 만들 수 있습니다.
- Azure 역할 기반 액세스 제어는 Azure Machine Learning에서 작업에 대한 액세스 권한을 부여하는 데 사용됩니다. 이 문서의 단계를 수행하려면 선택한 리소스 그룹에 대한 소유자 또는 기여자 권한이 있어야 합니다. 자세한 내용은 Azure AI 스튜디오의 역할 기반 액세스 제어를 참조하세요.
실시간 유추를 위한 흐름 배포
플렉스 흐름 또는 DAG 흐름 중 하나에서 흐름을 제대로 테스트한 후에는 프로덕션 환경에서 흐름을 배포할 수 있습니다. 이 문서에서는 실시간 유추를 위한 흐름을 배포하는 예제를 사용합니다. flex 흐름의 경우 flow.dag.yaml
대신 flow.flex.yaml
파일을 준비해야 합니다.
Docker 컨테이너, Kubernetes 클러스터 및 더 많은 같은 다른 플랫폼에 배포할 수도 있습니다.
참고 항목
추적 및 피드백 수집 API를 지원하도록 최신 프롬프트 흐름 기본 이미지를 사용하여 흐름을 배포해야 합니다.
배포에 대한 추적 및 수집 시스템 메트릭 사용
스튜디오 UI를 사용하여 배포하는 경우 배포 마법사의 배포 단계를 고급 설정>에서 Application Insights 진단 설정하면 추적 데이터 및 시스템 메트릭이 Application Insights에 연결된 프로젝트에 수집됩니다.
SDK 또는 CLI를 사용하는 경우 애플리케이션 인사이트에 연결된 프로젝트에 데이터를 수집하는 배포 yaml 파일에 속성 app_insights_enabled: true
을(를) 추가하여 수행할 수 있습니다.
app_insights_enabled: true
다음과 같이 배포 yaml 파일의 환경 변수 APPLICATIONINSIGHTS_CONNECTION_STRING
에 다른 Application Insights를 지정할 수도 있습니다. Azure Portal의 개요 페이지에서 Application Insights의 연결 문자열을 찾을 수 있습니다.
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 사양을 따릅니다.
지정된 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_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 수집기 서비스로 추적 데이터를 내보낼 수 있습니다. 고유한 범위 처리 논리 및 고유한 추적 영구 대상을 사용자 지정하려는 경우 이 내보내기를 사용합니다.