\n\n\n\n Osservabilità per le applicazioni LLM: Best practices e esempi pratici - AgntLog \n

Osservabilità per le applicazioni LLM: Best practices e esempi pratici

📖 13 min read2,549 wordsUpdated Apr 4, 2026

L’essor delle applicazioni LLM e la necessità di un’osservabilità avanzata

I modelli linguistici di grandi dimensioni (LLM) sono rapidamente passati da oggetti di studio accademico a componenti fondamentali di nuove applicazioni in vari settori. Dai chatbot intelligenti e generatori di contenuti agli assistenti codificati e strumenti di analisi dei dati, le applicazioni alimentate da LLM stanno ridefinendo le esperienze utente e i processi aziendali. Tuttavia, questo potere trasformativo porta con sé un insieme unico di sfide operative. A differenza del software tradizionale, le applicazioni LLM introducono un nuovo livello di complessità dovuto alla loro natura probabilistica, alla loro dipendenza da fornitori di modelli esterni, a un’ingegneria dell’invito complessa e alla qualità soggettiva dei loro risultati.

Gli strumenti di osservabilità tradizionali, progettati per sistemi deterministici, spesso non sono sufficienti per diagnosticare i problemi all’interno delle applicazioni LLM. Un semplice errore 5xx può indicare una chiamata API fallita, ma non ti dice se il modello ha allucinato, se l’invito era mal formulato o se l’input dell’utente è stato mal interpretato. Questo divario richiede un approccio specializzato all’osservabilità, che si concentra non solo sulla salute del sistema ma anche sulla qualità, la pertinenza e la sicurezza dei risultati del LLM, così come sulla danza complessa tra l’input dell’utente, l’invito, il modello e gli strumenti esterni.

Cos’è che rende l’osservabilità LLM diversa?

Le differenze fondamentali nell’architettura e nel comportamento delle applicazioni LLM richiedono una strategia di osservabilità distinta:

  • Nature probabilistica: Gli LLM non producono sempre lo stesso output per lo stesso input. Questo non determinismo rende il debug difficile.
  • Problema di scatola nera: Sebbene possiamo influenzare gli LLM tramite inviti e un fine-tuning, il processo di ragionamento interno rimane per lo più opaco.
  • Sensibilità all’ingegneria degli inviti: Piccole modifiche negli inviti possono portare a risultati molto diversi, richiedendo un monitoraggio attento delle versioni degli inviti e del loro impatto.
  • Qualità soggettiva: La ‘correttezza’ o ‘utilità’ di un output LLM è spesso soggettiva e dipendente dal contesto, rendendo difficile la valutazione automatica.
  • Dipendenze esterne: Molte applicazioni LLM si basano su API esterne (per modelli, database vettoriali, fonti RAG, ecc.), introducendo punti di guasto e latenza esterni.
  • Allucinazioni e pregiudizi: Gli LLM possono generare informazioni fattualmente errate o esibire pregiudizi, che devono essere rilevati e mitigati.
  • Utilizzo di token e costi: Le chiamate API LLM sono spesso addebitate per token, rendendo il monitoraggio dei costi un aspetto critico dell’osservabilità.
  • Chaining e comportamento degli agenti: Le applicazioni LLM complesse coinvolgono spesso più chiamate LLM, l’uso di strumenti e agenti di decisione, creando percorsi di esecuzione complessi.

Pilastri chiave dell’osservabilità LLM

Un’osservabilità LLM efficace può essere suddivisa in diversi pilastri chiave, ognuno dei quali affronta un aspetto specifico della salute e delle prestazioni dell’applicazione:

1. Monitoraggio delle richieste e delle risposte

Proprio come per i microservizi tradizionali, il monitoraggio delle singole richieste all’interno della tua applicazione LLM è fondamentale. Tuttavia, per gli LLM, questo monitoraggio deve catturare un contesto significativamente più ricco.

Migliori pratiche:

  • Catturare i payload completi delle richieste/riposte: Registra l’input utente completo, l’invito finale inviato al LLM, la risposta grezza del LLM e l’output trattato della tua applicazione. Questo è cruciale per l’analisi postuma e il debug.
  • Monitorare i modelli e le variabili di invito: Se utilizzi modelli di invito, registra l’ID/versione del modello e le variabili specifiche iniettate per ogni richiesta. Questo aiuta a comprendere come le modifiche all’invito influenzano i risultati.
  • Registrare il modello e i parametri: Registra il modello LLM specifico utilizzato (ad esempio, GPT-4, Claude 3 Opus), la temperatura, top_p, max_tokens, sequenze di arresto e qualsiasi altro parametro pertinente.
  • Timestamp e latenza: Pratica standard, ma critica per le chiamate LLM a causa delle potenziali limitazioni di throughput e dei tempi di risposta variabili. Monitora la latenza end-to-end e la latenza delle singole chiamate API LLM.
  • ID utente e di sessione: Associa le richieste a utenti o sessioni specifiche per comprendere le esperienze individuali degli utenti e identificare modelli.
  • Utilizzo degli strumenti: Se la tua applicazione LLM utilizza strumenti (ad esempio, API di ricerca, query di database, interprete di codice), registra quali strumenti sono stati evocati, i loro input e output. Questo è particolarmente importante per i sistemi basati su agenti.

Esempio pratico (Python/LangChain):

from langchain_core.tracers import ConsoleCallbackHandler
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# Una semplice catena LLM
model = ChatOpenAI(model="gpt-3.5-turbo")
prompt = ChatPromptTemplate.from_messages([
 ("system", "Sei un assistente IA utile."),
 ("user", "{query}")
])
chain = prompt | model

# Per vedere il monitoraggio di base nella console (per sviluppo/debug locale)
response = chain.invoke({"query": "Qual è la capitale della Francia?"}, config={"callbacks": [ConsoleCallbackHandler()]})

# Per produzione, integra una piattaforma di monitoraggio dedicata (ad esempio, Langsmith, OpenTelemetry)
# Esempio con Langsmith (concettuale, necessita di configurazione) :
# import os
# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = "your_langsmith_api_key"
# os.environ["LANGCHAIN_PROJECT"] = "my_llm_app"
# response = chain.invoke({"query": "Dammi un fatto divertente su Parigi."})
# print(response.content)

2. Qualità e valutazione delle uscite

Monitorare la qualità soggettiva delle uscite LLM è forse l’aspetto più difficile, ma cruciale, dell’osservabilità LLM.

Migliori pratiche:

  • Cicli di feedback umani: Implementa meccanismi che consentano agli utenti di valutare o dare il loro parere sulle risposte LLM (ad esempio, pollice su/giù, moduli di feedback in testo libero). Questo è inestimabile per identificare le regressioni e le aree di miglioramento.
  • Metriche di valutazione automatizzate: Per compiti specifici, utilizza metriche automatizzate. Per il riassunto, punteggi ROUGE; per il recupero fattuale, corrispondenza esatta o punteggi F1 rispetto a una verità di riferimento. Per la generazione di codice, tasso di successo dei test unitari.
  • LLM-come-giudice: Utilizza un LLM più potente per valutare l’output di un altro LLM in base a criteri predefiniti (ad esempio, coerenza, pertinenza, accuratezza fattuale, sicurezza). Questo può essere sorprendentemente efficace per scalare la valutazione.
  • Categorizzazione dei fallimenti: Quando viene rilevato un problema (umano o automatizzato), categorizzalo (ad esempio, allucinazione, non pertinente, incompleto, non sicuro, errato formato, scostamento di sentimenti). Questo aiuta a circoscrivere le debolezze specifiche.
  • Raccolta di dati di verità di riferimento: Raccogli e etichetta continuamente esempi di buone e cattive uscite per costruire un dataset solido per un fine-tuning futuro e una valutazione automatizzata.

Esempio pratico (LLM-come-giudice):

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

def evaluate_response(user_query, generated_response):
 evaluator_llm = ChatOpenAI(model="gpt-4-turbo", temperature=0)
 eval_prompt = ChatPromptTemplate.from_messages([
 ("system", "Sei un assistente IA progettato per valutare la qualità della risposta di un'altra IA. Valuta la risposta su una scala da 1 a 5 per pertinenza, accuratezza e completezza. Fornisci una breve spiegazione per la tua valutazione."),
 ("user", "Richiesta utente: {query}\nRisposta IA: {response}\nValutazione:")
 ])
 evaluation_chain = eval_prompt | evaluator_llm
 return evaluation_chain.invoke({"query": user_query, "response": generated_response}).content

# Esempio di utilizzo
query = "Parlami della storia di internet."
response = "Internet è stato inventato da Al Gore nel 1990." # Risposta errata
eval_result = evaluate_response(query, response)
print(eval_result)
# L'output atteso potrebbe essere: "Pertinenza: 5/5, Accuratezza: 1/5, Completezza: 2/5. Spiegazione: Sebbene pertinente, la risposta contiene un'inesattezza fattuale significativa riguardo Al Gore che ha inventato Internet." 

3. Monitoraggio dei costi e della latenza

Le chiamate API LLM possono essere costose, e la latenza influisce direttamente sull’esperienza utente. Il monitoraggio di queste metriche è essenziale.

Pratiche migliori:

  • Monitoraggio dell’utilizzo dei token: Tieni traccia del numero di token in ingresso e in uscita per ogni chiamata LLM. È il principale fattore di costo.
  • Stima dei costi: Traduce i conteggi dei token in costi stimati in dollari in base ai prezzi del fornitore. Configura avvisi per picchi di costo insoliti.
  • Latencia API: Tieni traccia del tempo necessario per ogni chiamata API LLM. Differenzia il tempo di elaborazione della tua applicazione e il tempo di risposta dell’API esterna.
  • Monitoraggio dei limiti di richiesta: Fai attenzione agli errori di limite di richiesta dell’API (ad esempio, 429 Troppe richieste). Implementa meccanismi di ripetizione con uno scarto esponenziale e allerta se i limiti di richiesta vengono superati frequentemente.
  • Stato dei fornitori: Monitora le pagine di stato dei tuoi fornitori LLM (OpenAI, Anthropic, ecc.) e integra le loro API di stato se disponibili.

Esempio pratico (registrazione di costi/latenza):

import time
from langchain_openai import ChatOpenAI

def call_llm_and_log_metrics(model_name, prompt_text):
 start_time = time.time()
 llm = ChatOpenAI(model=model_name)
 try:
 response = llm.invoke(prompt_text)
 end_time = time.time()

 # Langchain fornisce spesso informazioni sull'utilizzo dei token nei metadati della risposta
 input_tokens = response.response_metadata.get('token_usage', {}).get('prompt_tokens', 0)
 output_tokens = response.response_metadata.get('token_usage', {}).get('completion_tokens', 0)
 total_tokens = input_tokens + output_tokens

 latency = (end_time - start_time) * 1000 # millisecondi

 # Stampa semplice per illustrazione; in produzione, invia a Prometheus/Grafana, Datadog, ecc.
 print(f"Metrica di chiamata LLM:")
 print(f" Modello: {model_name}")
 print(f" Latency: {latency:.2f} ms")
 print(f" Tokens in ingresso: {input_tokens}")
 print(f" Tokens in uscita: {output_tokens}")
 print(f" Totale tokens: {total_tokens}")
 # Stimare il costo (tariffa esemplificativa, regola se necessario)
 # Per gpt-3.5-turbo-0125: ingresso $0.50/M tokens, uscita $1.50/M tokens
 input_cost = (input_tokens / 1_000_000) * 0.50
 output_cost = (output_tokens / 1_000_000) * 1.50
 total_cost = input_cost + output_cost
 print(f" Costo stimato: ${total_cost:.5f}")

 return response.content
 except Exception as e:
 print(f"Errore nella chiamata LLM: {e}")
 # Registra l'errore nel sistema di tracciamento degli errori
 return None

# Esempio di utilizzo
call_llm_and_log_metrics("gpt-3.5-turbo-0125", "Spiega l'entanglement quantistico in termini semplici.")

4. Monitoraggio della sicurezza & della protezione

Prevenire la generazione di contenuti dannosi, di parte o inappropriati è una preoccupazione fondamentale per le applicazioni LLM.

Pratiche migliori:

  • Moderazione delle entrate/uscite: Utilizza le API di moderazione dei contenuti (ad esempio, l’endpoint di moderazione di OpenAI, soluzioni personalizzate) per scansionare le entrate degli utenti e le uscite LLM alla ricerca di contenuti dannosi (discorsi d’odio, autocommiserazione, contenuti sessuali, violenza).
  • Rilevamento di jailbreak: Monitora i tentativi degli utenti di aggirare i filtri di sicurezza o di indurre il LLM a generare contenuti indesiderati (jailbreaking).
  • Rilevamento di PII/PHI: Implementa sistemi di rilevamento e rimozione di PII (informazioni personalmente identificabili) e PHI (informazioni sanitarie protette) per evitare fughe di dati sensibili.
  • Rilevamento di pregiudizi: Sebbene sia complesso, cerca di identificare i pregiudizi statisticamente significativi nelle uscite LLM nel tempo (ad esempio, pregiudizio di genere, pregiudizio razziale nel testo generato).
  • Monitoraggio dell’iniezione di comandi: Cerca modelli nelle entrate degli utenti che suggeriscono tentativi di iniezione di comandi.

Esempio pratico (moderazione OpenAI):

from openai import OpenAI

client = OpenAI()

def moderate_text(text):
 try:
 response = client.moderations.create(input=text)
 result = response.results[0]
 if result.flagged:
 print(f"Contenuto segnalato: {result.categories}")
 return True, result.categories
 else:
 print("Il contenuto è sicuro.")
 return False, {}
 except Exception as e:
 print(f"Errore nell'API di moderazione: {e}")
 return False, {"error": str(e)}

# Esempio di utilizzo
is_flagged, categories = moderate_text("Odio tutti e voglio far loro del male.")
# is_flagged, categories = moderate_text("Il rapido renard brun salta sopra il cane pigro.")

if is_flagged:
 # Prendere delle misure: bloccare la risposta, escalare, ecc.
 pass

5. Monitoraggio dei dati & del contesto (per RAG/Agenti)

Per le applicazioni che utilizzano la generazione aumentata da recupero (RAG) o agenti complessi, il monitoraggio delle fonti di dati e del contesto è fondamentale.

Pratiche migliori:

  • Performance di recupero: Monitora la latenza e il tasso di successo delle tue richieste al database vettoriale o delle API esterne per recuperare il contesto.
  • Qualità dei documenti recuperati: Registra il contenuto dei documenti recuperati per ogni richiesta. Valuta la loro pertinenza rispetto alla domanda dell’utente. Questo può essere fatto tramite revisione umana o LLM come giudice.
  • Utilizzo della finestra di contesto: Monitora quanto della finestra di contesto del LLM è utilizzata dai documenti recuperati e dall’invito. Un riempimento eccessivo può portare a troncare o diminuire le performance.
  • Attualità dei dati: Per i sistemi RAG, assicurati che le fonti di dati sottostanti (ad esempio, database vettoriale, knowledge base) siano aggiornate e che i tuoi pipeline di indicizzazione/embedding funzionino correttamente.
  • Accuratezza nella selezione degli strumenti: Per gli agenti, monitora se gli strumenti giusti vengono selezionati per determinate richieste utente. Registra il processo di ragionamento dell’agente.

Esempio pratico (registrazione del contesto RAG):

# Supponiamo che tu abbia un setup RAG (ad esempio, l'esempio RAG di Langchain)
# Questo è concettuale, l'implementazione specifica dipende dalla tua configurazione RAG

def query_rag_and_log_context(retriever, llm_chain, user_query):
 # Simulare il recupero
 retrieved_docs = retriever.invoke(user_query)
 
 # Registrare i documenti recuperati per l'osservabilità
 print(f"\n--- Documenti recuperati per la richiesta : '{user_query}' ---")
 for i, doc in enumerate(retrieved_docs):
 print(f"Doc {i+1} (Fonte : {doc.metadata.get('source', 'N/A')}):")
 print(f" Estratto di contenuto : {doc.page_content[:200]}...")
 print("---------------------------------------------------")

 # Passare i documenti alla catena LLM con la richiesta
 response = llm_chain.invoke({"context": retrieved_docs, "question": user_query})
 
 return response

# Segnaposto per un recuperatore e una catena LLM
class MockRetriever:
 def invoke(self, query):
 if "internet" in query:
 return [
 {'page_content': 'L\'ARPANET, finanziato dalla DARPA, è stato il precursore di Internet. Il suo sviluppo è iniziato alla fine degli anni '60.', 'metadata': {'source': 'Wikipedia'}},
 {'page_content': 'Vinton Cerf e Robert Kahn hanno sviluppato i protocolli TCP/IP, che sono diventati lo standard per la comunicazione su Internet.', 'metadata': {'source': 'RFC 793'}}
 ]
 return []

class MockLLMChain:
 def invoke(self, inputs):
 context_summary = " ".join([d['page_content'] for d in inputs['context']])
 return f"Basato sul contesto fornito, ecco una risposta a \"{inputs['question']}\" : {context_summary[:150]}..."

# Esempio di utilizzo
my_retriever = MockRetriever()
my_llm_chain = MockLLMChain()

query_rag_and_log_context(my_retriever, my_llm_chain, "Chi ha sviluppato i primi protocolli di Internet?")

Scelta degli strumenti giusti per l’osservabilità LLM

Una strategia di osservabilità LLM approfondita implica spesso una combinazione di strumenti :

  • Piattaforme specializzate in osservabilità LLM : Strumenti come Langsmith, Helicone, Athina.ai, Arize AI e Phoenix sono progettati specificamente per le applicazioni LLM, offrendo funzionalità come la gestione delle versioni delle richieste, la visualizzazione delle tracce, l’integrazione dei feedback degli utenti e la valutazione automatizzata.
  • Piattaforme tradizionali APM/Logging : Datadog, New Relic, Splunk, Elastic Stack (ELK) sono comunque essenziali per il monitoraggio dell’infrastruttura, i log delle applicazioni e l’aggregazione delle metriche. Integra metriche specifiche per LLM (utilizzo dei token, latenza) in queste platforme.
  • Basi di dati vettoriali : Cruciali per RAG, ma anche per memorizzare gli embedding delle richieste e delle risposte per un’analisi delle uscite problematiche basata sulla ricerca di similarità.
  • Strumenti di tracciamento delle esperienze : MLflow, Weights & Biases possono essere adattati per tracciare le esperienze di ingegneria delle richieste e le loro metriche associate.
  • Dashboard personalizzati & script : Per necessità specifiche, script Python personalizzati combinati a strumenti di dashboard come Grafana possono fornire approfondimenti mirati.

Conclusione

L’observabilità per le applicazioni LLM non è un’opzione, ma un requisito fondamentale per costruire sistemi solidi, affidabili e responsabili. Le caratteristiche uniche degli LLM richiedono un passaggio da una sorveglianza tradizionale a un approccio più sfumato che abbraccia il tracciamento delle entrate/uscite, la valutazione di qualità soggettiva, la gestione dei costi, le verifiche di sicurezza e la consapevolezza del contesto. Implementando le migliori pratiche descritte sopra e utilizzando gli strumenti appropriati, sviluppatori e team MLOps possono acquisire le intuizioni necessarie per comprendere, risolvere problemi e migliorare continuamente le loro applicazioni alimentate da LLM, garantendo che queste forniscano un valore costante e mantengano la fiducia degli utenti.

🕒 Published:

✍️
Written by Jake Chen

AI technology writer and researcher.

Learn more →
Browse Topics: Alerting | Analytics | Debugging | Logging | Observability

See Also

AgntboxClawgoAgntaiAgntzen
Scroll to Top