{"id":1105,"date":"2026-06-15T18:14:22","date_gmt":"2026-06-15T18:14:22","guid":{"rendered":"https:\/\/convly.ai\/how-to-build-a-rag-pipeline-2026\/"},"modified":"2026-06-15T18:17:48","modified_gmt":"2026-06-15T18:17:48","slug":"how-to-build-a-rag-pipeline-2026","status":"publish","type":"post","link":"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/","title":{"rendered":"Come costruire una pipeline RAG nel 2026 (guida passo passo)"},"content":{"rendered":"<p>La generazione con recupero aumentato (RAG) ha smesso di essere una semplice curiosit\u00e0 accademica molti anni fa. Nel 2026 \u00e8 il metodo predefinito per mettere un modello linguistico di grandi dimensioni (LLM) a disposizione dei propri documenti senza dover pagare per il fine-tuning del modello o rischiare che fornisca risposte inventate con eccessiva sicurezza. Il principio \u00e8 semplice da descrivere, ma pieno di insidie pratiche: individuare il testo pi\u00f9 pertinente, fornirlo al modello e lasciare che quest\u2019ultimo rediga la risposta.<\/p>\n<p>Questa \u00e8 una guida pratica alla realizzazione, non una panoramica teorica. Alla fine avrai una conoscenza precisa dei componenti necessari per una pipeline RAG funzionante nel 2026, degli strumenti specifici e delle versioni dei modelli da utilizzare, oltre a uno schema minimo di codice eseguibile in locale o tramite API. Abbiamo verificato ogni numero di versione, prezzo e benchmark riportati qui sotto confrontandoli con le fonti attuali \u2014 perch\u00e9 il peggiore bug RAG \u00e8 quello che copi da un articolo scritto l\u2019anno scorso per librerie ormai obsolete.<\/p>\n<div class=\"convly-tldr\">\n<h3>Punti chiave<\/h3>\n<ul>\n<li><strong>Sei fasi, nell\u2019ordine indicato:<\/strong> suddivisione in blocchi (chunking), embedding, memorizzazione, recupero, reranking, generazione. Saltare il reranker comporta un peggioramento evidente dei risultati migliori; saltare la valutazione significa non sapere mai se il sistema funziona davvero.<\/li>\n<li><strong>Il chunking banale d\u00e0 i migliori risultati.<\/strong> La suddivisione ricorsiva in blocchi di circa 512 token con un\u2019overlap del 10\u201320% supera il chunking semantico avanzato (69% contro il 54% di accuratezza) in un benchmark del 2026. \u00c8 il punto di partenza consigliato.<\/li>\n<li><strong>Embedding:<\/strong> nomic-embed-text (768 dimensioni, gratuito, eseguibile in locale) per prototipi; OpenAI text-embedding-3-large ($0,13 per 1 milione di token, 3072 dimensioni) o Voyage-3.5 per prestazioni elevate su larga scala.<\/li>\n<li><strong>Database vettoriale:<\/strong> pgvector se gi\u00e0 utilizzi PostgreSQL; Qdrant v1.18 (licenza Apache 2.0, scritto in Rust) quando hai bisogno di ricerche filtrate veloci; Chroma per lavori locali rapidi.<\/li>\n<li><strong>Framework:<\/strong> LangChain 1.x (con runtime LangGraph) per flussi agentic, LlamaIndex 0.14.x per applicazioni incentrate sul recupero \u2014 e puoi realizzare una pipeline utile in circa 40 righe di codice anche senza alcuno di questi framework.<\/li>\n<li><strong>Aggiungi un reranker.<\/strong> Cohere Rerank 3.5 ($2 per 1.000 ricerche) o l\u2019open-source BGE-reranker-v2-m3 (gratuito, ~50\u2013100 ms su GPU) migliorano in modo significativo la pertinenza dei primi k risultati.<\/li>\n<\/ul>\n<\/div>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-flat ez-toc-counter ez-toc-container-direction\">\n<label for=\"ez-toc-cssicon-toggle-item-6a389fb4b3484\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Attiva\/Disattiva<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #000000;color:#000000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #000000;color:#000000\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewbox=\"0 0 24 24\" version=\"1.2\" baseprofile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a389fb4b3484\"  aria-label=\"Attiva\/Disattiva\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1' ><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#How_a_RAG_pipeline_actually_works\" >Come funziona effettivamente una pipeline RAG<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#Step_1_Chunk_your_documents\" >Passo 1: Suddividi i tuoi documenti in blocchi<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#Step_2_Choose_an_embedding_model\" >Passo 2: Scegli un modello di embedding<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#Step_3_Store_vectors_in_a_vector_database\" >Passo 3: Memorizza i vettori in un database vettoriale<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#Step_4_Retrieve_and_rerank\" >Passo 4: Recupera e applica il reranking<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#Step_5_Augment_the_prompt_and_generate\" >Passo 5: Arricchisci il prompt e genera la risposta<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#Step_6_A_minimal_code_sketch\" >Passo 6: Uno schema minimo di codice<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#Step_7_Evaluate_%E2%80%94_dont_skip_this\" >Passo 7: Valuta \u2014 non saltare questo passaggio<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#FAQ\" >Domande frequenti<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#Bottom_line\" >Conclusione<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/convly.ai\/it\/how-to-build-a-rag-pipeline-2026\/#Related_articles\" >Articoli correlati<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"How_a_RAG_pipeline_actually_works\"><\/span>Come funziona effettivamente una pipeline RAG<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Un sistema RAG opera in due fasi. <strong>Indicizzazione<\/strong> avviene una sola volta (o ogni volta che i tuoi documenti cambiano): suddividi i file sorgenti in blocchi, converti ciascun blocco in un vettore mediante un modello di embedding e memorizzi tali vettori in un database. <strong>Interrogazione<\/strong> avviene per ogni richiesta: trasformi la domanda dell\u2019utente in un vettore tramite lo stesso modello di embedding, trovi i blocchi pi\u00f9 simili, eventualmente li sottoponi a reranking, inserisci quelli migliori nel prompt e invochi un modello linguistico di grandi dimensioni.<\/p>\n<p>Questo \u00e8 l\u2019intero concetto. La parte ingegneristica sta nei dettagli: dimensione dei blocchi, scelta del modello di embedding, numero di risultati da recuperare, necessit\u00e0 o meno di un reranker e modalit\u00e0 di valutazione dell\u2019efficacia complessiva. Se desideri acquisire prima le basi concettuali, il nostro <a href=\"\/it\/rag-retrieval-augmented-generation-explained\/\">approfondimento su RAG<\/a> tratta la teoria; questo articolo si concentra invece sulla sua implementazione pratica. Se invece stai ancora decidendo tra RAG e la personalizzazione diretta del modello, la <a href=\"\/it\/fine-tuning-vs-rag\/\">comparazione tra fine-tuning e RAG<\/a> \u00e8 il punto di partenza ideale \u2014 per la maggior parte dei team che alimentano un LLM con dati privati e in continua evoluzione, RAG rappresenta la soluzione pi\u00f9 economica e facilmente mantenibile.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_1_Chunk_your_documents\"><\/span>Passo 1: Suddividi i tuoi documenti in blocchi<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>I modelli di embedding hanno un limite di contesto e, cosa ancor pi\u00f9 importante, perdono precisione su passaggi lunghi. Pertanto, i documenti vengono suddivisi in blocchi. Il consenso del 2026, supportato da benchmark oggettivi e non da impressioni soggettive, \u00e8 poco appariscente: usa uno splitter ricorsivo basato sui caratteri mirato a blocchi di circa <strong>512 token con un\u2019overlap del 10\u201320%<\/strong> (50\u2013100 token).<\/p>\n<p>Una valutazione condotta nel febbraio 2026 su 50 documenti reali ha rilevato che la suddivisione ricorsiva na\u00efve in blocchi di 512 token ha ottenuto un\u2019accuratezza di recupero pari al 69%, mentre la suddivisione semantica \u2014 che cerca di spezzare i testi lungo i confini del significato \u2014 ha raggiunto soltanto il 54%. Il motivo \u00e8 banale: la suddivisione semantica ha prodotto frammenti di dimensione media pari a 43 token, troppo piccoli per fornire al modello un contesto sufficiente a rispondere correttamente. Nel frattempo, uno studio separato condotto nel gennaio 2026 con il sistema di recupero SPLADE ha evidenziato che l\u2019aggiunta di sovrapposizione (overlap) incrementava i costi di indicizzazione senza apportare alcun beneficio misurabile sul relativo dataset. La conclusione onesta \u00e8 questa: iniziare con blocchi ricorsivi di dimensione fissa e ricorrere alla suddivisione semantica o basata sulle pagine soltanto se le metriche di valutazione dimostrano inequivocabilmente che tale approccio \u00e8 necessario per i vostri documenti specifici.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_2_Choose_an_embedding_model\"><\/span>Passo 2: Scegli un modello di embedding<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Questa \u00e8 la decisione pi\u00f9 determinante dell\u2019intera pipeline, e la differenza tra le opzioni disponibili \u00e8 reale. Di seguito sono elencate le scelte degne di considerazione a met\u00e0 2026, corredate da dati verificati.<\/p>\n<table class=\"convly-vs\">\n<thead>\n<tr>\n<th>Modello<\/th>\n<th>Dimensioni<\/th>\n<th>Contesto<\/th>\n<th>Prezzo \/ 1 milione di token<\/th>\n<th>Note<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>nomic-embed-text v1.5<\/td>\n<td>768 (MRL 64\u2013768)<\/td>\n<td>8,192<\/td>\n<td>Gratuito (locale)<\/td>\n<td>274 MB; la scelta predefinita locale<\/td>\n<\/tr>\n<tr>\n<td>mxbai-embed-large<\/td>\n<td>1024<\/td>\n<td>512<\/td>\n<td>Gratuito (locale)<\/td>\n<td>670 MB; qualit\u00e0 superiore, contesto breve<\/td>\n<\/tr>\n<tr>\n<td>BGE-M3<\/td>\n<td>1024 + sparsa<\/td>\n<td>8,192<\/td>\n<td>Gratuito (locale)<\/td>\n<td>Licenza MIT, oltre 100 lingue<\/td>\n<\/tr>\n<tr>\n<td>OpenAI text-embedding-3-small<\/td>\n<td>1536<\/td>\n<td>8,191<\/td>\n<td>$0.02<\/td>\n<td>Baseline economico tramite API<\/td>\n<\/tr>\n<tr>\n<td>OpenAI text-embedding-3-large<\/td>\n<td>3072<\/td>\n<td>8,191<\/td>\n<td>$0.13<\/td>\n<td>$0,065 tramite Batch API<\/td>\n<\/tr>\n<tr>\n<td>Voyage-3.5<\/td>\n<td>2048 (MRL 256\u20132048)<\/td>\n<td>32,000<\/td>\n<td>$0.06<\/td>\n<td>Supera il modello 3-large di circa l\u20198% nelle prestazioni di recupero<\/td>\n<\/tr>\n<tr>\n<td>Gemini Embedding<\/td>\n<td>3072<\/td>\n<td>\u2014<\/td>\n<td>API<\/td>\n<td>Leader nella classifica MTEB v2 (~68,3)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Per un prototipo, iniziate localmente con <strong>nomic-embed-text<\/strong> \u2014 \u00e8 veloce, gratuito, si adatta facilmente su un laptop da 16 GB ed \u00e8 riportato battere l\u2019ormai obsoleto <code>text-embedding-ada-002<\/code>di OpenAI. Per ambienti di produzione, il settore open source ha effettivamente raggiunto i leader commerciali: BGE-M3 \u00e8 il modello affidabile, rilasciato con licenza MIT, adottato di default dalla maggior parte degli stack self-hosted, mentre Voyage-3.5 e Gemini Embedding guidano le classifiche dei servizi gestiti tramite API. Esiste per\u00f2 una regola fondamentale: <strong>qualsiasi modello usiate per incorporare i vostri documenti, dovrete utilizzare esattamente lo stesso modello anche per incorporare le query.<\/strong> Mescolare modelli distrugge silenziosamente le prestazioni del recupero.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_3_Store_vectors_in_a_vector_database\"><\/span>Passo 3: Memorizza i vettori in un database vettoriale<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Una volta ottenuti gli embedding, questi devono essere memorizzati in un sistema in grado di supportare ricerche rapide dei k vicini pi\u00f9 prossimi. Nel 2026 avete tre livelli ragionevoli tra cui scegliere.<\/p>\n<div class=\"convly-procons\">\n<div class=\"pros\">\n<h4>Scegliete questi strumenti<\/h4>\n<ul>\n<li><strong>pgvector 0.8<\/strong> se gi\u00e0 utilizzate PostgreSQL. Con un indice HNSW garantisce latenze p95 comprese tra una cifra singola e poche decine di millisecondi per 1 milione di vettori. La versione 0.8 ha introdotto le scansioni iterative, consentendo alle query filtrate di restituire un numero sufficiente di risultati. Nessuna nuova infrastruttura richiesta.<\/li>\n<li><strong>Qdrant v1.18<\/strong> (licenza Apache 2.0, scritto in Rust) quando i filtri sono fondamentali. Il suo algoritmo ACORN (introdotto nella versione 1.16) risolve il classico problema \u00abi filtri riducono drasticamente il recall\u00bb ampliando dinamicamente la ricerca HNSW sotto filtri particolarmente restrittivi ed \u00e8 attualmente uno dei migliori strumenti disponibili per ricerche filtrate. Si auto-installa con un singolo comando Docker.<\/li>\n<li><strong>Chroma<\/strong> per la prototipazione locale. Miglior esperienza per gli sviluppatori, modalit\u00e0 embedded, zero operazioni \u2014 perfetto finch\u00e9 non si superano i suoi limiti.<\/li>\n<\/ul>\n<\/div>\n<div class=\"cons\">\n<h4>Attenzione a<\/h4>\n<ul>\n<li>I servizi gestiti fatturano in base all\u2019uso e possono sorprendere gli utenti: con 100 milioni di vettori, Pinecone pu\u00f2 arrivare a costare oltre $5.000 al mese, contro una soluzione self-hosted molto pi\u00f9 economica come Qdrant o pgvector su una propria macchina virtuale. Eseguite un audit prima di scalare.<\/li>\n<li>La costruzione degli indici HNSW \u00e8 lenta su larga scala e l\u2019indice pu\u00f2 occupare circa 8 GB per 1 milione di vettori a 1536 dimensioni (usando halfvec si riduce approssimativamente della met\u00e0).<\/li>\n<li>L\u2019hardware di archiviazione domina le prestazioni: lo stesso setup pgvector ha conseguito circa 410 QPS su SSD cloud, contro 2.150 QPS su unit\u00e0 NVMe.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>Un\u2019analisi pi\u00f9 approfondita \u00e8 disponibile nel nostro <a href=\"\/it\/what-is-a-vector-database-2026\/\">guida ai database vettoriali<\/a>, ma per la maggior parte dei team l\u2019albero decisionale \u00e8 semplice: gi\u00e0 su PostgreSQL \u2192 pgvector; necessit\u00e0 di filtri pesanti o di miliardi di vettori \u2192 Qdrant o Milvus; semplice sperimentazione \u2192 Chroma.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_4_Retrieve_and_rerank\"><\/span>Passo 4: Recupera e applica il reranking<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Il recupero vero e proprio consiste in una singola chiamata: si genera l\u2019embedding della query e si chiede al database di restituire i k frammenti pi\u00f9 vicini (k tipicamente compreso tra 20 e 50). Tuttavia, la semplice similarit\u00e0 vettoriale \u00e8 uno strumento grossolano. Un <strong>reranker<\/strong> \u2014 un cross-encoder che valuta individualmente ogni coppia query-documento \u2014 riordina tali candidati e porta in primo piano quelli realmente pertinenti, prima che raggiungano il modello linguistico.<\/p>\n<p>Il pattern standard \u00e8: recuperare i primi 50 risultati con il bi-encoder, applicare il reranking e mantenere i primi 5\u201310. Cohere Rerank 3.5 costa $0,002 per ricerca ($2 ogni 1.000) e aggiunge tipicamente una latenza nell\u2019ordine dei 100\u2013300 ms. Se disponete di una GPU e desiderate azzerare i costi per ogni query, il modello open source <strong>BGE-reranker-v2-m3<\/strong> impiega circa 50\u2013100 ms ed \u00e8 multilingue. Il reranking rappresenta uno degli upgrade pi\u00f9 efficaci e meno impegnativi che si possano implementare \u2014 la maggior parte delle pipeline che \u00abrecuperano spazzatura\u00bb ne \u00e8 priva.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_5_Augment_the_prompt_and_generate\"><\/span>Passo 5: Arricchisci il prompt e genera la risposta<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A questo punto si compila il prompt: una breve istruzione di sistema che indica al modello di rispondere esclusivamente in base al contesto fornito, ai frammenti riordinati e alla domanda dell\u2019utente. Quindi si invoca il modello linguistico.<\/p>\n<p>Per il modello generativo potete optare per una soluzione locale o per un\u2019API. Localmente, tramite <a href=\"\/it\/what-is-ollama-complete-guide-2026\/\">Ollama<\/a>, il compromesso ideale nel 2026 \u00e8 un modello di classe 8B \u2014 ad esempio Qwen3 8B o Llama 3.1 8B quantizzato in Q4_K_M \u2014 che occupa 8\u201312 GB di VRAM e raggiunge velocit\u00e0 di generazione superiori a 40 token\/secondo su una GPU moderna. Qwen3 14B (~8\u20139 GB in Q4) rappresenta un notevole passo avanti, con una finestra di contesto di 128K token, utile per inserire testi recuperati pi\u00f9 lunghi. Per una soluzione ospitata con prestazioni pi\u00f9 elevate, un modello API di ultima generazione funziona bene; il nostro <a href=\"\/it\/build-ai-chatbot-claude-api\/\">tutorial sulla chatbot API Claude<\/a> illustra dettagliatamente questo percorso. Un promemoria utile proveniente dagli esperti: nel caso di RAG, la qualit\u00e0 del recupero conta generalmente pi\u00f9 della dimensione del modello \u2014 frammenti ben puliti, un buon embedder e un modello linguistico piccolo battono un modello enorme alimentato da un contesto scadente.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_6_A_minimal_code_sketch\"><\/span>Passo 6: Uno schema minimo di codice<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Di seguito \u00e8 riportata un\u2019intera pipeline locale basata su LangChain 1.x, Chroma e Ollama. Indicizza un documento ed elabora una domanda \u2014 nessuna chiave API richiesta.<\/p>\n<pre><code class=\"language-python\"># pip install langchain langchain-community langchain-chroma langchain-ollama\nfrom langchain_community.document_loaders import TextLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\nfrom langchain_ollama import OllamaEmbeddings, ChatOllama\nfrom langchain_chroma import Chroma\n\n# 1. Caricamento + suddivisione (~512 token, ~15% di sovrapposizione; le dimensioni sono in caratteri)\ndocs = TextLoader(&quot;handbook.txt&quot;).load()\nchunks = RecursiveCharacterTextSplitter(\n    chunk_size=2000, chunk_overlap=300\n).split_documents(docs)\n\n# 2. Embedding + 3. Memorizzazione\nembeddings = OllamaEmbeddings(model=&quot;nomic-embed-text&quot;)\nstore = Chroma.from_documents(chunks, embeddings)\n\n# 4. Recupero (primi 4)\nretriever = store.as_retriever(search_kwargs={&quot;k&quot;: 4})\n\n# 5. Arricchimento + generazione\nllm = ChatOllama(model=&quot;qwen3:8b&quot;)\nquestion = &quot;Qual \u00e8 il periodo di rimborso?&quot;\ncontext = &quot;nn&quot;.join(d.page_content for d in retriever.invoke(question))\nprompt = (f&quot;Rispondi utilizzando ESCLUSIVAMENTE il contesto fornito. Se l\u2019informazione non \u00e8 presente, indicarlo esplicitamente.nn&quot;\n          f&quot;Contesto:n{context}nnDomanda: {question}&quot;)\nprint(llm.invoke(prompt).content)\n<\/code><\/pre>\n<p>Questo \u00e8 l\u2019intero ciclo. Per aggiungere il reranking, inserite un <code>ContextualCompressionRetriever<\/code> con un cross-encoder tra i passaggi 4 e 5. Con LlamaIndex 0.14.x lo stesso flusso richiede tipicamente meno codice grazie alle sue astrazioni di recupero progettate appositamente: \u00e8 la scelta migliore per applicazioni fortemente orientate al recupero, mentre il runtime LangGraph di LangChain eccelle quando sono necessari agenti con stato e multi-step. (La scelta di un livello di orchestrazione \u00e8 un argomento a s\u00e9 stante; vedi la nostra <a href=\"\/it\/best-ai-agent-frameworks-2026\/\">comparazione dei framework per agenti AI<\/a>.)<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Step_7_Evaluate_%E2%80%94_dont_skip_this\"><\/span>Passo 7: Valuta \u2014 non saltare questo passaggio<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>La differenza tra una demo e un prodotto reale sta nella misurazione. Lo strumento standard \u00e8 <strong>RAGAS<\/strong>, che valuta la fedelt\u00e0 (l\u2019output si \u00e8 attenuto al contesto fornito?), la precisione del contesto e il richiamo del contesto utilizzando un modello linguistico come giudice. Crea un piccolo set di 20\u201350 coppie domanda-risposta estratte dai tuoi documenti reali ed eseguilo ad ogni modifica.<\/p>\n<p>Questo \u00e8 anche il modo per prendere onestamente ogni decisione precedente. Dovresti passare al chunking semantico? Aggiungere un reranker? Aumentare k da 4 a 8? Non indovinare: modifica una sola variabile, riesegui RAGAS e mantieni la modifica solo se i risultati migliorano. Senza questo ciclo, stai ottimizzando alla cieca.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"FAQ\"><\/span>Domande frequenti<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3>Quanto costa eseguire una pipeline RAG?<\/h3>\n<p>Almost free to prototype. With local Ollama embeddings, Chroma, and a local LLM, your only cost is electricity. At scale, the main bills are the vector DB (a self-hosted Qdrant or pgvector instance on your own VM is dramatically cheaper than managed offerings, which can exceed $5,000\/month at 100M vectors) and, if you use APIs, embeddings (OpenAI text-embedding-3-large is $0.13 per million tokens) plus generation calls.<\/p>\n<h3>Ho davvero bisogno di un database vettoriale, oppure posso usare un database tradizionale?<\/h3>\n<p>Hai bisogno della ricerca vettoriale, ma non necessariamente di un prodotto dedicato. pgvector aggiunge questa funzionalit\u00e0 a PostgreSQL e gestisce 1 milione di vettori con bassa latenza p95 (pochi millisecondi su NVMe, leggermente superiori su SSD cloud); quindi, se gi\u00e0 utilizzi PostgreSQL, puoi evitare completamente nuove infrastrutture. Opta per un database dedicato come Qdrant solo quando hai bisogno di filtri avanzati sui metadati o devi gestire miliardi di vettori.<\/p>\n<h3>Qual \u00e8 la dimensione ideale dei chunk?<\/h3>\n<p>Inizia con circa 512 token e un sovrapposizione del 10\u201320% usando uno splitter ricorsivo. Un benchmark del 2026 ha rilevato che questo approccio supera il chunking semantico in termini di accuratezza del recupero nel 69% dei casi contro il 54%. Passa a tecniche di chunking pi\u00f9 sofisticate solo se le metriche di valutazione dimostrano un effettivo miglioramento sui tuoi documenti specifici.<\/p>\n<h3>Un reranker \u00e8 davvero necessario?<\/h3>\n<p>Non per ottenere un sistema funzionante, ma rappresenta uno degli interventi pi\u00f9 economici per migliorare la qualit\u00e0. Recupera un ampio insieme (top 50), applica il reranking con Cohere Rerank 3.5 o con il modello open-source BGE-reranker-v2-m3, e conserva solo i primi 5\u201310 risultati. La maggior parte delle pipeline che restituiscono chunk irrilevanti semplicemente omette questo passaggio.<\/p>\n<h3>Posso costruire una pipeline RAG senza LangChain o LlamaIndex?<\/h3>\n<p>S\u00ec. Il ciclo fondamentale \u2014 embedding, ricerca, prompt, generazione \u2014 richiede circa 40 righe di Python puro che chiamano direttamente il tuo modello di embedding, il client del database vettoriale e il modello linguistico. I framework risparmiano tempo su loader, reranker e orchestrazione di agenti, ma sono opzionali; costruire tutto da zero ti offre il pieno controllo su ogni singolo passaggio.<\/p>\n<h3>Devo usare un modello locale o un\u2019API per la generazione?<\/h3>\n<p>Un modello locale (tramite Ollama, con un modello da 8B su 8\u201312 GB di VRAM) \u00e8 ottimo per privacy, controllo dei costi e uso offline. Un\u2019API ti garantisce invece una qualit\u00e0 superiore e zero operazioni da gestire. Molte squadre sviluppano inizialmente in locale per iterare a basso costo, poi scelgono caso per caso, in base alla sensibilit\u00e0 dei dati e al budget disponibile.<\/p>\n<h3>Come mantengo aggiornato l\u2019indice man mano che i documenti cambiano?<\/h3>\n<p>Rigenera e inserisci (upsert) solo i contenuti modificati, anzich\u00e9 ricostruire l\u2019intero indice. Tieni traccia di un hash del contenuto o della data di modifica per ogni documento sorgente e, in caso di aggiornamento, elimina i vecchi chunk associati a quel documento e inseriscine di nuovi. La maggior parte dei database vettoriali supporta upsert e cancellazioni basate su filtri sui metadati, rendendo cos\u00ec gli aggiornamenti incrementali semplici e affidabili.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Bottom_line\"><\/span>Conclusione<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Costruire una pipeline RAG nel 2026 \u00e8 davvero accessibile: sei fasi, un numero limitato di strumenti consolidati e circa 40 righe di codice per arrivare a un prototipo funzionante. Le insidie non risiedono nell\u2019architettura, bens\u00ec nei valori predefiniti. Usa chunk noiosi da 512 token, assicurati che gli embedder per query e documenti coincidano, aggiungi un reranker e non ottimizzare mai senza avere RAGAS integrato nel ciclo di valutazione. Inizia in locale e gratuitamente con nomic-embed-text, Chroma e un modello Ollama da 8B; sostituisci progressivamente singoli componenti con pgvector, Qdrant, Voyage o un\u2019API all\u2019avanguardia solo quando sono i tuoi numeri di valutazione \u2014 e non un articolo su un blog \u2014 a indicartelo. Ottieni un recupero accurato e persino un modello di piccole dimensioni ti porter\u00e0 molto lontano.<\/p>\n<p><!--related-block--><\/p>\n<div class=\"convly-related\">\n<h2><span class=\"ez-toc-section\" id=\"Related_articles\"><\/span>Articoli correlati<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/convly.ai\/it\/how-to-run-llama-3-locally-on-snapdragon-8-gen-4\/\">How to Run Llama 3 Locally on Snapdragon 8 Gen 4 (Step-by-Step, 2026)<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/it\/90-day-ai-engineer-path\/\">Da zero a ingegnere AI: il tuo percorso di apprendimento di 90 giorni<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/it\/ai-resume-screener-tutorial\/\">Creare uno screener per curriculum basato sull\u2019intelligenza artificiale (tutorial completo)<\/a><\/li>\n<li><a href=\"https:\/\/convly.ai\/it\/local-llm-ollama-setup\/\">Configurare il primo modello linguistico locale con Ollama<\/a><\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>A practical, code-first walkthrough of building a retrieval-augmented generation pipeline in 2026 \u2014 from embeddings and chunking to vector storage, reranking, and generation, with verified tool versions and honest notes on what actually works.<\/p>","protected":false},"author":1,"featured_media":1115,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[9],"tags":[746,747,442,259,429,748,441],"class_list":["post-1105","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-embeddings","tag-langchain","tag-llm","tag-ollama","tag-rag","tag-tutorial","tag-vector-database"],"_links":{"self":[{"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/posts\/1105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/comments?post=1105"}],"version-history":[{"count":1,"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/posts\/1105\/revisions"}],"predecessor-version":[{"id":1126,"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/posts\/1105\/revisions\/1126"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/media\/1115"}],"wp:attachment":[{"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/media?parent=1105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/categories?post=1105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/convly.ai\/it\/wp-json\/wp\/v2\/tags?post=1105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}