~/ / Artikel AI / LLM lokal di VPS / Embedding dengan Ollama: dasar untuk pencarian dan RAG

Embedding dengan Ollama: dasar untuk pencarian dan RAG

Pencarian yang menemukan bagian teks berdasarkan makna, dan RAG, yaitu model obrolan yang menjawab dari dokumen Anda sendiri, sama-sama dimulai dari embedding. Ollama dapat membuatnya di server yang sama dengan yang menjalankan model obrolan Anda. Artikel ini membahas cara mengirim permintaan, model yang tercantum di pustaka Ollama, pengaturan yang mengubah hasil, dan cara membandingkan vektornya, hanya berdasarkan apa yang dikatakan dokumentasi dan halaman pustaka Ollama. Dua alat di halaman ini memungkinkan Anda mencoba langkah-langkahnya di browser.

Terbit: · 4 menit baca · Fakta dicek terhadap dokumentasi dan halaman pustaka Ollama pada 2026-11-04. Model dan field dapat berubah, jadi periksa halaman terbaru sebelum Anda mengandalkannya.

Apa itu embedding

Halaman embeddings Ollama mengatakan bahwa embedding mengubah teks menjadi vektor numerik yang dapat Anda simpan di basis data vektor, cari dengan kemiripan kosinus, atau gunakan dalam pipeline RAG. Panjang vektor bergantung pada model; halaman itu menyebutkan umumnya 384 sampai 1024 dimensi.

Pencarian membuat embedding dari pertanyaan dengan model yang sama, lalu mencari vektor tersimpan yang paling mirip dengannya.

Membuat embedding dengan /api/embed

Endpoint-nya adalah POST /api/embed. Permintaan memerlukan model dan input, dan input dapat berupa satu string atau array string. Dengan array, respons berisi satu vektor untuk setiap string di field embeddings, dengan urutan yang sama, sehingga sekumpulan bagian teks hanya perlu satu permintaan.

Dokumentasi juga menunjukkan baris perintah: ollama run embeddinggemma "Hello world" mencetak vektor sebagai array JSON, dan teks dapat dialirkan lewat pipe dengan echo.

FieldKata referensi API
modelWajib. Nama model.
inputWajib. Satu teks atau array teks.
truncateDefault true: input yang melebihi jendela konteks dipotong. Jika false, error dikembalikan.
dimensionsJumlah dimensi untuk membuat embedding.
keep_aliveBerapa lama model tetap dimuat.
optionsOpsi saat dijalankan, seperti num_ctx untuk panjang konteks.

Ollama juga memiliki endpoint yang kompatibel dengan OpenAI, /v1/embeddings. Dokumentasinya mencantumkan model, input berupa string atau array string, encoding format, dan dimensions sebagai yang didukung, serta array token dan user sebagai yang tidak didukung.

Model embedding di pustaka Ollama

Pustaka Ollama memiliki kategori embedding. Tabel ini menampilkan enam dari model yang tercantum di sana, dengan ukuran dan jendela konteks yang diberikan halaman tag tiap model untuk tag latest. Empat dari enam model itu berukuran di bawah 1GB.

ModelUkuran tag latestJendela konteks
all-minilm46MB512
nomic-embed-text274MB2K
embeddinggemma622MB2K
mxbai-embed-large670MB512
bge-m31.2GB8K
qwen3-embedding4.7GB40K

Tag lain mengubah ukurannya: misalnya, pustaka mencantumkan qwen3-embedding:0.6b sebesar 639MB dengan jendela konteks 32K, dan embeddinggemma:300m-qat-q4_0 sebesar 239MB. Kami tidak membandingkan kualitas model-model ini; halaman pustaka tidak memeringkatnya. Saat kami mencoba all-minilm di Ollama 0.40.11, ollama show menampilkan panjang konteks 512 dan parameter num_ctx 256, dan input yang panjang dipotong pada 256 token. Periksa ollama show untuk model yang Anda gunakan.

Input yang panjang terpotong tanpa error

Jendela konteks dihitung dalam token. Karena truncate secara default bernilai true, teks yang lebih panjang dari jendela konteks model akan dipendekkan dan tetap mengembalikan vektor, tanpa error. Dokumen panjang yang dikirim sebagai satu input bisa kehilangan bagian akhirnya dengan cara ini.

Ada dua hal yang membantu. Pertama, pecah dokumen panjang menjadi chunk yang lebih kecil dan buat embedding untuk tiap chunk, yang juga membuat pencarian dapat mengembalikan bagian yang menjawab pertanyaan. Kedua, kirim dengan truncate diatur ke false, sehingga Ollama mengembalikan error alih-alih memendekkan chunk yang masih terlalu panjang.

Pemecah chunk di bawah ini memotong teks pada paragraf, baris, kalimat, dan spasi, dengan tumpang tindih (overlap), lalu menyusun satu permintaan /api/embed untuk semua chunk. Alat ini menghitung karakter, bukan token, karena tiap model memiliki tokenizer sendiri, jadi sisakan margin di bawah jendela konteks.

Coba sendiri: RAG Text Chunker

Panjang dihitung dalam karakter. Jendela konteks model dihitung dalam token, dan berapa token yang dipakai sebuah teks bergantung pada model, jadi sisakan margin.

Perintah curl

Jalankan di mesin yang dapat menjangkau Ollama. Responsnya berisi satu vektor per chunk, dengan urutan ini.

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

Chunk

3 chunk. Yang terpanjang memiliki 294 karakter.

  1. #0 · 294 karakter · dimulai pada offset 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 karakter · dimulai pada offset 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 karakter · dimulai pada offset 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.

Body JSON untuk /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
}

Field permintaan sebagaimana tercantum di referensi API Ollama untuk /api/embed, dicek pada 2026-11-04. Ollama API: Generate embeddings

Semuanya dilakukan di browser Anda. Alat ini hanya menulis perintah dan tidak mengirim apa pun.

Gunakan satu model untuk pengindeksan dan pencarian

Halaman embeddings menyatakan agar menggunakan model embedding yang sama untuk pengindeksan maupun kueri. Panjang vektor bergantung pada model, sehingga vektor dari dua model berbeda mungkin bahkan tidak memiliki jumlah dimensi yang sama.

Hal yang sama berlaku untuk dimensions: jika Anda mengaturnya saat mengindeks dokumen, atur nilai yang sama saat membuat embedding pertanyaan. Jika Anda mengganti model atau pengaturan ini, buat ulang embedding dokumen yang tersimpan.

Membandingkan vektor

Dokumentasi merekomendasikan kemiripan kosinus untuk sebagian besar kasus pencarian semantik, dan menyatakan bahwa /api/embed mengembalikan vektor berpanjang satuan yang dinormalisasi L2. Untuk vektor berpanjang satuan, kemiripan kosinus dan hasil kali titik adalah angka yang sama, sehingga basis data vektor yang diatur ke salah satunya akan memeringkat hasil dengan cara yang sama.

Untuk memeriksa sebuah model pada teks Anda sendiri sebelum membangun apa pun, buat embedding satu pertanyaan dan beberapa bagian teks dalam satu permintaan, dengan pertanyaan di urutan pertama. Tempel responsnya di bawah: bagian-bagian teks diperingkat menurut kemiripan kosinus dengan pertanyaan, dan alat ini menunjukkan apakah setiap vektor berpanjang satuan dan memiliki dimensi yang sama.

Coba sendiri: Embedding Similarity Calculator

Contoh ini memakai vektor rekaan berpanjang satuan dengan 4 dimensi agar mudah dibaca. Embedding sungguhan memiliki ratusan atau ribuan dimensi.

Dibaca sebagai respons /api/embed dari Ollama: 4 vektor dengan 4 dimensi. Semua vektor memiliki panjang 1, jadi kemiripan kosinus dan hasil kali titik sama.

Peringkat menurut kemiripan kosinus

Dibandingkan dengan #0 How do I keep a model loaded in Ollama?. Makin tinggi makin mirip.

PeringkatTeksKosinusHasil kali titikJarak
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

Matriks kemiripan kosinus

Setiap sel membandingkan vektor di baris dengan vektor di kolom.

#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

Vektor

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

Berdasarkan dokumentasi embeddings dan referensi API Ollama, dicek pada 2026-11-04. Ollama: Embeddings / Ollama API: Generate embeddings

Semuanya dihitung di browser Anda. Tidak ada yang dikirim ke mana pun.

Memori di server kecil

Model embedding dimuat seperti model lainnya. FAQ Ollama mengatakan bahwa OLLAMA_MAX_LOADED_MODELS, jumlah model yang dapat dimuat bersamaan jika muat di memori, secara default adalah 3 kali jumlah GPU, atau 3 untuk inferensi CPU. Jadi model obrolan dan model embedding dapat tetap dimuat bersamaan jika memori memungkinkan.

Artikel kami tentang memantau memori Ollama menjelaskan ollama ps, keep_alive, dan pengaturan lain yang menentukan apa yang tetap berada di memori.

Sumber

Baca selanjutnya