{"title":"Búsqueda semántica (embeddings)","slug":"semantic-search","category":"concepts","summary":"Búsqueda conceptual de memoria usando embeddings vectoriales — encuentre por significado, no solo por palabras clave.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":578,"read_minutes":3,"lang":"es","translated":true,"requested_lang":"es","content_markdown":"\n# Búsqueda semántica (embeddings)\n\nSynapse admite búsqueda semántica usando embeddings vectoriales. A diferencia\nde FTS5 (coincidencia por palabra clave), la búsqueda semántica encuentra\nmemorias por **significado** — incluso si no coincide ninguna palabra clave.\n\n## Cómo 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### ¿Qué son los embeddings?\n\nLos embeddings son representaciones vectoriales numéricas del texto. El texto\ncon significado similar tiene vectores similares. Synapse genera un vector (p.\nej. 1536 dimensiones) por el contenido de cada memoria.\n\n### Similitud coseno\n\nPara encontrar memorias semánticamente similares, Synapse calcula la similitud\ncoseno entre el vector de la consulta y cada vector de memoria. Mayor similitud\n= más relevante.\n\n## Cuándo usar búsqueda semántica\n\n### Use búsqueda semántica cuando:\n\n- Quiere \"memorias sobre X\" donde X se describe de forma diferente a como está\n  almacenado\n- FTS5 no devuelve resultados (sin coincidencia de palabra clave)\n- Quiere agrupación conceptual (p. ej. todas las memorias de \"deployment\",\n  incluso si algunas dicen \"release\")\n- La consulta es una pregunta: \"¿cómo gestionamos la autenticación?\"\n\n### Use FTS5 cuando:\n\n- Conoce palabras clave exactas\n- Necesita lógica booleana (AND, OR, NOT)\n- Necesita respuesta sub-milisegundo\n- Quiere coincidencia 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\nRespuesta:\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## Ejemplos\n\n### Buscar memorias de despliegue\n\n```bash\n# FTS5 might miss some — semantic catches all\ncurl .../memory/semantic-search?q=deployment+process\n```\n\nDevuelve memorias sobre \"deployment\", \"release\", \"publishing\", \"rolling out\",\netc.\n\n### Buscar patrones de autenticación\n\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nDevuelve memorias sobre login, auth, JWT, gestión de sesiones, OAuth, etc.\n\n### Buscar memorias similares\n\n```bash\n# Find memories similar to a specific one\ncurl .../memory/related/mem_001\n```\n\nUsa similitud semántica (vía etiquetas compartidas Y vectores de embedding).\n\n## Generación de embeddings\n\n### ¿Cuándo se generan los embeddings?\n\n- **Al almacenar memoria** — si el servicio de embeddings está configurado, el\n  embedding se genera de forma síncrona\n- **Generación en lote** — `POST /memory/embed-batch` genera embeddings para\n  memorias que no los tienen\n- **Actualizaciones asíncronas** — cuando se actualiza el contenido, el\n  embedding se regenera\n\n### Proveedores de embeddings\n\nSynapse admite proveedores de embeddings configurables:\n\n- **OpenAI** (`text-embedding-3-small`, `text-embedding-3-large`)\n- **Modelos locales** (vía Ollama o similar)\n- **Personalizado** (implementar la interfaz de embeddings)\n\nConfigúrelos mediante variables de entorno:\n\n```bash\nEMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small\n```\n\n### Generación en lote\n\nPara minds con muchas memorias sin 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## Rendimiento\n\n| Operación | Latencia |\n|-----------|---------|\n| Generate embedding (OpenAI) | 100-200ms |\n| Semantic search (1k memories) | 50-100ms |\n| Semantic search (10k memories) | 200-500ms |\n| Batch generation (100 memories) | 10-20s |\n\n> [!NOTE]\n> La búsqueda semántica es más lenta que FTS5 debido al cálculo vectorial. Use\n> FTS5 para palabras clave conocidas, semántica para consultas conceptuales.\n\n## Limitaciones\n\n### Costo de embeddings\n\nSi usa OpenAI, generar embeddings cuesta dinero (~$0.02 por 1M tokens para\ntext-embedding-3-small). Para 10.000 memorias de promedio 100 tokens cada una,\nson ~$0.02 — despreciable.\n\n### Arranque en frío\n\nLas memorias almacenadas antes de configurar los embeddings no los tendrán.\nEjecute `POST /memory/embed-batch` para rellenarlas.\n\n### Dependencia del proveedor\n\nSi el proveedor de embeddings está caído, la búsqueda semántica falla de forma\ngraciosa (devuelve resultados vacíos o un error). FTS5 sigue funcionando.\n\n## Cuando los embeddings no están disponibles\n\nSi el servicio de embeddings no está configurado:\n\n- `GET /memory/semantic-search` devuelve 503 Service Unavailable\n- `POST /memory` sigue funcionando (solo no se genera embedding)\n- La búsqueda FTS5 sigue funcionando\n\n## Mejores prácticas\n\n> [!TIP]\n> - **Use semántica para consultas conceptuales** — \"¿cómo gestionamos X?\"\n> - **Use FTS5 para términos específicos** — \"docker swarm\"\n> - **Rellene los embeddings regularmente** — `POST /memory/embed-batch`\n> - **Monitoree la salud del proveedor** — la búsqueda semántica depende de él\n> - **Combine con etiquetas** — semántica + filtro por etiqueta acota resultados\n\n## Próximos pasos\n\n- [Búsqueda FTS5](/docs/concepts/fts5-search)\n- [API de Memory](/docs/api/memory)\n- [Arquitectura](/docs/concepts/architecture)\n","content_html":"<h1>Búsqueda semántica (embeddings)</h1>\n<p>Synapse admite búsqueda semántica usando embeddings vectoriales. A diferencia\nde FTS5 (coincidencia por palabra clave), la búsqueda semántica encuentra\nmemorias por <strong>significado</strong> — incluso si no coincide ninguna palabra clave.</p>\n<h2>Cómo 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>¿Qué son los embeddings?</h3>\n<p>Los embeddings son representaciones vectoriales numéricas del texto. El texto\ncon significado similar tiene vectores similares. Synapse genera un vector (p.\nej. 1536 dimensiones) por el contenido de cada memoria.</p>\n<h3>Similitud coseno</h3>\n<p>Para encontrar memorias semánticamente similares, Synapse calcula la similitud\ncoseno entre el vector de la consulta y cada vector de memoria. Mayor similitud\n= más relevante.</p>\n<h2>Cuándo usar búsqueda semántica</h2>\n<h3>Use búsqueda semántica cuando:</h3>\n<ul>\n<li>Quiere &quot;memorias sobre X&quot; donde X se describe de forma diferente a como está\nalmacenado</li>\n<li>FTS5 no devuelve resultados (sin coincidencia de palabra clave)</li>\n<li>Quiere agrupación conceptual (p. ej. todas las memorias de &quot;deployment&quot;,\nincluso si algunas dicen &quot;release&quot;)</li>\n<li>La consulta es una pregunta: &quot;¿cómo gestionamos la autenticación?&quot;</li>\n</ul>\n<h3>Use FTS5 cuando:</h3>\n<ul>\n<li>Conoce palabras clave exactas</li>\n<li>Necesita lógica booleana (AND, OR, NOT)</li>\n<li>Necesita respuesta sub-milisegundo</li>\n<li>Quiere coincidencia 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>Respuesta:</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>Ejemplos</h2>\n<h3>Buscar memorias de despliegue</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>Devuelve memorias sobre &quot;deployment&quot;, &quot;release&quot;, &quot;publishing&quot;, &quot;rolling out&quot;,\netc.</p>\n<h3>Buscar patrones de autenticación</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>Devuelve memorias sobre login, auth, JWT, gestión de sesiones, OAuth, etc.</p>\n<h3>Buscar memorias 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 similitud semántica (vía etiquetas compartidas Y vectores de embedding).</p>\n<h2>Generación de embeddings</h2>\n<h3>¿Cuándo se generan los embeddings?</h3>\n<ul>\n<li><strong>Al almacenar memoria</strong> — si el servicio de embeddings está configurado, el\nembedding se genera de forma síncrona</li>\n<li><strong>Generación en lote</strong> — <code>POST /memory/embed-batch</code> genera embeddings para\nmemorias que no los tienen</li>\n<li><strong>Actualizaciones asíncronas</strong> — cuando se actualiza el contenido, el\nembedding se regenera</li>\n</ul>\n<h3>Proveedores de embeddings</h3>\n<p>Synapse admite proveedores de embeddings configurables:</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 locales</strong> (vía Ollama o similar)</li>\n<li><strong>Personalizado</strong> (implementar la interfaz de embeddings)</li>\n</ul>\n<p>Configúrelos mediante variables de entorno:</p>\n<pre><code class=\"hljs language-bash\">EMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small</code></pre><h3>Generación en lote</h3>\n<p>Para minds con muchas memorias sin 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>Rendimiento</h2>\n<table>\n<thead>\n<tr>\n<th>Operación</th>\n<th>Latencia</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Generate embedding (OpenAI)</td>\n<td>100-200ms</td>\n</tr>\n<tr>\n<td>Semantic search (1k memories)</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>Semantic search (10k memories)</td>\n<td>200-500ms</td>\n</tr>\n<tr>\n<td>Batch generation (100 memories)</td>\n<td>10-20s</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-note\">La búsqueda semántica es más lenta que FTS5 debido al cálculo vectorial. Use\nFTS5 para palabras clave conocidas, semántica para consultas conceptuales.</div><h2>Limitaciones</h2>\n<h3>Costo de embeddings</h3>\n<p>Si usa OpenAI, generar embeddings cuesta dinero (~$0.02 por 1M tokens para\ntext-embedding-3-small). Para 10.000 memorias de promedio 100 tokens cada una,\nson ~$0.02 — despreciable.</p>\n<h3>Arranque en frío</h3>\n<p>Las memorias almacenadas antes de configurar los embeddings no los tendrán.\nEjecute <code>POST /memory/embed-batch</code> para rellenarlas.</p>\n<h3>Dependencia del proveedor</h3>\n<p>Si el proveedor de embeddings está caído, la búsqueda semántica falla de forma\ngraciosa (devuelve resultados vacíos o un error). FTS5 sigue funcionando.</p>\n<h2>Cuando los embeddings no están disponibles</h2>\n<p>Si el servicio de embeddings no está configurado:</p>\n<ul>\n<li><code>GET /memory/semantic-search</code> devuelve 503 Service Unavailable</li>\n<li><code>POST /memory</code> sigue funcionando (solo no se genera embedding)</li>\n<li>La búsqueda FTS5 sigue funcionando</li>\n</ul>\n<h2>Mejores prácticas</h2>\n<div class=\"callout callout-ok\"></div><h2>Próximos pasos</h2>\n<ul>\n<li><a href=\"/docs/concepts/fts5-search\">Búsqueda FTS5</a></li>\n<li><a href=\"/docs/api/memory\">API de Memory</a></li>\n<li><a href=\"/docs/concepts/architecture\">Arquitectura</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"]}