{"title":"Recherche sémantique (embeddings)","slug":"semantic-search","category":"concepts","summary":"Recherche de mémoire conceptuelle utilisant des embeddings vectoriels — trouver par signification, pas seulement par mots-clés.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":648,"read_minutes":3,"lang":"fr","translated":true,"requested_lang":"fr","content_markdown":"\n# Recherche sémantique (embeddings)\n\nSynapse prend en charge la recherche sémantique utilisant des embeddings vectoriels.\nContrairement à FTS5 (correspondance par mots-clés), la recherche sémantique trouve\nles mémoires par **signification** — même si aucun mot-clé ne correspond.\n\n## Comment ça marche\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### Que sont les embeddings ?\n\nLes embeddings sont des représentations vectorielles numériques du texte. Le texte\navec une signification similaire a des vecteurs similaires. Synapse génère un vecteur\n(ex. 1536 dimensions) pour le contenu de chaque mémoire.\n\n### Similarité cosinus\n\nPour trouver les mémoires sémantiquement similaires, Synapse calcule la similarité\ncosinus entre le vecteur de requête et chaque vecteur de mémoire. Similarité plus\nélevée = plus pertinent.\n\n## Quand utiliser la recherche sémantique\n\n### Utilisez la recherche sémantique quand :\n\n- Vous voulez « des mémoires sur X » où X est décrit différemment que stocké\n- FTS5 ne renvoie aucun résultat (aucune correspondance de mot-clé)\n- Vous voulez un regroupement conceptuel (ex. toutes les mémoires « deployment », même si certaines disent « release »)\n- La requête est une question : « comment gérons-nous l'authentification ? »\n\n### Utilisez FTS5 quand :\n\n- Vous connaissez les mots-clés exacts\n- Vous avez besoin de logique booléenne (AND, OR, NOT)\n- Vous avez besoin d'une réponse sub-milliseconde\n- Vous voulez la correspondance de phrase\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\nRéponse :\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## Exemples\n\n### Trouver les mémoires de déploiement\n\n```bash\n# FTS5 peut en manquer — la sémantique les attrape toutes\ncurl .../memory/semantic-search?q=deployment+process\n```\n\nRenvoie les mémoires sur « deployment », « release », « publishing », « rolling out »,\netc.\n\n### Trouver les schémas d'authentification\n\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nRenvoie les mémoires sur le login, l'auth, le JWT, la gestion de session, OAuth, etc.\n\n### Trouver des mémoires similaires\n\n```bash\n# Trouver les mémoires similaires à une spécifique\ncurl .../memory/related/mem_001\n```\n\nUtilise la similarité sémantique (via tags partagés ET vecteurs d'embedding).\n\n## Génération d'embeddings\n\n### Quand les embeddings sont-ils générés ?\n\n- **Au stockage de mémoire** — si le service d'embeddings est configuré, l'embedding est généré de manière synchrone\n- **Génération par lot** — `POST /memory/embed-batch` génère des embeddings pour les mémoires qui en manquent\n- **Mises à jour asynchrones** — quand le contenu est mis à jour, l'embedding est régénéré\n\n### Fournisseurs d'embeddings\n\nSynapse prend en charge des fournisseurs d'embeddings configurables :\n\n- **OpenAI** (`text-embedding-3-small`, `text-embedding-3-large`)\n- **Modèles locaux** (via Ollama ou similaire)\n- **Personnalisé** (implémentez l'interface embeddings)\n\nConfigurez via des variables d'environnement :\n\n```bash\nEMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small\n```\n\n### Génération par lot\n\nPour les minds avec beaucoup de mémoires sans embeddings :\n\n```bash\n# Générer des embeddings pour jusqu'à 100 mémoires\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# Vérifier la progression\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/memory/embed-batch-status\n```\n\n## Performance\n\n| Opération | Latence |\n|-----------|---------|\n| Génération d'embedding (OpenAI) | 100-200 ms |\n| Recherche sémantique (1k mémoires) | 50-100 ms |\n| Recherche sémantique (10k mémoires) | 200-500 ms |\n| Génération par lot (100 mémoires) | 10-20 s |\n\n> [!NOTE]\n> La recherche sémantique est plus lente que FTS5 en raison du calcul vectoriel.\n> Utilisez FTS5 pour les mots-clés connus, sémantique pour les requêtes conceptuelles.\n\n## Limites\n\n### Coût des embeddings\n\nSi vous utilisez OpenAI, générer des embeddings coûte de l'argent (~0,02 $ par 1M\ntokens pour text-embedding-3-small). Pour 10 000 mémoires de 100 tokens en moyenne,\ncela représente ~0,02 $ — négligeable.\n\n### Démarrage à froid\n\nLes mémoires stockées avant la configuration des embeddings n'en auront pas. Exécutez\n`POST /memory/embed-batch` pour les rétroalimenter.\n\n### Dépendance au fournisseur\n\nSi le fournisseur d'embeddings est en panne, la recherche sémantique échoue\ngracieusement (renvoie des résultats vides ou une erreur). FTS5 fonctionne toujours.\n\n## Quand les embeddings ne sont pas disponibles\n\nSi le service d'embeddings n'est pas configuré :\n\n- `GET /memory/semantic-search` renvoie 503 Service Unavailable\n- `POST /memory` fonctionne toujours (simplement aucun embedding généré)\n- La recherche FTS5 fonctionne toujours\n\n## Bonnes pratiques\n\n> [!TIP]\n> - **Utilisez sémantique pour les requêtes conceptuelles** — « comment gérons-nous X ? »\n> - **Utilisez FTS5 pour les termes spécifiques** — « docker swarm »\n> - **Rétroalimentez les embeddings régulièrement** — `POST /memory/embed-batch`\n> - **Surveillez la santé du fournisseur** — la recherche sémantique en dépend\n> - **Combinez avec les tags** — sémantique + filtre de tag affine les résultats\n\n## Prochaines étapes\n\n- [Recherche FTS5](/docs/concepts/fts5-search)\n- [API Memory](/docs/api/memory)\n- [Architecture](/docs/concepts/architecture)\n","content_html":"<h1>Recherche sémantique (embeddings)</h1>\n<p>Synapse prend en charge la recherche sémantique utilisant des embeddings vectoriels.\nContrairement à FTS5 (correspondance par mots-clés), la recherche sémantique trouve\nles mémoires par <strong>signification</strong> — même si aucun mot-clé ne correspond.</p>\n<h2>Comment ça marche</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>Que sont les embeddings ?</h3>\n<p>Les embeddings sont des représentations vectorielles numériques du texte. Le texte\navec une signification similaire a des vecteurs similaires. Synapse génère un vecteur\n(ex. 1536 dimensions) pour le contenu de chaque mémoire.</p>\n<h3>Similarité cosinus</h3>\n<p>Pour trouver les mémoires sémantiquement similaires, Synapse calcule la similarité\ncosinus entre le vecteur de requête et chaque vecteur de mémoire. Similarité plus\nélevée = plus pertinent.</p>\n<h2>Quand utiliser la recherche sémantique</h2>\n<h3>Utilisez la recherche sémantique quand :</h3>\n<ul>\n<li>Vous voulez « des mémoires sur X » où X est décrit différemment que stocké</li>\n<li>FTS5 ne renvoie aucun résultat (aucune correspondance de mot-clé)</li>\n<li>Vous voulez un regroupement conceptuel (ex. toutes les mémoires « deployment », même si certaines disent « release »)</li>\n<li>La requête est une question : « comment gérons-nous l&#39;authentification ? »</li>\n</ul>\n<h3>Utilisez FTS5 quand :</h3>\n<ul>\n<li>Vous connaissez les mots-clés exacts</li>\n<li>Vous avez besoin de logique booléenne (AND, OR, NOT)</li>\n<li>Vous avez besoin d&#39;une réponse sub-milliseconde</li>\n<li>Vous voulez la correspondance de phrase</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>Réponse :</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>Exemples</h2>\n<h3>Trouver les mémoires de déploiement</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># FTS5 peut en manquer — la sémantique les attrape toutes</span>\ncurl .../memory/semantic-search?q=deployment+process</code></pre><p>Renvoie les mémoires sur « deployment », « release », « publishing », « rolling out »,\netc.</p>\n<h3>Trouver les schémas d&#39;authentification</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>Renvoie les mémoires sur le login, l&#39;auth, le JWT, la gestion de session, OAuth, etc.</p>\n<h3>Trouver des mémoires similaires</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Trouver les mémoires similaires à une spécifique</span>\ncurl .../memory/related/mem_001</code></pre><p>Utilise la similarité sémantique (via tags partagés ET vecteurs d&#39;embedding).</p>\n<h2>Génération d&#39;embeddings</h2>\n<h3>Quand les embeddings sont-ils générés ?</h3>\n<ul>\n<li><strong>Au stockage de mémoire</strong> — si le service d&#39;embeddings est configuré, l&#39;embedding est généré de manière synchrone</li>\n<li><strong>Génération par lot</strong> — <code>POST /memory/embed-batch</code> génère des embeddings pour les mémoires qui en manquent</li>\n<li><strong>Mises à jour asynchrones</strong> — quand le contenu est mis à jour, l&#39;embedding est régénéré</li>\n</ul>\n<h3>Fournisseurs d&#39;embeddings</h3>\n<p>Synapse prend en charge des fournisseurs d&#39;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>Modèles locaux</strong> (via Ollama ou similaire)</li>\n<li><strong>Personnalisé</strong> (implémentez l&#39;interface embeddings)</li>\n</ul>\n<p>Configurez via des variables d&#39;environnement :</p>\n<pre><code class=\"hljs language-bash\">EMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small</code></pre><h3>Génération par lot</h3>\n<p>Pour les minds avec beaucoup de mémoires sans embeddings :</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Générer des embeddings pour jusqu&#x27;à 100 mémoires</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\"># Vérifier la progression</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>Opération</th>\n<th>Latence</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Génération d&#39;embedding (OpenAI)</td>\n<td>100-200 ms</td>\n</tr>\n<tr>\n<td>Recherche sémantique (1k mémoires)</td>\n<td>50-100 ms</td>\n</tr>\n<tr>\n<td>Recherche sémantique (10k mémoires)</td>\n<td>200-500 ms</td>\n</tr>\n<tr>\n<td>Génération par lot (100 mémoires)</td>\n<td>10-20 s</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-note\">La recherche sémantique est plus lente que FTS5 en raison du calcul vectoriel.\nUtilisez FTS5 pour les mots-clés connus, sémantique pour les requêtes conceptuelles.</div><h2>Limites</h2>\n<h3>Coût des embeddings</h3>\n<p>Si vous utilisez OpenAI, générer des embeddings coûte de l&#39;argent (~0,02 $ par 1M\ntokens pour text-embedding-3-small). Pour 10 000 mémoires de 100 tokens en moyenne,\ncela représente ~0,02 $ — négligeable.</p>\n<h3>Démarrage à froid</h3>\n<p>Les mémoires stockées avant la configuration des embeddings n&#39;en auront pas. Exécutez\n<code>POST /memory/embed-batch</code> pour les rétroalimenter.</p>\n<h3>Dépendance au fournisseur</h3>\n<p>Si le fournisseur d&#39;embeddings est en panne, la recherche sémantique échoue\ngracieusement (renvoie des résultats vides ou une erreur). FTS5 fonctionne toujours.</p>\n<h2>Quand les embeddings ne sont pas disponibles</h2>\n<p>Si le service d&#39;embeddings n&#39;est pas configuré :</p>\n<ul>\n<li><code>GET /memory/semantic-search</code> renvoie 503 Service Unavailable</li>\n<li><code>POST /memory</code> fonctionne toujours (simplement aucun embedding généré)</li>\n<li>La recherche FTS5 fonctionne toujours</li>\n</ul>\n<h2>Bonnes pratiques</h2>\n<div class=\"callout callout-ok\"></div><h2>Prochaines étapes</h2>\n<ul>\n<li><a href=\"/docs/concepts/fts5-search\">Recherche FTS5</a></li>\n<li><a href=\"/docs/api/memory\">API Memory</a></li>\n<li><a href=\"/docs/concepts/architecture\">Architecture</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"]}