다음을 통해 공유


흐름 배포에 대한 추적 사용 및 피드백 수집

Important

이 문서에 표시된 항목(미리 보기)은 현재 퍼블릭 미리 보기에서 확인할 수 있습니다. 이 미리 보기는 서비스 수준 계약 없이 제공되며, 프로덕션 워크로드에는 권장되지 않습니다. 특정 기능이 지원되지 않거나 기능이 제한될 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.

프로덕션 환경에서 생성 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를 찾을 수 있습니다.

  1. Application Insights를 열고 왼쪽 탐색 영역에서 사용 및 예상 비용을 선택합니다. 사용자 지정 메트릭(미리 보기)을 선택하고 차원 포함을 선택한 후 변경 내용을 저장합니다.
  2. 왼쪽 탐색 영역에서 메트릭 탭을 선택합니다. 메트릭 네임스페이스에서 프롬프트 흐름 표준 메트릭을 선택하고 다양한 집계 방법을 사용하여 메트릭 드롭다운 목록에서 메트릭을 탐색할 수 있습니다.

피드백 수집 및 Application Insights로 보내기

프롬프트 흐름 제공은 고객이 피드백을 수집하는 데 도움이 되는 새로운 /feedback API를 제공하며, 피드백 페이로드는 json 형식 데이터일 수 있으며 PF 제공은 고객이 피드백 데이터를 추적 범위에 저장하는 데 도움이 됩니다. 데이터는 고객이 구성한 추적 내보내기 대상에 저장됩니다. 또한 OpenTelemetry 표준 추적 컨텍스트 전파를 지원하며 요청 헤더에서 설정된 추적 컨텍스트를 준수하고 이를 요청 부모 범위 컨텍스트로 사용합니다. 분산 추적 기능을 활용하여 피드백 추적과 채팅 요청 추적의 상관 관계를 지정할 수 있습니다.

다음은 흐름 배포 관리 엔드포인트 사용 추적의 점수를 매기고 동일한 점수 매기기 요청 추적 범위로 피드백을 보내는 방법을 보여 주는 샘플 코드입니다. 흐름에는 questionchat_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 수집기 서비스로 추적 데이터를 내보낼 수 있습니다. 고유한 범위 처리 논리 및 고유한 추적 영구 대상을 사용자 지정하려는 경우 이 내보내기를 사용합니다.