Cos’è il RAG? La generazione aumentata di recupero spiegata con un esempio funzionante

  1. Home
  2. Blog
  3. Intelligenza artificiale

Intelligenza artificiale

Cos’è il RAG? La generazione aumentata di recupero spiegata con un esempio funzionante

RAG consente a un modello di intelligenza artificiale di rispondere dai tuoi documenti anziché solo dalla memoria. Scopri come funziona la pipeline, esegui una piccola versione in semplice Python e scopri perché i sistemi reali falliscono e come testarli.

9 min di lettura
Cos'è il RAG? La generazione aumentata di recupero spiegata con un esempio funzionante

Punti chiave

  • RAG trova prima le informazioni rilevanti, le aggiunge al prompt e poi chiede al modello di rispondere da esse.
  • È il modo consueto per connettere un modello linguistico a dati privati ​​o che cambiano frequentemente.
  • La maggior parte dei problemi di qualità iniziano nel recupero e nella preparazione dei dati, non nel modello.
  • RAG riduce le risposte inventate ma non le elimina, quindi è necessario testarlo.

Chiedi a un assistente AI generale la politica di rimborso della tua azienda e può solo indovinare. Non ha mai visto i tuoi documenti. RAG, abbreviazione di retrieval-augmented generation, risolve questo problema cercando le informazioni giuste e consegnandole al modello insieme alla domanda.

Questa guida spiega ogni fase in un linguaggio semplice, quindi crea una piccola versione utilizzando solo la libreria standard di Python. Abbiamo eseguito quel codice su Python 3.13 e i punteggi mostrati provengono da quell’esecuzione. Non utilizza alcun modello linguistico, quindi dimostra il recupero e la creazione rapida e non abbiamo testato il passaggio della risposta finale.

Cos’è il RAG?

La generazione aumentata con recupero è una tecnica che combina una fase di ricerca con un modello linguistico. Quando arriva una domanda, il sistema cerca una fonte di conoscenza, aggiunge i risultati migliori al prompt e chiede al modello di rispondere in base a quel materiale.

Pensa a un esame a libro aperto. Uno studente a libro chiuso fa affidamento sulla memoria e può ricordare male con sicurezza. Uno studente a libro aperto può prima cercare la pagina giusta. RAG fornisce al modello quel libro e gli consente anche di indicare quale pagina ha utilizzato.

Il problema che RAG risolve

Un modello linguistico di per sé presenta tre limiti per l’uso aziendale:

  • Non conosce i tuoi dati privati. Le tue polizze, biglietti e contratti non facevano parte della sua formazione.
  • La sua conoscenza ha un limite. Non può sapere di un prezzo che hai cambiato stamattina.
  • Potrebbe inventare risposte. Quando non è sicuro, può produrre qualcosa di plausibile ma falso.

RAG li affronta tutti e tre e non è necessario riqualificare nulla. Aggiorna un documento, reindicizzalo e la risposta successiva potrà utilizzarlo.

Come funziona RAG, passo dopo passo

Un sistema RAG ha due condutture. Uno prepara i tuoi dati in anticipo e l’altro corre per ogni domanda.

Indicizzazione: preparare i dati

  1. Carica: raccogli contenuti da PDF, wiki, database o ticket.
  2. Pulisci e suddividi: rimuovi la spazzatura, quindi dividi i documenti in piccoli passaggi.
  3. Incorpora: converte ogni passaggio in un elenco di numeri, chiamato incorporamento, che ne cattura il significato.
  4. Memorizza: salva gli incorporamenti in un indice ricercabile, spesso un database vettoriale.

Interrogare: rispondere ad una domanda

  1. Recupera: incorpora la domanda e trova i passaggi più vicini al significato.
  2. Aumenta: inserisci questi passaggi nel prompt.
  3. Genera: il modello scrive una risposta utilizzando quel contesto.

Il recupero non deve necessariamente utilizzare vettori. Può essere una ricerca per parola chiave o anche una query SQL, a seconda di quale trova le informazioni giuste per i tuoi dati.

Un piccolo esempio funzionante

Per vedere bene le parti in movimento, ecco un piccolo retriever senza librerie. Rappresenta il testo come conteggio delle parole, un sostituto molto più semplice per gli incorporamenti reali, e valuta la somiglianza utilizzando la misura del coseno.

import math, re
from collections import Counter

DOCS = {
    "refunds": "Refunds are paid within 7 days to the original payment method.",
    "shipping": "Standard shipping takes 3 to 5 working days across India.",
    "warranty": "All keyboards include a 2 year warranty against defects.",
}

def vectorize(text):
    return Counter(re.findall(r"[a-z0-9]+", text.lower()))

def similarity(a, b):
    dot = sum(a[word] * b[word] for word in a)
    size = math.sqrt(sum(v * v for v in a.values()))
    size *= math.sqrt(sum(v * v for v in b.values()))
    return dot / size if size else 0

def retrieve(question, k=1):
    q = vectorize(question)
    scored = [(similarity(q, vectorize(t)), name) for name, t in DOCS.items()]
    return sorted(scored, reverse=True)[:k]

def build_prompt(question):
    (score, name), = retrieve(question)
    return (
        "Answer using only the context. If it is not there, say you do not know.\n"
        f"Context: {DOCS[name]}\n"
        f"Question: {question}"
    )

Chiedere rimborsi trova il passaggio giusto e costruisce questo prompt:

print(retrieve("How many days until refunds are paid?"))
# [(0.4558..., 'refunds')]

print(build_prompt("How many days until refunds are paid?"))
# Answer using only the context. If it is not there, say you do not know.
# Context: Refunds are paid within 7 days to the original payment method.
# Question: How many days until refunds are paid?

In un sistema completo, ora invieresti quel prompt a un modello linguistico. Il dettaglio importante è l’istruzione di ammettere quando manca la risposta, di cui puoi saperne di più nella nostra guida al prompt engineering.

Ciò che manca al nostro esempio

Ora prova una domanda che significa la stessa cosa ma usa parole diverse:

print(retrieve("When can I get my money back?", k=3))
# [(0.0, 'warranty'), (0.0, 'shipping'), (0.0, 'refunds')]

Ogni punteggio è zero, perché la domanda non condivide parole con nessun documento. “Rimborso” significa rimborso a un essere umano, ma le parole non possono dirlo. Questo singolo output spiega perché i sistemi reali utilizzano incorporamenti, progettati in modo tale che il testo con significato simile finisca con numeri simili, anche senza parole in comune.

Ma non dare per scontato che gli incorporamenti risolvano tutto. Possono avere difficoltà con termini esatti come codici prodotto e numeri di errore, che la ricerca per parole chiave gestisce molto bene. Questo è il motivo per cui molti sistemi di produzione utilizzano la ricerca ibrida, combinando i due approcci.

Chunking: il passo che le persone sottovalutano

I documenti vengono suddivisi in blocchi perché i file interi sono troppo lunghi e imprecisi per essere recuperati. La dimensione scelta comporta un vero e proprio compromesso:

Dimensione del pezzo Vantaggio Rischio
Troppo piccolo Corrispondenze precise Perde il contesto, ad esempio a quale prodotto si applica una regola
Troppo grande Mantiene il contesto Diluisce il significato e utilizza maggiormente il prompt
Diviso per struttura Rispetta titoli e sezioni Ha bisogno di documenti di origine più puliti

Alcune centinaia di parole con qualche sovrapposizione tra i blocchi sono un punto di partenza comune, ma trattalo come una prima ipotesi da testare. Dividi lungo i confini naturali, come le intestazioni, quando puoi. E allega metadati, come il titolo del documento, la data e il dipartimento, in modo da poter filtrare i risultati e citare le fonti.

Miglioramento del recupero

Quando le risposte sono scarse, questi sono gli aggiornamenti che vale la pena provare, più o meno in questo ordine:

  • Pulisci i dati. Rimuovi prima i documenti obsoleti e duplicati. Nessun algoritmo risolve fonti contraddittorie.
  • Utilizza la ricerca ibrida. Combina risultati basati sul significato e parole chiave.
  • Aggiungi una riclassificazione. Recupera più candidati, quindi utilizza un modello specializzato per riordinarli in base alla pertinenza.
  • Filtra per metadati. Limita i risultati per prodotto, regione o data prima della ricerca.
  • Riscrivi la query. Trasforma un vago seguito come “e la seconda?” in una domanda completa.

Suggerimento: Prima di incolpare il modello, guarda quale recupero è stato effettivamente restituito. Se il passaggio giusto non fosse stato nel contesto, nessun modello avrebbe potuto rispondere correttamente da esso.

RAG vs messa a punto

Domanda RAG Messa a punto
Cosa aggiunge? Conoscenza al momento delle domande Comportamento o stile addestrato
Aggiornamento delle informazioni Reindicizzare il documento Allenati di nuovo
Può citare le fonti? Sì Non in modo affidabile
Meglio per Fatti che cambiano Formato o tono coerente

Non si escludono a vicenda. Il nostro confronto tra RAG, messa a punto e ingegneria tempestiva copre come scegliere in modo più approfondito.

Come testare un sistema RAG

RAG è un software e necessita di test come qualsiasi altro software. Crea una serie di domande reali insieme ai passaggi e alle risposte che ti aspetti, quindi misura le due fasi separatamente:

Palcoscenico Domanda da porre Nome comune
Recupero Abbiamo trovato il passaggio giusto? Richiamo del contesto
Recupero Quanto di ciò che abbiamo recuperato è stato utile? Precisione del contesto
Generazione La risposta è supportata dal contesto? Fedeltà
Generazione Risponde davvero alla domanda? Pertinenza della risposta

Includi anche casi scomodi: domande senza risposta nei tuoi dati, domande che utilizzano formulazioni diverse e domande con fonti contrastanti. Esegui nuovamente questo set ogni volta che modifichi suddivisione, modelli o prompt, proprio come una suite di regressione. Il nostro tutorial pytest mostra come eseguire molti input attraverso un singolo test.

Perché i sistemi RAG falliscono

  • La risposta non è nei dati. Il modello può ancora tentarne uno, quindi spiegagli come rifiutare.
  • Il blocco corretto non è stato recuperato. Questo è spesso un problema di suddivisione in blocchi o di ricerca.
  • Troppo contesto. Passaggi irrilevanti possono distrarre il modello e aumentare i costi.
  • Documenti obsoleti. Una vecchia polizza può essere recuperata con la stessa sicurezza di quella attuale.
  • Tabelle e PDF analizzati male. Se l’estrazione confonde il testo, il recupero non viene mai ripristinato.
  • Testare solo con domande demo. Gli utenti reali esprimono le cose in modo molto diverso.

Sicurezza e autorizzazioni

RAG comporta due rischi che è facile non notare. Innanzitutto, il controllo degli accessi: se l’indice contiene file HR, la domanda di un dipendente junior non deve recuperarli. Applicare le autorizzazioni di ciascun utente durante il recupero, poiché indicare al modello di mantenere i segreti non è una protezione affidabile.

In secondo luogo, iniezione tempestiva. Una pagina Web o un documento recuperato potrebbe contenere testo come “ignora le tue istruzioni”. Tratta i contenuti recuperati come dati non attendibili, limita le azioni che il modello può intraprendere e richiedi a un essere umano di approvare quelle sensibili.

Considerazioni finali

RAG è un’idea semplice ma ricca di dettagli pratici: trova le informazioni giuste e poi chiedi al modello di usarle. Inizia con una serie piccola e pulita di documenti e una ventina di domande reali. Fai in modo che il recupero funzioni bene prima di aggiungere complessità, perché una pipeline modesta con dati validi di solito batte una pipeline sofisticata con dati errati.

Domande frequenti

Cosa significa RAG nell’intelligenza artificiale?

RAG sta per generazione aumentata con recupero. Un sistema recupera le informazioni rilevanti, le aggiunge al prompt e il modello genera una risposta da esse.

RAG ferma le allucinazioni dell’intelligenza artificiale?

Li riduce dando al modello fonti reali, ma non le rimuove. Un modello può ancora interpretare erroneamente il contesto, quindi testa le risposte e mostra le citazioni.

Ho bisogno di un database vettoriale per RAG?

Non sempre. I piccoli progetti possono utilizzare un indice in memoria, una ricerca per parole chiave o SQL. I database vettoriali aiutano con grandi raccolte e ricerche basate sul significato.

Qual è la differenza tra RAG e messa a punto?

RAG fornisce informazioni al momento delle domande, quindi gli aggiornamenti sono rapidi. Il fine tuning addestra un modello a modificare il proprio comportamento o stile ed è meno adatto al cambiamento dei fatti.

Cos’è un incorporamento?

Un incorporamento è un elenco di numeri che rappresentano il significato del testo. I passaggi con significati simili hanno numeri simili, il che rende possibile la ricerca basata sul significato.

Continua a imparare

Lavora con Stack Quora

Hai bisogno di aiuto con test, WordPress o SEO?

Aiutiamo i team a fornire software migliore e a far crescere i loro siti. Raccontaci a cosa stai lavorando e ti suggeriremo chiaramente il prossimo passo.

Continua a leggere

Altre guide su test, intelligenza artificiale e sviluppo moderno

Ti è piaciuto questo articolo? Scegli un argomento e passa direttamente ai nostri tutorial più recenti.

Intelligenza artificiale

Spiegazione delle allucinazioni dell'intelligenza artificiale: perché i modelli linguistici inventano le cose e come ridurle

Spiegazione delle allucinazioni dell'intelligenza artificiale: cosa sono, perché i modelli linguistici le producono, tipi comuni, come ridurle con b…

Leggi l'articolo →
DevOps

Spiegazione delle variabili d'ambiente: file .env, segreti e configurazione eseguiti correttamente

Variabili d'ambiente spiegate con esempi Python che abbiamo eseguito: lettura e impostazione, perché ogni valore è una stringa, file .env, ereditari…

Leggi l'articolo →
Sviluppo software

Spiegazione della limitazione della velocità API: algoritmi, intestazioni e gestione degli errori 429

La limitazione della velocità dell'API spiegata con una simulazione che abbiamo eseguito: bucket di token, finestra fissa, finestra scorrevole, risp…

Leggi l'articolo →
Automazione dei test

Derisione in Python: unittest.mock, patch e gli errori che fanno mentire i test

Mocking in Python con unittest.mock, testato: Mock e return_value, side_effect, patch dove viene utilizzato un nome, specifiche e autospec, date moc…

Leggi l'articolo →
Test del software

Spiegazione della copertura del codice: copertura di linea o di filiale e cosa significa realmente il 100%.

Copertura del codice spiegata con una vera esecuzione di cover.py: copertura di linea, ramo e condizione, lettura di un rapporto, perché la copertur…

Leggi l'articolo →
Database e SQL

DELETE vs TRUNCATE vs DROP in SQL: differenze, rollback e quando utilizzarli

DELETE vs TRUNCATE vs DROP spiegato con SQL testato: cosa rimuove, rollback, trigger, reimpostazione dell'identità, velocità e come differiscono Pos…

Leggi l'articolo →
Database e SQL

Spiegazione delle visualizzazioni SQL: crea, utilizza ed evita le insidie, con esempi

Viste SQL spiegate con le query che abbiamo eseguito: creazione di una vista, risultati in tempo reale, nascondere colonne, prestazioni, viste aggio…

Leggi l'articolo →
Sviluppo software

Interfaccia TypeScript e tipo: differenze reali, testate con il compilatore

Interfaccia TypeScript vs tipo, verificata con il vero compilatore: cosa possono fare entrambi, cosa può fare solo uno, fusione delle dichiarazioni,…

Leggi l'articolo →
Sviluppo software

Spiegazione di Python *args e **kwargs: funzioni flessibili con esempi chiari

Python *args e **kwargs spiegati con il codice che abbiamo eseguito: compressione e decompressione, ordine dei parametri, argomenti solo per parole …

Leggi l'articolo →
Sviluppo software

Funzioni Lambda Python: sintassi, usi reali e quando non usarli

Funzioni lambda Python spiegate con il codice che abbiamo eseguito: sintassi, ordinamento con chiave, mappa e filtro, chiusure, trap dell'associazio…

Leggi l'articolo →
Intelligenza artificiale

Cosa sono gli agenti AI? Come funzionano, con un semplice ciclo di agenti che puoi eseguire

Cosa sono gli agenti IA? Una semplice guida al ciclo dell'agente, agli strumenti, alla memoria e ai guardrail, con un piccolo ciclo Python che abbia…

Leggi l'articolo →
DevOps

Monitoraggio vs osservabilità: la vera differenza, con log, metriche e tracce

Spiegazione del monitoraggio e dell'osservabilità: errori noti e sconosciuti, log, metriche e tracce, una procedura dettagliata sugli incidenti di p…

Leggi l'articolo →
DevOps

Volumi Docker e montaggi di associazione: mantenere i dati del contenitore nel modo giusto

Volumi Docker e montaggi di collegamento spiegati: perché i dati del contenitore scompaiono, volumi denominati, montaggi di collegamento, tmpfs, ese…

Leggi l'articolo →
Automazione dei test

TDD vs BDD: differenze chiave, una caratteristica costruita in entrambi i modi e quando utilizzarli ciascuno

TDD vs BDD spiegato con una funzione di sconto costruita in entrambi i modi: refactoring rosso-verde con il codice che abbiamo eseguito, scenari "Da…

Leggi l'articolo →
Test del software

Test di accettazione da parte dell'utente (UAT): processo, lista di controllo ed esempi reali

Spiegazione del test di accettazione dell'utente: chi lo esegue, in cosa differisce dal QA, un processo in sette fasi, un modello di test case UAT, …

Leggi l'articolo →
Database e SQL

Spiegazione dei valori SQL NULL: IS NULL, COALESCE, NULLIF e le trappole da evitare

Valori SQL NULL spiegati con le query che abbiamo eseguito: logica a tre valori, IS NULL, COALESCE, NULLIF, come aggregazioni, join e ordinamento tr…

Leggi l'articolo →
Database e SQL

Istruzione SQL CASE WHEN: sintassi, esempi reali ed errori comuni

SQL CASE WHEN spiegato con le query che abbiamo eseguito: moduli semplici e cercati, ordine delle condizioni, pivot con SUM, trucchi COUNT, ordiname…

Leggi l'articolo →
Sviluppo software

Cos'è il JWT? Token Web JSON spiegati con un esempio funzionante

Cos'è il JWT? Spiegazione dei token Web JSON: le tre parti, un token creato e manomesso nel codice che abbiamo eseguito, JWT e sessioni, archiviazio…

Leggi l'articolo →
Sviluppo software

Spiegazione del loop di eventi JavaScript: stack di chiamate, microtask e timer con esempi

Il ciclo di eventi JavaScript spiegato con il codice che abbiamo eseguito: stack di chiamate, code di attività e microtask, perché setTimeout 0 non …

Leggi l'articolo →
Sviluppo software

Spiegazione dei generatori Python e del rendimento: risparmia memoria con esempi reali

Generatori Python e rendimento spiegati con il codice che abbiamo eseguito: come vengono messi in pausa e ripresi, misurato il risparmio di memoria,…

Leggi l'articolo →
Intelligenza artificiale

Cosa sono gli incorporamenti? I vettori e la somiglianza del coseno spiegati semplicemente

Cosa sono gli incorporamenti? Una guida in linguaggio semplice ai vettori, alla similarità del coseno e alla ricerca semantica, con un piccolo esemp…

Leggi l'articolo →
DevOps

Distribuzione blu-verde rispetto a quella canaria: differenze, compromessi e come scegliere

Spiegazione della distribuzione blu-verde e canary: come funziona ciascuna, costi, rischi e rollback, bucket utente stabile che abbiamo testato, mig…

Leggi l'articolo →
Automazione dei test

Test instabili: quali sono le cause e come risolverli definitivamente

Test instabili spiegati con demo che abbiamo eseguito: le cause principali, come confermarne e diagnosticarne uno, soluzioni adeguate per tempistich…

Leggi l'articolo →
Test del software

Test di carico e test di stress: differenze, metriche ed esempi k6

Spiegazione del test di carico e dello stress test: cosa dimostra ciascuno, test di picco e di assorbimento, le metriche che contano, perché le medi…

Leggi l'articolo →
Test del software

Caso di test e scenario di test: differenze chiave, esempi e quando utilizzarli

Spiegazione del caso di test e dello scenario di test: definizioni chiare, una tabella affiancata, una funzione di reimpostazione della password pre…

Leggi l'articolo →
Database e SQL

Ottimizzazione delle query SQL: leggi i piani di esecuzione e correggi query lente, con tempistiche

Ottimizzazione delle query SQL testata su un milione di righe: leggi i piani di esecuzione, aggiungi gli indici corretti, correggi filtri non aggior…

Leggi l'articolo →
Database e SQL

SQL UNION vs UNION ALL: differenze, esempi e prestazioni testate

SQL UNION vs UNION ALL spiegati con le query che abbiamo eseguito: duplicati, regole seguite da entrambi, un vero bug di dati, prestazioni misurate,…

Leggi l'articolo →
Sviluppo software

Tutorial sull'API di recupero JavaScript: GET, POST, gestione degli errori e timeout

Un tutorial sull'API JavaScript Fetch testato su un server locale: GET e POST, perché 404 non genera eccezioni, un helper riutilizzabile, stringhe d…

Leggi l'articolo →
Sviluppo software

Gestione dei file Python: lettura, scrittura, CSV, JSON e pathlib con esempi

Gestione dei file Python spiegata con il codice che abbiamo eseguito: modalità aperte, con, lettura di file di grandi dimensioni, CSV, JSON, pathlib…

Leggi l'articolo →
Sviluppo software

Classi e oggetti Python: tutorial OOP con esempi reali

Classi e oggetti Python spiegati con il codice che abbiamo eseguito: __init__, metodi, attributi di classe e istanza, ereditarietà, proprietà, metod…

Leggi l'articolo →
Intelligenza artificiale

Che cos'è un modello linguistico di grandi dimensioni? Come funzionano i LLM, spiegato senza esagerazioni

Cos’è un modello linguistico ampio? LLM spiegati in un linguaggio semplice: token, incorporamenti, attenzione, formazione, finestre di temperatura e…

Leggi l'articolo →
DevOps

Comandi Linux per principianti: la guida essenziale del terminale con esempi

Comandi Linux per principianti, raggruppati per attività: navigazione, file, visualizzazione log, grep, pipe, permessi, processi e archivi, con un e…

Leggi l'articolo →
Automazione dei test

Selenio vs drammaturgo: differenze chiave, codice a confronto e quale scegliere

Selenium vs Playwright a confronto: architettura, attesa, supporto per browser e linguaggio, debug, lo stesso test in entrambi gli strumenti, consig…

Leggi l'articolo →
Test del software

Partizionamento di equivalenza: tecnica di progettazione dei test spiegata con esempi pratici

Spiegazione del partizionamento di equivalenza: come trovare partizioni valide e non valide, esempi funzionanti per età, password e coupon, test che…

Leggi l'articolo →
Test del software

Gravità vs priorità nel test del software: differenze, matrice ed esempi reali

Spiegazione della gravità e della priorità nei test del software: definizioni chiare, una matrice a quattro vie con esempi, scale di livello, chi im…

Leggi l'articolo →
Database e SQL

Esercitazione sulle sottoquery SQL: tipi, sottoquery correlate ed EXISTS con esempi

Un tutorial sulle sottoquery SQL con le query che abbiamo eseguito: sottoquery scalari, IN, FROM e SELECT, sottoquery correlate, EXISTS, trap NOT IN…

Leggi l'articolo →
Database e SQL

Spiegazione di transazioni SQL e ACID: COMMIT, ROLLBACK e livelli di isolamento

Transazioni SQL e ACID spiegate con un bonifico bancario eseguito: COMMIT, ROLLBACK, punti di salvataggio, blocchi, livelli di isolamento, letture s…

Leggi l'articolo →
Sviluppo software

Cheat sheet dei comandi Git: i comandi che usi effettivamente, con esempi

Un cheat sheet dei comandi Git raggruppato per attività: configurazione, staging, rami, telecomandi, stash, cronologia ed errori di annullamento, co…

Leggi l'articolo →
Sviluppo software

Spiegazione delle promesse JavaScript: quindi, cattura, Promise.all ed errori comuni

Promesse JavaScript spiegate con il codice che abbiamo eseguito: stati, catene then e catch, gestione degli errori, Promise.all, allSettled, race an…

Leggi l'articolo →
Sviluppo software

Tutorial sul dizionario Python: metodi, esempi e modelli comuni

Un tutorial sul dizionario Python con il codice che abbiamo eseguito: creazione, lettura e aggiornamento di dettami, metodi chiave, unione, comprens…

Leggi l'articolo →
Intelligenza artificiale

Cos'è il RAG? La generazione aumentata di recupero spiegata con un esempio funzionante

Cos'è il RAG? La generazione aumentata di recupero viene spiegata passo dopo passo: indicizzazione, suddivisione in blocchi, incorporamenti, recuper…

Leggi l'articolo →
DevOps

Tutorial Terraform per principianti: infrastruttura come codice dal primo file ai moduli

Un tutorial su Terraform per principianti: inizia senza account cloud, impara init, pianifica e applica, quindi variabili, output, stato, moduli e u…

Leggi l'articolo →
DevOps

Docker vs Kubernetes: differenze chiave, come funzionano insieme e di cosa hai bisogno

Spiegazione di Docker vs Kubernetes: cosa fa ciascuno, la stessa app viene eseguita con entrambi, Docker Compose e Swarm a confronto, il dockershim …

Leggi l'articolo →
Automazione dei test

Tutorial Pytest per principianti: infissi, parametrizzazione ed esempi reali

Un tutorial pytest per principianti con test che abbiamo eseguito su pytest 9.2: asserzioni, dispositivi, parametrizzazione, conftest, marcatori, tm…

Leggi l'articolo →
Test del software

Ciclo di vita del test del software (STLC): 6 fasi, criteri di ingresso e uscita, esempio

Spiegazione del ciclo di vita del test del software: sei fasi STLC con criteri di ingresso e uscita, risultati finali, un esempio di funzionalità di…

Leggi l'articolo →
Sviluppo software

Git merge vs rebase: differenze, esempi e quando usare ciascuno

Git merge vs rebase spiegato con output reale del log, una tabella di confronto, la regola d'oro del rebase e un flusso di lavoro sicuro per i team.

Leggi l'articolo →
Sviluppo software

List comprehension in Python: sintassi, esempi e quando evitarla

List comprehension in Python spiegata: sintassi, filtri, if-else, cicli annidati, tempi misurati e i casi in cui un normale ciclo for è meglio.

Leggi l'articolo →
Database e SQL

SQL JOIN spiegati con esempi (Inner, Left, Right, Full)

Capisci i JOIN SQL passo dopo passo con tabelle e query di esempio: INNER, LEFT, RIGHT, FULL, CROSS e SELF, con errori comuni e consigli sulle prest…

Leggi l'articolo →