{"title":"Semantisk sökning (inbäddningar)","slug":"semantic-search","category":"concepts","summary":"Begreppslig minnessökning med vektorinbäddningar — hitta efter betydelse, inte bara nyckelord.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":500,"read_minutes":3,"lang":"sv","translated":true,"requested_lang":"sv","content_markdown":"\n# Semantisk sökning (inbäddningar)\n\nSynapse stöder semantisk sökning med vektorinbäddningar. Till skillnad från FTS5\n(nyckelordsmatchning) hittar semantisk sökning minnen efter **betydelse** — även\nom inga nyckelord matchar.\n\n## Hur det fungerar\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### Vad är inbäddningar?\n\nInbäddningar är numeriska vektorrepresentationer av text. Text med liknande\nbetydelse har liknande vektorer. Synapse genererar en vektor (t.ex. 1536\ndimensioner) för varje minnes innehåll.\n\n### Cosine similarity\n\nFör att hitta semantiskt liknande minnen beräknar Synapse cosinuslikheten\nmellan frågevektorn och varje minnesvektor. Högre likhet = mer relevant.\n\n## När semantisk sökning ska användas\n\n### Använd semantisk sökning när:\n\n- Ni vill ha \"minnen om X\" där X beskrivs annorlunda än lagrat\n- FTS5 returnerar inga resultat (ingen nyckelordsmatchning)\n- Ni vill ha begreppslig gruppering (t.ex. alla \"deployment\"-minnen, även om vissa säger \"release\")\n- Frågan är en fråga: \"hur hanterar vi autentisering?\"\n\n### Använd FTS5 när:\n\n- Ni känner till exakta nyckelord\n- Ni behöver boolesk logik (AND, OR, NOT)\n- Ni behöver svar under en millisekund\n- Ni vill ha frasmatchning\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\nSvar:\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## Exempel\n\n### Hitta driftsättningsminnen\n\n```bash\n# FTS5 might miss some — semantic catches all\ncurl .../memory/semantic-search?q=deployment+process\n```\n\nReturnerar minnen om \"deployment\", \"release\", \"publishing\", \"rolling out\" etc.\n\n### Hitta autentiseringsmönster\n\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nReturnerar minnen om inloggning, auth, JWT, sessionshantering, OAuth etc.\n\n### Hitta liknande minnen\n\n```bash\n# Find memories similar to a specific one\ncurl .../memory/related/mem_001\n```\n\nAnvänder semantisk likhet (via gemensamma taggar OCH inbäddningsvektorer).\n\n## Inbäddningsgenerering\n\n### När genereras inbäddningar?\n\n- **Vid minneslagring** — om inbäddningstjänst är konfigurerad genereras inbäddning synkront\n- **Batchgenerering** — `POST /memory/embed-batch` genererar inbäddningar för minnen som saknar dem\n- **Asynkrona uppdateringar** — när innehåll uppdateras regenereras inbäddningen\n\n### Inbäddningsleverantörer\n\nSynapse stöder konfigurerbara inbäddningsleverantörer:\n\n- **OpenAI** (`text-embedding-3-small`, `text-embedding-3-large`)\n- **Lokala modeller** (via Ollama eller liknande)\n- **Anpassade** (implementera inbäddningsgränssnittet)\n\nKonfigurera via miljövariabler:\n\n```bash\nEMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small\n```\n\n### Batchgenerering\n\nFör minds med många minnen som saknar inbäddningar:\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## Prestanda\n\n| Åtgärd | Latens |\n|-----------|---------|\n| Generera inbäddning (OpenAI) | 100–200 ms |\n| Semantisk sökning (1k minnen) | 50–100 ms |\n| Semantisk sökning (10k minnen) | 200–500 ms |\n| Batchgenerering (100 minnen) | 10–20 s |\n\n> [!NOTE]\n> Semantisk sökning är långsammare än FTS5 på grund av vektorberäkning.\n> Använd FTS5 för kända nyckelord, semantisk för begreppsliga frågor.\n\n## Begränsningar\n\n### Kostnad för inbäddningar\n\nOm ni använder OpenAI kostar generering av inbäddningar pengar (~$0,02 per 1M\ntokens för text-embedding-3-small). För 10 000 minnen med i snitt 100 tokens\nvar blir det ~$0,02 — försumbart.\n\n### Kallstart\n\nMinnen som lagrats innan inbäddningar konfigurerades kommer inte att ha\ninbäddningar. Kör `POST /memory/embed-batch` för att fylla i.\n\n### Leverantörsberoende\n\nOm inbäddningsleverantören är nere misslyckas semantisk sökning graciöst\n(returnerar tomma resultat eller fel). FTS5 fungerar fortfarande.\n\n## När inbäddningar inte är tillgängliga\n\nOm inbäddningstjänst inte är konfigurerad:\n\n- `GET /memory/semantic-search` returnerar 503 Service Unavailable\n- `POST /memory` fungerar fortfarande (bara ingen inbäddning genererad)\n- FTS5-sökning fungerar fortfarande\n\n## Bästa praxis\n\n> [!TIP]\n> - **Använd semantisk för begreppsliga frågor** — \"hur hanterar vi X?\"\n> - **Använd FTS5 för specifika termer** — \"docker swarm\"\n> - **Fyll i inbäddningar regelbundet** — `POST /memory/embed-batch`\n> - **Övervaka leverantörshälsa** — semantisk sökning beror på den\n> - **Kombinera med taggar** — semantisk + taggfilter snävar in resultatet\n\n## Nästa steg\n\n- [FTS5-sökning](/docs/concepts/fts5-search)\n- [Memory API](/docs/api/memory)\n- [Arkitektur](/docs/concepts/architecture)\n","content_html":"<h1>Semantisk sökning (inbäddningar)</h1>\n<p>Synapse stöder semantisk sökning med vektorinbäddningar. Till skillnad från FTS5\n(nyckelordsmatchning) hittar semantisk sökning minnen efter <strong>betydelse</strong> — även\nom inga nyckelord matchar.</p>\n<h2>Hur det fungerar</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>Vad är inbäddningar?</h3>\n<p>Inbäddningar är numeriska vektorrepresentationer av text. Text med liknande\nbetydelse har liknande vektorer. Synapse genererar en vektor (t.ex. 1536\ndimensioner) för varje minnes innehåll.</p>\n<h3>Cosine similarity</h3>\n<p>För att hitta semantiskt liknande minnen beräknar Synapse cosinuslikheten\nmellan frågevektorn och varje minnesvektor. Högre likhet = mer relevant.</p>\n<h2>När semantisk sökning ska användas</h2>\n<h3>Använd semantisk sökning när:</h3>\n<ul>\n<li>Ni vill ha &quot;minnen om X&quot; där X beskrivs annorlunda än lagrat</li>\n<li>FTS5 returnerar inga resultat (ingen nyckelordsmatchning)</li>\n<li>Ni vill ha begreppslig gruppering (t.ex. alla &quot;deployment&quot;-minnen, även om vissa säger &quot;release&quot;)</li>\n<li>Frågan är en fråga: &quot;hur hanterar vi autentisering?&quot;</li>\n</ul>\n<h3>Använd FTS5 när:</h3>\n<ul>\n<li>Ni känner till exakta nyckelord</li>\n<li>Ni behöver boolesk logik (AND, OR, NOT)</li>\n<li>Ni behöver svar under en millisekund</li>\n<li>Ni vill ha frasmatchning</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>Svar:</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>Exempel</h2>\n<h3>Hitta driftsättningsminnen</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>Returnerar minnen om &quot;deployment&quot;, &quot;release&quot;, &quot;publishing&quot;, &quot;rolling out&quot; etc.</p>\n<h3>Hitta autentiseringsmönster</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>Returnerar minnen om inloggning, auth, JWT, sessionshantering, OAuth etc.</p>\n<h3>Hitta liknande minnen</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>Använder semantisk likhet (via gemensamma taggar OCH inbäddningsvektorer).</p>\n<h2>Inbäddningsgenerering</h2>\n<h3>När genereras inbäddningar?</h3>\n<ul>\n<li><strong>Vid minneslagring</strong> — om inbäddningstjänst är konfigurerad genereras inbäddning synkront</li>\n<li><strong>Batchgenerering</strong> — <code>POST /memory/embed-batch</code> genererar inbäddningar för minnen som saknar dem</li>\n<li><strong>Asynkrona uppdateringar</strong> — när innehåll uppdateras regenereras inbäddningen</li>\n</ul>\n<h3>Inbäddningsleverantörer</h3>\n<p>Synapse stöder konfigurerbara inbäddningsleverantörer:</p>\n<ul>\n<li><strong>OpenAI</strong> (<code>text-embedding-3-small</code>, <code>text-embedding-3-large</code>)</li>\n<li><strong>Lokala modeller</strong> (via Ollama eller liknande)</li>\n<li><strong>Anpassade</strong> (implementera inbäddningsgränssnittet)</li>\n</ul>\n<p>Konfigurera via miljövariabler:</p>\n<pre><code class=\"hljs language-bash\">EMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small</code></pre><h3>Batchgenerering</h3>\n<p>För minds med många minnen som saknar inbäddningar:</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>Prestanda</h2>\n<table>\n<thead>\n<tr>\n<th>Åtgärd</th>\n<th>Latens</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Generera inbäddning (OpenAI)</td>\n<td>100–200 ms</td>\n</tr>\n<tr>\n<td>Semantisk sökning (1k minnen)</td>\n<td>50–100 ms</td>\n</tr>\n<tr>\n<td>Semantisk sökning (10k minnen)</td>\n<td>200–500 ms</td>\n</tr>\n<tr>\n<td>Batchgenerering (100 minnen)</td>\n<td>10–20 s</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-note\">Semantisk sökning är långsammare än FTS5 på grund av vektorberäkning.\nAnvänd FTS5 för kända nyckelord, semantisk för begreppsliga frågor.</div><h2>Begränsningar</h2>\n<h3>Kostnad för inbäddningar</h3>\n<p>Om ni använder OpenAI kostar generering av inbäddningar pengar (~$0,02 per 1M\ntokens för text-embedding-3-small). För 10 000 minnen med i snitt 100 tokens\nvar blir det ~$0,02 — försumbart.</p>\n<h3>Kallstart</h3>\n<p>Minnen som lagrats innan inbäddningar konfigurerades kommer inte att ha\ninbäddningar. Kör <code>POST /memory/embed-batch</code> för att fylla i.</p>\n<h3>Leverantörsberoende</h3>\n<p>Om inbäddningsleverantören är nere misslyckas semantisk sökning graciöst\n(returnerar tomma resultat eller fel). FTS5 fungerar fortfarande.</p>\n<h2>När inbäddningar inte är tillgängliga</h2>\n<p>Om inbäddningstjänst inte är konfigurerad:</p>\n<ul>\n<li><code>GET /memory/semantic-search</code> returnerar 503 Service Unavailable</li>\n<li><code>POST /memory</code> fungerar fortfarande (bara ingen inbäddning genererad)</li>\n<li>FTS5-sökning fungerar fortfarande</li>\n</ul>\n<h2>Bästa praxis</h2>\n<div class=\"callout callout-ok\"></div><h2>Nästa steg</h2>\n<ul>\n<li><a href=\"/docs/concepts/fts5-search\">FTS5-sökning</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/concepts/architecture\">Arkitektur</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"]}