~/ / Articoli sull'IA / LLM locali su un VPS / Embedding con Ollama: le basi per ricerca e RAG
Embedding con Ollama: le basi per ricerca e RAG
Una ricerca che trova i passaggi in base al significato e il RAG, in cui un modello di chat risponde a partire dai tuoi documenti, cominciano entrambi con gli embedding. Ollama può crearli sullo stesso server che esegue il tuo modello di chat. Questo articolo tratta la richiesta, i modelli che la libreria di Ollama elenca, le impostazioni che cambiano il risultato e il modo di confrontare i vettori, usando solo ciò che dicono la documentazione e le pagine della libreria di Ollama. Due strumenti in questa pagina ti permettono di provare i passaggi nel browser.
Pubblicato: · 5 min di lettura · Fatti verificati sulla documentazione e sulle pagine della libreria di Ollama il 2026-11-04. Modelli e campi cambiano, quindi controlla le pagine attuali prima di farvi affidamento.
Che cos'è un embedding
La pagina degli embedding di Ollama dice che gli embedding trasformano il testo in vettori numerici che si possono salvare in un database vettoriale, cercare con la similarità del coseno o usare in pipeline di RAG. La lunghezza del vettore dipende dal modello; la pagina indica tipicamente da 384 a 1024 dimensioni.
Una ricerca crea l'embedding della domanda con lo stesso modello e cerca i vettori salvati che le somigliano di più.
Creare embedding con /api/embed
L'endpoint è POST /api/embed. La richiesta richiede model e input, e input può essere una singola stringa oppure un array di stringhe. Con un array, la risposta contiene un vettore per ogni stringa nel campo embeddings, nello stesso ordine, quindi un gruppo di passaggi richiede una sola richiesta.
La documentazione mostra anche la riga di comando: ollama run embeddinggemma "Hello world" stampa il vettore come array JSON, e il testo si può passare con una pipe usando echo.
| Campo | Che cosa dice il riferimento dell'API |
|---|---|
| model | Obbligatorio. Il nome del modello. |
| input | Obbligatorio. Un testo o un array di testi. |
| truncate | Predefinito true: gli input che superano la finestra di contesto vengono troncati. Se false, viene restituito un errore. |
| dimensions | Il numero di dimensioni per cui generare gli embedding. |
| keep_alive | Per quanto tempo il modello resta caricato. |
| options | Opzioni di esecuzione, come num_ctx per la lunghezza del contesto. |
Ollama ha anche un endpoint compatibile con OpenAI, /v1/embeddings. La sua documentazione elenca come supportati model, input come stringa o array di stringhe, encoding format e dimensions, e come non supportati gli array di token e user.
I modelli di embedding nella libreria di Ollama
La libreria di Ollama ha una categoria dedicata agli embedding. La tabella mostra sei dei modelli elencati, con la dimensione e la finestra di contesto che la pagina dei tag di ciascun modello indica per il tag latest. Quattro dei sei sono sotto 1GB.
| Modello | Dimensione del tag latest | Finestra di contesto |
|---|---|---|
| all-minilm | 46MB | 512 |
| nomic-embed-text | 274MB | 2K |
| embeddinggemma | 622MB | 2K |
| mxbai-embed-large | 670MB | 512 |
| bge-m3 | 1.2GB | 8K |
| qwen3-embedding | 4.7GB | 40K |
Altri tag cambiano la dimensione: per esempio, la libreria elenca qwen3-embedding:0.6b con 639MB e una finestra di contesto di 32K, ed embeddinggemma:300m-qat-q4_0 con 239MB. Non abbiamo confrontato la qualità di questi modelli; le pagine della libreria non li classificano. Provando all-minilm su Ollama 0.40.11, ollama show indicava una lunghezza del contesto di 512 e un parametro num_ctx di 256, e un input lungo è stato tagliato a 256 token. Controlla ollama show per il modello che usi.
Un input lungo viene tagliato senza alcun errore
La finestra di contesto si conta in token. Poiché truncate è true per impostazione predefinita, un testo più lungo della finestra di contesto del modello viene accorciato e restituisce comunque un vettore, senza alcun errore. Un documento lungo inviato come un unico input può perdere così la sua parte finale.
Due cose aiutano. Dividere i documenti lunghi in pezzi (chunk) più piccoli e creare l'embedding di ciascuno, il che permette anche a una ricerca di restituire la parte che risponde alla domanda. E inviare truncate con il valore false, in modo che Ollama restituisca un errore invece di accorciare un pezzo ancora troppo lungo.
Lo strumento qui sotto divide il testo in corrispondenza di paragrafi, righe, frasi e spazi, con una sovrapposizione (overlap), e costruisce un'unica richiesta /api/embed per tutti i pezzi. Conta i caratteri, non i token, perché ogni modello ha un proprio tokenizer, quindi lascia un margine sotto la finestra di contesto.
Provalo: RAG Text Chunker
Le lunghezze sono in caratteri. La finestra di contesto del modello è in token, e quanti token usa un testo dipende dal modello, quindi lascia un margine.
Comando curl
Eseguilo su una macchina che raggiunge Ollama. La risposta ha un vettore per pezzo, in quest'ordine.
curl http://localhost:11434/api/embed -d '{
"model": "embeddinggemma",
"input": [
"Embeddings turn text into numeric vectors. You can store them in a vector database and search them with cosine similarity, or use them in a RAG pipeline.\n\nThe length of each vector depends on the embedding model. Use the same model when you index your documents and when you embed a question.\n\n",
"Ollama'\''s /api/embed endpoint takes a single string or an array of strings. By default, input that is longer than the model'\''s context window is truncated. Set truncate to false to get an error instead.\n\n",
"Split long documents into smaller chunks before you embed them, so that each chunk fits in the context window and a search can return the part that answers the question."
],
"truncate": false
}'Pezzi
3 pezzi. Il più lungo ha 294 caratteri.
#0 · 294 caratteri · inizia alla posizione 0
Embeddings turn text into numeric vectors. You can store them in a vector database and search them with cosine similarity, or use them in a RAG pipeline. The length of each vector depends on the embedding model. Use the same model when you index your documents and when you embed a question.
#1 · 202 caratteri · inizia alla posizione 294
Ollama's /api/embed endpoint takes a single string or an array of strings. By default, input that is longer than the model's context window is truncated. Set truncate to false to get an error instead.
#2 · 169 caratteri · inizia alla posizione 496
Split long documents into smaller chunks before you embed them, so that each chunk fits in the context window and a search can return the part that answers the question.
Corpo JSON per /api/embed
{
"model": "embeddinggemma",
"input": [
"Embeddings turn text into numeric vectors. You can store them in a vector database and search them with cosine similarity, or use them in a RAG pipeline.\n\nThe length of each vector depends on the embedding model. Use the same model when you index your documents and when you embed a question.\n\n",
"Ollama's /api/embed endpoint takes a single string or an array of strings. By default, input that is longer than the model's context window is truncated. Set truncate to false to get an error instead.\n\n",
"Split long documents into smaller chunks before you embed them, so that each chunk fits in the context window and a search can return the part that answers the question."
],
"truncate": false
}Campi della richiesta come indicati nel riferimento dell'API di Ollama per /api/embed, verificati il 2026-11-04. Ollama API: Generate embeddings
Tutto avviene nel tuo browser. Lo strumento si limita a scrivere il comando e non invia nulla.
Usa un solo modello per indicizzare e per cercare
La pagina degli embedding dice di usare lo stesso modello di embedding sia per l'indicizzazione sia per l'interrogazione. La lunghezza del vettore dipende dal modello, quindi i vettori di due modelli diversi possono non avere nemmeno lo stesso numero di dimensioni.
Lo stesso vale per dimensions: se lo imposti quando indicizzi i documenti, imposta lo stesso valore quando crei gli embedding delle domande. Se cambi il modello o questa impostazione, ricrea gli embedding dei documenti salvati.
Confrontare i vettori
La documentazione raccomanda la similarità del coseno per la maggior parte dei casi di ricerca semantica e dice che /api/embed restituisce vettori normalizzati L2, di lunghezza unitaria. Per vettori di lunghezza unitaria, la similarità del coseno e il prodotto scalare sono lo stesso numero, quindi un database vettoriale impostato su uno dei due ordinerà i risultati allo stesso modo.
Per provare un modello sui tuoi testi prima di costruire qualsiasi cosa, crea in un'unica richiesta l'embedding di una domanda e di alcuni passaggi, con la domanda per prima. Incolla la risposta qui sotto: i passaggi vengono ordinati per similarità del coseno con la domanda, e lo strumento mostra se tutti i vettori hanno lunghezza unitaria e le stesse dimensioni.
Provalo: Embedding Similarity Calculator
L'esempio usa vettori inventati, di lunghezza unitaria e con 4 dimensioni, così si possono leggere. Gli embedding reali hanno centinaia o migliaia di dimensioni.
Letto come una risposta di Ollama /api/embed: 4 vettori con 4 dimensioni. Tutti i vettori hanno lunghezza 1, quindi la similarità del coseno e il prodotto scalare sono uguali.
Classifica per similarità del coseno
Confrontato con #0 How do I keep a model loaded in Ollama?. Più alto è, più è simile.
| Posizione | Testo | Coseno | Prodotto scalare | Distanza |
|---|---|---|---|---|
| 1 | #1 keep_alive controls how long the model stays in memory | 0.9962 | 0.9962 | 0.0876 |
| 2 | #2 Protect Ollama with nginx and a password | 0.4037 | 0.4037 | 1.0921 |
| 3 | #3 Tomorrow's weather forecast | 0.0100 | 0.0100 | 1.4071 |
Matrice di similarità del coseno
Ogni cella confronta il vettore della riga con il vettore della colonna.
| #0 | #1 | #2 | #3 | |
|---|---|---|---|---|
| #0 | 1.000 | 0.996 | 0.404 | 0.010 |
| #1 | 0.996 | 1.000 | 0.475 | -0.005 |
| #2 | 0.404 | 0.475 | 1.000 | -0.377 |
| #3 | 0.010 | -0.005 | -0.377 | 1.000 |
Vettori
| Testo | Dimensioni | Lunghezza (norma L2) | Lunghezza unitaria |
|---|---|---|---|
| #0 How do I keep a model loaded in Ollama? | 4 | 1.000000 | Sì |
| #1 keep_alive controls how long the model stays in memory | 4 | 1.000000 | Sì |
| #2 Protect Ollama with nginx and a password | 4 | 1.000001 | Sì |
| #3 Tomorrow's weather forecast | 4 | 1.000000 | Sì |
Basato sulla documentazione degli embedding e sul riferimento dell'API di Ollama, verificati il 2026-11-04. Ollama: Embeddings / Ollama API: Generate embeddings
Tutto viene calcolato nel tuo browser. Non viene inviato nulla da nessuna parte.
La memoria su un piccolo server
Un modello di embedding viene caricato come qualsiasi altro modello. Le FAQ di Ollama dicono che OLLAMA_MAX_LOADED_MODELS, il numero di modelli che possono essere caricati contemporaneamente se stanno in memoria, ha come valore predefinito 3 volte il numero di GPU, oppure 3 per l'inferenza su CPU. Quindi un modello di chat e un modello di embedding possono restare caricati insieme quando la memoria lo consente.
Il nostro articolo su come tenere d'occhio la memoria di Ollama spiega ollama ps, keep_alive e le altre impostazioni che decidono che cosa resta in memoria.
Fonti
Leggi anche
- Salvare e cercare gli embedding di Ollama in PostgreSQL con pgvectorConserva gli embedding di Ollama in PostgreSQL con pgvector, cercali con HNSW o IVFFlat e passa i risultati a /api/chat perché la risposta citi le sue fonti.
- Tenere d'occhio la memoria di Ollama su una piccola VPSScopri cosa Ollama tiene in memoria, per quanto tempo e quali impostazioni lo cambiano: ollama ps, keep_alive e i limiti, dalle FAQ ufficiali.
- Collegare Dify a Ollama sul proprio VPSEsegui Dify sul tuo VPS e usa Ollama come modello: installazione, campi del plugin, il problema dell'indirizzo in Docker e gli embedding, dalla documentazione ufficiale.
- Avviare un LLM locale senza un PC costoso: guida per principianti all'uso di una VPSNon hai un PC potente? Affitta una VPS ed esegui un piccolo LLM locale dal browser: sei passaggi, dalla stima della memoria a una chat protetta, con i limiti dichiarati con onestà.