{"title":"Semantische Suche (Embeddings)","slug":"semantic-search","category":"concepts","summary":"Konzeptionelle Memory-Suche mit Vektor-Embeddings — nach Bedeutung finden, nicht nur nach Keywords.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":494,"read_minutes":2,"lang":"de","translated":true,"requested_lang":"de","content_markdown":"\n# Semantische Suche (Embeddings)\n\nSynapse unterstützt semantische Suche mittels Vektor-Embeddings. Anders als FTS5\n(Keyword-Matching) findet die semantische Suche Memories nach **Bedeutung** —\nselbst wenn keine Keywords übereinstimmen.\n\n## Funktionsweise\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### Was sind Embeddings?\n\nEmbeddings sind numerische Vektor-Repräsentationen von Text. Text mit ähnlicher\nBedeutung hat ähnliche Vektoren. Synapse generiert einen Vektor (z. B. 1536\nDimensionen) für den Inhalt jedes Memories.\n\n### Cosine-Ähnlichkeit\n\nUm semantisch ähnliche Memories zu finden, berechnet Synapse die\nCosine-Ähnlichkeit zwischen dem Query-Vektor und jedem Memory-Vektor. Höhere\nÄhnlichkeit = relevanter.\n\n## Wann semantische Suche verwenden?\n\n### Verwende semantische Suche, wenn:\n\n- Du „Memories über X\" suchst, wobei X anders beschrieben ist als gespeichert\n- FTS5 keine Ergebnisse liefert (kein Keyword-Match)\n- Du konzeptionelle Gruppierung willst (z. B. alle „Deployment\"-Memories, auch wenn manche „Release\" sagen)\n- Die Anfrage eine Frage ist: „wie gehen wir mit Authentifizierung um?\"\n\n### Verwende FTS5, wenn:\n\n- Du exakte Keywords kennst\n- Du boolesche Logik brauchst (AND, OR, NOT)\n- Du sub-millisecond-Antwort brauchst\n- Du Phrase-Matching willst\n\n## Endpunkt\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\nAntwort:\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## Beispiele\n\n### Deployment-Memories finden\n\n```bash\n# FTS5 might miss some — semantic catches all\ncurl .../memory/semantic-search?q=deployment+process\n```\n\nLiefert Memories über „Deployment\", „Release\", „Publishing\", „Rolling out\" etc.\n\n### Authentifizierungs-Pattern finden\n\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nLiefert Memories über Login, Auth, JWT, Session-Management, OAuth etc.\n\n### Ähnliche Memories finden\n\n```bash\n# Find memories similar to a specific one\ncurl .../memory/related/mem_001\n```\n\nVerwendet semantische Ähnlichkeit (über gemeinsame Tags UND Embedding-Vektoren).\n\n## Embedding-Generierung\n\n### Wann werden Embeddings generiert?\n\n- **Beim Speichern eines Memories** — wenn der Embeddings-Dienst konfiguriert ist, wird das Embedding synchron generiert\n- **Batch-Generierung** — `POST /memory/embed-batch` generiert Embeddings für Memories, die keine haben\n- **Async-Updates** — bei Inhaltsänderung wird das Embedding neu generiert\n\n### Embedding-Provider\n\nSynapse unterstützt konfigurierbare Embedding-Provider:\n\n- **OpenAI** (`text-embedding-3-small`, `text-embedding-3-large`)\n- **Lokale Modelle** (über Ollama oder ähnliches)\n- **Custom** (Embeddings-Interface implementieren)\n\nKonfiguriere via Environment-Variablen:\n\n```bash\nEMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small\n```\n\n### Batch-Generierung\n\nFür Minds mit vielen Memories ohne 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## Performance\n\n| Operation | Latenz |\n|-----------|--------|\n| Embedding generieren (OpenAI) | 100-200ms |\n| Semantische Suche (1k Memories) | 50-100ms |\n| Semantische Suche (10k Memories) | 200-500ms |\n| Batch-Generierung (100 Memories) | 10-20s |\n\n> [!NOTE]\n> Semantische Suche ist langsamer als FTS5 wegen der Vektor-Berechnung.\n> Verwende FTS5 für bekannte Keywords, semantische für konzeptionelle Queries.\n\n## Einschränkungen\n\n### Embedding-Kosten\n\nBei Verwendung von OpenAI kostet die Embedding-Generierung Geld (~$0.02 pro 1M\nToken für text-embedding-3-small). Bei 10.000 Memories mit durchschnittlich 100\nToken sind das ~$0.02 — vernachlässigbar.\n\n### Cold Start\n\nMemories, die vor der Konfiguration der Embeddings gespeichert wurden, haben\nkeine Embeddings. Führe `POST /memory/embed-batch` zum Backfillen aus.\n\n### Provider-Abhängigkeit\n\nWenn der Embeddings-Provider down ist, schlägt die semantische Suche graceful\nfehl (leere Ergebnisse oder Fehler). FTS5 funktioniert weiterhin.\n\n## Wenn Embeddings nicht verfügbar sind\n\nWenn der Embeddings-Dienst nicht konfiguriert ist:\n\n- `GET /memory/semantic-search` liefert 503 Service Unavailable\n- `POST /memory` funktioniert weiterhin (nur kein Embedding generiert)\n- FTS5-Suche funktioniert weiterhin\n\n## Best Practices\n\n> [!TIP]\n> - **Semantisch für konzeptionelle Queries** — „wie gehen wir mit X um?\"\n> - **FTS5 für spezifische Begriffe** — „docker swarm\"\n> - **Embeddings regelmäßig backfillen** — `POST /memory/embed-batch`\n> - **Provider-Gesundheit überwachen** — semantische Suche hängt davon ab\n> - **Mit Tags kombinieren** — semantisch + Tag-Filter schränkt Ergebnisse ein\n\n## Nächste Schritte\n\n- [FTS5-Suche](/docs/concepts/fts5-search)\n- [Memory-API](/docs/api/memory)\n- [Architektur](/docs/concepts/architecture)\n","content_html":"<h1>Semantische Suche (Embeddings)</h1>\n<p>Synapse unterstützt semantische Suche mittels Vektor-Embeddings. Anders als FTS5\n(Keyword-Matching) findet die semantische Suche Memories nach <strong>Bedeutung</strong> —\nselbst wenn keine Keywords übereinstimmen.</p>\n<h2>Funktionsweise</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>Was sind Embeddings?</h3>\n<p>Embeddings sind numerische Vektor-Repräsentationen von Text. Text mit ähnlicher\nBedeutung hat ähnliche Vektoren. Synapse generiert einen Vektor (z. B. 1536\nDimensionen) für den Inhalt jedes Memories.</p>\n<h3>Cosine-Ähnlichkeit</h3>\n<p>Um semantisch ähnliche Memories zu finden, berechnet Synapse die\nCosine-Ähnlichkeit zwischen dem Query-Vektor und jedem Memory-Vektor. Höhere\nÄhnlichkeit = relevanter.</p>\n<h2>Wann semantische Suche verwenden?</h2>\n<h3>Verwende semantische Suche, wenn:</h3>\n<ul>\n<li>Du „Memories über X&quot; suchst, wobei X anders beschrieben ist als gespeichert</li>\n<li>FTS5 keine Ergebnisse liefert (kein Keyword-Match)</li>\n<li>Du konzeptionelle Gruppierung willst (z. B. alle „Deployment&quot;-Memories, auch wenn manche „Release&quot; sagen)</li>\n<li>Die Anfrage eine Frage ist: „wie gehen wir mit Authentifizierung um?&quot;</li>\n</ul>\n<h3>Verwende FTS5, wenn:</h3>\n<ul>\n<li>Du exakte Keywords kennst</li>\n<li>Du boolesche Logik brauchst (AND, OR, NOT)</li>\n<li>Du sub-millisecond-Antwort brauchst</li>\n<li>Du Phrase-Matching willst</li>\n</ul>\n<h2>Endpunkt</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>Antwort:</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>Beispiele</h2>\n<h3>Deployment-Memories finden</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>Liefert Memories über „Deployment&quot;, „Release&quot;, „Publishing&quot;, „Rolling out&quot; etc.</p>\n<h3>Authentifizierungs-Pattern finden</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>Liefert Memories über Login, Auth, JWT, Session-Management, OAuth etc.</p>\n<h3>Ähnliche Memories finden</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>Verwendet semantische Ähnlichkeit (über gemeinsame Tags UND Embedding-Vektoren).</p>\n<h2>Embedding-Generierung</h2>\n<h3>Wann werden Embeddings generiert?</h3>\n<ul>\n<li><strong>Beim Speichern eines Memories</strong> — wenn der Embeddings-Dienst konfiguriert ist, wird das Embedding synchron generiert</li>\n<li><strong>Batch-Generierung</strong> — <code>POST /memory/embed-batch</code> generiert Embeddings für Memories, die keine haben</li>\n<li><strong>Async-Updates</strong> — bei Inhaltsänderung wird das Embedding neu generiert</li>\n</ul>\n<h3>Embedding-Provider</h3>\n<p>Synapse unterstützt konfigurierbare Embedding-Provider:</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 Modelle</strong> (über Ollama oder ähnliches)</li>\n<li><strong>Custom</strong> (Embeddings-Interface implementieren)</li>\n</ul>\n<p>Konfiguriere via Environment-Variablen:</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-Generierung</h3>\n<p>Für Minds mit vielen Memories ohne 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>Performance</h2>\n<table>\n<thead>\n<tr>\n<th>Operation</th>\n<th>Latenz</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Embedding generieren (OpenAI)</td>\n<td>100-200ms</td>\n</tr>\n<tr>\n<td>Semantische Suche (1k Memories)</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>Semantische Suche (10k Memories)</td>\n<td>200-500ms</td>\n</tr>\n<tr>\n<td>Batch-Generierung (100 Memories)</td>\n<td>10-20s</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-note\">Semantische Suche ist langsamer als FTS5 wegen der Vektor-Berechnung.\nVerwende FTS5 für bekannte Keywords, semantische für konzeptionelle Queries.</div><h2>Einschränkungen</h2>\n<h3>Embedding-Kosten</h3>\n<p>Bei Verwendung von OpenAI kostet die Embedding-Generierung Geld (~$0.02 pro 1M\nToken für text-embedding-3-small). Bei 10.000 Memories mit durchschnittlich 100\nToken sind das ~$0.02 — vernachlässigbar.</p>\n<h3>Cold Start</h3>\n<p>Memories, die vor der Konfiguration der Embeddings gespeichert wurden, haben\nkeine Embeddings. Führe <code>POST /memory/embed-batch</code> zum Backfillen aus.</p>\n<h3>Provider-Abhängigkeit</h3>\n<p>Wenn der Embeddings-Provider down ist, schlägt die semantische Suche graceful\nfehl (leere Ergebnisse oder Fehler). FTS5 funktioniert weiterhin.</p>\n<h2>Wenn Embeddings nicht verfügbar sind</h2>\n<p>Wenn der Embeddings-Dienst nicht konfiguriert ist:</p>\n<ul>\n<li><code>GET /memory/semantic-search</code> liefert 503 Service Unavailable</li>\n<li><code>POST /memory</code> funktioniert weiterhin (nur kein Embedding generiert)</li>\n<li>FTS5-Suche funktioniert weiterhin</li>\n</ul>\n<h2>Best Practices</h2>\n<div class=\"callout callout-ok\"></div><h2>Nächste Schritte</h2>\n<ul>\n<li><a href=\"/docs/concepts/fts5-search\">FTS5-Suche</a></li>\n<li><a href=\"/docs/api/memory\">Memory-API</a></li>\n<li><a href=\"/docs/concepts/architecture\">Architektur</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"]}