[{"data":1,"prerenderedAt":858},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fit\u002Fai\u002Fprompt-versiyonlama-ab-testi-llm-disiplini":13},{"i18nKey":4,"paths":5},"ai-004-2026-07",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fai\u002Fprompt-versioning-ab-testing-llm-ops","\u002Fen\u002Fai\u002Fprompt-versioning-ab-testing-llm-ops","\u002Fes\u002Fai\u002Fprompt-versionamiento-y-pruebas-ab","\u002Ffr\u002Fai\u002Fversionierung-und-ab-tests-von-prompts","\u002Fit\u002Fai\u002Fprompt-versiyonlama-ab-testi-llm-disiplini","\u002Fru\u002Fai\u002Fprompt-versioning-ab-testing-llm-ops","\u002Ftr\u002Fai\u002Fprompt-versiyonlama-ve-a-b-testi-llm-operasyonun-disiplini",{"_path":10,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":852,"_id":853,"_source":854,"_file":855,"_stem":856,"_extension":857},"ai",false,"","Versionamento dei Prompt e A\u002FB Test: la Disciplina delle Operazioni LLM","Nei sistemi LLM in production, testare, versionare e rollback delle modifiche ai prompt richiedono disciplina ingegneristica. Come con Promptfoo e LangSmith?","2026-07-11",[21,22,23,24,25],"llm-ops","prompt-engineering","evaluation","ab-testing","langsmith",9,"Roibase",{"type":29,"children":30,"toc":840},"root",[31,39,46,68,73,78,84,89,94,115,122,127,481,510,523,529,542,547,552,568,574,579,584,681,686,705,711,716,721,734,740,745,750,785,790,796,801,806,818,824,829,834],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","Chiunque operi sistemi LLM in production si confronta con la stessa domanda: ho modificato il prompt, l'output è migliorato? Dire \"sembra più coerente\" non è sufficiente. Se un team marketing genera 500 titoli di blog da Claude API ogni giorno, la differenza tra \"sii creativo\" e \"sii persuasivo\" nel prompt può generare migliaia di dollari di differenza in conversioni. Spingere in production senza misurare questa differenza non è ingegneria, è gambling. Pipeline di versionamento e valutazione dei prompt trasformano l'operatività LLM da sperimentazione casuale a testing disciplinato.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"perché-la-modifica-del-prompt-è-diversa-da-quella-del-codice",[44],{"type":37,"value":45},"Perché la Modifica del Prompt è Diversa da quella del Codice",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,66],{"type":37,"value":50},"Nel software classico, cambiare ",{"type":32,"tag":52,"props":53,"children":55},"code",{"className":54},[],[56],{"type":37,"value":57},"if (x > 5)",{"type":37,"value":59}," in ",{"type":32,"tag":52,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"if (x >= 5)",{"type":37,"value":67}," rompe gli unit test — il comportamento è deterministico. La modifica di un prompt è stocastica: lo stesso input produce output diversi, non esistono test di regressione, la definizione di \"peggio dell'originale\" è ambigua. Chiedendo a GPT-4 \"scrivi brevemente\" un giorno ottieni 50 parole, un altro 120. Questa incertezza rende impossibile decidere \"manda in production \u002F non mandare\" senza metriche.",{"type":32,"tag":33,"props":69,"children":70},{},[71],{"type":37,"value":72},"La seconda differenza riguarda i checkpoint di controllo. Una modifica al codice passa attraverso unit test, test d'integrazione e staging prima di arrivare al deployment. Una modifica al prompt, nella maggior parte dei team, va in production con \"ho provato nell'UI di Claude, funziona bene\". Il risultato: due settimane dopo arriva la segnalazione \"i nuovi prompt usano troppo gergo\", e per tornare alla versione precedente devi controllare il commit di git.",{"type":32,"tag":33,"props":74,"children":75},{},[76],{"type":37,"value":77},"La terza differenza è il lag nel rilevare l'impatto. Contenuto generato con un nuovo prompt potrebbe ridurre la performance SEO due mesi dopo; l'output del chatbot potrebbe erodere la soddisfazione del cliente gradualmente. Un bug nel codice triggera subito un allarme in Sentry, la regressione del prompt si accumula silenziosamente.",{"type":32,"tag":40,"props":79,"children":81},{"id":80},"lanatomia-di-una-pipeline-di-valutazione",[82],{"type":37,"value":83},"L'Anatomia di una Pipeline di Valutazione",{"type":32,"tag":33,"props":85,"children":86},{},[87],{"type":37,"value":88},"Una pipeline di valutazione ha tre strati: dataset, judge, report. Il dataset è un campione di input da production — non \"prompt generico di test\", ma query reali di utenti. Per un chatbot di supporto clienti, il dataset è un set di 100 coppie input-output da ticket reali. Le etichetter manualmente: \"contiene allucinazione\", \"tono errato\", \"fattualmente corretto\". Il dataset non è un fixture statico, viene aggiornato da production ogni settimana.",{"type":32,"tag":33,"props":90,"children":91},{},[92],{"type":37,"value":93},"Il judge è il meccanismo che scorea l'output. Livello base: regex\u002Fkeyword matching (\"l'output deve contenere 'ci scusiamo'\"). Livello intermedio: usare un altro LLM come judge (chiedi a GPT-4 \"questo output è utile? Dai un voto da 1 a 5\"). Livello avanzato: train un custom classifier (un BERT-based binary classifier: allucinazione sì\u002Fno). Lo stesso judge deve essere versionato — se il judge cambia, gli score cambiano, le trend si rompono.",{"type":32,"tag":33,"props":95,"children":96},{},[97,99,105,107,113],{"type":37,"value":98},"Lo strato report trasforma l'A\u002FB test in decisione. Hai due versioni di prompt: ",{"type":32,"tag":52,"props":100,"children":102},{"className":101},[],[103],{"type":37,"value":104},"baseline",{"type":37,"value":106}," (production) e ",{"type":32,"tag":52,"props":108,"children":110},{"className":109},[],[111],{"type":37,"value":112},"candidate",{"type":37,"value":114}," (quella sotto test). Esegui entrambe sullo stesso dataset, gli score del judge vengono aggregati. Report: \"candidate ha il 12% di accuracy fattuale più alta, ma il 8% di latenza più alta\". Decisione: è accettabile l'aumento di latenza? Lo rispondi con una metrica (il P95 della latenza supera l'SLA?).",{"type":32,"tag":116,"props":117,"children":119},"h3",{"id":118},"setup-di-eval-semplice-con-promptfoo",[120],{"type":37,"value":121},"Setup di Eval Semplice con Promptfoo",{"type":32,"tag":33,"props":123,"children":124},{},[125],{"type":37,"value":126},"Promptfoo è uno strumento CLI open source — scrivi la valutazione in configurazione:",{"type":32,"tag":128,"props":129,"children":133},"pre",{"className":130,"code":131,"language":132,"meta":16,"style":16},"language-yaml shiki shiki-themes github-dark","# promptfoo.yaml\nprompts:\n  - file:\u002F\u002Fprompts\u002Fv1-baseline.txt\n  - file:\u002F\u002Fprompts\u002Fv2-candidate.txt\n\nproviders:\n  - openai:gpt-4\n  - anthropic:claude-3-opus-20240229\n\ntests:\n  - vars:\n      user_query: \"Quando arriverà il mio ordine?\"\n    assert:\n      - type: contains\n        value: \"tracciamento della spedizione\"\n      - type: llm-rubric\n        value: \"La risposta mostra empatia verso il cliente?\"\n\n  - vars:\n      user_query: \"Come faccio a fare un reso?\"\n    assert:\n      - type: not-contains\n        value: \"sfortunatamente non possiamo\"\n","yaml",[134],{"type":32,"tag":52,"props":135,"children":136},{"__ignoreMap":16},[137,149,165,180,193,203,216,229,242,249,262,279,298,311,334,352,373,390,398,414,431,443,464],{"type":32,"tag":138,"props":139,"children":142},"span",{"class":140,"line":141},"line",1,[143],{"type":32,"tag":138,"props":144,"children":146},{"style":145},"--shiki-default:#6A737D",[147],{"type":37,"value":148},"# promptfoo.yaml\n",{"type":32,"tag":138,"props":150,"children":152},{"class":140,"line":151},2,[153,159],{"type":32,"tag":138,"props":154,"children":156},{"style":155},"--shiki-default:#85E89D",[157],{"type":37,"value":158},"prompts",{"type":32,"tag":138,"props":160,"children":162},{"style":161},"--shiki-default:#E1E4E8",[163],{"type":37,"value":164},":\n",{"type":32,"tag":138,"props":166,"children":168},{"class":140,"line":167},3,[169,174],{"type":32,"tag":138,"props":170,"children":171},{"style":161},[172],{"type":37,"value":173},"  - ",{"type":32,"tag":138,"props":175,"children":177},{"style":176},"--shiki-default:#9ECBFF",[178],{"type":37,"value":179},"file:\u002F\u002Fprompts\u002Fv1-baseline.txt\n",{"type":32,"tag":138,"props":181,"children":183},{"class":140,"line":182},4,[184,188],{"type":32,"tag":138,"props":185,"children":186},{"style":161},[187],{"type":37,"value":173},{"type":32,"tag":138,"props":189,"children":190},{"style":176},[191],{"type":37,"value":192},"file:\u002F\u002Fprompts\u002Fv2-candidate.txt\n",{"type":32,"tag":138,"props":194,"children":196},{"class":140,"line":195},5,[197],{"type":32,"tag":138,"props":198,"children":200},{"emptyLinePlaceholder":199},true,[201],{"type":37,"value":202},"\n",{"type":32,"tag":138,"props":204,"children":206},{"class":140,"line":205},6,[207,212],{"type":32,"tag":138,"props":208,"children":209},{"style":155},[210],{"type":37,"value":211},"providers",{"type":32,"tag":138,"props":213,"children":214},{"style":161},[215],{"type":37,"value":164},{"type":32,"tag":138,"props":217,"children":219},{"class":140,"line":218},7,[220,224],{"type":32,"tag":138,"props":221,"children":222},{"style":161},[223],{"type":37,"value":173},{"type":32,"tag":138,"props":225,"children":226},{"style":176},[227],{"type":37,"value":228},"openai:gpt-4\n",{"type":32,"tag":138,"props":230,"children":232},{"class":140,"line":231},8,[233,237],{"type":32,"tag":138,"props":234,"children":235},{"style":161},[236],{"type":37,"value":173},{"type":32,"tag":138,"props":238,"children":239},{"style":176},[240],{"type":37,"value":241},"anthropic:claude-3-opus-20240229\n",{"type":32,"tag":138,"props":243,"children":244},{"class":140,"line":26},[245],{"type":32,"tag":138,"props":246,"children":247},{"emptyLinePlaceholder":199},[248],{"type":37,"value":202},{"type":32,"tag":138,"props":250,"children":252},{"class":140,"line":251},10,[253,258],{"type":32,"tag":138,"props":254,"children":255},{"style":155},[256],{"type":37,"value":257},"tests",{"type":32,"tag":138,"props":259,"children":260},{"style":161},[261],{"type":37,"value":164},{"type":32,"tag":138,"props":263,"children":265},{"class":140,"line":264},11,[266,270,275],{"type":32,"tag":138,"props":267,"children":268},{"style":161},[269],{"type":37,"value":173},{"type":32,"tag":138,"props":271,"children":272},{"style":155},[273],{"type":37,"value":274},"vars",{"type":32,"tag":138,"props":276,"children":277},{"style":161},[278],{"type":37,"value":164},{"type":32,"tag":138,"props":280,"children":282},{"class":140,"line":281},12,[283,288,293],{"type":32,"tag":138,"props":284,"children":285},{"style":155},[286],{"type":37,"value":287},"      user_query",{"type":32,"tag":138,"props":289,"children":290},{"style":161},[291],{"type":37,"value":292},": ",{"type":32,"tag":138,"props":294,"children":295},{"style":176},[296],{"type":37,"value":297},"\"Quando arriverà il mio ordine?\"\n",{"type":32,"tag":138,"props":299,"children":301},{"class":140,"line":300},13,[302,307],{"type":32,"tag":138,"props":303,"children":304},{"style":155},[305],{"type":37,"value":306},"    assert",{"type":32,"tag":138,"props":308,"children":309},{"style":161},[310],{"type":37,"value":164},{"type":32,"tag":138,"props":312,"children":314},{"class":140,"line":313},14,[315,320,325,329],{"type":32,"tag":138,"props":316,"children":317},{"style":161},[318],{"type":37,"value":319},"      - ",{"type":32,"tag":138,"props":321,"children":322},{"style":155},[323],{"type":37,"value":324},"type",{"type":32,"tag":138,"props":326,"children":327},{"style":161},[328],{"type":37,"value":292},{"type":32,"tag":138,"props":330,"children":331},{"style":176},[332],{"type":37,"value":333},"contains\n",{"type":32,"tag":138,"props":335,"children":337},{"class":140,"line":336},15,[338,343,347],{"type":32,"tag":138,"props":339,"children":340},{"style":155},[341],{"type":37,"value":342},"        value",{"type":32,"tag":138,"props":344,"children":345},{"style":161},[346],{"type":37,"value":292},{"type":32,"tag":138,"props":348,"children":349},{"style":176},[350],{"type":37,"value":351},"\"tracciamento della spedizione\"\n",{"type":32,"tag":138,"props":353,"children":355},{"class":140,"line":354},16,[356,360,364,368],{"type":32,"tag":138,"props":357,"children":358},{"style":161},[359],{"type":37,"value":319},{"type":32,"tag":138,"props":361,"children":362},{"style":155},[363],{"type":37,"value":324},{"type":32,"tag":138,"props":365,"children":366},{"style":161},[367],{"type":37,"value":292},{"type":32,"tag":138,"props":369,"children":370},{"style":176},[371],{"type":37,"value":372},"llm-rubric\n",{"type":32,"tag":138,"props":374,"children":376},{"class":140,"line":375},17,[377,381,385],{"type":32,"tag":138,"props":378,"children":379},{"style":155},[380],{"type":37,"value":342},{"type":32,"tag":138,"props":382,"children":383},{"style":161},[384],{"type":37,"value":292},{"type":32,"tag":138,"props":386,"children":387},{"style":176},[388],{"type":37,"value":389},"\"La risposta mostra empatia verso il cliente?\"\n",{"type":32,"tag":138,"props":391,"children":393},{"class":140,"line":392},18,[394],{"type":32,"tag":138,"props":395,"children":396},{"emptyLinePlaceholder":199},[397],{"type":37,"value":202},{"type":32,"tag":138,"props":399,"children":401},{"class":140,"line":400},19,[402,406,410],{"type":32,"tag":138,"props":403,"children":404},{"style":161},[405],{"type":37,"value":173},{"type":32,"tag":138,"props":407,"children":408},{"style":155},[409],{"type":37,"value":274},{"type":32,"tag":138,"props":411,"children":412},{"style":161},[413],{"type":37,"value":164},{"type":32,"tag":138,"props":415,"children":417},{"class":140,"line":416},20,[418,422,426],{"type":32,"tag":138,"props":419,"children":420},{"style":155},[421],{"type":37,"value":287},{"type":32,"tag":138,"props":423,"children":424},{"style":161},[425],{"type":37,"value":292},{"type":32,"tag":138,"props":427,"children":428},{"style":176},[429],{"type":37,"value":430},"\"Come faccio a fare un reso?\"\n",{"type":32,"tag":138,"props":432,"children":434},{"class":140,"line":433},21,[435,439],{"type":32,"tag":138,"props":436,"children":437},{"style":155},[438],{"type":37,"value":306},{"type":32,"tag":138,"props":440,"children":441},{"style":161},[442],{"type":37,"value":164},{"type":32,"tag":138,"props":444,"children":446},{"class":140,"line":445},22,[447,451,455,459],{"type":32,"tag":138,"props":448,"children":449},{"style":161},[450],{"type":37,"value":319},{"type":32,"tag":138,"props":452,"children":453},{"style":155},[454],{"type":37,"value":324},{"type":32,"tag":138,"props":456,"children":457},{"style":161},[458],{"type":37,"value":292},{"type":32,"tag":138,"props":460,"children":461},{"style":176},[462],{"type":37,"value":463},"not-contains\n",{"type":32,"tag":138,"props":465,"children":467},{"class":140,"line":466},23,[468,472,476],{"type":32,"tag":138,"props":469,"children":470},{"style":155},[471],{"type":37,"value":342},{"type":32,"tag":138,"props":473,"children":474},{"style":161},[475],{"type":37,"value":292},{"type":32,"tag":138,"props":477,"children":478},{"style":176},[479],{"type":37,"value":480},"\"sfortunatamente non possiamo\"\n",{"type":32,"tag":33,"props":482,"children":483},{},[484,486,492,494,500,502,508],{"type":37,"value":485},"Il comando ",{"type":32,"tag":52,"props":487,"children":489},{"className":488},[],[490],{"type":37,"value":491},"promptfoo eval",{"type":37,"value":493}," esegue ogni prompt × ogni test case, controlla gli assertion e stampa una tabella: quale prompt fallisce in quale test. L'assertion ",{"type":32,"tag":52,"props":495,"children":497},{"className":496},[],[498],{"type":37,"value":499},"llm-rubric",{"type":37,"value":501}," usa un altro LLM come judge (Promptfoo lo chiama automaticamente). Per vedere la differenza A\u002FB, lancia ",{"type":32,"tag":52,"props":503,"children":505},{"className":504},[],[506],{"type":37,"value":507},"promptfoo view",{"type":37,"value":509}," per aprire l'interfaccia web, dove confronti i due prompt side-by-side.",{"type":32,"tag":33,"props":511,"children":512},{},[513,515,521],{"type":37,"value":514},"Il vantaggio di Promptfoo è la velocità: 50 test case in 2 minuti, si integra in CI\u002FCD (",{"type":32,"tag":52,"props":516,"children":518},{"className":517},[],[519],{"type":37,"value":520},"promptfoo eval --assertions",{"type":37,"value":522}," ritorna exit code 1 se un test fallisce). Lo svantaggio: non è integrato con le trace di production — devi esportare i dati manualmente.",{"type":32,"tag":40,"props":524,"children":526},{"id":525},"eval-basato-su-trace-di-production-con-langsmith",[527],{"type":37,"value":528},"Eval Basato su Trace di Production con LangSmith",{"type":32,"tag":33,"props":530,"children":531},{},[532,534,540],{"type":37,"value":533},"LangSmith (prodotto del team LangChain) registra automaticamente i run LLM di production, poi esegui la valutazione su quei log. Il flusso: se la tua applicazione usa LangChain SDK, ogni LLM call viene loggato in LangSmith (input, output, latenza, costo). Nell'interfaccia di LangSmith, filtra: \"run con tag customer_support negli ultimi 7 giorni\", seleziona 200 esempi, clicca \"create dataset\". Questo dataset è ora versionato — salvato come ",{"type":32,"tag":52,"props":535,"children":537},{"className":536},[],[538],{"type":37,"value":539},"2026-07-01-support-sample",{"type":37,"value":541},".",{"type":32,"tag":33,"props":543,"children":544},{},[545],{"type":37,"value":546},"Ora vuoi testare un nuovo prompt. Nel \"Playground\" di LangSmith, modifichi il prompt e clicchi \"Run on dataset\": il nuovo prompt gira sui 200 esempi. I risultati appaiono side-by-side: output vecchio vs output nuovo. Tu o un judge model annotate: thumbs up\u002Fdown, o score personalizzato (1-5). LangSmith aggrega questi score: ad esempio, \"il nuovo prompt ha thumbs-up al 78%, il vecchio al 65%\".",{"type":32,"tag":33,"props":548,"children":549},{},[550],{"type":37,"value":551},"La forza di LangSmith è il contesto della trace. Non solo il prompt — anche gli step di retrieval sono visibili nella trace. Esempio: modifichi il prompt in un sistema RAG, ma il problema era il retrieval — documenti sbagliati venivano recuperati. Guardando la trace vedi: \"il nuovo prompt dà risposte migliori perché ho anche modificato la query di retrieval\". Questo insight non esiste in Promptfoo (che guarda solo l'output finale).",{"type":32,"tag":33,"props":553,"children":554},{},[555,557,566],{"type":37,"value":556},"Il trade-off di LangSmith è il lock-in: devi usare l'ecosistema LangChain. Se usi pure Anthropic SDK o OpenAI SDK, scrivi codice di tracing manuale (invia ogni call all'API di LangSmith). Alternativa: l'approccio ",{"type":32,"tag":558,"props":559,"children":563},"a",{"href":560,"rel":561},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Fgeo",[562],"nofollow",[564],{"type":37,"value":565},"Geo-Posizionamento del Brand nelle Risposte LLM",{"type":37,"value":567}," di Roibase — invii le trace LLM al tuo data warehouse, esegui l'eval da BigQuery.",{"type":32,"tag":40,"props":569,"children":571},{"id":570},"come-scegliere-le-metriche-di-eval",[572],{"type":37,"value":573},"Come Scegliere le Metriche di Eval",{"type":32,"tag":33,"props":575,"children":576},{},[577],{"type":37,"value":578},"La scelta della metrica dipende dal use case. Per la generazione di contenuti: \"la densità di keyword è nel target?\", \"il tono segue le linee guida del brand?\", \"ci sono allucinazioni fattuale?\". Per chatbot: \"la query è stata risolta?\", \"la latenza rispetta l'SLA?\", \"l'utente ha fatto una domanda di follow-up?\". Per ogni metrica, devi definire il judge.",{"type":32,"tag":33,"props":580,"children":581},{},[582],{"type":37,"value":583},"Una buona eval suite ha almeno 3 strati di metrica:",{"type":32,"tag":585,"props":586,"children":587},"table",{},[588,612],{"type":32,"tag":589,"props":590,"children":591},"thead",{},[592],{"type":32,"tag":593,"props":594,"children":595},"tr",{},[596,602,607],{"type":32,"tag":597,"props":598,"children":599},"th",{},[600],{"type":37,"value":601},"Strato",{"type":32,"tag":597,"props":603,"children":604},{},[605],{"type":37,"value":606},"Metriche di Esempio",{"type":32,"tag":597,"props":608,"children":609},{},[610],{"type":37,"value":611},"Tipo di Judge",{"type":32,"tag":613,"props":614,"children":615},"tbody",{},[616,639,660],{"type":32,"tag":593,"props":617,"children":618},{},[619,629,634],{"type":32,"tag":620,"props":621,"children":622},"td",{},[623],{"type":32,"tag":624,"props":625,"children":626},"strong",{},[627],{"type":37,"value":628},"Funzionale",{"type":32,"tag":620,"props":630,"children":631},{},[632],{"type":37,"value":633},"Il formato è corretto (JSON parsabile?), contiene keyword obbligatori?",{"type":32,"tag":620,"props":635,"children":636},{},[637],{"type":37,"value":638},"Regex \u002F deterministico",{"type":32,"tag":593,"props":640,"children":641},{},[642,650,655],{"type":32,"tag":620,"props":643,"children":644},{},[645],{"type":32,"tag":624,"props":646,"children":647},{},[648],{"type":37,"value":649},"Qualità",{"type":32,"tag":620,"props":651,"children":652},{},[653],{"type":37,"value":654},"Appropriatezza del tono, accuracy fattuale, allucinazione",{"type":32,"tag":620,"props":656,"children":657},{},[658],{"type":37,"value":659},"LLM-as-judge (GPT-4-turbo scorea)",{"type":32,"tag":593,"props":661,"children":662},{},[663,671,676],{"type":32,"tag":620,"props":664,"children":665},{},[666],{"type":32,"tag":624,"props":667,"children":668},{},[669],{"type":37,"value":670},"Business",{"type":32,"tag":620,"props":672,"children":673},{},[674],{"type":37,"value":675},"Previsione di conversione, stima di engagement",{"type":32,"tag":620,"props":677,"children":678},{},[679],{"type":37,"value":680},"Custom model (XGBoost predice: questo output porterà a una vendita?)",{"type":32,"tag":33,"props":682,"children":683},{},[684],{"type":37,"value":685},"Le metriche funzionali sono economiche, veloci, guard contro le regressioni. Le metriche di qualità sono costose (le call del judge LLM), ma il proxy più vicino alla valutazione umana. Le metriche di business sono le più preziose ma difficili da trainare — devi abbinare i dati di conversione all'output.",{"type":32,"tag":33,"props":687,"children":688},{},[689,691,696,698,703],{"type":37,"value":690},"Sia Promptfoo che LangSmith supportano LLM-as-judge. In Promptfoo, l'assertion ",{"type":32,"tag":52,"props":692,"children":694},{"className":693},[],[695],{"type":37,"value":499},{"type":37,"value":697}," invia a GPT-4 il tuo prompt: \"Scorea il seguente output da 1-10 per ",{"type":32,"tag":138,"props":699,"children":700},{},[701],{"type":37,"value":702},"il tuo criterio",{"type":37,"value":704},", rispondi solo il numero\". In LangSmith, definisci un \"Evaluator\": ad esempio, \"chiedere a Claude Haiku 'c'è empatia?', convertire la risposta a bool\".",{"type":32,"tag":40,"props":706,"children":708},{"id":707},"trasferire-lab-test-in-production",[709],{"type":37,"value":710},"Trasferire l'A\u002FB Test in Production",{"type":32,"tag":33,"props":712,"children":713},{},[714],{"type":37,"value":715},"Dopo che l'eval offline ha passato, viene il test A\u002FB in production. Due strategie: shadow deployment e gradual rollout. Nel shadow deployment, il nuovo prompt riceve il traffico di production ma l'output non viene mostrato all'utente — viene solo loggato e confrontato con il baseline. Shadow per una settimana, se le metriche non mostrano differenze significative, il nuovo prompt è scartato.",{"type":32,"tag":33,"props":717,"children":718},{},[719],{"type":37,"value":720},"Nel gradual rollout: 5% di traffico al nuovo prompt, 95% al baseline. Due settimane di osservazione delle metriche di business (es: conversation resolution rate del chatbot). Se tutto è stabile al 5%, sale al 25%, poi 50%, poi 100%. Se le KPI scendono a una delle fasi, rollback immediato.",{"type":32,"tag":33,"props":722,"children":723},{},[724,726,732],{"type":37,"value":725},"Il meccanismo di rollback è non-negoziabile. Versionare il prompt in git non è sufficiente — devi versionare anche il deployment di production. Esempio: se il tuo workflow n8n legge il prompt da un URL raw di GitHub, l'URL deve includere l'hash del commit: ",{"type":32,"tag":52,"props":727,"children":729},{"className":728},[],[730],{"type":37,"value":731},"github.com\u002F...\u002Fprompt.md?ref=abc123",{"type":37,"value":733},". Rollback: cambia l'hash a un commit precedente, rideploy del workflow (30 secondi). Un sistema di feature flag è più sofisticato: uno strumento tipo LaunchDarkly ti permette di toggleare la versione del prompt a runtime, senza deployment.",{"type":32,"tag":40,"props":735,"children":737},{"id":736},"budget-di-eval-e-automazione",[738],{"type":37,"value":739},"Budget di Eval e Automazione",{"type":32,"tag":33,"props":741,"children":742},{},[743],{"type":37,"value":744},"Il budget di eval di un sistema LLM in production dovrebbe essere il 10-20% del costo delle API LLM. Se fai 5.000$ di call a Claude al mese, dedica 500-1.000$ all'eval. Questo budget copre: refresh del dataset (100 nuovi esempi ogni settimana), call del judge LLM (2 per esempio = 200 esempi × 2 × $0.01 = $4), e labeling manuale (etichettamento umano dei casi edge critici, tariffato per ora).",{"type":32,"tag":33,"props":746,"children":747},{},[748],{"type":37,"value":749},"Automazione strutturata:",{"type":32,"tag":751,"props":752,"children":753},"ol",{},[754,765,775],{"type":32,"tag":755,"props":756,"children":757},"li",{},[758,763],{"type":32,"tag":624,"props":759,"children":760},{},[761],{"type":37,"value":762},"Eval in CI:",{"type":37,"value":764}," Ogni commit del prompt esegue Promptfoo contro il baseline, se una metrica funzionale fallisce la PR non viene mergeata.",{"type":32,"tag":755,"props":766,"children":767},{},[768,773],{"type":32,"tag":624,"props":769,"children":770},{},[771],{"type":37,"value":772},"Eval notturna:",{"type":37,"value":774}," Ogni notte il nuovo dataset è campionato da production, i candidate prompt vengono eseguiti, il rapporto va su Slack.",{"type":32,"tag":755,"props":776,"children":777},{},[778,783],{"type":32,"tag":624,"props":779,"children":780},{},[781],{"type":37,"value":782},"Review settimanale:",{"type":37,"value":784}," Lunedì mattina il team guarda il dashboard di LangSmith, revisiona le trend delle metriche di qualità, decide sui nuovi esperimenti.",{"type":32,"tag":33,"props":786,"children":787},{},[788],{"type":37,"value":789},"Senza automazione, l'eval nasce morta. \"Lo testeremo manualmente\" significa che nessuno lo farà — due mesi dopo il prompt di production sarà chaos.",{"type":32,"tag":40,"props":791,"children":793},{"id":792},"contro-argomento-leval-non-cattura-il-vero-utente",[794],{"type":37,"value":795},"Contro-argomento: L'Eval non Cattura il Vero Utente",{"type":32,"tag":33,"props":797,"children":798},{},[799],{"type":37,"value":800},"Il limite dell'eval: per quanto buono sia il judge, non può predire il comportamento reale dell'utente. Un LLM-as-judge dice \"questo tono è buono\", ma l'utente potrebbe chiudere. Soluzione: complementare l'eval con l'A\u002FB test in production, usare la valutazione come \"gate di go\u002Fno-go\", non come decisione finale. Eval passato = il nuovo prompt guadagna il 5% del traffico, ma la decisione ultima viene da KPI.",{"type":32,"tag":33,"props":802,"children":803},{},[804],{"type":37,"value":805},"Il secondo contro-argomento è il costo: costruire la pipeline di eval richiede tempo (2-3 settimane), le call del judge LLM si accumulano. Se modifichi il prompt una volta al mese, l'overhead della pipeline non si giustifica. Risposta: se modifichi il prompt una volta al mese, c'è un problema nella tua strategia LLM — la velocità di iterazione è troppo lenta, non è ingegneria della crescita.",{"type":32,"tag":33,"props":807,"children":808},{},[809,811,816],{"type":37,"value":810},"Domanda finale: è più rischioso andare avanti senza eval, o è il sovraccarico dell'eval? Se l'output LLM è critico per il ricavo (ad esempio: recommendation di prodotto, supporto clienti, citazioni in ",{"type":32,"tag":558,"props":812,"children":814},{"href":560,"rel":813},[562],[815],{"type":37,"value":565},{"type":37,"value":817},"), la risposta è chiara: senza eval, voli alla cieca. Se l'output è secondario (ad esempio: riassunti in uno strumento interno), il QA manuale potrebbe bastare.",{"type":32,"tag":40,"props":819,"children":821},{"id":820},"cosa-fai-questa-settimana",[822],{"type":37,"value":823},"Cosa Fai Questa Settimana",{"type":32,"tag":33,"props":825,"children":826},{},[827],{"type":37,"value":828},"Se hai LLM in production ma non hai una pipeline di eval: questa settimana installa Promptfoo, scrivi 20 test case, aggiungilo a CI. Commit message: \"Add baseline prompt eval\". Nel giro di un mese: crea un dataset di 100 esempi da production, avvia la trial di LangSmith (o invia il tuo log di trace personale a BigQuery), esegui il primo test A\u002FB in shadow mode. Entro tre mesi: l'automazione dell'eval è live, ogni modifica al prompt viene mergeata con la diff della metrica, il rollback è un comando.",{"type":32,"tag":33,"props":830,"children":831},{},[832],{"type":37,"value":833},"Il versionamento dei prompt e l'eval estraggono le operazioni LLM dal gioco d'azzardo e le portano nella disciplina ingegneristica. Invece di dire \"il nuovo prompt sembra migliore\", dici \"il candidate prompt ha il 12% di accuracy fattuale più alta e il 3% di latenza più bassa rispetto al baseline\". Questa differenza è la linea tra un LLM affidabile in production e un esperimento.",{"type":32,"tag":835,"props":836,"children":837},"style",{},[838],{"type":37,"value":839},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":16,"searchDepth":167,"depth":167,"links":841},[842,843,846,847,848,849,850,851],{"id":42,"depth":151,"text":45},{"id":80,"depth":151,"text":83,"children":844},[845],{"id":118,"depth":167,"text":121},{"id":525,"depth":151,"text":528},{"id":570,"depth":151,"text":573},{"id":707,"depth":151,"text":710},{"id":736,"depth":151,"text":739},{"id":792,"depth":151,"text":795},{"id":820,"depth":151,"text":823},"markdown","content:it:ai:prompt-versiyonlama-ab-testi-llm-disiplini.md","content","it\u002Fai\u002Fprompt-versiyonlama-ab-testi-llm-disiplini.md","it\u002Fai\u002Fprompt-versiyonlama-ab-testi-llm-disiplini","md",1785103522700]