[{"data":1,"prerenderedAt":1133},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fit\u002Fai\u002Fprompt-versioning-ab-testing":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-discipline","\u002Fes\u002Fai\u002Fversionamiento-prompts-ab-testing-llm","\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":14,"_dir":15,"_draft":16,"_partial":16,"_locale":17,"title":18,"description":19,"publishedAt":20,"modifiedAt":20,"category":15,"i18nKey":4,"tags":21,"readingTime":27,"author":28,"body":29,"_type":812,"_id":1128,"_source":1129,"_file":1130,"_stem":1131,"_extension":1132},"\u002Fit\u002Fai\u002Fprompt-versioning-ab-testing","ai",false,"","Versionamento dei Prompt e A\u002FB Test: La Disciplina delle Operazioni LLM","Come testare sistematicamente gli output LLM con Promptfoo e LangSmith? Pratica nella costruzione di pipeline di valutazione per applicazioni AI production-grade.","2026-07-30",[22,23,24,25,26],"llm-ops","prompt-engineering","evaluation","ab-testing","mlops",9,"Roibase",{"type":30,"children":31,"toc":1114},"root",[32,40,47,52,65,70,76,90,103,435,440,447,452,457,463,468,484,490,495,500,506,511,544,554,559,594,599,605,610,615,767,772,777,783,796,804,809,984,989,1002,1008,1013,1018,1023,1078,1083,1097,1103,1108],{"type":33,"tag":34,"props":35,"children":36},"element","p",{},[37],{"type":38,"value":39},"text","Nel momento in cui iniziate a usare LLM in produzione, scoprite di aver bisogno della stessa disciplina di \"test suite\" dell'ingegneria software classica. Quando cambiate un prompt, cosa accade alla consistenza dell'output? Se aggiornate la versione del modello, come cambia il bilancio costo-qualità? Come trasformate il vostro intuito \"Claude ha dato una risposta migliore\" in una metrica numerica? Nel 2026, quando le operazioni LLM sono mature, vincono quelli che rispondono a queste domande sistematicamente, non manualmente. Strumenti come Promptfoo e LangSmith, insieme alle pipeline di valutazione, sono l'assicurazione per mantenere gli LLM in produzione.",{"type":33,"tag":41,"props":42,"children":44},"h2",{"id":43},"cambio-di-prompt-cambio-di-codice",[45],{"type":38,"value":46},"Cambio di Prompt = Cambio di Codice",{"type":33,"tag":34,"props":48,"children":49},{},[50],{"type":38,"value":51},"Immaginate di avere un workflow di generazione di contenuti di marketing. Inviate un prompt all'API Claude, ricevete una bozza di blog. Nella prima versione dite semplicemente \"scrivi\", nella seconda aggiungete al system prompt \"Scrivi per Roibase, usa un tono ingegneristico\". Nella terza versione aggiungete una lista di \"PAROLE VIETATE\". Ogni cambio influisce sull'output, ma come lo misurate?",{"type":33,"tag":34,"props":53,"children":54},{},[55,57,63],{"type":38,"value":56},"Nel software classico esiste il unit test — input della funzione fisso, output deterministico. Con gli LLM, l'input è fisso ma l'output è stocastico. Non potete decidere con una sola esecuzione. Dovete eseguire lo stesso prompt con 10 seed diversi, osservare il token count medio, la latenza, il punteggio di coerenza. Ecco perché il ",{"type":33,"tag":58,"props":59,"children":60},"strong",{},[61],{"type":38,"value":62},"versionamento dei prompt",{"type":38,"value":64}," è critico quanto il versionamento del codice. Potete tracciare i cambiamenti del prompt con Git commit, ma se non tracciate l'output siete punto e a capo. Qui entra in gioco la suite di valutazione: esegue test automatici a ogni commit, rivela regressioni nelle metriche.",{"type":33,"tag":34,"props":66,"children":67},{},[68],{"type":38,"value":69},"Scenario concreto: nel vostro workflow n8n state facendo generare contenuti con Claude. Quando cambiate il prompt da \"1500 parole\" a \"1400-1600 parole\", la lunghezza media scende da 1520 a 1480 parole, il costo in token cala del 3% ma il punteggio di leggibilità perde 0.2 punti. Per vedere questo tradeoff senza provare manualmente è indispensabile una pipeline di valutazione automatica.",{"type":33,"tag":41,"props":71,"children":73},{"id":72},"promptfoo-regression-test-suite-per-i-prompt",[74],{"type":38,"value":75},"Promptfoo: Regression Test Suite per i Prompt",{"type":33,"tag":34,"props":77,"children":78},{},[79,81,88],{"type":38,"value":80},"Promptfoo è uno strumento open source a riga di comando — definite i prompt con config YAML, fornite i test case in CSV o JSON, scrivete le asserzioni. Il comando ",{"type":33,"tag":82,"props":83,"children":85},"code",{"className":84},[],[86],{"type":38,"value":87},"promptfoo eval",{"type":38,"value":89}," esegue tutte le varianti, fornisce una tabella di successo\u002Ffallimento.",{"type":33,"tag":34,"props":91,"children":92},{},[93,95,101],{"type":38,"value":94},"Un tipico ",{"type":33,"tag":82,"props":96,"children":98},{"className":97},[],[99],{"type":38,"value":100},"promptfoo.yaml",{"type":38,"value":102}," appare così:",{"type":33,"tag":104,"props":105,"children":109},"pre",{"code":106,"language":107,"meta":17,"className":108,"style":17},"prompts:\n  - id: baseline\n    text: \"Scrivi un articolo di blog su {{topic}}\"\n  - id: roibase-tone\n    text: \"Scrivi un articolo di blog su {{topic}}. Usa un tono di disciplina ingegneristica. Niente parole hype.\"\n\nproviders:\n  - anthropic:messages:claude-3-5-sonnet-20241022\n\ntests:\n  - vars:\n      topic: \"server-side GTM setup\"\n    assert:\n      - type: contains\n        value: \"first-party\"\n      - type: javascript\n        value: output.length > 1400 && output.length \u003C 1600\n      - type: cost\n        threshold: 0.05\n","yaml","language-yaml shiki shiki-themes github-dark",[110],{"type":33,"tag":82,"props":111,"children":112},{"__ignoreMap":17},[113,131,156,174,195,212,222,235,248,255,268,285,303,316,339,357,378,395,416],{"type":33,"tag":114,"props":115,"children":118},"span",{"class":116,"line":117},"line",1,[119,125],{"type":33,"tag":114,"props":120,"children":122},{"style":121},"--shiki-default:#85E89D",[123],{"type":38,"value":124},"prompts",{"type":33,"tag":114,"props":126,"children":128},{"style":127},"--shiki-default:#E1E4E8",[129],{"type":38,"value":130},":\n",{"type":33,"tag":114,"props":132,"children":134},{"class":116,"line":133},2,[135,140,145,150],{"type":33,"tag":114,"props":136,"children":137},{"style":127},[138],{"type":38,"value":139},"  - ",{"type":33,"tag":114,"props":141,"children":142},{"style":121},[143],{"type":38,"value":144},"id",{"type":33,"tag":114,"props":146,"children":147},{"style":127},[148],{"type":38,"value":149},": ",{"type":33,"tag":114,"props":151,"children":153},{"style":152},"--shiki-default:#9ECBFF",[154],{"type":38,"value":155},"baseline\n",{"type":33,"tag":114,"props":157,"children":159},{"class":116,"line":158},3,[160,165,169],{"type":33,"tag":114,"props":161,"children":162},{"style":121},[163],{"type":38,"value":164},"    text",{"type":33,"tag":114,"props":166,"children":167},{"style":127},[168],{"type":38,"value":149},{"type":33,"tag":114,"props":170,"children":171},{"style":152},[172],{"type":38,"value":173},"\"Scrivi un articolo di blog su {{topic}}\"\n",{"type":33,"tag":114,"props":175,"children":177},{"class":116,"line":176},4,[178,182,186,190],{"type":33,"tag":114,"props":179,"children":180},{"style":127},[181],{"type":38,"value":139},{"type":33,"tag":114,"props":183,"children":184},{"style":121},[185],{"type":38,"value":144},{"type":33,"tag":114,"props":187,"children":188},{"style":127},[189],{"type":38,"value":149},{"type":33,"tag":114,"props":191,"children":192},{"style":152},[193],{"type":38,"value":194},"roibase-tone\n",{"type":33,"tag":114,"props":196,"children":198},{"class":116,"line":197},5,[199,203,207],{"type":33,"tag":114,"props":200,"children":201},{"style":121},[202],{"type":38,"value":164},{"type":33,"tag":114,"props":204,"children":205},{"style":127},[206],{"type":38,"value":149},{"type":33,"tag":114,"props":208,"children":209},{"style":152},[210],{"type":38,"value":211},"\"Scrivi un articolo di blog su {{topic}}. Usa un tono di disciplina ingegneristica. Niente parole hype.\"\n",{"type":33,"tag":114,"props":213,"children":215},{"class":116,"line":214},6,[216],{"type":33,"tag":114,"props":217,"children":219},{"emptyLinePlaceholder":218},true,[220],{"type":38,"value":221},"\n",{"type":33,"tag":114,"props":223,"children":225},{"class":116,"line":224},7,[226,231],{"type":33,"tag":114,"props":227,"children":228},{"style":121},[229],{"type":38,"value":230},"providers",{"type":33,"tag":114,"props":232,"children":233},{"style":127},[234],{"type":38,"value":130},{"type":33,"tag":114,"props":236,"children":238},{"class":116,"line":237},8,[239,243],{"type":33,"tag":114,"props":240,"children":241},{"style":127},[242],{"type":38,"value":139},{"type":33,"tag":114,"props":244,"children":245},{"style":152},[246],{"type":38,"value":247},"anthropic:messages:claude-3-5-sonnet-20241022\n",{"type":33,"tag":114,"props":249,"children":250},{"class":116,"line":27},[251],{"type":33,"tag":114,"props":252,"children":253},{"emptyLinePlaceholder":218},[254],{"type":38,"value":221},{"type":33,"tag":114,"props":256,"children":258},{"class":116,"line":257},10,[259,264],{"type":33,"tag":114,"props":260,"children":261},{"style":121},[262],{"type":38,"value":263},"tests",{"type":33,"tag":114,"props":265,"children":266},{"style":127},[267],{"type":38,"value":130},{"type":33,"tag":114,"props":269,"children":271},{"class":116,"line":270},11,[272,276,281],{"type":33,"tag":114,"props":273,"children":274},{"style":127},[275],{"type":38,"value":139},{"type":33,"tag":114,"props":277,"children":278},{"style":121},[279],{"type":38,"value":280},"vars",{"type":33,"tag":114,"props":282,"children":283},{"style":127},[284],{"type":38,"value":130},{"type":33,"tag":114,"props":286,"children":288},{"class":116,"line":287},12,[289,294,298],{"type":33,"tag":114,"props":290,"children":291},{"style":121},[292],{"type":38,"value":293},"      topic",{"type":33,"tag":114,"props":295,"children":296},{"style":127},[297],{"type":38,"value":149},{"type":33,"tag":114,"props":299,"children":300},{"style":152},[301],{"type":38,"value":302},"\"server-side GTM setup\"\n",{"type":33,"tag":114,"props":304,"children":306},{"class":116,"line":305},13,[307,312],{"type":33,"tag":114,"props":308,"children":309},{"style":121},[310],{"type":38,"value":311},"    assert",{"type":33,"tag":114,"props":313,"children":314},{"style":127},[315],{"type":38,"value":130},{"type":33,"tag":114,"props":317,"children":319},{"class":116,"line":318},14,[320,325,330,334],{"type":33,"tag":114,"props":321,"children":322},{"style":127},[323],{"type":38,"value":324},"      - ",{"type":33,"tag":114,"props":326,"children":327},{"style":121},[328],{"type":38,"value":329},"type",{"type":33,"tag":114,"props":331,"children":332},{"style":127},[333],{"type":38,"value":149},{"type":33,"tag":114,"props":335,"children":336},{"style":152},[337],{"type":38,"value":338},"contains\n",{"type":33,"tag":114,"props":340,"children":342},{"class":116,"line":341},15,[343,348,352],{"type":33,"tag":114,"props":344,"children":345},{"style":121},[346],{"type":38,"value":347},"        value",{"type":33,"tag":114,"props":349,"children":350},{"style":127},[351],{"type":38,"value":149},{"type":33,"tag":114,"props":353,"children":354},{"style":152},[355],{"type":38,"value":356},"\"first-party\"\n",{"type":33,"tag":114,"props":358,"children":360},{"class":116,"line":359},16,[361,365,369,373],{"type":33,"tag":114,"props":362,"children":363},{"style":127},[364],{"type":38,"value":324},{"type":33,"tag":114,"props":366,"children":367},{"style":121},[368],{"type":38,"value":329},{"type":33,"tag":114,"props":370,"children":371},{"style":127},[372],{"type":38,"value":149},{"type":33,"tag":114,"props":374,"children":375},{"style":152},[376],{"type":38,"value":377},"javascript\n",{"type":33,"tag":114,"props":379,"children":381},{"class":116,"line":380},17,[382,386,390],{"type":33,"tag":114,"props":383,"children":384},{"style":121},[385],{"type":38,"value":347},{"type":33,"tag":114,"props":387,"children":388},{"style":127},[389],{"type":38,"value":149},{"type":33,"tag":114,"props":391,"children":392},{"style":152},[393],{"type":38,"value":394},"output.length > 1400 && output.length \u003C 1600\n",{"type":33,"tag":114,"props":396,"children":398},{"class":116,"line":397},18,[399,403,407,411],{"type":33,"tag":114,"props":400,"children":401},{"style":127},[402],{"type":38,"value":324},{"type":33,"tag":114,"props":404,"children":405},{"style":121},[406],{"type":38,"value":329},{"type":33,"tag":114,"props":408,"children":409},{"style":127},[410],{"type":38,"value":149},{"type":33,"tag":114,"props":412,"children":413},{"style":152},[414],{"type":38,"value":415},"cost\n",{"type":33,"tag":114,"props":417,"children":419},{"class":116,"line":418},19,[420,425,429],{"type":33,"tag":114,"props":421,"children":422},{"style":121},[423],{"type":38,"value":424},"        threshold",{"type":33,"tag":114,"props":426,"children":427},{"style":127},[428],{"type":38,"value":149},{"type":33,"tag":114,"props":430,"children":432},{"style":431},"--shiki-default:#79B8FF",[433],{"type":38,"value":434},"0.05\n",{"type":33,"tag":34,"props":436,"children":437},{},[438],{"type":38,"value":439},"Quando eseguite questa config, Promptfoo invia entrambi i prompt a Claude, controlla le asserzioni: la parola \"first-party\" compare? È tra le 1400-1600 parole? Il costo API è sotto i 0.05 dollari? Se c'è un fallimento, vi dice in quale prompt. Se integrate in CI\u002FCD, il cambio del prompt viene testato automaticamente nella pull request — come un unit test classico.",{"type":33,"tag":441,"props":442,"children":444},"h3",{"id":443},"perché-automazione-e-non-manuale",[445],{"type":38,"value":446},"Perché Automazione e Non Manuale?",{"type":33,"tag":34,"props":448,"children":449},{},[450],{"type":38,"value":451},"Test manuale: inviate 5 argomenti diversi a Claude, leggete gli output con gli occhi, dite \"bene\". Il giorno dopo cambiate il prompt, fate di nuovo il test manuale. Alla decima iterazione dimenticate quale cambio ha influito su quale metrica.",{"type":33,"tag":34,"props":453,"children":454},{},[455],{"type":38,"value":456},"Automazione: avete 50 test case (keyword veri tratti dalla Search Console), ogni cambio di prompt viene eseguito automaticamente. Tabella di regressione: \"Baseline prompt media 1520 parole, nuovo prompt 1480 — calo del 2.6%\". La decisione si basa sulla metrica, non sulla sensazione.",{"type":33,"tag":41,"props":458,"children":460},{"id":459},"langsmith-osservabilità-in-produzione",[461],{"type":38,"value":462},"LangSmith: Osservabilità in Produzione",{"type":33,"tag":34,"props":464,"children":465},{},[466],{"type":38,"value":467},"Promptfoo è lo strumento di test al momento dello sviluppo. LangSmith (prodotto dal team di LangChain) vi consente di osservare cosa accade in produzione. Ogni chiamata LLM viene registrata in LangSmith: input, output, latenza, token count, metadati. Nel dashboard visualizzate le tracce — retrieval, costruzione del prompt, chiamata LLM, post-processing della catena, il tutto passo dopo passo.",{"type":33,"tag":34,"props":469,"children":470},{},[471,473,482],{"type":38,"value":472},"Esempio: nei nostri lavori su ",{"type":33,"tag":474,"props":475,"children":479},"a",{"href":476,"rel":477},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Fgeo",[478],"nofollow",[480],{"type":38,"value":481},"Generative Engine Optimization",{"type":38,"value":483}," a Roibase stiamo costruendo una pipeline LLM per tracciare le citazioni di ChatGPT. Pipeline: domanda dell'utente → embedding → retrieval Pinecone → context injection → Claude → citation extraction. LangSmith registra ogni fase. Se il tasso di citazione scende sotto il 15%, arriva un alert — drift del prompt o problema di qualità del retrieval viene catturato istantaneamente.",{"type":33,"tag":441,"props":485,"children":487},{"id":486},"tracing-vs-logging",[488],{"type":38,"value":489},"Tracing vs Logging",{"type":33,"tag":34,"props":491,"children":492},{},[493],{"type":38,"value":494},"Logging classico: \"Ho inviato questo prompt all'API Claude, ho ricevuto questa risposta\" registrato. Trace: \"Retrieval ha impiegato 120ms, sono arrivati 5 documenti, la costruzione del prompt 15ms, Claude 2.3 secondi, latenza totale 2.45 secondi — nessuna violazione SLA\". Il trace vi consente di vedere la pipeline end-to-end. Nelle catene LLM trovare il collo di bottiglia è critico: se il retrieval è lento è l'optimizzazione dell'indice del database, se l'LLM è lento è la versione del modello o ridurre il numero di token del prompt.",{"type":33,"tag":34,"props":496,"children":497},{},[498],{"type":38,"value":499},"In produzione quando fate A\u002FB test usate LangSmith anche: il 50% del traffico riceve il prompt baseline, il 50% il nuovo prompt — ogni variante ha il suo gruppo di tracce separate, confronto delle metriche in tempo reale. Baseline 2.1 secondi di latenza media, nuovo prompt 1.9 secondi ma il punteggio di qualità dell'output scende da 0.85 a 0.80 — la tabella dei tradeoff è dal vivo.",{"type":33,"tag":41,"props":501,"children":503},{"id":502},"pipeline-di-valutazione-punteggio-di-qualità-automatico",[504],{"type":38,"value":505},"Pipeline di Valutazione: Punteggio di Qualità Automatico",{"type":33,"tag":34,"props":507,"children":508},{},[509],{"type":38,"value":510},"L'output LLM è soggettivo — come automatizzate la domanda \"è bello o brutto\"? Due metodi: asserzione basata su regole e LLM-as-a-judge.",{"type":33,"tag":34,"props":512,"children":513},{},[514,519,521,527,529,535,536,542],{"type":33,"tag":58,"props":515,"children":516},{},[517],{"type":38,"value":518},"Basata su regole:",{"type":38,"value":520}," Le asserzioni in Promptfoo come ",{"type":33,"tag":82,"props":522,"children":524},{"className":523},[],[525],{"type":38,"value":526},"contains",{"type":38,"value":528},", ",{"type":33,"tag":82,"props":530,"children":532},{"className":531},[],[533],{"type":38,"value":534},"length",{"type":38,"value":528},{"type":33,"tag":82,"props":537,"children":539},{"className":538},[],[540],{"type":38,"value":541},"regex-match",{"type":38,"value":543},". \"1400-1600 parole\", \"nessun punto esclamativo\", \"almeno 1 link interno\". Veloce, deterministico ma non misura la qualità semantica.",{"type":33,"tag":34,"props":545,"children":546},{},[547,552],{"type":33,"tag":58,"props":548,"children":549},{},[550],{"type":38,"value":551},"LLM-as-a-judge:",{"type":38,"value":553}," Fate valutare l'output a un altro LLM (solitamente GPT-4 o Claude). Esempio: \"Questo articolo di blog è scritto in tono ingegneristico? Dai un punteggio da 1 a 10.\" Se il judge model dà 7.5 passa, se dà 6 fallisce. Questo metodo cattura la qualità semantica ma è non-deterministico — il model judge stesso è stocastico. Soluzione: eseguire ogni eval 3 volte e fare la media.",{"type":33,"tag":34,"props":555,"children":556},{},[557],{"type":38,"value":558},"Nel workflow di generazione dei contenuti di Roibase la pipeline eval è così:",{"type":33,"tag":560,"props":561,"children":562},"ol",{},[563,569,574,579,584,589],{"type":33,"tag":564,"props":565,"children":566},"li",{},[567],{"type":38,"value":568},"Facciamo generare una bozza di blog a Claude",{"type":33,"tag":564,"props":570,"children":571},{},[572],{"type":38,"value":573},"Inviamo la bozza a Promptfoo",{"type":33,"tag":564,"props":575,"children":576},{},[577],{"type":38,"value":578},"Basato su regole: numero di parole, numero di link interni, controllo di parole vietate",{"type":33,"tag":564,"props":580,"children":581},{},[582],{"type":38,"value":583},"LLM-as-a-judge: facciamo dare a GPT-4 un punteggio \"aderenza al tono 1-10\"",{"type":33,"tag":564,"props":585,"children":586},{},[587],{"type":38,"value":588},"Tutte le metriche vengono registrate in Notion",{"type":33,"tag":564,"props":590,"children":591},{},[592],{"type":38,"value":593},"Se il punteggio medio scende sotto 8, arriva un alert su Slack",{"type":33,"tag":34,"props":595,"children":596},{},[597],{"type":38,"value":598},"Con questa pipeline quando generate 1000 articoli lo standard di qualità rimane coerente. Il team di QA manuale non legge ogni articolo ma controlla solo i fallimenti di eval — risparmio di tempo del 90%.",{"type":33,"tag":41,"props":600,"children":602},{"id":601},"ab-test-due-prompt-due-bilanci-costo-qualità",[603],{"type":38,"value":604},"A\u002FB Test: Due Prompt, Due Bilanci Costo-Qualità",{"type":33,"tag":34,"props":606,"children":607},{},[608],{"type":38,"value":609},"In produzione l'A\u002FB test dei prompt funziona come il feature flagging classico. Usate LaunchDarkly o un servizio di flag personalizzato: fornite il prompt_v1 al 50% degli utenti, il prompt_v2 all'altro 50%. Per ogni variante raccogliete le metriche: token count medio, latenza, conversione downstream (ad esempio l'editore approva la bozza del blog?).",{"type":33,"tag":34,"props":611,"children":612},{},[613],{"type":38,"value":614},"Esempio concreto: a Roibase stiamo testando una nuova versione del prompt con guidance specifico per categoria. Il prompt baseline è generico, il nuovo prompt contiene istruzioni aggiuntive per categoria. L'A\u002FB test funziona per 2 settimane:",{"type":33,"tag":616,"props":617,"children":618},"table",{},[619,648],{"type":33,"tag":620,"props":621,"children":622},"thead",{},[623],{"type":33,"tag":624,"props":625,"children":626},"tr",{},[627,633,638,643],{"type":33,"tag":628,"props":629,"children":630},"th",{},[631],{"type":38,"value":632},"Metrica",{"type":33,"tag":628,"props":634,"children":635},{},[636],{"type":38,"value":637},"Baseline",{"type":33,"tag":628,"props":639,"children":640},{},[641],{"type":38,"value":642},"Nuovo Prompt",{"type":33,"tag":628,"props":644,"children":645},{},[646],{"type":38,"value":647},"Delta",{"type":33,"tag":649,"props":650,"children":651},"tbody",{},[652,676,699,721,744],{"type":33,"tag":624,"props":653,"children":654},{},[655,661,666,671],{"type":33,"tag":656,"props":657,"children":658},"td",{},[659],{"type":38,"value":660},"Token medio (input+output)",{"type":33,"tag":656,"props":662,"children":663},{},[664],{"type":38,"value":665},"3200",{"type":33,"tag":656,"props":667,"children":668},{},[669],{"type":38,"value":670},"3450",{"type":33,"tag":656,"props":672,"children":673},{},[674],{"type":38,"value":675},"+7.8%",{"type":33,"tag":624,"props":677,"children":678},{},[679,684,689,694],{"type":33,"tag":656,"props":680,"children":681},{},[682],{"type":38,"value":683},"Latenza media (secondi)",{"type":33,"tag":656,"props":685,"children":686},{},[687],{"type":38,"value":688},"2.1",{"type":33,"tag":656,"props":690,"children":691},{},[692],{"type":38,"value":693},"2.3",{"type":33,"tag":656,"props":695,"children":696},{},[697],{"type":38,"value":698},"+9.5%",{"type":33,"tag":624,"props":700,"children":701},{},[702,707,712,717],{"type":33,"tag":656,"props":703,"children":704},{},[705],{"type":38,"value":706},"Costo\u002Farticolo ($)",{"type":33,"tag":656,"props":708,"children":709},{},[710],{"type":38,"value":711},"0.042",{"type":33,"tag":656,"props":713,"children":714},{},[715],{"type":38,"value":716},"0.046",{"type":33,"tag":656,"props":718,"children":719},{},[720],{"type":38,"value":698},{"type":33,"tag":624,"props":722,"children":723},{},[724,729,734,739],{"type":33,"tag":656,"props":725,"children":726},{},[727],{"type":38,"value":728},"Tasso di approvazione editore",{"type":33,"tag":656,"props":730,"children":731},{},[732],{"type":38,"value":733},"72%",{"type":33,"tag":656,"props":735,"children":736},{},[737],{"type":38,"value":738},"81%",{"type":33,"tag":656,"props":740,"children":741},{},[742],{"type":38,"value":743},"+12.5%",{"type":33,"tag":624,"props":745,"children":746},{},[747,752,757,762],{"type":33,"tag":656,"props":748,"children":749},{},[750],{"type":38,"value":751},"Tasso di accuratezza link interno",{"type":33,"tag":656,"props":753,"children":754},{},[755],{"type":38,"value":756},"65%",{"type":33,"tag":656,"props":758,"children":759},{},[760],{"type":38,"value":761},"89%",{"type":33,"tag":656,"props":763,"children":764},{},[765],{"type":38,"value":766},"+36.9%",{"type":33,"tag":34,"props":768,"children":769},{},[770],{"type":38,"value":771},"Il nuovo prompt costa il 10% in più ma il tasso di approvazione dell'editore aumenta del 12.5% — il costo di revisione dell'editore diminuisce. L'accuratezza del link interno aumenta del 36.9% — il guadagno SEO copre il costo. Decisione: vince il nuovo prompt, passa in produzione.",{"type":33,"tag":34,"props":773,"children":774},{},[775],{"type":38,"value":776},"Durante l'A\u002FB test in LangSmith create un gruppo di tracce separato per ogni variante. Se vedete un'anomalia (ad esempio il nuovo prompt ha un 5% di errori HTTP 429 rate limit) la notate subito.",{"type":33,"tag":41,"props":778,"children":780},{"id":779},"versionamento-git-metadati",[781],{"type":38,"value":782},"Versionamento: Git + Metadati",{"type":33,"tag":34,"props":784,"children":785},{},[786,788,794],{"type":38,"value":787},"Tenete la versione del prompt su Git come il codice ma i metadati sono separati. Cartella ",{"type":33,"tag":82,"props":789,"children":791},{"className":790},[],[792],{"type":38,"value":793},"prompts\u002F",{"type":38,"value":795},":",{"type":33,"tag":104,"props":797,"children":799},{"code":798},"prompts\u002F\n  roibase-blog-v1.md\n  roibase-blog-v2.md\n  roibase-blog-v3.md\n",[800],{"type":33,"tag":82,"props":801,"children":802},{"__ignoreMap":17},[803],{"type":38,"value":798},{"type":33,"tag":34,"props":805,"children":806},{},[807],{"type":38,"value":808},"Ogni file contiene metadati nel frontmatter:",{"type":33,"tag":104,"props":810,"children":814},{"code":811,"language":812,"meta":17,"className":813,"style":17},"---\nversion: 3\nmodel: claude-3-5-sonnet-20241022\ntemperature: 0.7\nmax_tokens: 8000\ncreated: 2026-07-15\ndeprecated: false\ntest_suite: promptfoo-blog-eval.yaml\n---\n\n# RUOLO\nState scrivendo per Roibase.\n...\n","markdown","language-markdown shiki shiki-themes github-dark",[815],{"type":33,"tag":82,"props":816,"children":817},{"__ignoreMap":17},[818,826,843,860,877,894,911,928,945,952,959,968,976],{"type":33,"tag":114,"props":819,"children":820},{"class":116,"line":117},[821],{"type":33,"tag":114,"props":822,"children":823},{"style":127},[824],{"type":38,"value":825},"---\n",{"type":33,"tag":114,"props":827,"children":828},{"class":116,"line":133},[829,834,838],{"type":33,"tag":114,"props":830,"children":831},{"style":121},[832],{"type":38,"value":833},"version",{"type":33,"tag":114,"props":835,"children":836},{"style":127},[837],{"type":38,"value":149},{"type":33,"tag":114,"props":839,"children":840},{"style":431},[841],{"type":38,"value":842},"3\n",{"type":33,"tag":114,"props":844,"children":845},{"class":116,"line":158},[846,851,855],{"type":33,"tag":114,"props":847,"children":848},{"style":121},[849],{"type":38,"value":850},"model",{"type":33,"tag":114,"props":852,"children":853},{"style":127},[854],{"type":38,"value":149},{"type":33,"tag":114,"props":856,"children":857},{"style":152},[858],{"type":38,"value":859},"claude-3-5-sonnet-20241022\n",{"type":33,"tag":114,"props":861,"children":862},{"class":116,"line":176},[863,868,872],{"type":33,"tag":114,"props":864,"children":865},{"style":121},[866],{"type":38,"value":867},"temperature",{"type":33,"tag":114,"props":869,"children":870},{"style":127},[871],{"type":38,"value":149},{"type":33,"tag":114,"props":873,"children":874},{"style":431},[875],{"type":38,"value":876},"0.7\n",{"type":33,"tag":114,"props":878,"children":879},{"class":116,"line":197},[880,885,889],{"type":33,"tag":114,"props":881,"children":882},{"style":121},[883],{"type":38,"value":884},"max_tokens",{"type":33,"tag":114,"props":886,"children":887},{"style":127},[888],{"type":38,"value":149},{"type":33,"tag":114,"props":890,"children":891},{"style":431},[892],{"type":38,"value":893},"8000\n",{"type":33,"tag":114,"props":895,"children":896},{"class":116,"line":214},[897,902,906],{"type":33,"tag":114,"props":898,"children":899},{"style":121},[900],{"type":38,"value":901},"created",{"type":33,"tag":114,"props":903,"children":904},{"style":127},[905],{"type":38,"value":149},{"type":33,"tag":114,"props":907,"children":908},{"style":431},[909],{"type":38,"value":910},"2026-07-15\n",{"type":33,"tag":114,"props":912,"children":913},{"class":116,"line":224},[914,919,923],{"type":33,"tag":114,"props":915,"children":916},{"style":121},[917],{"type":38,"value":918},"deprecated",{"type":33,"tag":114,"props":920,"children":921},{"style":127},[922],{"type":38,"value":149},{"type":33,"tag":114,"props":924,"children":925},{"style":431},[926],{"type":38,"value":927},"false\n",{"type":33,"tag":114,"props":929,"children":930},{"class":116,"line":237},[931,936,940],{"type":33,"tag":114,"props":932,"children":933},{"style":121},[934],{"type":38,"value":935},"test_suite",{"type":33,"tag":114,"props":937,"children":938},{"style":127},[939],{"type":38,"value":149},{"type":33,"tag":114,"props":941,"children":942},{"style":152},[943],{"type":38,"value":944},"promptfoo-blog-eval.yaml\n",{"type":33,"tag":114,"props":946,"children":947},{"class":116,"line":27},[948],{"type":33,"tag":114,"props":949,"children":950},{"style":127},[951],{"type":38,"value":825},{"type":33,"tag":114,"props":953,"children":954},{"class":116,"line":257},[955],{"type":33,"tag":114,"props":956,"children":957},{"emptyLinePlaceholder":218},[958],{"type":38,"value":221},{"type":33,"tag":114,"props":960,"children":961},{"class":116,"line":270},[962],{"type":33,"tag":114,"props":963,"children":965},{"style":964},"--shiki-default:#79B8FF;--shiki-default-font-weight:bold",[966],{"type":38,"value":967},"# RUOLO\n",{"type":33,"tag":114,"props":969,"children":970},{"class":116,"line":287},[971],{"type":33,"tag":114,"props":972,"children":973},{"style":127},[974],{"type":38,"value":975},"State scrivendo per Roibase.\n",{"type":33,"tag":114,"props":977,"children":978},{"class":116,"line":305},[979],{"type":33,"tag":114,"props":980,"children":981},{"style":127},[982],{"type":38,"value":983},"...\n",{"type":33,"tag":34,"props":985,"children":986},{},[987],{"type":38,"value":988},"Il messaggio di commit Git: \"prompt v3: aggiunto guidance specifico per categoria, lista di parole vietate estesa\". Quando CI\u002FCD vede questo commit esegue automaticamente la suite di test Promptfoo. Se il test passa viene deployato nell'ambiente staging, A\u002FB test funziona per 24 ore, se va bene passa in produzione.",{"type":33,"tag":34,"props":990,"children":991},{},[992,994,1000],{"type":38,"value":993},"Il versionamento consente un rollback veloce: se c'è un problema in produzione ",{"type":33,"tag":82,"props":995,"children":997},{"className":996},[],[998],{"type":38,"value":999},"git revert",{"type":38,"value":1001},", il prompt vecchio è attivo in 5 minuti.",{"type":33,"tag":41,"props":1003,"children":1005},{"id":1004},"ottimizzazione-dei-costi-token-audit",[1006],{"type":38,"value":1007},"Ottimizzazione dei Costi: Token Audit",{"type":33,"tag":34,"props":1009,"children":1010},{},[1011],{"type":38,"value":1012},"Nelle applicazioni LLM il costo è solitamente calcolato come input token + output token. Il prezzo dell'API Claude Sonnet 3.5: $3\u002F1M input token, $15\u002F1M output token (prezzo 2026). Una bozza di blog di 1500 parole è ~2000 output token, system prompt + user prompt ~1200 input token — ~$0.042 per articolo.",{"type":33,"tag":34,"props":1014,"children":1015},{},[1016],{"type":38,"value":1017},"Se generate 1000 articoli al mese il costo è $42. Se optimizzate il prompt e riducete gli output token del 10%, risparmiate $6.30 al mese — $75.60 all'anno. Sembra poco ma scala. A 10,000 articoli\u002Fmese siamo a $756\u002Fanno.",{"type":33,"tag":34,"props":1019,"children":1020},{},[1021],{"type":38,"value":1022},"Aggiungete l'asserzione di costo alla suite di eval di Promptfoo:",{"type":33,"tag":104,"props":1024,"children":1026},{"code":1025,"language":107,"meta":17,"className":108,"style":17},"assert:\n  - type: cost\n    threshold: 0.045\n",[1027],{"type":33,"tag":82,"props":1028,"children":1029},{"__ignoreMap":17},[1030,1042,1061],{"type":33,"tag":114,"props":1031,"children":1032},{"class":116,"line":117},[1033,1038],{"type":33,"tag":114,"props":1034,"children":1035},{"style":121},[1036],{"type":38,"value":1037},"assert",{"type":33,"tag":114,"props":1039,"children":1040},{"style":127},[1041],{"type":38,"value":130},{"type":33,"tag":114,"props":1043,"children":1044},{"class":116,"line":133},[1045,1049,1053,1057],{"type":33,"tag":114,"props":1046,"children":1047},{"style":127},[1048],{"type":38,"value":139},{"type":33,"tag":114,"props":1050,"children":1051},{"style":121},[1052],{"type":38,"value":329},{"type":33,"tag":114,"props":1054,"children":1055},{"style":127},[1056],{"type":38,"value":149},{"type":33,"tag":114,"props":1058,"children":1059},{"style":152},[1060],{"type":38,"value":415},{"type":33,"tag":114,"props":1062,"children":1063},{"class":116,"line":158},[1064,1069,1073],{"type":33,"tag":114,"props":1065,"children":1066},{"style":121},[1067],{"type":38,"value":1068},"    threshold",{"type":33,"tag":114,"props":1070,"children":1071},{"style":127},[1072],{"type":38,"value":149},{"type":33,"tag":114,"props":1074,"children":1075},{"style":431},[1076],{"type":38,"value":1077},"0.045\n",{"type":33,"tag":34,"props":1079,"children":1080},{},[1081],{"type":38,"value":1082},"Se il costo dopo il cambio del prompt supera i 0.045 dollari il test fallisce. Regolate questo threshold in base alle metriche di business (tasso di approvazione editore, conversione).",{"type":33,"tag":34,"props":1084,"children":1085},{},[1086,1088,1095],{"type":38,"value":1087},"Per l'audit dei token guardate le tracce LangSmith: quale componente del prompt consuma più token? Ad esempio la sezione \"DIVIETI\" nel system prompt consuma 300 token — è davvero necessaria ad ogni chiamata, oppure potete inietterla in base al contesto tramite retrieval? Nei nostri lavori su ",{"type":33,"tag":474,"props":1089,"children":1092},{"href":1090,"rel":1091},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Ffirstparty",[478],[1093],{"type":38,"value":1094},"First-Party Data & Measurement Architecture",{"type":38,"value":1096}," usiamo una strategia di context injection: rendiamo il prompt modulare, aggiungiamo solo i moduli necessari in base al segmento utente — risparmio di token del 15-20%.",{"type":33,"tag":41,"props":1098,"children":1100},{"id":1099},"cosa-fare-adesso",[1101],{"type":38,"value":1102},"Cosa Fare Adesso",{"type":33,"tag":34,"props":1104,"children":1105},{},[1106],{"type":38,"value":1107},"Se state usando LLM in produzione smettete di testare i cambiamenti del prompt manualmente. Iniziate installando Promptfoo: 10 test case, 3 asserzioni (numero di parole, costo, controllo di keyword semantiche). Integratelo in CI\u002FCD — test automatico ad ogni PR. Passo successivo: aggiungete uno strumento di osservabilità come LangSmith, monitorate le tracce in produzione. Per l'A\u002FB test create un sistema di feature flag, pilotate le nuove versioni di prompt con il 10% del traffico. Questa disciplina porta le operazioni LLM dal livello \"sembra funzionare\" al livello \"misurabile, ottimizzabile\". Il prompt è ormai codice — testatelo come codice, versionatelo, deployatelo.",{"type":33,"tag":1109,"props":1110,"children":1111},"style",{},[1112],{"type":38,"value":1113},"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":17,"searchDepth":158,"depth":158,"links":1115},[1116,1117,1120,1123,1124,1125,1126,1127],{"id":43,"depth":133,"text":46},{"id":72,"depth":133,"text":75,"children":1118},[1119],{"id":443,"depth":158,"text":446},{"id":459,"depth":133,"text":462,"children":1121},[1122],{"id":486,"depth":158,"text":489},{"id":502,"depth":133,"text":505},{"id":601,"depth":133,"text":604},{"id":779,"depth":133,"text":782},{"id":1004,"depth":133,"text":1007},{"id":1099,"depth":133,"text":1102},"content:it:ai:prompt-versioning-ab-testing.md","content","it\u002Fai\u002Fprompt-versioning-ab-testing.md","it\u002Fai\u002Fprompt-versioning-ab-testing","md",1785967479307]