Embedding e database vettoriali spiegati in modo semplice
Cosa sono gli embedding e i database vettoriali, senza formule matematiche. Mettiamo alla prova bge-m3 e nomic-embed-text su testi complessi: 8 su 10 contro 4 su 10.
👁 115 letture
Un embedding è la trasformazione di un testo in un elenco di numeri (un vettore), in cui testi con significato simile ricevono numeri simili. Un database vettoriale memorizza questi vettori e trova rapidamente quelli più vicini alla tua richiesta. Su questo principio si basano la ricerca semantica, i sistemi RAG e la memoria degli agenti AI. Qui sotto ti spiego come funziona senza matematica e ti mostro un test tra due modelli di embedding gratuiti su frasi e leggi: uno ha individuato l’articolo corretto in 8 casi su 10, l’altro soltanto in 4. Questo testo fa parte del percorso Agenti AI da zero.
Situazione al 4 ottobre 2026
- Ho testato due modelli eseguiti in locale con Ollama 0.35.1 su una scheda RTX 4090:
bge-m3(licenza MIT) enomic-embed-text(Apache 2.0). Entrambi possono essere usati anche a scopi commerciali. - Il test: 5 frasi da confrontare tra loro e 10 domande poste su 920 frammenti normativi (abbiamo condotto il test su testi di legge polacchi).
- Costo: 0 EUR, tutto elaborato in locale sul mio computer.
- Il codice del test si trova nel pacchetto archivio iniziale agenti (
04_rag.py).
Embedding: una spiegazione semplice
Immagina una mappa in cui ogni frase rappresenta un punto preciso. Le frasi sulla cauzione d’affitto si trovano vicine tra loro, quelle sulle ferie poco più distanti, mentre le frasi sulle previsioni del tempo finiscono dall’altra parte della mappa. L’embedding è l’insieme delle coordinate di una frase su questa mappa. L’unica differenza è che la mappa non ha solo due dimensioni, ma diverse centinaia o più di mille.
Ecco come appare l’inizio dell’embedding generato dal modello bge-m3 per la frase tradotta “A quanto ammonta la cauzione per l’affitto di un appartamento?” (testata originariamente in polacco come “Ile wynosi kaucja za wynajem mieszkania?”):
[-0.0375, 0.0463, -0.0196, -0.0042, 0.0015, ... ] (in totale 1024 numeri)
I singoli numeri presi da soli non significano nulla. Ciò che conta è la distanza geometrica tra i vettori. Di solito la si calcola tramite la similarità cosinusale: un valore pari a 1 indica una direzione identica (lo stesso significato), mentre valori vicini allo 0 indicano l’assenza di qualsiasi legame semantico.
Test su cinque frasi
Ho confrontato la frase originale di riferimento “Ile wynosi kaucja za wynajem mieszkania?” (“A quanto ammonta la cauzione per l’affitto di un appartamento?”) con altre quattro frasi. Un modello valido dovrebbe considerare più vicina la frase con lo stesso significato, anche quando usa parole diverse o una lingua differente.
| Frase confrontata (con traduzione dal test polacco) | bge-m3 | nomic-embed-text |
|---|---|---|
| How much is the rental deposit for a flat? (stesso senso, in inglese) | 0,736 | 0,416 |
| Jaki depozyt wplaca najemca lokalu? [trad. Che deposito versa l’inquilino dell’immobile?] (stesso senso, parole diverse) | 0,678 | 0,665 |
| Kaucja za butelki zwrotne w sklepie [trad. Cauzione per le bottiglie a rendere in negozio] (stessa parola, senso diverso) | 0,569 | 0,713 |
| Ile dni urlopu wypoczynkowego mam w roku? [trad. Quanti giorni di ferie retribuite ho all’anno?] (argomento del tutto diverso) | 0,442 | 0,755 |
Il modello bge-m3 ha ordinato le frasi esattamente come farebbe un essere umano: prima la traduzione, poi la parafrasi, a seguire il deposito per le bottiglie e infine, alla distanza maggiore, la domanda sulle ferie. Al contrario, nomic-embed-text ha ritenuto la domanda sulle ferie la più simile a quella sulla cauzione, mentre ha collocato la traduzione inglese all’ultimo posto. Trattandosi di un modello addestrato principalmente sull’inglese, con lingue diverse tende a catturare la struttura sintattica superficiale (“Quanto ammonta… / Quanti giorni…”) più che il senso reale.
Test su testi normativi complessi
Nella guida RAG passo dopo passo ho creato un motore di ricerca basato su 920 frammenti di testi legislativi (abbiamo testato il sistema in polacco su Codice del lavoro, legge sulla tutela degli inquilini e diritti del paziente). Ho posto 10 domande in linguaggio comune e ho verificato in quale posizione dei risultati compariva l’articolo corretto.
| Caratteristica | bge-m3 | nomic-embed-text |
|---|---|---|
| Articolo corretto al 1° posto | 5 su 10 | 2 su 10 |
| Articolo corretto tra i primi cinque | 8 su 10 | 4 su 10 |
| Dimensioni del vettore | 1024 | 768 |
| Lunghezza massima del testo (finestra di contesto in Ollama) | 8192 token | 2048 token |
| Memoria VRAM occupata dopo il caricamento | 664 MB | 323 MB |
| Dimensione dell’indice per 920 frammenti | 8,5 MB | 7,5 MB |
| Tempo di indicizzazione di 920 frammenti* | 155 s | 105 s |
| Scarto nei punteggi (domanda fuori contesto vs risposta pertinente) | 0,43 vs 0,64-0,72 | 0,69 vs 0,69-0,77 |
| Licenza | MIT | Apache 2.0 |
* Durante la misurazione la scheda video era impegnata in un’altra attività, quindi considera i tempi come indicativi. Con la GPU totalmente libera entrambi i modelli risultano più veloci.
L’ultima riga della tabella è importante quanto la precisione. Con bge-m3, una domanda sui limiti di velocità in autostrada (tema del tutto assente nei documenti analizzati) ha ottenuto una similarità massima di 0,43, nettamente inferiore rispetto ai frammenti pertinenti. Questo consente di impostare una soglia minima e rispondere “non lo so” senza nemmeno interpellare il modello di generazione. Con nomic-embed-text quasi ogni valore si aggira attorno a 0,7, rendendo impossibile fissare una soglia affidabile.
Che cos’è un database vettoriale
Un database vettoriale è un archivio in cui conservi gli embedding insieme al testo originale e ai metadati (nome del file, numero di articolo, data) e che è ottimizzato per trovare rapidamente i vettori più vicini. Quando gestisci collezioni ridotte è sufficiente un array numpy: i miei 920 vettori occupano 8,5 MB e interrogarli richiede una sola moltiplicazione tra matrici. Ti serve invece un vero database vettoriale quando:
- hai centinaia di migliaia di frammenti e il calcolo manuale diventa troppo lento;
- vuoi filtrare le risposte in base ai metadati (ad esempio: “solo Codice del lavoro”, “solo documenti del 2026”);
- aggiungi documenti di continuo e vuoi evitare di ricalcolare l’intero indice da zero;
- il motore di ricerca deve servire molte richieste in contemporanea.
| Soluzione | Ambiente di esecuzione | A chi è adatta |
|---|---|---|
| numpy (file .npz) | nel tuo script locale | studio, test, fino a qualche decina di migliaia di frammenti |
| Chroma | in locale, file su disco o server dedicato | primi progetti, prototipi |
| pgvector (PostgreSQL) | nella tua istanza PostgreSQL esistente | usi già PostgreSQL e cerchi un unico archivio per tutti i dati |
| Qdrant, Weaviate, Milvus | server proprietario o infrastruttura cloud | dataset ampi, carichi di produzione con molti utenti |
Nei miei test ho verificato che Chroma 1.5.9 restituisce esattamente gli stessi risultati di numpy a parità di dati. Il database vettoriale non migliora la precisione semantica: rende l’architettura più comoda e scalabile. L’accuratezza dipende esclusivamente dalla qualità del modello di embedding e dal criterio con cui suddividi il testo (chunking).
Come scegliere un modello di embedding
- Punta su un modello multilingue solido se lavori con lingue diverse dall’inglese. Tra quelli gratuiti ed eseguibili in locale,
bge-m3ha mostrato ottime capacità di comprensione. - Crea un piccolo dataset di verifica: 10-20 domande reali di cui conosci con certezza il frammento corrispondente. Senza questo banco di prova, scegliere un modello significa procedere alla cieca.
- Misura la frequenza con cui il frammento corretto compare tra i primi cinque risultati (top-5), poiché è questo il quantitativo solitamente passato al prompt di un sistema RAG.
- Esamina la dispersione dei punteggi per le domande fuori contesto. Una separazione netta permette di definire una soglia per dire “non so rispondere”.
- Presta attenzione ai prefissi:
nomic-embed-textrichiede l’aggiunta disearch_query:prima della domanda e disearch_document:prima del documento. Senza queste etichette i risultati peggiorano ulteriormente.
I modelli di embedding sono accessibili anche tramite API cloud (OpenAI, Google, Mistral, Cohere). In questo caso paghi in base al consumo di token e invii i tuoi documenti ai server del provider. Per capire come calcolare il volume di elaborazione e i costi, leggi l’approfondimento sui token.
Dove usare gli embedding oltre ai sistemi RAG
- Motori di ricerca per e-commerce o basi di conoscenza, capaci di collegare “scarpe per la pioggia” a “calzature impermeabili”.
- Rilevamento di duplicati tra ticket di supporto, discussioni della community o articoli del catalogo.
- Raggruppamento (clustering) automatico dei feedback dei clienti per area tematica, senza ricorrere a tag manuali.
- Memoria per agenti autonomi: l’agente registra decisioni e considerazioni come vettori e richiama contesti analoghi quando affronta un nuovo compito. Trovi diversi scenari operativi in Agente AI: 12 esempi pratici.
Domande frequenti
Che cos’è un embedding in una sola frase?
È un elenco ordinato di numeri che rappresenta il significato di un testo, permettendo al computer di confrontare i contenuti in base al senso e non alle singole parole.
Che differenza c’è tra un embedding e un token?
Un token è una porzione di testo (spesso una parte di parola) in cui il modello scompone la frase. L’embedding è il vettore finale che sintetizza il significato dell’intero frammento. Il modello di embedding analizza prima i singoli token e poi li converte in un unico vettore numerico.
È obbligatorio calcolare gli embedding su una scheda grafica dedicata?
No, i modelli più leggeri funzionano anche su CPU, anche se l’elaborazione sarà più lenta. Durante i test bge-m3 occupava appena 664 MB di memoria video, risultando compatibile con quasi tutte le schede grafiche recenti.
Posso combinare embedding generati da modelli diversi?
No. Ogni modello costruisce un proprio spazio semantico. La domanda deve essere trasformata in coordinate numeriche dallo stesso identico modello impiegato per i documenti. Se decidi di cambiare modello dovrai ricalcolare l’intero indice vettoriale.
Meglio un database vettoriale o un database tradizionale?
Un database convenzionale cerca corrispondenze esatte su valori e stringhe, mentre quello vettoriale lavora sulla vicinanza concettuale. Spesso la strategia più efficace consiste nell’unire i due approcci (ricerca ibrida): le parole chiave intercettano codici identificativi e nomi propri, mentre i vettori recuperano sinonimi e perifrasi.
Quanto costa generare embedding?
In locale il costo è limitato al consumo elettrico del computer. Tramite API commerciale rappresentano una delle chiamate più economiche nel panorama dell’intelligenza artificiale, nell’ordine di frazioni di dollaro per milione di token. Controlla sempre i listini aggiornati del singolo fornitore.
Google · Le tue fontiPiù in alto su Google con un solo clicAggiungi alle fonti preferite →Fonti e data della verifica
- bge-m3 e nomic-embed-text nella libreria di Ollama (dati verificati il 4 ottobre 2026).
- Documentazione ufficiale di Chroma.
- Rilevazioni: workstation locale (RTX 4090, Windows 11, Ollama 0.35.1), 4 ottobre 2026, fascia oraria 14:30-15:00.


