Abilitare la traccia e raccogliere feedback per una distribuzione del flusso

Importante

Alcune funzionalità descritte in questo articolo potrebbero essere disponibili solo in anteprima. Questa anteprima viene fornita senza un contratto di servizio e non è consigliabile per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.

Dopo aver distribuito un'APP di intelligenza artificiale generativa nell'ambiente di produzione, è possibile migliorare la comprensione e ottimizzare le prestazioni. I dati di traccia di ogni richiesta, le metriche aggregate e il feedback degli utenti svolgono ruoli critici.

Questo articolo illustra come abilitare la traccia, raccogliere metriche aggregate e raccogliere il feedback degli utenti durante il tempo di inferenza della distribuzione del flusso.

Prerequisiti

  • L'interfaccia della riga di comando di Azure e l'estensione di Azure Machine Learning per l'interfaccia della riga di comando di Azure.
  • Un progetto di Studio AI. Se non si ha già un progetto, è possibile crearne uno qui.
  • Una risorsa Application Insights. Se non si ha già una risorsa Application Insights, è possibile crearne una qui.
  • I controlli degli accessi in base al ruolo di Azure vengono usati per concedere l'accesso alle operazioni in Azure Machine Learning. Per eseguire la procedura descritta in questo articolo, è necessario disporre delle autorizzazioni come Proprietario o Collaboratore per il gruppo di risorse selezionato. Per altre informazioni, vedere Controllo degli accessi in base al ruolo in Studio AI della piattaforma Azure.

Distribuire un flusso per l'inferenza in tempo reale

Dopo aver testato correttamente il flusso, un flusso flessibile o un flusso DAG, è possibile distribuire il flusso nell'ambiente di produzione. In questo articolo l’esempio si riferisce alla distribuzione di un flusso per l'inferenza in tempo reale. Per i flussi flessibili, è necessario preparare il file flow.flex.yaml anziché flow.dag.yaml.

È anche possibile eseguire la distribuzione in altre piattaforme, ad esempio in un contenitore Docker, in un cluster Kubernetes e altro ancora.

Nota

È necessario usare l'immagine di base del prompt flow più recente per distribuire il flusso in modo che supporti l'API di raccolta della traccia e del feedback.

Abilitare la traccia e raccogliere le metriche di sistema per la distribuzione

Se si usa l'interfaccia utente di Studio per la distribuzione, è possibile abilitare la diagnostica di Application Insights nel passaggio impostazioni avanzate> Distribuzione della procedura guidata di distribuzione, in cui i dati di traccia e le metriche di sistema vengono raccolti nel progetto collegato ad Application Insights.

Se si usa l'SDK o l'interfaccia della riga di comando, è possibile aggiungere una proprietà app_insights_enabled: true nel file yaml di distribuzione che raccoglie i dati sul progetto collegato ad Application Insights.

app_insights_enabled: true

È anche possibile specificare altre risorse Application Insights da una variabile di ambiente APPLICATIONINSIGHTS_CONNECTION_STRING nel file yaml di distribuzione come indicato di seguito. È possibile trovare la stringa di connessione di Application Insights nella pagina Panoramica del portale di Azure.

environment_variables:
  APPLICATIONINSIGHTS_CONNECTION_STRING: <connection_string>

Nota

Se si imposta solo app_insights_enabled: true ma il progetto non ha una risorsa di Application Insights collegata, la distribuzione non avrà esito negativo, ma non verranno raccolti dati.

Se si specificano contemporaneamente sia app_insights_enabled: true che la variabile di ambiente indicata in precedenza, i dati di traccia e le metriche verranno inviati al progetto collegato ad Application Insights. Pertanto, se si vuole specificare una risorsa Application Insights diversa, è sufficiente mantenere la variabile di ambiente.

Se si esegue la distribuzione in altre piattaforme, è anche possibile usare la variabile di ambienteAPPLICATIONINSIGHTS_CONNECTION_STRING: <connection_string> per raccogliere dati di traccia e metriche nella risorsa Application Insights specificata.

Visualizzare i dati di traccia in Application Insights

La traccia registra eventi specifici o lo stato di un'applicazione durante l'esecuzione. Una traccia può includere dati sulle chiamate di funzioni, i valori delle variabili, gli eventi di sistema e altro ancora. La traccia consente di suddividere i componenti di un'applicazione in input e output discreti, che è fondamentale per il debug e la comprensione di un'applicazione. Altre informazioni sulla traccia sono disponibili qui. I dati di traccia seguono la specifica OpenTelemetry.

È possibile visualizzare la traccia dettagliata nella risorsa Application Insights specificata. Lo screenshot seguente mostra un esempio di evento di un flusso distribuito contenente più nodi. In Application Insights -> Ricerca causa -> Ricerca delle transazioni ed è possibile selezionare ogni nodo per visualizzarne la traccia dettagliata.

Nel record degli eventi di tipo dipendenza vengono registrate le chiamate dalle distribuzioni. Il nome dell'evento è il nome della cartella del flusso. Altre informazioni sulla ricerca e la diagnostica delle transazioni in Application Insights.

Visualizzare le metriche di sistema in Application Insights

Nome metriche Type Dimensioni Descrizione
token_consumption counter - flow
- node
- llm_engine
- token_type: prompt_tokens: token di input dell'API LLM; completion_tokens: token di risposta dell'API LLM; total_tokens = prompt_tokens + completion tokens
Metriche di consumo di token OpenAI
flow_latency histogram flow,response_code,streaming,response_type costo di esecuzione della richiesta, response_type indica se è full/firstbyte/lastbyte
flow_request counter flow,response_code,exception,streaming Numero di richieste di flusso
node_latency histogram flow,node,run_status Costo di esecuzione del nodo
node_request counter flow,node,exception,run_status Numero di esecuzioni del nodo
rpc_latency histogram flow,node,api_call Costo RPC
rpc_request counter flow,node,api_call,exception Numero RPC
flow_streaming_response_duration histogram flusso Costo di invio della risposta di streaming, dall'invio del primo byte all'invio dell'ultimo byte

È possibile trovare l'istanza predefinita di Application Insights dell'area di lavoro nella pagina dell'area di lavoro nel portale di Azure.

  1. Aprire Application Insights e selezionare Utilizzo e costi stimati nel riquadro di spostamento a sinistra. Selezionare Metriche personalizzate (anteprima), quindi selezionare Con dimensioni e salvare la modifica.
  2. Selezionare la scheda Metriche nel riquadro di spostamento a sinistra. Selezionare Metriche standard del prompt flow nello Spazio dei nomi della metrica. È possibile esplorare le metriche dall'elenco a discesa Metrica con diversi metodi di aggregazione.

Raccogliere feedback e inviarlo ad Application Insights

La gestione del prompt flow fornisce una nuova API /feedback che consente ai clienti di raccogliere il feedback. Il payload del feedback può essere qualsiasi dato in formato JSON, PF serve solo per consentire al cliente di salvare i dati del feedback in un intervallo di traccia. I dati verranno salvati nella destinazione dell'utilità di esportazione della traccia configurata dal cliente. Supporta anche la propagazione del contesto di traccia standard OpenTelemetry, che indica che verrà rispettato il contesto di traccia impostato nell'intestazione della richiesta e lo userà come contesto dell'intervallo padre della richiesta. È possibile usare la funzionalità di traccia distribuita per correlare la traccia del feedback alla relativa traccia delle richieste di chat.

Di seguito è riportato il codice di esempio che illustra come assegnare un punteggio a un endpoint gestito distribuito abilitato per la traccia e inviare il feedback allo stesso intervallo di traccia della richiesta di assegnazione dei punteggi. Il flusso genera gli input question e chat_history e l’output answer. Dopo aver assegnato il punteggio all'endpoint, il feedback viene raccolto e inviato alla risorsa Application Insights specificata durante la distribuzione del flusso.

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'))

È possibile visualizzare la traccia della richiesta insieme al feedback in Application Insights.

Utilizzo avanzato: esportare la traccia nel servizio dell'agente di raccolta OpenTelemetry personalizzato

In alcuni casi, è possibile esportare i dati di traccia nel servizio dell’agente di raccolta OTel distribuito, che può essere abilitato impostando "OTEL_EXPORTER_OTLP_ENDPOINT". Usare questa utilità di esportazione per personalizzare la logica di elaborazione dell'intervallo e la destinazione persistente di traccia.