{"title":"Semantisch zoeken (Embeddings)","slug":"semantic-search","category":"concepts","summary":"Conceptueel zoeken in herinneringen met vector-embeddings — vind op betekenis, niet alleen op trefwoorden.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":506,"read_minutes":3,"lang":"nl","translated":true,"requested_lang":"nl","content_markdown":"\n# Semantisch zoeken (Embeddings)\n\nSynapse ondersteunt semantisch zoeken met behulp van vector-embeddings. In tegenstelling\ntot FTS5 (trefwoordovereenkomst) vindt semantisch zoeken herinneringen op **betekenis** —\nzelfs als er geen trefwoorden overeenkomen.\n\n## Hoe het werkt\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### Wat zijn embeddings?\n\nEmbeddings zijn numerieke vectorrepresentaties van tekst. Tekst met vergelijkbare\nbetekenis heeft vergelijkbare vectoren. Synapse genereert een vector (bijv. 1536 dimensies)\nvoor de inhoud van elke herinnering.\n\n### Cosinus-similariteit\n\nOm semantisch vergelijkbare herinneringen te vinden, berekent Synapse de cosinus-similariteit\ntussen de query-vector en elke memory-vector. Hogere similariteit = meer\nrelevant.\n\n## Wanneer semantisch zoeken gebruiken\n\n### Gebruik semantisch zoeken wanneer:\n\n- U \"herinneringen over X\" wilt waarbij X anders wordt omschreven dan opgeslagen\n- FTS5 geen resultaten retourneert (geen trefwoordovereenkomst)\n- U conceptuele groepering wilt (bijv. alle \"deployment\"-herinneringen, zelfs als sommige \"release\" zeggen)\n- De query een vraag is: \"hoe handelen we authenticatie?\"\n\n### Gebruik FTS5 wanneer:\n\n- U exacte trefwoorden kent\n- U booleaanse logica nodig heeft (AND, OR, NOT)\n- U sub-milliseconde respons nodig hebt\n- U zinsovereenkomst wilt\n\n## Eindpunt\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## Voorbeelden\n\n### Vind deployment-herinneringen\n\n```bash\n# FTS5 might miss some — semantic catches all\ncurl .../memory/semantic-search?q=deployment+process\n```\n\nRetourneert herinneringen over \"deployment\", \"release\", \"publishing\", \"rolling out\",\nenz.\n\n### Vind authenticatie-patronen\n\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nRetourneert herinneringen over login, auth, JWT, sessiebeheer, OAuth, enz.\n\n### Vind vergelijkbare herinneringen\n\n```bash\n# Find memories similar to a specific one\ncurl .../memory/related/mem_001\n```\n\nGebruikt semantische similariteit (via gedeelde tags EN embedding-vectoren).\n\n## Embedding-generatie\n\n### Wanneer worden embeddings gegenereerd?\n\n- **Bij memory-opslag** — als embeddings-service is geconfigureerd, wordt embedding synchroon gegenereerd\n- **Batch-generatie** — `POST /memory/embed-batch` genereert embeddings voor herinneringen die deze missen\n- **Asynchrone updates** — wanneer inhoud wordt bijgewerkt, wordt embedding opnieuw gegenereerd\n\n### Embedding-providers\n\nSynapse ondersteunt configureerbare embedding-providers:\n\n- **OpenAI** (`text-embedding-3-small`, `text-embedding-3-large`)\n- **Lokale modellen** (via Ollama of vergelijkbaar)\n- **Aangepast** (implementeer de embeddings-interface)\n\nConfigureer via omgevingsvariabelen:\n\n```bash\nEMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small\n```\n\n### Batch-generatie\n\nVoor minds met veel herinneringen die embeddings missen:\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## Prestaties\n\n| Bewerking | Latentie |\n|-----------|----------|\n| Embedding genereren (OpenAI) | 100-200ms |\n| Semantisch zoeken (1k herinneringen) | 50-100ms |\n| Semantisch zoeken (10k herinneringen) | 200-500ms |\n| Batch-generatie (100 herinneringen) | 10-20s |\n\n> [!NOTE]\n> Semantisch zoeken is langzamer dan FTS5 vanwege vectorberekening. Gebruik FTS5\n> voor bekende trefwoorden, semantisch voor conceptuele query's.\n\n## Beperkingen\n\n### Kosten van embeddings\n\nBij gebruik van OpenAI kost het genereren van embeddings geld (~$0,02 per 1M tokens\nvoor text-embedding-3-small). Voor 10.000 herinneringen met gemiddeld 100 tokens elk,\nis dat ~$0,02 — verwaarloosbaar.\n\n### Cold start\n\nHerinneringen die zijn opgeslagen voordat embeddings waren geconfigureerd, hebben geen\nembeddings. Voer `POST /memory/embed-batch` uit om bij te vullen.\n\n### Provider-afhankelijkheid\n\nAls de embeddings-provider niet beschikbaar is, faalt semantisch zoeken graceful\n(retourneert lege resultaten of een fout). FTS5 blijft werken.\n\n## Wanneer embeddings niet beschikbaar zijn\n\nAls embeddings-service niet is geconfigureerd:\n\n- `GET /memory/semantic-search` retourneert 503 Service Unavailable\n- `POST /memory` blijft werken (alleen geen embedding gegenereerd)\n- FTS5-zoekopdracht blijft werken\n\n## Best practices\n\n> [!TIP]\n> - **Gebruik semantisch voor conceptuele query's** — \"hoe handelen we X?\"\n> - **Gebruik FTS5 voor specifieke termen** — \"docker swarm\"\n> - **Vul embeddings regelmatig bij** — `POST /memory/embed-batch`\n> - **Monitor provider-gezondheid** — semantisch zoeken is ervan afhankelijk\n> - **Combineer met tags** — semantisch + tag-filter verfijnt resultaten\n\n## Volgende stappen\n\n- [FTS5-zoekopdracht](/docs/concepts/fts5-search)\n- [Memory API](/docs/api/memory)\n- [Architectuur](/docs/concepts/architecture)\n","content_html":"<h1>Semantisch zoeken (Embeddings)</h1>\n<p>Synapse ondersteunt semantisch zoeken met behulp van vector-embeddings. In tegenstelling\ntot FTS5 (trefwoordovereenkomst) vindt semantisch zoeken herinneringen op <strong>betekenis</strong> —\nzelfs als er geen trefwoorden overeenkomen.</p>\n<h2>Hoe het werkt</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>Wat zijn embeddings?</h3>\n<p>Embeddings zijn numerieke vectorrepresentaties van tekst. Tekst met vergelijkbare\nbetekenis heeft vergelijkbare vectoren. Synapse genereert een vector (bijv. 1536 dimensies)\nvoor de inhoud van elke herinnering.</p>\n<h3>Cosinus-similariteit</h3>\n<p>Om semantisch vergelijkbare herinneringen te vinden, berekent Synapse de cosinus-similariteit\ntussen de query-vector en elke memory-vector. Hogere similariteit = meer\nrelevant.</p>\n<h2>Wanneer semantisch zoeken gebruiken</h2>\n<h3>Gebruik semantisch zoeken wanneer:</h3>\n<ul>\n<li>U &quot;herinneringen over X&quot; wilt waarbij X anders wordt omschreven dan opgeslagen</li>\n<li>FTS5 geen resultaten retourneert (geen trefwoordovereenkomst)</li>\n<li>U conceptuele groepering wilt (bijv. alle &quot;deployment&quot;-herinneringen, zelfs als sommige &quot;release&quot; zeggen)</li>\n<li>De query een vraag is: &quot;hoe handelen we authenticatie?&quot;</li>\n</ul>\n<h3>Gebruik FTS5 wanneer:</h3>\n<ul>\n<li>U exacte trefwoorden kent</li>\n<li>U booleaanse logica nodig heeft (AND, OR, NOT)</li>\n<li>U sub-milliseconde respons nodig hebt</li>\n<li>U zinsovereenkomst wilt</li>\n</ul>\n<h2>Eindpunt</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>Voorbeelden</h2>\n<h3>Vind deployment-herinneringen</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>Retourneert herinneringen over &quot;deployment&quot;, &quot;release&quot;, &quot;publishing&quot;, &quot;rolling out&quot;,\nenz.</p>\n<h3>Vind authenticatie-patronen</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>Retourneert herinneringen over login, auth, JWT, sessiebeheer, OAuth, enz.</p>\n<h3>Vind vergelijkbare herinneringen</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>Gebruikt semantische similariteit (via gedeelde tags EN embedding-vectoren).</p>\n<h2>Embedding-generatie</h2>\n<h3>Wanneer worden embeddings gegenereerd?</h3>\n<ul>\n<li><strong>Bij memory-opslag</strong> — als embeddings-service is geconfigureerd, wordt embedding synchroon gegenereerd</li>\n<li><strong>Batch-generatie</strong> — <code>POST /memory/embed-batch</code> genereert embeddings voor herinneringen die deze missen</li>\n<li><strong>Asynchrone updates</strong> — wanneer inhoud wordt bijgewerkt, wordt embedding opnieuw gegenereerd</li>\n</ul>\n<h3>Embedding-providers</h3>\n<p>Synapse ondersteunt configureerbare embedding-providers:</p>\n<ul>\n<li><strong>OpenAI</strong> (<code>text-embedding-3-small</code>, <code>text-embedding-3-large</code>)</li>\n<li><strong>Lokale modellen</strong> (via Ollama of vergelijkbaar)</li>\n<li><strong>Aangepast</strong> (implementeer de embeddings-interface)</li>\n</ul>\n<p>Configureer via omgevingsvariabelen:</p>\n<pre><code class=\"hljs language-bash\">EMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small</code></pre><h3>Batch-generatie</h3>\n<p>Voor minds met veel herinneringen die embeddings missen:</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>Prestaties</h2>\n<table>\n<thead>\n<tr>\n<th>Bewerking</th>\n<th>Latentie</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Embedding genereren (OpenAI)</td>\n<td>100-200ms</td>\n</tr>\n<tr>\n<td>Semantisch zoeken (1k herinneringen)</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>Semantisch zoeken (10k herinneringen)</td>\n<td>200-500ms</td>\n</tr>\n<tr>\n<td>Batch-generatie (100 herinneringen)</td>\n<td>10-20s</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-note\">Semantisch zoeken is langzamer dan FTS5 vanwege vectorberekening. Gebruik FTS5\nvoor bekende trefwoorden, semantisch voor conceptuele query's.</div><h2>Beperkingen</h2>\n<h3>Kosten van embeddings</h3>\n<p>Bij gebruik van OpenAI kost het genereren van embeddings geld (~$0,02 per 1M tokens\nvoor text-embedding-3-small). Voor 10.000 herinneringen met gemiddeld 100 tokens elk,\nis dat ~$0,02 — verwaarloosbaar.</p>\n<h3>Cold start</h3>\n<p>Herinneringen die zijn opgeslagen voordat embeddings waren geconfigureerd, hebben geen\nembeddings. Voer <code>POST /memory/embed-batch</code> uit om bij te vullen.</p>\n<h3>Provider-afhankelijkheid</h3>\n<p>Als de embeddings-provider niet beschikbaar is, faalt semantisch zoeken graceful\n(retourneert lege resultaten of een fout). FTS5 blijft werken.</p>\n<h2>Wanneer embeddings niet beschikbaar zijn</h2>\n<p>Als embeddings-service niet is geconfigureerd:</p>\n<ul>\n<li><code>GET /memory/semantic-search</code> retourneert 503 Service Unavailable</li>\n<li><code>POST /memory</code> blijft werken (alleen geen embedding gegenereerd)</li>\n<li>FTS5-zoekopdracht blijft werken</li>\n</ul>\n<h2>Best practices</h2>\n<div class=\"callout callout-ok\"></div><h2>Volgende stappen</h2>\n<ul>\n<li><a href=\"/docs/concepts/fts5-search\">FTS5-zoekopdracht</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/concepts/architecture\">Architectuur</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"]}