~/ / 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.
| Field | Kata referensi API |
|---|---|
| model | Wajib. Nama model. |
| input | Wajib. Satu teks atau array teks. |
| truncate | Default true: input yang melebihi jendela konteks dipotong. Jika false, error dikembalikan. |
| dimensions | Jumlah dimensi untuk membuat embedding. |
| keep_alive | Berapa lama model tetap dimuat. |
| options | Opsi 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.
| Model | Ukuran tag latest | Jendela konteks |
|---|---|---|
| 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 |
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.
#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.
#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.
#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.
| Peringkat | Teks | Kosinus | Hasil kali titik | Jarak |
|---|---|---|---|---|
| 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 |
Matriks kemiripan kosinus
Setiap sel membandingkan vektor di baris dengan vektor di kolom.
| #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 |
Vektor
| Teks | Dimensi | Panjang (norma L2) | Panjang satuan |
|---|---|---|---|
| #0 How do I keep a model loaded in Ollama? | 4 | 1.000000 | Ya |
| #1 keep_alive controls how long the model stays in memory | 4 | 1.000000 | Ya |
| #2 Protect Ollama with nginx and a password | 4 | 1.000001 | Ya |
| #3 Tomorrow's weather forecast | 4 | 1.000000 | Ya |
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
- Simpan dan cari embedding Ollama di PostgreSQL dengan pgvectorSimpan embedding Ollama di PostgreSQL dengan pgvector, cari dengan HNSW atau IVFFlat, dan teruskan hasilnya ke /api/chat agar jawabannya menyebut sumbernya.
- Memantau memori Ollama di VPS kecilLihat apa yang disimpan Ollama di memori, berapa lama bertahan di sana, dan pengaturan apa yang mengubahnya: ollama ps, keep_alive, dan batasannya, dari FAQ resmi.
- Menghubungkan Dify ke Ollama di VPS Anda sendiriJalankan Dify di VPS Anda sendiri dan pakai Ollama sebagai modelnya: instalasi, kolom plugin, masalah alamat di Docker, dan embedding, dari dokumentasi resmi.
- Menjalankan LLM lokal tanpa PC mahal: panduan pemula memakai VPSTidak punya PC bertenaga? Sewa VPS dan jalankan LLM lokal kecil dari browser Anda: enam langkah dari perkiraan memori sampai layar obrolan yang terlindungi, dengan batasannya dinyatakan secara jujur.