Intermedio 11 minEmbeddings

Sentence Transformers : gli embedding in locale

Risposta diretta

Sentence Transformers è una libreria Python che carica un modello di embedding da Hugging Face e trasforma testi in vettori con model.encode, su processore o GPU; model.similarity confronta poi questi vettori. Per il francese, scegli un modello multilingue: un modello anglofono come all-MiniLM-L6-v2 valuta male i testi. Mantieni i tuoi passaggi al di sotto della lunghezza massima del modello, perché la parte eccedente viene troncata senza avviso.

Questa guida mostra come installare la libreria, codificare un corpus, scegliere un modello che comprenda il francese, evitare errori silenziosi (limite di lunghezza, prefissi delle query, due modelli mescolati) e accelerare l'indicizzazione sulla tua macchina. Confronta anche Sentence Transformers con l'API di embedding di Ollama, per aiutarti a decidere quale utilizzare.

Di Mohamed Meguedmi·Agg. 2026-09-30·Testato su Windows, macOS e Linux

#Cosa è un embedding e cosa fa la libreria

Un modello di embedding trasforma un testo in una lista di numeri, un vettore, in modo che due testi dal significato simile abbiano vettori vicini. La documentazione di Sentence Transformers descrive questi modelli, detti bi-encoder, come modelli che calcolano una rappresentazione di dimensione fissa per un testo, con un calcolo degli embedding spesso efficiente e un calcolo della similarità molto rapido. È il componente di partenza del RAG: si codifica la domanda, si cercano i passaggi i cui vettori sono più vicini e li si fornisce al modello linguistico. Due conseguenze da ricordare: il modello che codifica i documenti deve essere lo stesso che codifica le domande, e la sua nozione di «vicino» deriva dal suo addestramento. Un modello addestrato soprattutto sull'inglese è un giudice poco affidabile del francese.

Primo esempio della documentazione ufficiale
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
    "The weather is lovely today.",
    "It's so sunny outside!",
    "He drove to the stadium.",
]
embeddings = model.encode(sentences)
print(embeddings.shape)  # [3, 384]
similarities = model.similarity(embeddings, embeddings)

Questo modello genera vettori di 384 dimensioni e funge da esempio di partenza, ma è progettato per l'inglese: per un corpus francese, sostituiscilo come indicato più in basso. La libreria colloca automaticamente il modello sul miglior dispositivo disponibile (cuda, mps o cpu) e puoi forzare la scelta con il parametro device.

#Installare e codificare un corpus francese

Il kit RAG Local

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
  1. 01
    Installare la libreria
    Usa pip install -U sentence-transformers in un ambiente Python. La versione 6.1.0 è stata pubblicata il 18 settembre 2026 e richiede Python 3.10 o successivo, secondo PyPI.
  2. 02
    Scegliere un modello multilingue
    Scegli un modello annunciato come multilingue (vedi la tabella più sotto), non un modello all-*, addestrato per l'inglese.
  3. 03
    Codificare i documenti in blocco
    Passa una lista di testi a encode: la libreria li elabora in batch, sfruttando così l'hardware molto meglio rispetto a una chiamata per ogni testo.
  4. 04
    Codificare la domanda con lo stesso modello
    Usa lo stesso modello e gli stessi prefissi usati per i documenti, poi confronta con similarity.
  5. 05
    Mantenere il nome del modello con l'indice
    Annotalo nei metadati: se cambi modello, dovrai ricodificare tutto il corpus.
Ricerca semantica con un modello multilingue
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("intfloat/multilingual-e5-large")

docs = [
    "Le contrat peut être résilié avec un préavis de trois mois.",
    "La facture est payable à trente jours fin de mois.",
]
question = "Quel est le délai pour mettre fin au contrat ?"

doc_emb = model.encode(docs, prompt="passage: ", normalize_embeddings=True)
q_emb = model.encode(question, prompt="query: ", normalize_embeddings=True)
print(model.similarity(q_emb, doc_emb))

Il prefisso query: per le domande e passage: per i documenti è quello citato nella documentazione di Sentence Transformers per questo modello. Senza di esso, la qualità del recupero peggiora senza alcun messaggio di errore. Il parametro prompt di encode applica il prefisso a ogni testo.

#Scegliere un modello che comprenda il francese

La documentazione propone modelli originali e invita a consultare la classifica MTEB come fonte di ispirazione, con due avvertenze: escludere i modelli troppo grandi per il tuo hardware e sperimentare, perché i modelli ben posizionati in classifica non danno necessariamente buoni risultati sui tuoi compiti. La tabella seguente riporta ciò che la documentazione dice sui modelli citati.

Modelli citati nella documentazione di Sentence Transformers
ModelloCosa dice la documentazionePer il francese
all-MiniLM-L6-v2Circa 5 volte più veloce di all-mpnet-base-v2, buona qualità; 384 dimensioni, massimo 256 tokenNo: orientato all'inglese
all-mpnet-base-v2La migliore qualità della famiglia all-*, modello generalistaNo: orientato all'inglese
multi-qa-mpnet-base-cos-v1Addestrato per la ricerca semantica su 215 milioni di coppie domanda-rispostaNo: orientato all'inglese
paraphrase-multilingual-MiniLM-L12-v2Addestrato su dati paralleli per più di 50 lingueSì, pensato per la similarità tra frasi
paraphrase-multilingual-mpnet-base-v2Stessa famiglia, più di 50 lingueSì, più pesante
distiluse-base-multilingual-cased-v1Supporta 15 lingue tra cui il franceseSì, con un numero limitato di lingue
multilingual-e5-largeRichiede i prefissi query: e passage: (indicati dalla documentazione)Sì, ricerca multilingue
i
La similarità tra frasi e la ricerca documentale non sono lo stesso compito
Un modello addestrato a riconoscere parafrasi non è necessariamente il migliore per trovare un passaggio che risponda a una domanda. Per un RAG, preferisci un modello addestrato per la ricerca. Le nostre guide sugli embedding francesi e su BGE-M3 confrontano i candidati.

#Errori che rovinano un corpus senza messaggio d'errore

Un modello anglofono su testi in francese
Tutto funziona, ma il recupero è comunque distorto. È l'errore più comune.
Passaggi più lunghi del limite del modello
La documentazione specifica che, dei testi più lunghi, vengono mantenuti soltanto i primi max_seq_length token: la parte finale di ogni passaggio lungo diventa invisibile.
Un modello diverso per documenti e domande
I vettori non parlano più della stessa cosa: risultati anomali, generalmente introdotti aggiornando solo una parte della catena.
Prefissi dimenticati
Alcuni modelli richiedono un prefisso diverso per le domande e i documenti; l'omissione degrada la ricerca.
Vettori non normalizzati con un punteggio inadeguato
Se il modello richiede una similarità coseno, normalizza i vettori o usa la misura corrispondente, altrimenti il ranking si degrada.

#Misurare la vicinanza: normalizzazione e coseno

Due vettori vengono confrontati mediante una misura di similarità, il più delle volte il coseno. La documentazione di Ollama indica che il suo endpoint restituisce vettori normalizzati e consiglia il coseno per la maggior parte delle ricerche semantiche. Con vettori normalizzati, coseno e prodotto scalare danno lo stesso ordinamento, il che consente di utilizzare un indice ottimizzato per il prodotto scalare. L'aspetto da controllare è la coerenza: la misura del database vettoriale deve corrispondere a quella prevista dal modello ed è indicata nella scheda del modello.

Quanto alla lunghezza, la documentazione dà un ordine di grandezza: 512 token per molti modelli di tipo BERT, pari a 300–400 parole in inglese, e 256 token per all-MiniLM-L6-v2. Il francese consuma più token per parola: suddividi i tuoi passaggi mantenendoli al di sotto del limite con un margine, e verifica model.max_seq_length. Puoi ridurlo, ma non aumentarlo oltre quanto il modello supporta. La documentazione aggiunge che un modello addestrato su testi brevi rappresenta meno bene i testi lunghi.

#Indicizzare rapidamente sulla propria macchina

Processore o GPU
Il modello viene eseguito sul miglior dispositivo disponibile. Una GPU accelera l'indicizzazione in massa e fa poca differenza per una singola query.
Precisione ridotta
Su GPU, il passaggio a float16 o bfloat16 accelera l'inferenza con una perdita minima di precisione, secondo la documentazione.
Backend ONNX e OpenVINO
La documentazione indica possibili accelerazioni fino a 2–3 volte, a seconda dell'hardware e del backend; verificale sulla tua macchina.
Più GPU o processi
encode accetta una lista di dispositivi: utile per corpus di grandi dimensioni, meno per quelli piccoli a causa del costo di avvio.
Vettori più compatti
La quantizzazione binaria o a numeri interi dei vettori e i modelli con dimensioni troncabili riducono lo spazio di archiviazione e il costo della ricerca.
Cache e indicizzazione
Non ricodificare i documenti invariati: la chiave della cache si basa sul contenuto, non sul nome del file. Su una macchina che serve anche un modello linguistico, esegui l'indicizzazione quando nessuno lo sta usando.

#Quanto pesa un indice di vettori

La dimensione di un indice si calcola moltiplicando il numero di vettori per la loro dimensione e per quattro byte se i numeri sono in float32. Un vettore di 384 dimensioni occupa 1.536 byte: un milione di passaggi rappresenta circa 1,5 GB. A 1.024 dimensioni, lo stesso milione occupa circa 4 GB. Questi valori escludono i metadati e le strutture di indicizzazione del database vettoriale. La scelta del modello ha quindi un'incidenza diretta sulla memoria RAM necessaria alla ricerca, e la quantizzazione dei vettori menzionata in precedenza può ridurre questa occupazione di memoria.

#Sentence Transformers o l'API di embedding di Ollama

Ollama offre anche degli embedding: la documentazione indica che il comando ollama run peut genera vettori e che l'endpoint api/embed restituisce vettori normalizzati in L2. Consiglia i modelli embeddinggemma, qwen3-embedding e all-minilm, con vettori tipicamente di 384 a 1.024 dimensioni, e ricorda due regole: coseno per la maggior parte delle ricerche, e modello identico per l'indexazione e la query.

Quale strumento per i tuoi embedding?
CriterioSentence TransformersAPI di embedding di Ollama
InstallazioneLibreria Python da installareGià presente se utilizzi Ollama
Scelta dei modelliTutti i modelli compatibili di Hugging FaceModelli della libreria Ollama
Controllo dei prefissi e della lunghezzaDettagliato: prompt, max_seq_length, prompt con nomeA seconda del modello e dell'invocazione
Addestramento o affinamentoSì, la libreria lo gestisceNo
Uso tipicoIndicizzazione in massa, esperimenti, rerankingIntegrazione semplice in una pipeline già basata su Ollama

#L'embedding è solo un primo filtro

La documentazione di Sentence Transformers descrive il bi-encoder come la prima fase di una ricerca in due fasi, in cui un cross-encoder, o reranker, riordina i migliori risultati. Il cross-encoder legge insieme la domanda e ciascun passaggio: è più lento, ma più preciso su un numero limitato di candidati. Recuperare una ventina di passaggi in base alla similarità, poi riordinarli per conservarne solo alcuni, è uno dei miglioramenti meno costosi di una pipeline RAG. La guida dedicata al reranker ne illustra nel dettaglio l’implementazione; misura il beneficio sulle tue venti domande prima di mantenerlo, perché aggiunge latenza a ogni richiesta, un secondo modello da mantenere e un consumo di memoria aggiuntivo.

Una buona abitudine, prima ancora di confrontare i modelli, è esaminare ciò che contiene il tuo corpus: frasi brevi e autonome o lunghi paragrafi tecnici? Domande formulate come parole chiave o frasi intere? La risposta orienta la scelta del limite di lunghezza, della segmentazione e del modello. Un corpus giuridico denso non richiede le stesse impostazioni di una raccolta di domande e risposte brevi, e nessuna classifica pubblica può saperlo al posto tuo.

#Valuta la scelta del modello prima di indicizzare

  1. 01
    Scrivere venti domande reali
    Scegli domande che i tuoi utenti porranno, formulate con le loro parole, non con quelle del documento.
  2. 02
    Annotare il passaggio atteso
    Per ogni domanda, identifica il passaggio o i passaggi che contengono la risposta.
  3. 03
    Confrontare due o tre modelli
    Codifica lo stesso corpus con ogni modello e osserva se il passaggio corretto appare tra i primi cinque risultati.
  4. 04
    Rieseguire a ogni modifica
    Modello, suddivisione o prefisso modificati: esegui di nuovo questo breve test prima di reindicizzare.

#FAQ

FAQ
Serve una GPU per Sentence Transformers?+
No. I modelli di embedding sono abbastanza piccoli da essere eseguiti sul processore e la libreria sceglie automaticamente il miglior dispositivo disponibile. Una GPU serve soprattutto a indicizzare più velocemente un corpus di grandi dimensioni; per codificare una sola domanda, la differenza è piccola nella maggior parte dei casi.
Quale modello Sentence Transformers scegliere per il francese?+
Scegli un modello multilingue: la documentazione cita paraphrase-multilingual-MiniLM-L12-v2 per più di 50 lingue e multilingual-e5-large con i prefissi query: e passage:. Prova due o tre candidati sulle tue domande anziché affidarti soltanto alla classifica MTEB, la cui documentazione ricorda che non predice i risultati che otterrai.
È possibile usare il modello di conversazione per l'encoding?+
No. Un modello di embedding è addestrato a collocare vicini tra loro i testi dal significato simile; un modello di conversazione non lo è, e il recupero delle informazioni diventa mediocre anche se il codice sembra funzionare senza errori. Usa un modello di embedding dedicato, distinto dal modello che scrive le risposte.
Che succede se cambio il modello di embedding?+
È necessario ricodificare tutto il corpus, perché i vettori di due modelli non sono comparabili: le loro dimensioni e coordinate differiscono. Annota il nome del modello insieme all'indice e prevedi il tempo di calcolo necessario per ricostruire il database vettoriale prima di effettuare il passaggio, mantenendo attivo l'indice precedente durante l'operazione.
Che succede se il mio testo supera la lunghezza massima?+
Il testo viene troncato ai primi max_seq_length token, senza errori: la parte finale del passaggio viene ignorata dalla ricerca. Con all-MiniLM-L6-v2, il limite è di 256 token. Suddividi i tuoi testi in passaggi più brevi del limite del modello, lasciando un margine.
Sentence Transformers o Ollama per gli embedding?+
Sentence Transformers offre un controllo maggiore (prefissi, lunghezza, modelli di Hugging Face, addestramento). L'API di Ollama è più semplice se la tua pipeline si basa già su Ollama. In entrambi i casi, usa lo stesso modello per l'indicizzazione e l'interrogazione, con la misura di similarità consigliata per quel modello.

#Per approfondire

Questa guida ti è stata utile?

Un feedback, un errore, una precisazione? Facci sapere, così la guida migliora per tutti.