RAG con ChromaDB e Mistral
Per un RAG locale con Mistral, lo stack più semplice è Ollama (generazione ed embedding con bge-m3) più ChromaDB in modalità file, senza server né PyTorch. Quanto al modello, ministral-3:8b (6,0 GB, licenza Apache 2.0, contesto dichiarato di 256K) è una buona scelta predefinita per una scheda da 8 a 12 GB, ministral-3:14b per 16 GB e mistral-small3.2:24b (15 GB) per capacità superiori. L'impostazione da non dimenticare: la finestra di contesto di Ollama, da aumentare affinché i passaggi trovino spazio nel prompt.
Questa guida mostra come costruire un assistente documentale completo, con due script Python e un modello Mistral eseguito sulla tua macchina: i tuoi PDF e file di testo vengono suddivisi in passaggi e indicizzati in ChromaDB; i passaggi recuperati vengono poi forniti al modello, che risponde citando le proprie fonti. Spiega anche quale modello Mistral scegliere in base alla memoria video disponibile e quali insidie portano un RAG a dare risposte fuori tema.
#Ciò che costruiamo: un RAG Mistral completamente locale
Il RAG (generazione aumentata tramite recupero) consiste nel trovare i passaggi dei tuoi documenti che riguardano la domanda, poi inserirli nel prompt del modello affinché risponda basandosi su di essi. Il risultato atteso qui è un piccolo strumento da riga di comando: uno script indicizza una cartella di documenti; un secondo legge una domanda, trova i cinque passaggi più vicini in ChromaDB, li trasmette a un modello Mistral tramite Ollama insieme alla domanda e mostra la risposta seguita dai file consultati. Niente lascia la macchina: Ollama rende disponibili il modello di generazione e il modello di embedding, ChromaDB memorizza i vettori in una cartella locale.
Il termine «Mistral» viene usato in due sensi: i modelli a pesi aperti di Mistral AI, che scarichi ed esegui autonomamente (oggetto di questa guida), e le API ospitate dall'azienda, che inviano i tuoi passaggi ai suoi server. Per i documenti riservati, solo la prima opzione rispetta il requisito «100% locale».
#Quale modello Mistral scegliere per il RAG
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
Un RAG ha esigenze specifiche: il modello deve seguire un’istruzione rigorosa (« rispondi soltanto basandoti sui passaggi »), leggere più passaggi senza perdere il filo e rispondere in francese. La dimensione conta meno rispetto alla conversazione libera; invece, la memoria disponibile per il contesto conta di più. Le dimensioni riportate di seguito sono quelle visualizzate dalla libreria Ollama, con la quantizzazione predefinita.
| Modello | Dimensione in Ollama | Contesto annunciato | Per chi |
|---|---|---|---|
| ministral-3:3b | 3,0 GB | 256K | Macchina senza GPU dedicata; risposte semplici, scarsa tolleranza alle istruzioni complesse |
| ministral-3:8b | 6,0 GB | 256K | Scelta predefinita ragionevole per una scheda da 8 a 12 GB o un portatile con 16 GB di memoria |
| ministral-3:14b | 9,1 GB | 256K | Scheda da 16 GB, oppure da 12 GB con un contesto moderato |
| mistral-nemo (12B) | vedi la pagina Ollama | 128K | Alternativa meno recente, ancora diffusa |
| mistral-small3.2:24b | 15 GB | 128K | Scheda da 24 GB o memoria unificata da 32 GB e oltre; il più affidabile nel rispettare le istruzioni sul formato |
| mistral (7B, versione 0.3) | 4,4 GB | 32K | Modello vecchio: da riservare a macchine molto limitate |
La famiglia Ministral 3 (3B, 8B e 14B) è pubblicata con licenza Apache 2.0, come indicato nell'annuncio di Mistral 3, e la pagina Ollama la descrive come progettata per il deployment edge, capace di funzionare su una vasta gamma di hardware. Mistral Small 4, pubblicato nel 2026 con 119 miliardi di parametri in totale secondo il nome della sua scheda Hugging Face, è destinato a hardware server: non è un candidato per un computer personale. Per un ordine di grandezza della memoria necessaria, il calcolatore di VRAM del sito fornisce il peso del modello più la cache del contesto.
#Lo stack tecnologico
- Generazione
- Un modello Mistral fornito da Ollama, attraverso l'API HTTP locale sulla porta 11434.
- Embeddings
- bge-m3 servito da Ollama: la pagina della libreria lo descrive come un modello di BAAI versatile, multilingue e a più livelli di granularità, con 567 milioni di parametri. Evita di dover installare PyTorch e sentence-transformers.
- Database vettoriale
- ChromaDB in modalità locale (PersistentClient): una cartella, nessun server. Chroma fornisce un wrapper, OllamaEmbeddingFunction, che chiama l'API di embedding di Ollama.
- Lettura dei file
- pypdf per i PDF contenenti testo, lettura diretta per Markdown e testo semplice. Un PDF scansionato è un'immagine: serve prima il riconoscimento dei caratteri.
#Preparare l'ambiente
- 01Installa Ollama e ottieni i modelliInstalla Ollama, poi scarica il modello di generazione e il modello di embedding con i due comandi seguenti.
- 02Creare l'ambiente PythonPython 3.10 o successivo. Un ambiente virtuale mantiene le dipendenze del progetto separate.
- 03Posizionare i documentiCopia i tuoi PDF e i file Markdown e di testo in una cartella docs/ accanto agli script.
#2. Indicizzare i documenti in ChromaDB
Lo script legge ogni file, suddivide il testo in passaggi di circa 1.800 caratteri rispettando i confini dei paragrafi, poi li affida a Chroma, che chiama bge-m3 tramite Ollama per calcolare i vettori. Due dettagli contano: ogni passaggio conserva il nome del file nei metadati (per citare la fonte) e le aggiunte avvengono in lotti anziché un passaggio alla volta.
L'uso di upsert con identificatori basati sul nome del file e sul numero del passaggio permette di rieseguire lo script: reindicizzare la stessa cartella aggiorna i passaggi invece di duplicarli. Attenzione però: se un documento viene accorciato, i vecchi passaggi in eccesso rimangono nel database; per una modifica importante, elimina la cartella chroma_db e reindicizza. La scelta della dimensione dei passaggi è spiegata in dettaglio nella guida sulle strategie di chunking.
#3. Interrogare: ricerca, poi generazione
Il secondo script incorpora la domanda, recupera i cinque passaggi più vicini e compone il prompt. L'istruzione è decisiva: chiede di rispondere esclusivamente sulla base dei passaggi, di ammettere quando mancano le informazioni e di citare il file. Il parametro num_ctx aumenta la finestra di contesto: la documentazione di Ollama indica che la finestra predefinita è di 4.096 token e che la variabile OLLAMA_CONTEXT_LENGTH o il parametro num_ctx la modificano. Con cinque passaggi da 400 a 500 token, l'istruzione e la risposta, una finestra di 4.096 token è al limite: un contesto troppo corto viene troncato senza alcun avviso e il modello risponde senza aver letto la fine dei tuoi passaggi.
#Verificare cosa restituisce ChromaDB prima di dare la colpa al modello
Quando una risposta è sbagliata, la causa va cercata in uno di due punti: la ricerca non ha recuperato il passaggio giusto oppure il modello lo ha utilizzato male. Puoi distinguere i due casi visualizzando i passaggi recuperati con la rispettiva distanza, senza chiamare il modello. Se il passaggio giusto non compare tra i primi cinque, modifica la suddivisione del testo, aggiungi una ricerca per parole chiave o un reranker. Se è presente e la risposta resta errata, il problema dipende dal prompt, dal contesto troncato o dal modello: prova il modello di dimensioni superiori prima di trarre conclusioni.
#Budget di memoria: ciò che deve stare in memoria contemporaneamente
Il RAG fa coesistere due modelli, quello che genera e quello che calcola i vettori, più la cache del contesto del primo. Ollama carica ogni modello su richiesta e può rimuoverne uno dalla memoria per fare spazio all'altro, aggiungendo un ritardo a ogni passaggio se la memoria è appena sufficiente. La tabella fornisce un ordine di grandezza per tre configurazioni; il peso del modello proviene dalla libreria Ollama, mentre il resto è un calcolo da affinare con il calcolatore di VRAM del sito.
| Configurazione | Peso del modello di generazione | Da aggiungere | Scheda prevista |
|---|---|---|---|
| ministral-3:8b + bge-m3 | 6,0 GB | Cache di contesto, modello di embedding (567 milioni di parametri, poco più di un GB a mezza precisione), margine per il sistema | Da 8 a 12 GB |
| ministral-3:14b + bge-m3 | 9,1 GB | Lo stesso: il contesto lungo diventa il fattore limitante su 12 GB | Da 12 a 16 GB |
| mistral-small3.2:24b + bge-m3 | 15 GB | Idem; prevedere un ampio margine | 24 GB o più |
#Le insidie che portano a risposte fuori tema
- Il contesto predefinito troppo breve
- Vedere sopra: senza aumentare num_ctx, gli ultimi passaggi vengono troncati. Sintomo tipico: ChromaDB recupera correttamente la risposta giusta, ma il modello dice di non trovarla.
- PDF scansionati
- pypdf legge solo il testo già presente. Una scansione restituisce un risultato vuoto: lo script lo segnala. Sottoponi prima il documento a un OCR, descritto nella guida su Tesseract.
- Passaggi senza contesto
- Un passaggio estrapolato dal suo documento (« il termine è di 30 giorni ») non chiarisce di cosa si parla. Anteponi a ogni passaggio il titolo del documento o della sezione.
- Domanda senza risposta nei documenti
- Senza l'istruzione «dillo chiaramente», un modello colma il vuoto con ciò che sa. Testa sempre una domanda la cui risposta non è nei tuoi file.
- Identificatori e termini esatti
- Un numero di contratto o di fascicolo non viene recuperato bene tramite gli embedding: aggiungi una ricerca per parole chiave, come descritto nella guida sulla ricerca ibrida.
#Per approfondire
| Miglioramento | Sforzo | Da fare quando |
|---|---|---|
| Aumentare il numero di brani (k) da 5 a 8 | Una riga | La risposta è distribuita su più passaggi |
| Chunking per titoli invece che per paragrafi | Medio | Documenti strutturati (documentazione, contratti suddivisi in articoli) |
| Ricerca ibrida BM25 + vettoriale | Medio | Domande per identificativo, sigla o nome proprio |
| Reranker (bge-reranker-v2-m3) | Medio | La risposta corretta viene recuperata ma classificata oltre il 5° posto |
| Interfaccia di chat (Open WebUI, API FastAPI) | Variabile | Altri utenti devono utilizzare lo strumento |
| Backup e reindicizzazione programmati | Basso | La cartella dei documenti cambia ogni settimana |
Ogni miglioramento ha la propria guida: misura il recall su un insieme di 30–50 domande reali prima e dopo, anziché accumulare tecniche. Se preferisci un'interfaccia pronta senza scrivere codice, la guida sul RAG senza programmazione presenta Open WebUI e AnythingLLM.
#Domande frequenti sul RAG con Mistral
Quale modello Mistral per un RAG locale?+
Ollama può calcolare gli embedding al posto di sentence-transformers?+
Perché il modello dice che non trova la risposta, anche se è presente nei miei documenti?+
È possibile usare l'API Mistral al posto di Ollama?+
Come aggiungere nuovi documenti senza reindicizzare tutto?+
Serve un GPU per questo RAG?+
- RAG in locale con ChromaDB e Ollama: tutorial Python
- Strategie di chunking
- Ricerca ibrida BM25 + vettoriale
- Aggiungere un reranker alla propria pipeline
- Calcolatore VRAM
- RAG locale con Ollama senza scrivere codice
- Fonte: Ollama, ministral-3
- Fonte: Ollama, mistral-small3.2
- Fonte: Ollama, bge-m3
- Fonte: Chroma, embedding Ollama
- Fonte: FAQ Ollama, finestra di contesto
Un feedback, un errore, una precisazione? Facci sapere, così la guida migliora per tutti.