~/ / Articles sur l'IA / LLM locaux sur un VPS / Embeddings avec Ollama : les bases pour la recherche et le RAG

Embeddings avec Ollama : les bases pour la recherche et le RAG

Une recherche qui trouve des passages d'après leur sens et le RAG, où un modèle de chat répond à partir de vos propres documents, commencent tous deux par des embeddings. Ollama peut les créer sur le même serveur que celui qui exécute votre modèle de chat. Cet article présente la requête, les modèles que liste la bibliothèque d'Ollama, les réglages qui changent le résultat et la façon de comparer les vecteurs, en s'appuyant uniquement sur ce que disent la documentation et les pages de la bibliothèque d'Ollama. Deux outils de cette page permettent d'essayer ces étapes dans votre navigateur.

Publié: · 5 min de lecture · Faits vérifiés dans la documentation et les pages de la bibliothèque d'Ollama le 2026-11-04. Les modèles et les champs évoluent, consultez donc les pages actuelles avant de vous y fier.

Ce qu'est un embedding

La page des embeddings d'Ollama indique que les embeddings transforment du texte en vecteurs numériques que l'on peut stocker dans une base de données vectorielle, rechercher avec la similarité cosinus ou utiliser dans des pipelines de RAG. La longueur du vecteur dépend du modèle ; la page donne en général de 384 à 1024 dimensions.

Une recherche crée l'embedding de la question avec le même modèle et cherche les vecteurs stockés qui lui ressemblent le plus.

Créer des embeddings avec /api/embed

Le endpoint est POST /api/embed. La requête a besoin de model et de input, et input peut être une chaîne unique ou un tableau de chaînes. Avec un tableau, la réponse contient un vecteur par chaîne dans le champ embeddings, dans le même ordre, si bien qu'un lot de passages ne demande qu'une seule requête.

La documentation montre aussi la ligne de commande : ollama run embeddinggemma "Hello world" affiche le vecteur sous forme de tableau JSON, et le texte peut être transmis par un tube avec echo.

ChampCe que dit la référence de l'API
modelObligatoire. Le nom du modèle.
inputObligatoire. Un texte ou un tableau de textes.
truncateVaut true par défaut : les entrées qui dépassent la fenêtre de contexte sont tronquées. Si false, une erreur est renvoyée.
dimensionsLe nombre de dimensions pour lesquelles les embeddings sont générés.
keep_aliveCombien de temps le modèle reste chargé.
optionsOptions d'exécution, comme num_ctx pour la longueur du contexte.

Ollama possède aussi un endpoint compatible avec OpenAI, /v1/embeddings. Sa documentation donne comme pris en charge model, input sous forme de chaîne ou de tableau de chaînes, encoding format et dimensions, et comme non pris en charge les tableaux de tokens et user.

Les modèles d'embeddings de la bibliothèque d'Ollama

La bibliothèque d'Ollama comporte une catégorie d'embeddings. Le tableau montre six des modèles qui y figurent, avec la taille et la fenêtre de contexte que la page des tags de chaque modèle indique pour le tag latest. Quatre des six pèsent moins de 1GB.

ModèleTaille du tag latestFenêtre de contexte
all-minilm46MB512
nomic-embed-text274MB2K
embeddinggemma622MB2K
mxbai-embed-large670MB512
bge-m31.2GB8K
qwen3-embedding4.7GB40K

D'autres tags changent la taille : par exemple, la bibliothèque liste qwen3-embedding:0.6b à 639MB avec une fenêtre de contexte de 32K, et embeddinggemma:300m-qat-q4_0 à 239MB. Nous n'avons pas comparé la qualité de ces modèles ; les pages de la bibliothèque ne les classent pas. En essayant all-minilm avec Ollama 0.40.11, ollama show indiquait une longueur de contexte de 512 et un paramètre num_ctx de 256, et une entrée longue a été coupée à 256 tokens. Vérifiez ollama show pour le modèle que vous utilisez.

Un texte long est coupé sans aucune erreur

La fenêtre de contexte se compte en tokens. Comme truncate vaut true par défaut, un texte plus long que la fenêtre de contexte du modèle est raccourci et renvoie tout de même un vecteur, sans aucune erreur. Un long document envoyé en une seule entrée peut ainsi perdre sa fin.

Deux choses aident. Découper les longs documents en morceaux (chunks) plus petits et créer l'embedding de chacun, ce qui permet aussi à une recherche de renvoyer la partie qui répond à la question. Et envoyer truncate avec la valeur false, pour qu'Ollama renvoie une erreur plutôt que de raccourcir un morceau encore trop long.

Le découpeur ci-dessous coupe le texte aux paragraphes, aux lignes, aux phrases et aux espaces, avec un chevauchement (overlap), et construit une seule requête /api/embed pour tous les morceaux. Il compte des caractères, pas des tokens, car chaque modèle a son propre tokenizer ; gardez donc une marge sous la fenêtre de contexte.

Essayez: RAG Text Chunker

Les longueurs sont en caractères. La fenêtre de contexte du modèle est en tokens, et le nombre de tokens d'un texte dépend du modèle ; gardez donc une marge.

Commande curl

Exécutez-la sur une machine qui peut joindre Ollama. La réponse contient un vecteur par morceau, dans cet ordre.

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
}'

Morceaux

3 morceaux. Le plus long compte 294 caractères.

  1. #0 · 294 caractères · commence à la position 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 caractères · commence à la position 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 caractères · commence à la position 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.

Corps JSON pour /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
}

Champs de la requête tels que donnés dans la référence de l'API d'Ollama pour /api/embed, vérifiés le 2026-11-04. Ollama API: Generate embeddings

Tout se fait dans votre navigateur. L'outil se contente d'écrire la commande et n'envoie rien.

Utilisez un seul modèle pour indexer et pour rechercher

La page des embeddings indique d'utiliser le même modèle d'embeddings pour l'indexation et pour l'interrogation. La longueur du vecteur dépend du modèle ; des vecteurs issus de deux modèles différents peuvent donc ne même pas avoir le même nombre de dimensions.

Il en va de même pour dimensions : si vous le définissez en indexant vos documents, définissez la même valeur en créant les embeddings des questions. Si vous changez de modèle ou ce réglage, recréez les embeddings des documents stockés.

Comparer les vecteurs

La documentation recommande la similarité cosinus pour la plupart des cas de recherche sémantique et indique que /api/embed renvoie des vecteurs normalisés L2, de longueur unitaire. Pour des vecteurs de longueur unitaire, la similarité cosinus et le produit scalaire sont le même nombre ; une base de données vectorielle réglée sur l'un ou l'autre classera donc les résultats de la même façon.

Pour tester un modèle sur vos propres textes avant de construire quoi que ce soit, créez en une seule requête les embeddings d'une question et de quelques passages, la question en premier. Collez la réponse ci-dessous : les passages sont classés selon leur similarité cosinus avec la question, et l'outil indique si tous les vecteurs ont une longueur unitaire et les mêmes dimensions.

Essayez: Embedding Similarity Calculator

L'exemple utilise des vecteurs inventés, de longueur unitaire et à 4 dimensions, pour qu'ils restent lisibles. De vrais embeddings ont des centaines ou des milliers de dimensions.

Lu comme une réponse d'Ollama /api/embed : 4 vecteurs de 4 dimensions. Tous les vecteurs ont une longueur de 1, donc la similarité cosinus et le produit scalaire sont égaux.

Classement par similarité cosinus

Comparé avec #0 How do I keep a model loaded in Ollama?. Plus la valeur est élevée, plus la similarité est grande.

RangTexteCosinusProduit scalaireDistance
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 de similarité cosinus

Chaque cellule compare le vecteur de la ligne avec le vecteur de la colonne.

#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

Vecteurs

TexteDimensionsLongueur (norme L2)Longueur unitaire
#0 How do I keep a model loaded in Ollama?41.000000Oui
#1 keep_alive controls how long the model stays in memory41.000000Oui
#2 Protect Ollama with nginx and a password41.000001Oui
#3 Tomorrow's weather forecast41.000000Oui

D'après la documentation des embeddings et la référence de l'API d'Ollama, vérifiées le 2026-11-04. Ollama: Embeddings / Ollama API: Generate embeddings

Tout est calculé dans votre navigateur. Rien n'est envoyé nulle part.

La mémoire sur un petit serveur

Un modèle d'embeddings se charge comme n'importe quel autre modèle. La FAQ d'Ollama indique que OLLAMA_MAX_LOADED_MODELS, le nombre de modèles pouvant être chargés en même temps s'ils tiennent en mémoire, vaut par défaut 3 fois le nombre de GPU, ou 3 pour l'inférence sur CPU. Un modèle de chat et un modèle d'embeddings peuvent donc rester chargés ensemble quand la mémoire le permet.

Notre article sur la surveillance de la mémoire d'Ollama explique ollama ps, keep_alive et les autres réglages qui décident de ce qui reste en mémoire.

Sources

À lire ensuite