{"title":"Pencarian Semantik (Embeddings)","slug":"semantic-search","category":"concepts","summary":"Pencarian memori konseptual menggunakan vektor embeddings — temukan berdasarkan makna, bukan hanya kata kunci.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":524,"read_minutes":3,"lang":"id","translated":true,"requested_lang":"id","content_markdown":"\n# Pencarian Semantik (Embeddings)\n\nSynapse mendukung pencarian semantik menggunakan vektor embeddings. Berbeda\ndengan FTS5 (pencocokan kata kunci), pencarian semantik menemukan memori\nberdasarkan **makna** — bahkan jika tidak ada kata kunci yang cocok.\n\n## Cara Kerja\n\n```\n1. Memory stored → embedding generated → vector stored\n2. Search query → embedding generated → vector compared\n3. Cosine similarity → top N results returned\n```\n\n### Apa itu embeddings?\n\nEmbeddings adalah representasi vektor numerik dari teks. Teks dengan makna\nserupa memiliki vektor yang serupa. Synapse membuat vektor (mis. 1536 dimensi)\nuntuk konten setiap memori.\n\n### Cosine similarity\n\nUntuk menemukan memori yang mirip secara semantik, Synapse menghitung cosine\nsimilarity antara vektor kueri dan setiap vektor memori. Kesamaan lebih tinggi\n= lebih relevan.\n\n## Kapan Menggunakan Pencarian Semantik\n\n### Gunakan pencarian semantik ketika:\n\n- Anda ingin \"memori tentang X\" di mana X dideskripsikan secara berbeda dari yang disimpan\n- FTS5 tidak mengembalikan hasil (tidak ada cocok kata kunci)\n- Anda ingin pengelompokan konseptual (mis. semua memori \"deployment\", bahkan jika beberapa menyebut \"release\")\n- Kueri adalah pertanyaan: \"bagaimana kita menangani autentikasi?\"\n\n### Gunakan FTS5 ketika:\n\n- Anda tahu kata kunci persis\n- Anda memerlukan logika boolean (AND, OR, NOT)\n- Anda memerlukan respons sub-milidetik\n- Anda ingin pencocokan frasa\n\n## Endpoint\n\n### GET /memory/semantic-search\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     \"https://synapse.schaefer.zone/memory/semantic-search?q=container+orchestration\"\n```\n\nRespons:\n\n```json\n{\n  \"results\": [\n    {\n      \"id\": \"mem_001\",\n      \"category\": \"project\",\n      \"key\": \"project_synapse_deployment\",\n      \"content\": \"Synapse deployed using Docker Swarm on vps1...\",\n      \"tags\": [\"docker\", \"swarm\", \"deployment\"],\n      \"similarity\": 0.89\n    },\n    {\n      \"id\": \"mem_042\",\n      \"category\": \"fact\",\n      \"key\": \"kubernetes_cluster\",\n      \"content\": \"We use Kubernetes for production orchestration...\",\n      \"tags\": [\"kubernetes\", \"orchestration\"],\n      \"similarity\": 0.84\n    }\n  ]\n}\n```\n\n## Contoh\n\n### Mencari memori deployment\n\n```bash\n# FTS5 might miss some — semantic catches all\ncurl .../memory/semantic-search?q=deployment+process\n```\n\nMengembalikan memori tentang \"deployment\", \"release\", \"publishing\", \"rolling out\",\ndll.\n\n### Mencari pola autentikasi\n\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nMengembalikan memori tentang login, auth, JWT, manajemen sesi, OAuth, dll.\n\n### Mencari memori serupa\n\n```bash\n# Find memories similar to a specific one\ncurl .../memory/related/mem_001\n```\n\nMenggunakan kesamaan semantik (melalui tag bersama DAN vektor embeddings).\n\n## Pembuatan Embedding\n\n### Kapan embeddings dibuat?\n\n- **Saat penyimpanan memori** — jika layanan embeddings dikonfigurasi, embedding dibuat secara sinkron\n- **Pembuatan batch** — `POST /memory/embed-batch` membuat embeddings untuk memori yang belum memilikinya\n- **Pembaruan asinkron** — saat konten diperbarui, embedding dibuat ulang\n\n### Provider embedding\n\nSynapse mendukung provider embedding yang dapat dikonfigurasi:\n\n- **OpenAI** (`text-embedding-3-small`, `text-embedding-3-large`)\n- **Model lokal** (melalui Ollama atau serupa)\n- **Khusus** (implementasikan antarmuka embeddings)\n\nKonfigurasi melalui variabel lingkungan:\n\n```bash\nEMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small\n```\n\n### Pembuatan batch\n\nUntuk mind dengan banyak memori yang belum memiliki embeddings:\n\n```bash\n# Generate embeddings for up to 100 memories\ncurl -X POST https://synapse.schaefer.zone/memory/embed-batch \\\n  -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"limit\": 100}'\n\n# Check progress\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/memory/embed-batch-status\n```\n\n## Performa\n\n| Operasi | Latensi |\n|-----------|---------|\n| Membuat embedding (OpenAI) | 100-200ms |\n| Pencarian semantik (1k memori) | 50-100ms |\n| Pencarian semantik (10k memori) | 200-500ms |\n| Pembuatan batch (100 memori) | 10-20s |\n\n> [!NOTE]\n> Pencarian semantik lebih lambat dari FTS5 karena komputasi vektor. Gunakan\n> FTS5 untuk kata kunci yang diketahui, semantik untuk kueri konseptual.\n\n## Batasan\n\n### Biaya embeddings\n\nJika menggunakan OpenAI, membuat embeddings memerlukan biaya (~$0,02 per 1M\ntoken untuk text-embedding-3-small). Untuk 10.000 memori rata-rata 100 token\nmasing-masing, itu ~$0,02 — dapat diabaikan.\n\n### Cold start\n\nMemori yang disimpan sebelum embeddings dikonfigurasi tidak akan memiliki\nembeddings. Jalankan `POST /memory/embed-batch` untuk backfill.\n\n### Ketergantungan provider\n\nJika provider embeddings tidak aktif, pencarian semantik gagal dengan baik\n(mengembalikan hasil kosong atau error). FTS5 masih berfungsi.\n\n## Saat Embeddings Tidak Tersedia\n\nJika layanan embeddings tidak dikonfigurasi:\n\n- `GET /memory/semantic-search` mengembalikan 503 Service Unavailable\n- `POST /memory` masih berfungsi (hanya tidak ada embedding yang dibuat)\n- Pencarian FTS5 masih berfungsi\n\n## Praktik Terbaik\n\n> [!TIP]\n> - **Gunakan semantik untuk kueri konseptual** — \"bagaimana kita menangani X?\"\n> - **Gunakan FTS5 untuk istilah spesifik** — \"docker swarm\"\n> - **Backfill embeddings secara teratur** — `POST /memory/embed-batch`\n> - **Pantau kesehatan provider** — pencarian semantik bergantung padanya\n> - **Kombinasikan dengan tag** — semantik + filter tag mempersempit hasil\n\n## Langkah Berikutnya\n\n- [Pencarian FTS5](/docs/concepts/fts5-search)\n- [Memory API](/docs/api/memory)\n- [Arsitektur](/docs/concepts/architecture)\n","content_html":"<h1>Pencarian Semantik (Embeddings)</h1>\n<p>Synapse mendukung pencarian semantik menggunakan vektor embeddings. Berbeda\ndengan FTS5 (pencocokan kata kunci), pencarian semantik menemukan memori\nberdasarkan <strong>makna</strong> — bahkan jika tidak ada kata kunci yang cocok.</p>\n<h2>Cara Kerja</h2>\n<pre><code class=\"hljs language-plaintext\">1. Memory stored → embedding generated → vector stored\n2. Search query → embedding generated → vector compared\n3. Cosine similarity → top N results returned</code></pre><h3>Apa itu embeddings?</h3>\n<p>Embeddings adalah representasi vektor numerik dari teks. Teks dengan makna\nserupa memiliki vektor yang serupa. Synapse membuat vektor (mis. 1536 dimensi)\nuntuk konten setiap memori.</p>\n<h3>Cosine similarity</h3>\n<p>Untuk menemukan memori yang mirip secara semantik, Synapse menghitung cosine\nsimilarity antara vektor kueri dan setiap vektor memori. Kesamaan lebih tinggi\n= lebih relevan.</p>\n<h2>Kapan Menggunakan Pencarian Semantik</h2>\n<h3>Gunakan pencarian semantik ketika:</h3>\n<ul>\n<li>Anda ingin &quot;memori tentang X&quot; di mana X dideskripsikan secara berbeda dari yang disimpan</li>\n<li>FTS5 tidak mengembalikan hasil (tidak ada cocok kata kunci)</li>\n<li>Anda ingin pengelompokan konseptual (mis. semua memori &quot;deployment&quot;, bahkan jika beberapa menyebut &quot;release&quot;)</li>\n<li>Kueri adalah pertanyaan: &quot;bagaimana kita menangani autentikasi?&quot;</li>\n</ul>\n<h3>Gunakan FTS5 ketika:</h3>\n<ul>\n<li>Anda tahu kata kunci persis</li>\n<li>Anda memerlukan logika boolean (AND, OR, NOT)</li>\n<li>Anda memerlukan respons sub-milidetik</li>\n<li>Anda ingin pencocokan frasa</li>\n</ul>\n<h2>Endpoint</h2>\n<h3>GET /memory/semantic-search</h3>\n<pre><code class=\"hljs language-bash\">curl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/semantic-search?q=container+orchestration&quot;</span></code></pre><p>Respons:</p>\n<pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;results&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">[</span>\n    <span class=\"hljs-punctuation\">{</span>\n      <span class=\"hljs-attr\">&quot;id&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;mem_001&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;category&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;project&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;key&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;project_synapse_deployment&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;content&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Synapse deployed using Docker Swarm on vps1...&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;tags&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">[</span><span class=\"hljs-string\">&quot;docker&quot;</span><span class=\"hljs-punctuation\">,</span> <span class=\"hljs-string\">&quot;swarm&quot;</span><span class=\"hljs-punctuation\">,</span> <span class=\"hljs-string\">&quot;deployment&quot;</span><span class=\"hljs-punctuation\">]</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;similarity&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">0.89</span>\n    <span class=\"hljs-punctuation\">}</span><span class=\"hljs-punctuation\">,</span>\n    <span class=\"hljs-punctuation\">{</span>\n      <span class=\"hljs-attr\">&quot;id&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;mem_042&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;category&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;fact&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;key&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;kubernetes_cluster&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;content&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;We use Kubernetes for production orchestration...&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;tags&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">[</span><span class=\"hljs-string\">&quot;kubernetes&quot;</span><span class=\"hljs-punctuation\">,</span> <span class=\"hljs-string\">&quot;orchestration&quot;</span><span class=\"hljs-punctuation\">]</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;similarity&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">0.84</span>\n    <span class=\"hljs-punctuation\">}</span>\n  <span class=\"hljs-punctuation\">]</span>\n<span class=\"hljs-punctuation\">}</span></code></pre><h2>Contoh</h2>\n<h3>Mencari memori deployment</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># FTS5 might miss some — semantic catches all</span>\ncurl .../memory/semantic-search?q=deployment+process</code></pre><p>Mengembalikan memori tentang &quot;deployment&quot;, &quot;release&quot;, &quot;publishing&quot;, &quot;rolling out&quot;,\ndll.</p>\n<h3>Mencari pola autentikasi</h3>\n<pre><code class=\"hljs language-bash\">curl .../memory/semantic-search?q=how+<span class=\"hljs-keyword\">do</span>+<span class=\"hljs-built_in\">users</span>+<span class=\"hljs-built_in\">log</span>+<span class=\"hljs-keyword\">in</span></code></pre><p>Mengembalikan memori tentang login, auth, JWT, manajemen sesi, OAuth, dll.</p>\n<h3>Mencari memori serupa</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Find memories similar to a specific one</span>\ncurl .../memory/related/mem_001</code></pre><p>Menggunakan kesamaan semantik (melalui tag bersama DAN vektor embeddings).</p>\n<h2>Pembuatan Embedding</h2>\n<h3>Kapan embeddings dibuat?</h3>\n<ul>\n<li><strong>Saat penyimpanan memori</strong> — jika layanan embeddings dikonfigurasi, embedding dibuat secara sinkron</li>\n<li><strong>Pembuatan batch</strong> — <code>POST /memory/embed-batch</code> membuat embeddings untuk memori yang belum memilikinya</li>\n<li><strong>Pembaruan asinkron</strong> — saat konten diperbarui, embedding dibuat ulang</li>\n</ul>\n<h3>Provider embedding</h3>\n<p>Synapse mendukung provider embedding yang dapat dikonfigurasi:</p>\n<ul>\n<li><strong>OpenAI</strong> (<code>text-embedding-3-small</code>, <code>text-embedding-3-large</code>)</li>\n<li><strong>Model lokal</strong> (melalui Ollama atau serupa)</li>\n<li><strong>Khusus</strong> (implementasikan antarmuka embeddings)</li>\n</ul>\n<p>Konfigurasi melalui variabel lingkungan:</p>\n<pre><code class=\"hljs language-bash\">EMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small</code></pre><h3>Pembuatan batch</h3>\n<p>Untuk mind dengan banyak memori yang belum memiliki embeddings:</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Generate embeddings for up to 100 memories</span>\ncurl -X POST https://synapse.schaefer.zone/memory/embed-batch \\\n  -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n  -H <span class=\"hljs-string\">&quot;Content-Type: application/json&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;limit&quot;: 100}&#x27;</span>\n\n<span class=\"hljs-comment\"># Check progress</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n     https://synapse.schaefer.zone/memory/embed-batch-status</code></pre><h2>Performa</h2>\n<table>\n<thead>\n<tr>\n<th>Operasi</th>\n<th>Latensi</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Membuat embedding (OpenAI)</td>\n<td>100-200ms</td>\n</tr>\n<tr>\n<td>Pencarian semantik (1k memori)</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>Pencarian semantik (10k memori)</td>\n<td>200-500ms</td>\n</tr>\n<tr>\n<td>Pembuatan batch (100 memori)</td>\n<td>10-20s</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-note\">Pencarian semantik lebih lambat dari FTS5 karena komputasi vektor. Gunakan\nFTS5 untuk kata kunci yang diketahui, semantik untuk kueri konseptual.</div><h2>Batasan</h2>\n<h3>Biaya embeddings</h3>\n<p>Jika menggunakan OpenAI, membuat embeddings memerlukan biaya (~$0,02 per 1M\ntoken untuk text-embedding-3-small). Untuk 10.000 memori rata-rata 100 token\nmasing-masing, itu ~$0,02 — dapat diabaikan.</p>\n<h3>Cold start</h3>\n<p>Memori yang disimpan sebelum embeddings dikonfigurasi tidak akan memiliki\nembeddings. Jalankan <code>POST /memory/embed-batch</code> untuk backfill.</p>\n<h3>Ketergantungan provider</h3>\n<p>Jika provider embeddings tidak aktif, pencarian semantik gagal dengan baik\n(mengembalikan hasil kosong atau error). FTS5 masih berfungsi.</p>\n<h2>Saat Embeddings Tidak Tersedia</h2>\n<p>Jika layanan embeddings tidak dikonfigurasi:</p>\n<ul>\n<li><code>GET /memory/semantic-search</code> mengembalikan 503 Service Unavailable</li>\n<li><code>POST /memory</code> masih berfungsi (hanya tidak ada embedding yang dibuat)</li>\n<li>Pencarian FTS5 masih berfungsi</li>\n</ul>\n<h2>Praktik Terbaik</h2>\n<div class=\"callout callout-ok\"></div><h2>Langkah Berikutnya</h2>\n<ul>\n<li><a href=\"/docs/concepts/fts5-search\">Pencarian FTS5</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/concepts/architecture\">Arsitektur</a></li>\n</ul>\n","urls":{"html":"/docs/concepts/semantic-search","text":"/docs/concepts/semantic-search?format=text","json":"/docs/concepts/semantic-search?format=json","llm":"/docs/concepts/semantic-search?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}