Embedding Multilingue in Locale: EmbeddingGemma e i Modelli Piccoli che Girano sul Tuo PC
Cosa Sono gli Embedding
Un embedding è una rappresentazione numerica del significato di un testo. Un modello di embedding prende in ingresso una frase, un paragrafo o un documento e restituisce un vettore, cioè una lista di numeri (tipicamente qualche centinaio). La proprietà fondamentale è che testi con significato simile producono vettori vicini.
Le frasi "come faccio un reso?" e "procedura per restituire un articolo" non hanno quasi parole in comune, ma i loro embedding saranno molto vicini. È questa proprietà a rendere possibile la ricerca semantica e, di conseguenza, i sistemi RAG: si confronta il vettore della domanda con i vettori dei documenti e si recuperano i più simili.
Perché Generarli in Locale
Molti servizi offrono embedding tramite API: si invia un testo, si riceve un vettore. È comodo, ma ci sono buone ragioni per farlo in locale.
- Privacy: i documenti non lasciano mai la propria macchina o la propria rete. Per procedure interne, contratti o dati di clienti è spesso un requisito.
- Costi: indicizzare un archivio di documenti significa generare migliaia o milioni di embedding. In locale il costo marginale è zero.
- Indipendenza: nessun limite di richieste, nessun cambio di prezzo o di modello deciso da altri. E un vincolo spesso dimenticato: se il fornitore dismette il modello, tutti i vettori salvati vanno rigenerati.
- Latenza: per volumi moderati, un modello piccolo in locale risponde in pochi millisecondi senza passare dalla rete.
Fino a poco tempo fa il compromesso era la qualità: i modelli piccoli funzionavano bene in inglese e male nelle altre lingue. Oggi non è più così.
EmbeddingGemma
EmbeddingGemma è un modello di embedding di Google della famiglia Gemma, con circa 300 milioni di parametri. È stato progettato esplicitamente per funzionare on-device, cioè su laptop, desktop e perfino dispositivi mobili, ed è addestrato su oltre cento lingue, italiano compreso.
Alcune caratteristiche lo rendono particolarmente adatto a progetti personali e aziendali di piccola scala:
- Dimensioni contenute: occupa poca memoria e gira in modo accettabile anche su CPU.
- Vettori a 768 dimensioni, riducibili a dimensioni più piccole (ad esempio 512, 256 o 128) grazie alla tecnica Matryoshka: i primi valori del vettore contengono già la maggior parte dell'informazione, quindi si può troncare per risparmiare spazio con una perdita di qualità limitata.
- Prompt per compito: il modello rende meglio quando si indica se il testo è una domanda o un documento, perché le due cose vanno rappresentate in modo leggermente diverso.
Usarlo con Python
Il modo più semplice è la libreria sentence-transformers:
from sentence_transformers import SentenceTransformer
modello = SentenceTransformer("google/embeddinggemma-300m")
documenti = [
"Per registrare un reso da un altro negozio, aprire la sezione Resi e selezionare il punto vendita di origine.",
"Gli inventari di fine stagione si svolgono la prima settimana di febbraio e di agosto.",
"Il cambio taglia è gratuito entro 30 giorni dall'acquisto con scontrino.",
]
domanda = "Come faccio a restituire un capo comprato in un altro negozio?"
emb_documenti = modello.encode_document(documenti)
emb_domanda = modello.encode_query(domanda)
similarita = modello.similarity(emb_domanda, emb_documenti)
print(similarita)
Il primo documento otterrà il punteggio più alto, anche se la domanda non usa le parole "registrare" o "sezione Resi". Questa è la ricerca semantica in poche righe.
Per salvare spazio si può troncare la dimensione dei vettori già al caricamento:
modello = SentenceTransformer("google/embeddinggemma-300m", truncate_dim=256)
L'accesso al modello su Hugging Face richiede di accettarne la licenza d'uso una tantum.
Le Alternative
EmbeddingGemma non è l'unica opzione. Altri modelli piccoli e multilingue molto usati sono:
- la famiglia multilingual-e5 (small, base, large), solida e ampiamente testata;
- BGE-M3, più grande, che produce sia vettori densi sia sparsi ed è ottimo per la ricerca ibrida;
- nomic-embed-text e i modelli disponibili direttamente in Ollama, comodi se si usa già Ollama per gli LLM locali.
La scelta giusta dipende dai propri documenti: il consiglio è preparare un piccolo set di domande reali con le risposte attese e confrontare due o tre modelli. Mezz'ora di test vale più di qualsiasi classifica generica.
Consigli Pratici
Il chunking conta quanto il modello
Gli embedding funzionano meglio su porzioni di testo coerenti: un paragrafo, una sezione, una procedura. Dividere i documenti in blocchi di qualche centinaio di parole, con una leggera sovrapposizione tra blocchi consecutivi, è un buon punto di partenza. Blocchi troppo lunghi diluiscono il significato; troppo corti perdono il contesto.
Non mescolare modelli
Vettori prodotti da modelli diversi non sono confrontabili. Se si cambia modello, bisogna rigenerare tutti gli embedding. Conviene salvare, insieme a ogni vettore, il nome e la versione del modello usato.
Normalizzare il testo
Rimuovere intestazioni ripetute, piè di pagina, numeri di pagina e spazi superflui prima di generare gli embedding migliora la qualità dei risultati in modo sorprendente.
Salvare i vettori in un database adatto
Una volta generati, gli embedding vanno salvati in un database che permetta la ricerca per similarità, come Qdrant o pgvector. Un'architettura interessante è esporre salvataggio e ricerca tramite un server MCP: qualsiasi assistente AI compatibile può allora memorizzare e recuperare informazioni, mentre gli embedding vengono generati localmente senza inviare i testi a servizi esterni.
Conclusioni
I modelli di embedding piccoli e multilingue hanno reso la ricerca semantica accessibile a chiunque abbia un computer. EmbeddingGemma, con i suoi 300 milioni di parametri, il supporto all'italiano e la possibilità di ridurre la dimensione dei vettori, è un'ottima base per costruire sistemi RAG privati, economici e indipendenti. Il passo successivo è collegarli a un buon database vettoriale e, soprattutto, curare la qualità dei documenti che si indicizzano.