~/ / 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.

CampoChe cosa dice il riferimento dell'API
modelObbligatorio. Il nome del modello.
inputObbligatorio. Un testo o un array di testi.
truncatePredefinito true: gli input che superano la finestra di contesto vengono troncati. Se false, viene restituito un errore.
dimensionsIl numero di dimensioni per cui generare gli embedding.
keep_alivePer quanto tempo il modello resta caricato.
optionsOpzioni 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.

ModelloDimensione del tag latestFinestra di contesto
all-minilm46MB512
nomic-embed-text274MB2K
embeddinggemma622MB2K
mxbai-embed-large670MB512
bge-m31.2GB8K
qwen3-embedding4.7GB40K

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.

  1. #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.

  2. #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.

  3. #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.

PosizioneTestoCosenoProdotto scalareDistanza
1#1 keep_alive controls how long the model stays in memory0.99620.99620.0876
2#2 Protect Ollama with nginx and a password0.40370.40371.0921
3#3 Tomorrow's weather forecast0.01000.01001.4071

Matrice di similarità del coseno

Ogni cella confronta il vettore della riga con il vettore della colonna.

#0#1#2#3
#01.0000.9960.4040.010
#10.9961.0000.475-0.005
#20.4040.4751.000-0.377
#30.010-0.005-0.3771.000

Vettori

TestoDimensioniLunghezza (norma L2)Lunghezza unitaria
#0 How do I keep a model loaded in Ollama?41.000000Sì
#1 keep_alive controls how long the model stays in memory41.000000Sì
#2 Protect Ollama with nginx and a password41.000001Sì
#3 Tomorrow's weather forecast41.000000Sì

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