~/ / Artykuły o AI / Lokalne LLM na VPS / Embeddingi w Ollamie: podstawy wyszukiwania i RAG

Embeddingi w Ollamie: podstawy wyszukiwania i RAG

Wyszukiwanie, które znajduje fragmenty tekstu według znaczenia, oraz RAG, w którym model czatu odpowiada na podstawie Twoich własnych dokumentów, zaczynają się od embeddingów. Ollama może je tworzyć na tym samym serwerze, na którym działa Twój model czatu. Ten artykuł omawia żądanie, modele wymienione w bibliotece Ollamy, ustawienia zmieniające wynik oraz porównywanie wektorów, wyłącznie na podstawie tego, co mówią dokumentacja i strony biblioteki Ollamy. Dwa narzędzia na tej stronie pozwalają wypróbować te kroki w przeglądarce.

Opublikowano: · 4 min czytania · Fakty sprawdzone w dokumentacji i na stronach biblioteki Ollamy dnia 2026-11-04. Modele i pola się zmieniają, dlatego przed poleganiem na nich sprawdź aktualne strony.

Czym jest embedding

Strona Ollamy o embeddingach podaje, że embeddingi zamieniają tekst w wektory liczbowe, które można przechowywać w bazie wektorowej, przeszukiwać za pomocą podobieństwa cosinusowego lub wykorzystywać w potokach RAG. Długość wektora zależy od modelu; strona podaje typowo od 384 do 1024 wymiarów.

Wyszukiwanie tworzy embedding pytania tym samym modelem i szuka zapisanych wektorów, które są do niego najbardziej podobne.

Tworzenie embeddingów przez /api/embed

Endpoint to POST /api/embed. Żądanie wymaga model i input, a input może być pojedynczym ciągiem znaków albo tablicą ciągów. Przy tablicy odpowiedź zawiera w polu embeddings jeden wektor na każdy ciąg, w tej samej kolejności, więc do wielu fragmentów tekstu wystarczy jedno żądanie.

Dokumentacja pokazuje też wiersz poleceń: ollama run embeddinggemma "Hello world" wypisuje wektor jako tablicę JSON, a tekst można przekazać potokiem za pomocą echo.

PoleCo mówi dokumentacja API
modelWymagane. Nazwa modelu.
inputWymagane. Tekst albo tablica tekstów.
truncateDomyślnie true: dane wejściowe przekraczające okno kontekstu są ucinane. Przy false zwracany jest błąd.
dimensionsLiczba wymiarów, dla których tworzone są embeddingi.
keep_aliveJak długo model pozostaje załadowany.
optionsOpcje uruchomieniowe, na przykład num_ctx dla długości kontekstu.

Ollama ma też endpoint zgodny z OpenAI, /v1/embeddings. Jego dokumentacja wymienia jako obsługiwane model, input jako ciąg lub tablicę ciągów, encoding format oraz dimensions, a jako nieobsługiwane tablice tokenów i user.

Modele embeddingów w bibliotece Ollamy

Biblioteka Ollamy ma kategorię embeddingów. Tabela pokazuje sześć wymienionych tam modeli, z rozmiarem i oknem kontekstu, które strona tagów danego modelu podaje dla najnowszego tagu. Cztery z sześciu mają mniej niż 1GB.

ModelRozmiar najnowszego taguOkno kontekstu
all-minilm46MB512
nomic-embed-text274MB2K
embeddinggemma622MB2K
mxbai-embed-large670MB512
bge-m31.2GB8K
qwen3-embedding4.7GB40K

Inne tagi zmieniają rozmiar: na przykład biblioteka podaje qwen3-embedding:0.6b z 639MB i oknem kontekstu 32K oraz embeddinggemma:300m-qat-q4_0 z 239MB. Nie porównywaliśmy jakości tych modeli; strony biblioteki nie tworzą ich rankingu. Gdy wypróbowaliśmy all-minilm w Ollama 0.40.11, ollama show pokazało długość kontekstu 512 i parametr num_ctx równy 256, a długie wejście zostało ucięte na 256 tokenach. Sprawdź ollama show dla modelu, którego używasz.

Długie dane wejściowe są ucinane bez błędu

Okno kontekstu liczy się w tokenach. Ponieważ truncate domyślnie ma wartość true, tekst dłuższy niż okno kontekstu modelu zostaje skrócony i mimo to zwraca wektor, bez błędu. Długi dokument wysłany jako jedno wejście może w ten sposób stracić koniec.

Pomagają dwie rzeczy. Podziel długie dokumenty na mniejsze fragmenty (chunki) i twórz embedding każdego z nich, dzięki czemu wyszukiwanie może też zwrócić tę część, która odpowiada na pytanie. Oraz wysyłaj truncate ustawione na false, aby Ollama zwróciła błąd zamiast skracać fragment, który nadal jest za długi.

Chunker poniżej dzieli tekst na akapitach, wierszach, zdaniach i spacjach, z nakładaniem (overlap), i buduje jedno żądanie /api/embed dla wszystkich chunków. Liczy znaki, a nie tokeny, ponieważ każdy model ma własny tokenizer, więc zostaw margines poniżej okna kontekstu.

Wypróbuj: RAG Text Chunker

Długości podano w znakach. Okno kontekstu modelu liczy się w tokenach, a liczba tokenów zużywanych przez tekst zależy od modelu, więc zostaw margines.

Polecenie curl

Uruchom je na komputerze, który ma dostęp do Ollama. Odpowiedź zawiera jeden wektor na chunk, w tej kolejności.

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

Chunki

Liczba chunków: 3. Najdłuższy ma 294 znaków.

  1. #0 · znaków: 294 · zaczyna się na pozycji 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 · znaków: 202 · zaczyna się na pozycji 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 · znaków: 169 · zaczyna się na pozycji 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.

Treść JSON dla /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
}

Pola żądania według dokumentacji API Ollamy dla /api/embed, sprawdzone dnia 2026-11-04. Ollama API: Generate embeddings

Wszystko dzieje się w Twojej przeglądarce. Narzędzie tylko zapisuje polecenie i niczego nie wysyła.

Jeden model do indeksowania i wyszukiwania

Strona o embeddingach mówi, by do indeksowania i do zapytań używać tego samego modelu embeddingów. Długość wektora zależy od modelu, więc wektory z dwóch różnych modeli mogą nawet nie mieć tej samej liczby wymiarów.

To samo dotyczy dimensions: jeśli ustawisz je przy indeksowaniu dokumentów, ustaw tę samą wartość przy tworzeniu embeddingów pytań. Jeśli zmienisz model lub to ustawienie, utwórz ponownie embeddingi zapisanych dokumentów.

Porównywanie wektorów

Dokumentacja zaleca podobieństwo cosinusowe w większości zastosowań wyszukiwania semantycznego i podaje, że /api/embed zwraca wektory znormalizowane w L2, o długości 1. Dla wektorów o długości 1 podobieństwo cosinusowe i iloczyn skalarny to ta sama liczba, więc baza wektorowa ustawiona na jedno z nich uporządkuje wyniki tak samo.

Aby sprawdzić model na własnych tekstach, zanim cokolwiek zbudujesz, utwórz embeddingi pytania i kilku fragmentów tekstu w jednym żądaniu, z pytaniem na początku. Wklej odpowiedź poniżej: fragmenty tekstu zostaną uszeregowane według podobieństwa cosinusowego do pytania, a narzędzie pokaże, czy każdy wektor ma długość 1 i te same wymiary.

Wypróbuj: Embedding Similarity Calculator

Przykład używa zmyślonych wektorów o długości 1 i 4 wymiarach, aby dało się je przeczytać. Prawdziwe embeddingi mają setki lub tysiące wymiarów.

Odczytano jako odpowiedź Ollama /api/embed: wektorów: 4, wymiarów: 4. Wszystkie wektory mają długość 1, więc podobieństwo cosinusowe i iloczyn skalarny są równe.

Ranking według podobieństwa cosinusowego

Porównanie z #0 How do I keep a model loaded in Ollama?. Wyższa wartość oznacza większe podobieństwo.

MiejsceTekstCosinusIloczyn skalarnyOdległość
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

Macierz podobieństwa cosinusowego

Każda komórka porównuje wektor z wiersza z wektorem z kolumny.

#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

Wektory

TekstWymiaryDługość (norma L2)Długość 1
#0 How do I keep a model loaded in Ollama?41.000000Tak
#1 keep_alive controls how long the model stays in memory41.000000Tak
#2 Protect Ollama with nginx and a password41.000001Tak
#3 Tomorrow's weather forecast41.000000Tak

Na podstawie dokumentacji o embeddingach i dokumentacji API Ollamy, sprawdzone dnia 2026-11-04. Ollama: Embeddings / Ollama API: Generate embeddings

Wszystko jest liczone w Twojej przeglądarce. Nic nie jest nigdzie wysyłane.

Pamięć na małym serwerze

Model embeddingów jest ładowany tak jak każdy inny model. FAQ Ollamy podaje, że OLLAMA_MAX_LOADED_MODELS, czyli liczba modeli, które mogą być załadowane jednocześnie, jeśli mieszczą się w pamięci, domyślnie wynosi 3 razy liczba GPU, a przy inferencji na CPU 3. Model czatu i model embeddingów mogą więc pozostać załadowane razem, jeśli pozwala na to pamięć.

Nasz artykuł o obserwowaniu pamięci Ollamy wyjaśnia ollama ps, keep_alive i pozostałe ustawienia, które decydują o tym, co zostaje w pamięci.

Źródła

Czytaj dalej