{"title":"Ricerca semantica (embedding)","slug":"semantic-search","category":"concepts","summary":"Ricerca concettuale delle memorie usando embedding vettoriali — trova per significato, non solo per parole chiave.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":576,"read_minutes":3,"lang":"it","translated":true,"requested_lang":"it","content_markdown":"\n# Ricerca semantica (embedding)\n\nSynapse supporta la ricerca semantica usando embedding vettoriali. A differenza\ndi FTS5 (corrispondenza per parola chiave), la ricerca semantica trova le\nmemorie per **significato** — anche se nessuna parola chiave corrisponde.\n\n## Come funziona\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### Cosa sono gli embedding?\n\nGli embedding sono rappresentazioni vettoriali numeriche del testo. Testo con\nsignificato simile ha vettori simili. Synapse genera un vettore (es. 1536\ndimensioni) per il contenuto di ogni memoria.\n\n### Similarità del coseno\n\nPer trovare memorie semanticamente simili, Synapse calcola la similarità del\ncoseno tra il vettore della query e ogni vettore di memoria. Similarità più\nalta = più rilevante.\n\n## Quando usare la ricerca semantica\n\n### Usi la ricerca semantica quando:\n\n- Vuole \"memorie su X\" dove X è descritto diversamente da come è salvato\n- FTS5 non restituisce risultati (nessuna corrispondenza di parola chiave)\n- Vuole raggruppamento concettuale (es. tutte le memorie \"deployment\", anche se alcune dicono \"release\")\n- La query è una domanda: \"come gestiamo l'autenticazione?\"\n\n### Usi FTS5 quando:\n\n- Conosce le parole chiave esatte\n- Ha bisogno di logica booleana (AND, OR, NOT)\n- Ha bisogno di risposta sub-millisecond\n- Vuole corrispondenza di 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\nRisposta:\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## Esempi\n\n### Trova memorie sul deployment\n\n```bash\n# FTS5 might miss some — semantic catches all\ncurl .../memory/semantic-search?q=deployment+process\n```\n\nRestituisce memorie su \"deployment\", \"release\", \"publishing\", \"rolling out\",\necc.\n\n### Trova pattern di autenticazione\n\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nRestituisce memorie su login, auth, JWT, gestione sessioni, OAuth, ecc.\n\n### Trova memorie simili\n\n```bash\n# Find memories similar to a specific one\ncurl .../memory/related/mem_001\n```\n\nUsa similarità semantica (tramite tag condivisi E vettori di embedding).\n\n## Generazione degli embedding\n\n### Quando vengono generati gli embedding?\n\n- **Su memorizzazione** — se il servizio embedding è configurato, l'embedding viene generato in modo sincrono\n- **Generazione batch** — `POST /memory/embed-batch` genera embedding per le memorie che ne sono sprovviste\n- **Aggiornamenti asincroni** — quando il contenuto viene aggiornato, l'embedding viene rigenerato\n\n### Provider di embedding\n\nSynapse supporta provider di embedding configurabili:\n\n- **OpenAI** (`text-embedding-3-small`, `text-embedding-3-large`)\n- **Modelli locali** (tramite Ollama o simili)\n- **Personalizzato** (implementi l'interfaccia embeddings)\n\nConfiguri tramite variabili di ambiente:\n\n```bash\nEMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small\n```\n\n### Generazione batch\n\nPer menti con molte memorie sprovviste di embedding:\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## Prestazioni\n\n| Operazione | Latenza |\n|-----------|---------|\n| Genera embedding (OpenAI) | 100-200ms |\n| Ricerca semantica (1k memorie) | 50-100ms |\n| Ricerca semantica (10k memorie) | 200-500ms |\n| Generazione batch (100 memorie) | 10-20s |\n\n> [!NOTE]\n> La ricerca semantica è più lenta di FTS5 a causa del calcolo vettoriale. Usi\n> FTS5 per parole chiave note, semantica per query concettuali.\n\n## Limitazioni\n\n### Costo degli embedding\n\nSe usa OpenAI, generare embedding costa denaro (~$0,02 per 1M token per\ntext-embedding-3-small). Per 10.000 memorie con una media di 100 token ciascuna,\nsono ~$0,02 — trascurabile.\n\n### Cold start\n\nLe memorie salvate prima che gli embedding fossero configurati non avranno\nembedding. Esegua `POST /memory/embed-batch` per backfill.\n\n### Dipendenza dal provider\n\nSe il provider di embedding è down, la ricerca semantica fallisce in modo\ngrazioso (restituisce risultati vuoti o errore). FTS5 continua a funzionare.\n\n## Quando gli embedding non sono disponibili\n\nSe il servizio embedding non è configurato:\n\n- `GET /memory/semantic-search` restituisce 503 Service Unavailable\n- `POST /memory` funziona comunque (solo senza embedding generato)\n- La ricerca FTS5 funziona ancora\n\n## Best practice\n\n> [!TIP]\n> - **Usi la semantica per query concettuali** — \"come gestiamo X?\"\n> - **Usi FTS5 per termini specifici** — \"docker swarm\"\n> - **Faccia backfill degli embedding regolarmente** — `POST /memory/embed-batch`\n> - **Monitori la salute del provider** — la ricerca semantica dipende da esso\n> - **Combini con i tag** — semantica + filtro tag restringe i risultati\n\n## Prossimi passi\n\n- [Ricerca FTS5](/docs/concepts/fts5-search)\n- [Memory API](/docs/api/memory)\n- [Architettura](/docs/concepts/architecture)\n","content_html":"<h1>Ricerca semantica (embedding)</h1>\n<p>Synapse supporta la ricerca semantica usando embedding vettoriali. A differenza\ndi FTS5 (corrispondenza per parola chiave), la ricerca semantica trova le\nmemorie per <strong>significato</strong> — anche se nessuna parola chiave corrisponde.</p>\n<h2>Come funziona</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>Cosa sono gli embedding?</h3>\n<p>Gli embedding sono rappresentazioni vettoriali numeriche del testo. Testo con\nsignificato simile ha vettori simili. Synapse genera un vettore (es. 1536\ndimensioni) per il contenuto di ogni memoria.</p>\n<h3>Similarità del coseno</h3>\n<p>Per trovare memorie semanticamente simili, Synapse calcola la similarità del\ncoseno tra il vettore della query e ogni vettore di memoria. Similarità più\nalta = più rilevante.</p>\n<h2>Quando usare la ricerca semantica</h2>\n<h3>Usi la ricerca semantica quando:</h3>\n<ul>\n<li>Vuole &quot;memorie su X&quot; dove X è descritto diversamente da come è salvato</li>\n<li>FTS5 non restituisce risultati (nessuna corrispondenza di parola chiave)</li>\n<li>Vuole raggruppamento concettuale (es. tutte le memorie &quot;deployment&quot;, anche se alcune dicono &quot;release&quot;)</li>\n<li>La query è una domanda: &quot;come gestiamo l&#39;autenticazione?&quot;</li>\n</ul>\n<h3>Usi FTS5 quando:</h3>\n<ul>\n<li>Conosce le parole chiave esatte</li>\n<li>Ha bisogno di logica booleana (AND, OR, NOT)</li>\n<li>Ha bisogno di risposta sub-millisecond</li>\n<li>Vuole corrispondenza di 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>Risposta:</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>Esempi</h2>\n<h3>Trova memorie sul 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>Restituisce memorie su &quot;deployment&quot;, &quot;release&quot;, &quot;publishing&quot;, &quot;rolling out&quot;,\necc.</p>\n<h3>Trova pattern di autenticazione</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>Restituisce memorie su login, auth, JWT, gestione sessioni, OAuth, ecc.</p>\n<h3>Trova memorie simili</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 similarità semantica (tramite tag condivisi E vettori di embedding).</p>\n<h2>Generazione degli embedding</h2>\n<h3>Quando vengono generati gli embedding?</h3>\n<ul>\n<li><strong>Su memorizzazione</strong> — se il servizio embedding è configurato, l&#39;embedding viene generato in modo sincrono</li>\n<li><strong>Generazione batch</strong> — <code>POST /memory/embed-batch</code> genera embedding per le memorie che ne sono sprovviste</li>\n<li><strong>Aggiornamenti asincroni</strong> — quando il contenuto viene aggiornato, l&#39;embedding viene rigenerato</li>\n</ul>\n<h3>Provider di embedding</h3>\n<p>Synapse supporta provider di embedding configurabili:</p>\n<ul>\n<li><strong>OpenAI</strong> (<code>text-embedding-3-small</code>, <code>text-embedding-3-large</code>)</li>\n<li><strong>Modelli locali</strong> (tramite Ollama o simili)</li>\n<li><strong>Personalizzato</strong> (implementi l&#39;interfaccia embeddings)</li>\n</ul>\n<p>Configuri tramite variabili di 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>Generazione batch</h3>\n<p>Per menti con molte memorie sprovviste di embedding:</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>Prestazioni</h2>\n<table>\n<thead>\n<tr>\n<th>Operazione</th>\n<th>Latenza</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Genera embedding (OpenAI)</td>\n<td>100-200ms</td>\n</tr>\n<tr>\n<td>Ricerca semantica (1k memorie)</td>\n<td>50-100ms</td>\n</tr>\n<tr>\n<td>Ricerca semantica (10k memorie)</td>\n<td>200-500ms</td>\n</tr>\n<tr>\n<td>Generazione batch (100 memorie)</td>\n<td>10-20s</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-note\">La ricerca semantica è più lenta di FTS5 a causa del calcolo vettoriale. Usi\nFTS5 per parole chiave note, semantica per query concettuali.</div><h2>Limitazioni</h2>\n<h3>Costo degli embedding</h3>\n<p>Se usa OpenAI, generare embedding costa denaro (~$0,02 per 1M token per\ntext-embedding-3-small). Per 10.000 memorie con una media di 100 token ciascuna,\nsono ~$0,02 — trascurabile.</p>\n<h3>Cold start</h3>\n<p>Le memorie salvate prima che gli embedding fossero configurati non avranno\nembedding. Esegua <code>POST /memory/embed-batch</code> per backfill.</p>\n<h3>Dipendenza dal provider</h3>\n<p>Se il provider di embedding è down, la ricerca semantica fallisce in modo\ngrazioso (restituisce risultati vuoti o errore). FTS5 continua a funzionare.</p>\n<h2>Quando gli embedding non sono disponibili</h2>\n<p>Se il servizio embedding non è configurato:</p>\n<ul>\n<li><code>GET /memory/semantic-search</code> restituisce 503 Service Unavailable</li>\n<li><code>POST /memory</code> funziona comunque (solo senza embedding generato)</li>\n<li>La ricerca FTS5 funziona ancora</li>\n</ul>\n<h2>Best practice</h2>\n<div class=\"callout callout-ok\"></div><h2>Prossimi passi</h2>\n<ul>\n<li><a href=\"/docs/concepts/fts5-search\">Ricerca FTS5</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/concepts/architecture\">Architettura</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"]}