AI Prompt Engineering · Lezione

Strategie di logging e documentazione

Registrazione delle versioni dei prompt, degli input e degli output per un debugging riproducibile

Lezione 4 di 413 passaggi

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 8601
  • prompt_id: quale modello di prompt è stato utilizzato
  • model: nome e versione esatti del modello
  • temperature: parametro di campionamento
  • input: il messaggio dell'utente (o un hash in presenza di PII)
  • output: la risposta del modello
  • latency_ms: tempo di risposta
  • tokens_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 output

Formato 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'] = version

Gestire 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, score

Documentazione 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.

Gratis per iniziare

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

  1. Diagnosticare output imprevisti
  2. Analisi delle cause principali dei problemi nei prompt
  3. Approccio sistematico al debugging
  4. Strategie di logging e documentazione
← Torna a AI Prompt Engineering