RAG locale : introduction
Un RAG locale (retrieval-augmented generation) ti permette di interrogare i tuoi documenti con un modello che funziona sul tuo computer: i tuoi file vengono suddivisi in passaggi e trasformati in vettori da un modello di embedding; poi, a ogni domanda, solo i passaggi più vicini vengono aggiunti al prompt del modello. Nulla deve necessariamente uscire dal computer, né per l'indicizzazione né per la risposta.
Questa introduzione spiega come funziona un RAG locale, lo stack minimo per costruirlo su Ollama, le opzioni senza codice, un esempio in Python con LlamaIndex e soprattutto i punti in cui la maggior parte dei primi tentativi fallisce: suddivisione in blocchi, lingua, ricerca, PDF. Indica anche quando un RAG non è la soluzione giusta.
#RAG locale: la definizione e ciò che ti aspetti
RAG significa retrieval-augmented generation, cioè generazione aumentata tramite recupero: si recuperano prima dei passaggi pertinenti da una base di documenti, poi si chiede al modello di redigere una risposta a partire da essi. Il termine locale specifica che ogni fase (lettura dei documenti, calcolo degli embedding, archiviazione, generazione) avviene sul tuo hardware. È l'uso più utile di un modello privato: domande su contratti, note, una base di conoscenze interna, con risposte che citano le fonti.
| Componente | Ruolo | Esempi |
|---|---|---|
| Lettore di documenti | Estrarre il testo pulito da file PDF, Word, Markdown e HTML | Lettori di LlamaIndex, Docling |
| Segmentatore (chunker) | Suddividere il testo in passaggi di dimensioni adeguate | Suddivisione per token o per struttura |
| Modello di embedding | Trasformare ogni passaggio in un vettore | embeddinggemma, qwen3-embedding, all-minilm (consigliati da Ollama) |
| Database vettoriale | Archiviare i vettori e cercare i più vicini | ChromaDB, Qdrant, FAISS, pgvector |
| Modello di generazione | Redigere la risposta a partire dai passaggi | Modello servito tramite Ollama o LM Studio |
#Perché usare un RAG piuttosto che inviare tutto al modello?
I tuoi documenti, la tua IA: un RAG locale affidabile sui tuoi PDF, sulle tue note e sulle tue email — senza inviare nulla nel cloud.
- Spazio online a vita
- PDF + file
- Aggiornamenti a vita
Prima idea: copiare tutti i propri documenti nel prompt. Ci sono però due limiti. La finestra di contesto è limitata: 300 PDF rappresentano milioni di token, ben oltre quanto un modello locale possa accettare. E anche quando un documento riesce a essere inserito, la qualità cala: uno studio di riferimento (Liu et al., Stanford) mostra che la performance può diminuire notevolmente quando l'informazione utile si trova al centro di un lungo contesto, anche per modelli progettati per contesti lunghi. Questo fenomeno si chiama lost in the middle.
Il RAG aggira questi due problemi trasmettendo al modello solo alcuni passaggi selezionati in relazione alla domanda. Il modello legge alcune centinaia di token ben mirati invece di decine di migliaia di token poco utili, con un costo di calcolo e una latenza minori. Tutta l'abilità sta nel recuperare bene i passaggi.
Un ordine di grandezza, con un calcolo illustrativo: 300 PDF di 20 pagine, con circa 600 token per pagina, rappresentano 3,6 milioni di token, cioè centinaia di volte la finestra di 8.000 token che si imposta spesso su un modello locale. Suddivisi in passaggi di 400 token, producono circa 9.000 passaggi. Una domanda ne seleziona cinque, cioè 2.000 token: il modello legge lo 0,06% del corpus, ma lo 0,06% giusto se la ricerca ha successo.
#Il concetto in due minuti: embedding e distanza
Un embedding è una lista di numeri che rappresenta il senso di un testo. Due testi che parlano della stessa cosa hanno vettori vicini, anche se non usano le stesse parole. La documentazione di Ollama descrive gli embedding come vettori numerici che si possono memorizzare in un database vettoriale, cercare tramite la similarità del coseno o utilizzare in un RAG, con una lunghezza che dipende dal modello, tipicamente compresa tra 384 e 1024 dimensioni.
Una domanda viene trasformata in un vettore dallo stesso modello, poi confrontata con tutti i passaggi indicizzati: vengono restituiti quelli più vicini. Il punto che trae in inganno i principianti: il modello di embedding utilizzato per l'indice e quello utilizzato per le domande devono essere identici. La documentazione di LlamaIndex lo ricorda nel suo esempio di ricaricamento dell'indice: è importante utilizzare lo stesso embed_model usato per costruirlo.
#Anatomia di un RAG: due fasi
#Fase 1: l'indicizzazione, eseguita una volta per documento
- 01IngestioneLeggere i file (PDF, Word, Markdown, HTML) ed estrarne il testo pulito. È la fase più sottovalutata.
- 02SuddivisioneSuddividere in brani abbastanza piccoli da essere precisi e abbastanza grandi da conservare il senso. Brani da 200 a 500 token sono un punto di partenza comune.
- 03EmbeddingElaborare ogni brano con il modello di embedding, ad esempio con il comando ollama run embeddinggemma o l'API /api/embed.
- 04ArchiviazioneSalvare i vettori insieme al testo originale e ai metadati (nome del file, pagina, data).
#Fase 2: la richiesta, per ogni domanda
- 01Embedding della domandaCon lo stesso modello utilizzato per l’indicizzazione.
- 02RicercaTrovare gli N passaggi con il vettore più vicino, usando la similarità coseno come misura.
- 03Assemblaggio del promptCostruire un messaggio che contenga gli estratti e l'istruzione di rispondere citando le fonti e di segnalare quando la risposta non si trova negli estratti.
- 04GenerazioneInviare questo prompt al modello locale, che redige la risposta.
#Lo stack minimo e le opzioni senza codice
Per un RAG locale funzionante bastano quattro componenti: un modello di generazione servito da Ollama, un modello di embedding, un database vettoriale e uno strato che li collega. Per il francese, scegli un modello di embedding multilingue; la pagina di Ollama ne consiglia tre (embeddinggemma, qwen3-embedding, all-minilm), e le dimensioni dei vettori restano contenute, il che permette di eseguirli su un portatile.
| Via | Sforzo | Controllo | Adatto a |
|---|---|---|---|
| LM Studio, Chat with Documents | Trascinare file .pdf, .docx o .txt in una conversazione | Basso: passaggio automatico tra documento intero e RAG | Prova rapida su alcuni file |
| AnythingLLM | Applicazione con scelta dell'embedder e della base vettoriale | Medio | Piccola squadra senza sviluppatore |
| Open WebUI | Interfaccia web collegata a Ollama, basi di conoscenza | Medio | Uso quotidiano di una raccolta di appunti |
| LlamaIndex o Haystack in Python | Codice da scrivere | Alto: suddivisione, ricerca, valutazione | Progetto su misura o da distribuire |
Per evitare di programmare, la guida sul RAG in LM Studio e quella su AnythingLLM illustrano in dettaglio ciascun percorso; la guida su NotebookLM e le alternative locali tratta la query «notebook lm rag».
#Il pipeline in Python, passo dopo passo
L'esempio qui sotto segue lo schema ufficiale del tutorial LlamaIndex con modelli locali: un lettore di directory, un modello di embedding, un modello servito da Ollama, poi un motore di interrogazione. Installa prima i pacchetti llama-index-llms-ollama e llama-index-embeddings-huggingface. Adatta i nomi dei modelli a quelli che hai scaricato.
La prima esecuzione calcola tutti gli embedding, operazione che richiede più o meno tempo a seconda del volume e della macchina. Per evitare di ricalcolarli tutti, salva l'indice con index.storage_context.persist, poi ricaricalo con load_index_from_storage riutilizzando lo stesso modello di embedding. Il parametro context_window limita la memoria consumata, come precisato nel tutorial.
#Le insidie che fanno fallire i primi tentativi
- Una suddivisione ingenua rompe le strutture
- Un taglio a metà di una tabella produce passaggi illeggibili. Usa uno strumento di segmentazione che rispetti titoli e tabelle, oppure converti prima i documenti con Docling.
- La lingua dell'embedding conta
- Un modello di embedding addestrato soprattutto sull'inglese recupera meno efficacemente i passaggi in francese. Scegli un modello multilingue e testalo su 10 domande reali prima di indicizzare tutto il corpus.
- Un unico valore di top-k raramente è adatto
- Troppo pochi passaggi impoveriscono la risposta; troppi sommergono il modello. Regola il numero in base alla natura dei documenti e verifica con domande di cui conosci la risposta.
- Una cattiva ricerca produce una risposta espressa con sicurezza ma falsa
- Un modello che riceve estratti non pertinenti può inventare una risposta che sembra certa. Misura innanzitutto la pertinenza degli estratti.
- I PDF nascondono insidie
- Doppia colonna, piè di pagina, tabelle, scansioni: una parte importante del lavoro consiste nel ripulire i dati durante l'ingestione. Un PDF scansionato richiede l'OCR prima di qualsiasi altro trattamento.
- Mescolare i modelli di embedding
- Indicizzare con un modello e interrogare con un altro dà risultati assurdi, senza messaggi di errore.
#Quando non usare RAG
| Situazione | Approccio migliore | Perché |
|---|---|---|
| Meno di una ventina di pagine | Inviare tutto nel contesto | Più semplice, senza perdere alcun passaggio del testo; è anche ciò che fa LM Studio quando il documento rientra nella finestra di contesto |
| Domanda fattuale su dati strutturati (fatturato 2024) | Query SQL o script di estrazione | Un RAG ritrova del testo, non un calcolo esatto |
| Domanda di sintesi su tutto il corpus | Riepiloghi gerarchici poi domanda sui riepiloghi | Il RAG recupera solo alcuni passaggi, non una visione d’insieme |
| Documenti modificati in continuazione | Indexazione incrementale, o ricerca per parole chiave | Reindicizzare a ogni modifica costa più che eseguire una query |
| Apprendere uno stile o un formato | Fine-tuning | Il RAG fornisce fatti, non uno stile di scrittura |
La guida che confronta il fine-tuning e il RAG approfondisce quest'ultimo caso.
#Hardware e riservatezza: ciò che resta sul tuo sistema
In un RAG completamente locale, i documenti, i vettori e le domande rimangono sulla macchina, a condizione che ogni componente sia locale: modello di embedding servito da Ollama o caricato dal disco, database vettoriale su file o come servizio locale, modello di generazione locale. Verifica che nessun componente chiami un servizio online: un embedder o un modello cloud selezionato per errore invierebbe i tuoi passaggi all'esterno.
Dal punto di vista hardware, la componente più esigente è il modello di generazione: in Q4, un modello da 8 a 9 miliardi di parametri trova posto in circa 5 GB di memoria, oltre alla memoria necessaria per il contesto. Qui il contesto cresce perché contiene gli estratti: prevedi un margine se aumenti il numero di passaggi. L'embedding, invece, è leggero; l'indicizzazione iniziale di un corpus di grandi dimensioni resta l'operazione più lunga e viene eseguita una sola volta. La guida sui LLM senza GPU indica cosa consente ciascuna quantità di RAM.
#E dopo? I miglioramenti da apportare, in ordine
Un RAG di base risponde spesso bene a domande semplici. Per andare oltre, l'ordine più conveniente è il seguente: prima una suddivisione che rispetti la struttura, poi la ricerca ibrida (vettoriale e per parole chiave con BM25, per non perdere un termine esatto come un numero di contratto), poi un reranker che riordina i primi risultati, infine una valutazione su un insieme di circa cinquanta domande di cui conosci la risposta. Senza misurazioni, ogni cambiamento rimane un'impressione.
Che cosa è un RAG locale?+
Qual è la differenza tra RAG e fine-tuning?+
Qual è il modello di embedding da scegliere per il francese?+
Serve una GPU per un RAG locale?+
Quale dimensione scegliere per i segmenti di testo da indicizzare?+
Come capire se il mio RAG risponde correttamente?+
- Che cos'è il RAG: guida per principianti
- Strategie di divisione dei documenti
- Embedding per il francese
- RAG in LM Studio
- AnythingLLM: tutorial RAG
- Valutare un RAG con Ragas
- Fonte: embedding in Ollama
- Fonte: tutorial LlamaIndex con modelli locali
- Fonte: Lost in the Middle (Liu et al.)
- Fonte: LM Studio, Chat with Documents
Un feedback, un errore, una precisazione? Facci sapere, così la guida migliora per tutti.