{"title":"Busca semântica (embeddings)","slug":"semantic-search","category":"concepts","summary":"Busca conceitual de memória usando embeddings vetoriais — encontre por significado, não apenas palavras-chave.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":571,"read_minutes":3,"lang":"pt","translated":true,"requested_lang":"pt","content_markdown":"\n# Busca semântica (embeddings)\n\nO Synapse suporta busca semântica usando embeddings vetoriais. Diferente do\nFTS5 (correspondência de palavras-chave), a busca semântica encontra memórias\npor **significado** — mesmo que nenhuma palavra-chave corresponda.\n\n## Como funciona\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### O que são embeddings?\n\nEmbeddings são representações vetoriais numéricas de texto. Textos com\nsignificado similar têm vetores similares. O Synapse gera um vetor (ex.: 1536\ndimensões) para o conteúdo de cada memória.\n\n### Similaridade de cosseno\n\nPara encontrar memórias semanticamente similares, o Synapse calcula a\nsimilaridade de cosseno entre o vetor da consulta e cada vetor de memória.\nMaior similaridade = mais relevante.\n\n## Quando usar busca semântica\n\n### Use busca semântica quando:\n\n- Você quer \"memórias sobre X\" onde X é descrito de forma diferente do que foi armazenado\n- FTS5 não retorna resultados (nenhuma palavra-chave corresponde)\n- Você quer agrupamento conceitual (ex.: todas as memórias de \"deployment\", mesmo que algumas digam \"release\")\n- A consulta é uma pergunta: \"como tratamos autenticação?\"\n\n### Use FTS5 quando:\n\n- Você conhece as palavras-chave exatas\n- Você precisa de lógica booleana (AND, OR, NOT)\n- Você precisa de resposta sub-milissegundo\n- Você quer correspondência de frase\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\nResposta:\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## Exemplos\n\n### Encontrar memórias de deployment\n\n```bash\n# FTS5 might miss some — semantic catches all\ncurl .../memory/semantic-search?q=deployment+process\n```\n\nRetorna memórias sobre \"deployment\", \"release\", \"publishing\", \"rolling out\",\netc.\n\n### Encontrar padrões de autenticação\n\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nRetorna memórias sobre login, auth, JWT, gerenciamento de sessão, OAuth, etc.\n\n### Encontrar memórias similares\n\n```bash\n# Find memories similar to a specific one\ncurl .../memory/related/mem_001\n```\n\nUsa similaridade semântica (via tags compartilhadas E vetores de embedding).\n\n## Geração de embeddings\n\n### Quando os embeddings são gerados?\n\n- **No armazenamento de memória** — se o serviço de embeddings estiver configurado, o embedding é gerado sincronamente\n- **Geração em lote** — `POST /memory/embed-batch` gera embeddings para memórias que não os têm\n- **Atualizações assíncronas** — quando o conteúdo é atualizado, o embedding é regenerado\n\n### Provedores de embedding\n\nO Synapse suporta provedores de embedding configuráveis:\n\n- **OpenAI** (`text-embedding-3-small`, `text-embedding-3-large`)\n- **Modelos locais** (via Ollama ou similar)\n- **Customizado** (implemente a interface de embeddings)\n\nConfigure via variáveis de ambiente:\n\n```bash\nEMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small\n```\n\n### Geração em lote\n\nPara minds com muitas memórias sem 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## Desempenho\n\n| Operação | Latência |\n|----------|----------|\n| Gerar embedding (OpenAI) | 100-200ms |\n| Busca semântica (1k memórias) | 50-100ms |\n| Busca semântica (10k memórias) | 200-500ms |\n| Geração em lote (100 memórias) | 10-20s |\n\n> [!NOTE]\n> Busca semântica é mais lenta que FTS5 devido à computação vetorial. Use\n> FTS5 para palavras-chave conhecidas, semântica para consultas conceituais.\n\n## Limitações\n\n### Custo dos embeddings\n\nSe usar OpenAI, gerar embeddings custa dinheiro (~$0.02 por 1M tokens para\ntext-embedding-3-small). Para 10.000 memórias com média de 100 tokens cada,\nsão ~$0.02 — insignificante.\n\n### Cold start\n\nMemórias armazenadas antes de os embeddings serem configurados não terão\nembeddings. Execute `POST /memory/embed-batch` para preencher retroativamente.\n\n### Dependência de provedor\n\nSe o provedor de embeddings cair, a busca semântica falha graciosamente\n(retorna resultados vazios ou erro). FTS5 continua funcionando.\n\n## Quando embeddings não estão disponíveis\n\nSe o serviço de embeddings não estiver configurado:\n\n- `GET /memory/semantic-search` retorna 503 Service Unavailable\n- `POST /memory` ainda funciona (apenas nenhum embedding é gerado)\n- Busca FTS5 ainda funciona\n\n## Melhores práticas\n\n> [!TIP]\n> - **Use semântica para consultas conceituais** — \"como tratamos X?\"\n> - **Use FTS5 para termos específicos** — \"docker swarm\"\n> - **Preencha embeddings regularmente** — `POST /memory/embed-batch`\n> - **Monitore a saúde do provedor** — a busca semântica depende disso\n> - **Combine com tags** — semântica + filtro de tag estreita os resultados\n\n## Próximos passos\n\n- [Busca FTS5](/docs/concepts/fts5-search)\n- [API de Memória](/docs/api/memory)\n- [Arquitetura](/docs/concepts/architecture)\n","content_html":"<h1>Busca semântica (embeddings)</h1>\n<p>O Synapse suporta busca semântica usando embeddings vetoriais. Diferente do\nFTS5 (correspondência de palavras-chave), a busca semântica encontra memórias\npor <strong>significado</strong> — mesmo que nenhuma palavra-chave corresponda.</p>\n<h2>Como funciona</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>O que são embeddings?</h3>\n<p>Embeddings são representações vetoriais numéricas de texto. Textos com\nsignificado similar têm vetores similares. O Synapse gera um vetor (ex.: 1536\ndimensões) para o conteúdo de cada memória.</p>\n<h3>Similaridade de cosseno</h3>\n<p>Para encontrar memórias semanticamente similares, o Synapse calcula a\nsimilaridade de cosseno entre o vetor da consulta e cada vetor de memória.\nMaior similaridade = mais relevante.</p>\n<h2>Quando usar busca semântica</h2>\n<h3>Use busca semântica quando:</h3>\n<ul>\n<li>Você quer &quot;memórias sobre X&quot; onde X é descrito de forma diferente do que foi armazenado</li>\n<li>FTS5 não retorna resultados (nenhuma palavra-chave corresponde)</li>\n<li>Você quer agrupamento conceitual (ex.: todas as memórias de &quot;deployment&quot;, mesmo que algumas digam &quot;release&quot;)</li>\n<li>A consulta é uma pergunta: &quot;como tratamos autenticação?&quot;</li>\n</ul>\n<h3>Use FTS5 quando:</h3>\n<ul>\n<li>Você conhece as palavras-chave exatas</li>\n<li>Você precisa de lógica booleana (AND, OR, NOT)</li>\n<li>Você precisa de resposta sub-milissegundo</li>\n<li>Você quer correspondência de frase</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>Resposta:</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>Exemplos</h2>\n<h3>Encontrar memórias de 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>Retorna memórias sobre &quot;deployment&quot;, &quot;release&quot;, &quot;publishing&quot;, &quot;rolling out&quot;,\netc.</p>\n<h3>Encontrar padrões de autenticação</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>Retorna memórias sobre login, auth, JWT, gerenciamento de sessão, OAuth, etc.</p>\n<h3>Encontrar memórias similares</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>Usa similaridade semântica (via tags compartilhadas E vetores de embedding).</p>\n<h2>Geração de embeddings</h2>\n<h3>Quando os embeddings são gerados?</h3>\n<ul>\n<li><strong>No armazenamento de memória</strong> — se o serviço de embeddings estiver configurado, o embedding é gerado sincronamente</li>\n<li><strong>Geração em lote</strong> — <code>POST /memory/embed-batch</code> gera embeddings para memórias que não os têm</li>\n<li><strong>Atualizações assíncronas</strong> — quando o conteúdo é atualizado, o embedding é regenerado</li>\n</ul>\n<h3>Provedores de embedding</h3>\n<p>O Synapse suporta provedores de embedding configuráveis:</p>\n<ul>\n<li><strong>OpenAI</strong> (<code>text-embedding-3-small</code>, <code>text-embedding-3-large</code>)</li>\n<li><strong>Modelos locais</strong> (via Ollama ou similar)</li>\n<li><strong>Customizado</strong> (implemente a interface de embeddings)</li>\n</ul>\n<p>Configure via variáveis de ambiente:</p>\n<pre><code class=\"hljs language-bash\">EMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small</code></pre><h3>Geração em lote</h3>\n<p>Para minds com muitas memórias sem 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>Desempenho</h2>\n<table>\n<thead>\n<tr>\n<th>Operação</th>\n<th>Latência</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Gerar embedding (OpenAI)</td>\n<td>100-200ms</td>\n</tr>\n<tr>\n<td>Busca semântica (1k memórias)</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>Busca semântica (10k memórias)</td>\n<td>200-500ms</td>\n</tr>\n<tr>\n<td>Geração em lote (100 memórias)</td>\n<td>10-20s</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-note\">Busca semântica é mais lenta que FTS5 devido à computação vetorial. Use\nFTS5 para palavras-chave conhecidas, semântica para consultas conceituais.</div><h2>Limitações</h2>\n<h3>Custo dos embeddings</h3>\n<p>Se usar OpenAI, gerar embeddings custa dinheiro (~$0.02 por 1M tokens para\ntext-embedding-3-small). Para 10.000 memórias com média de 100 tokens cada,\nsão ~$0.02 — insignificante.</p>\n<h3>Cold start</h3>\n<p>Memórias armazenadas antes de os embeddings serem configurados não terão\nembeddings. Execute <code>POST /memory/embed-batch</code> para preencher retroativamente.</p>\n<h3>Dependência de provedor</h3>\n<p>Se o provedor de embeddings cair, a busca semântica falha graciosamente\n(retorna resultados vazios ou erro). FTS5 continua funcionando.</p>\n<h2>Quando embeddings não estão disponíveis</h2>\n<p>Se o serviço de embeddings não estiver configurado:</p>\n<ul>\n<li><code>GET /memory/semantic-search</code> retorna 503 Service Unavailable</li>\n<li><code>POST /memory</code> ainda funciona (apenas nenhum embedding é gerado)</li>\n<li>Busca FTS5 ainda funciona</li>\n</ul>\n<h2>Melhores práticas</h2>\n<div class=\"callout callout-ok\"></div><h2>Próximos passos</h2>\n<ul>\n<li><a href=\"/docs/concepts/fts5-search\">Busca FTS5</a></li>\n<li><a href=\"/docs/api/memory\">API de Memória</a></li>\n<li><a href=\"/docs/concepts/architecture\">Arquitetura</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"]}