Strategie di logging e documentazione
Registrazione delle versioni dei prompt, degli input e degli output per un debugging riproducibile
Strategie di logging e documentazione è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.
Perché il logging dei prompt è importante
Senza logging, gli errori dei prompt rimangono invisibili finché un utente non li segnala. Con il logging è possibile:
- Rilevare le regressioni nel momento stesso in cui si verificano
- Riprodurre esattamente qualsiasi errore passato
- Misurare i miglioramenti nel tempo man mano che i prompt evolvono
- Verificare il comportamento del modello ai fini della conformità o della sicurezza
Il logging non è facoltativo nei sistemi di prompt in produzione: è la base per applicazioni LLM affidabili.
La voce di log minima necessaria
Ogni interazione con un prompt dovrebbe registrare almeno questi campi:
timestamp: UTC in formato ISO 8601prompt_id: quale modello di prompt è stato utilizzatomodel: nome e versione esatti del modellotemperature: parametro di campionamentoinput: il messaggio dell'utente (o un hash in presenza di PII)output: la risposta del modellolatency_ms: tempo di rispostatokens_used: token di input + output
import time, json
from datetime import datetime, timezone
def logged_call(prompt_id, system_prompt, user_message, model='gpt-4o', temperature=0.7):
start = time.time()
resp = client.chat.completions.create(
model=model,
messages=[
{'role': 'system', 'content': system_prompt},
{'role': 'user', 'content': user_message}
],
temperature=temperature
)
latency = int((time.time() - start) * 1000)
output = resp.choices[0].message.content
log_entry = {
'timestamp': datetime.now(timezone.utc).isoformat(),
'prompt_id': prompt_id,
'model': model,
'temperature': temperature,
'input': user_message,
'output': output,
'latency_ms': latency,
'input_tokens': resp.usage.prompt_tokens,
'output_tokens': resp.usage.completion_tokens
}
append_log(log_entry)
return outputFormato di logging strutturato
Utilizzi il JSON delimitato da newline (JSONL) per i file di log. Ogni riga è un oggetto JSON completo e valido. Questo formato è:
- Facile da estendere senza blocchi
- Leggibile da jq, pandas e tutti gli aggregatori di log
- Adatto allo streaming: ogni riga può essere elaborata non appena arriva
import json
LOG_FILE = 'prompt_logs.jsonl'
def append_log(entry):
with open(LOG_FILE, 'a') as f:
f.write(json.dumps(entry) + '\n')
def read_logs():
with open(LOG_FILE) as f:
return [json.loads(line) for line in f if line.strip()]
# Query: all entries for prompt_id 'summarize_v3'
logs = read_logs()
summarize_logs = [e for e in logs if e['prompt_id'] == 'summarize_v3']
print(f'Total calls to summarize_v3: {len(summarize_logs)}')Versionamento dei prompt
I prompt cambiano nel tempo. Senza versionamento, non è possibile riprodurre il comportamento passato o confrontare gli output del modello tra diverse versioni del prompt. Utilizzi un identificatore di versione in ogni voce di log.
Versionamento semplice: una stringa di versione semantica (ad esempio v1.2.3) oppure un hash del commit git. Conservi le versioni dei prompt in un file dedicato, in modo da poter recuperare qualsiasi versione per riprodurla.
PROMPTS = {
'summarize': {
'v1': 'Summarize the following text.',
'v2': 'Summarize the following text in 3 sentences.',
'v3': 'Summarize the following text in exactly 3 sentences. '
'Start each sentence on a new line. No bullet points.'
}
}
CURRENT_VERSIONS = {'summarize': 'v3'}
def get_prompt(prompt_id):
version = CURRENT_VERSIONS[prompt_id]
return version, PROMPTS[prompt_id][version]
version, prompt = get_prompt('summarize')
log_entry['prompt_version'] = versionGestire i dati personali nei log
Gli input degli utenti possono contenere informazioni personali identificabili (PII). La registrazione degli input grezzi potrebbe violare il GDPR o il CCPA. Opzioni:
- Hash: memorizzare l'hash SHA-256 dell'input, riproducibile per la deduplicazione ma non per la riproduzione
- Oscuramento: utilizzare un'espressione regolare o un modello NER per sostituire i dati personali prima della registrazione
- Archiviazione separata: registrare i dati personali in un archivio crittografato con controlli di accesso e registrare solo un ID di riferimento nel log principale
import hashlib, re
def redact_pii(text):
# Redact email addresses
text = re.sub(r'[\w.-]+@[\w.-]+\.\w+', '[EMAIL]', text)
# Redact phone numbers (US format)
text = re.sub(r'\b\d{3}[-.]\d{3}[-.]\d{4}\b', '[PHONE]', text)
return text
def hash_input(text):
return hashlib.sha256(text.encode()).hexdigest()[:16]
log_entry['input'] = redact_pii(user_message)
log_entry['input_hash'] = hash_input(user_message)Monitoraggio della latenza e dei costi
I log consentono di creare dashboard per costi e latenza. Monitori le metriche per versione del prompt per rilevare regressioni nelle prestazioni o nei costi dopo una modifica al prompt:
def compute_cost(entry, price_per_1m_input=5.0, price_per_1m_output=15.0):
input_cost = entry['input_tokens'] / 1_000_000 * price_per_1m_input
output_cost = entry['output_tokens'] / 1_000_000 * price_per_1m_output
return input_cost + output_cost
def prompt_stats(prompt_id, version):
logs = [e for e in read_logs()
if e['prompt_id'] == prompt_id and e.get('prompt_version') == version]
if not logs:
return
avg_latency = sum(e['latency_ms'] for e in logs) / len(logs)
total_cost = sum(compute_cost(e) for e in logs)
print(f'{prompt_id} {version}: {len(logs)} calls, avg {avg_latency:.0f}ms, total ${total_cost:.4f}')Registrazione della valutazione dell'output
Oltre ai log grezzi, memorizzi i punteggi di valutazione insieme a ogni voce di log. In questo modo è possibile analizzare le tendenze: la qualità dell'output migliora tra le diverse versioni del prompt?
def evaluated_call(prompt_id, system_prompt, user_message, evaluator_fn):
output = logged_call(prompt_id, system_prompt, user_message)
score = evaluator_fn(user_message, output)
# Update the last log entry with the evaluation score
logs = read_logs()
last = logs[-1]
last['eval_score'] = score
last['eval_pass'] = score >= 0.8
# Rewrite the last line
with open(LOG_FILE, 'a') as f:
# In practice, use a DB or separate eval log
pass
return output, scoreDocumentazione dei prompt
Ogni modello di prompt dovrebbe avere una voce di documentazione associata che includa:
- Scopo: quale attività esegue il prompt
- Variabili: quali segnaposto sono presenti e quali valori si aspettano
- Limitazioni note: gli input con cui è noto che il prompt fallisce
- Cronologia delle versioni: che cosa è cambiato in ogni versione e perché
- Casi di test: collegamento alla suite di test per questo prompt
PROMPT_DOCS = {
'summarize': {
'purpose': 'Summarize a single text passage into 3 sentences.',
'variables': {'text': 'The passage to summarize (max 2000 tokens)'},
'known_limitations': [
'Fails to preserve numbers accurately for texts with many statistics',
'May not summarize correctly for non-English text'
],
'versions': {
'v1': 'Initial version — vague length instruction',
'v2': 'Added 3-sentence limit',
'v3': 'Added line-break and no-bullet formatting fix'
},
'test_suite': 'tests/test_summarize.py'
}
}Utilizzare servizi di logging centralizzati
Per i sistemi in produzione, scriva i log in un servizio centralizzato anziché in file locali:
- LangSmith: piattaforma nativa di tracing e valutazione di LangChain
- Weights and Biases Prompts: monitoraggio degli esperimenti per i prompt
- Datadog / Grafana: dashboard operative standard con metriche personalizzate
- Supabase / PostgreSQL: interrogazione dei log con SQL per analisi ad hoc
Lo schema è lo stesso; cambia solo la destinazione.
# Example: writing to Supabase
from supabase import create_client
supabase = create_client('https://xxx.supabase.co', 'your-anon-key')
def log_to_supabase(entry):
supabase.table('prompt_logs').insert(entry).execute()
# Now query with SQL:
# SELECT prompt_id, prompt_version, AVG(latency_ms), COUNT(*)
# FROM prompt_logs
# WHERE timestamp > NOW() - INTERVAL '7 days'
# GROUP BY prompt_id, prompt_version
# ORDER BY COUNT(*) DESC;Avvisi sui picchi di errori
Configuri gli avvisi quando i tassi di errore superano una soglia. Ad esempio: se più del 10% delle chiamate a un prompt restituisce JSON non valido nell'arco di 5 minuti, invii un avviso.
from collections import deque
from datetime import datetime, timezone, timedelta
recent_results = deque(maxlen=100) # sliding window
def track_and_alert(prompt_id, success, alert_fn, threshold=0.10):
recent_results.append({'success': success, 'time': datetime.now(timezone.utc)})
window = [
r for r in recent_results
if r['time'] > datetime.now(timezone.utc) - timedelta(minutes=5)
]
if not window:
return
fail_rate = sum(1 for r in window if not r['success']) / len(window)
if fail_rate > threshold:
alert_fn(f'ALERT: {prompt_id} failure rate {fail_rate:.0%} in last 5 min')Conservazione e archiviazione
Definisca un criterio di conservazione dei log:
- Log grezzi delle chiamate: 30 giorni (a rotazione) — volume elevato, necessari per eseguire il debug dei problemi recenti
- Metriche aggregate: 1 anno — necessarie per l'analisi delle tendenze e la previsione dei costi
- Log degli errori: a tempo indefinito — necessari per individuare schemi nelle cause principali
Comprima e archivi i log grezzi dopo 30 giorni. Non elimini mai i log degli errori: sono la memoria istituzionale per il prompt engineering.
Verifica delle conoscenze
Qual è il vantaggio principale dell'utilizzo del formato JSON delimitato da newline (JSONL) per i log dei prompt rispetto a un singolo grande array JSON?
Riepilogo: logging e documentazione
Pratiche fondamentali per il logging e la documentazione dei prompt:
- Registri ogni chiamata: timestamp, prompt_id, version, model, temperature, input, output, latency, tokens
- Utilizzi il formato JSONL: adatto all'aggiunta progressiva, interrogabile con strumenti standard
- Versioni i prompt: ogni modifica riceve una nuova versione; i log fanno riferimento alla versione
- Gestisca i dati personali: oscuri o sottoponga a hashing gli input sensibili prima di registrarli
- Tenga traccia dei costi e della latenza: rilevi le regressioni dopo gli aggiornamenti dei prompt
- Imposti avvisi sui picchi di errori: monitoraggio del tasso di errore su una finestra scorrevole
Questo conclude il corso 17 sul debugging degli errori dei prompt. Prossimo argomento: prompt injection e difesa.
Impara AI Prompt Engineering con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 53
- Lezioni
- 199
Domande Frequenti
La lezione «Strategie di logging e documentazione» è gratuita?
Sì — il testo completo di «Strategie di logging e documentazione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.
Cosa imparerò in «Strategie di logging e documentazione»?
Registrazione delle versioni dei prompt, degli input e degli output per un debugging riproducibile Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Prompt Engineering?
Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Strategie di logging e documentazione»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?
Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Diagnosticare output imprevisti
- Analisi delle cause principali dei problemi nei prompt
- Approccio sistematico al debugging
- Strategie di logging e documentazione