{"title":"Семантичний пошук (ембеддинги)","slug":"semantic-search","category":"concepts","summary":"Концептуальний пошук спогадів із використанням векторних ембеддингів — пошук за змістом, а не лише за ключовими словами.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":505,"read_minutes":3,"lang":"uk","translated":true,"requested_lang":"uk","content_markdown":"\n# Семантичний пошук (ембеддинги)\n\nSynapse підтримує семантичний пошук за допомогою векторних ембеддингів. На відміну\nвід FTS5 (зіставлення ключових слів), семантичний пошук знаходить спогади за\n**змістом** — навіть якщо ключові слова не збігаються.\n\n## Як це працює\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### Що таке ембеддинги?\n\nЕмбеддинги — це числові векторні представлення тексту. Текст зі схожим змістом\nмає схожі вектори. Synapse генерує вектор (напр. 1536 вимірів) для вмісту\nкожного спогаду.\n\n### Косинусна подібність\n\nДля пошуку семантично схожих спогадів Synapse обчислює косинусну подібність\nміж вектором запиту та вектором кожного спогаду. Більша подібність = більша\nрелевантність.\n\n## Коли використовувати семантичний пошук\n\n### Використовуйте семантичний пошук, коли:\n\n- Потрібні «спогади про X», де X описано інакше, ніж збережено\n- FTS5 не повертає результатів (немає збігу ключових слів)\n- Потрібне концептуальне групування (напр. усі спогади про «deployment», навіть якщо деякі кажуть «release»)\n- Запит є питанням: «як ми обробляємо автентифікацію?»\n\n### Використовуйте FTS5, коли:\n\n- Знаєте точні ключові слова\n- Потрібна булева логіка (AND, OR, NOT)\n- Потрібна затримка менше мілісекунди\n- Потрібен пошук фраз\n\n## Кінцева точка\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\nВідповідь:\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## Приклади\n\n### Пошук спогадів про розгортання\n\n```bash\n# FTS5 може пропустити деякі — семантичний ловить усі\ncurl .../memory/semantic-search?q=deployment+process\n```\n\nПовертає спогади про «deployment», «release», «publishing», «rolling out» тощо.\n\n### Пошук шаблонів автентифікації\n\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nПовертає спогади про login, auth, JWT, session management, OAuth тощо.\n\n### Пошук подібних спогадів\n\n```bash\n# Знайти спогади, подібні до конкретного\ncurl .../memory/related/mem_001\n```\n\nВикористовує семантичну подібність (через спільні теги ТА вектори ембеддингів).\n\n## Генерування ембеддингів\n\n### Коли генеруються ембеддинги?\n\n- **При збереженні спогаду** — якщо службу ембеддингів налаштовано, ембеддинг генерується синхронно\n- **Пакетна генерація** — `POST /memory/embed-batch` генерує ембеддинги для спогадів, що їх не мають\n- **Асинхронні оновлення** — при оновленні вмісту ембеддинг регенерується\n\n### Постачальники ембеддингів\n\nSynapse підтримує настроюваних постачальників ембеддингів:\n\n- **OpenAI** (`text-embedding-3-small`, `text-embedding-3-large`)\n- **Локальні моделі** (через Ollama або подібні)\n- **Користувацькі** (реалізуйте інтерфейс ембеддингів)\n\nНалаштування через змінні середовища:\n\n```bash\nEMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small\n```\n\n### Пакетна генерація\n\nДля mind-ів із багатьма спогадами без ембеддингів:\n\n```bash\n# Згенерувати ембеддинги для до 100 спогадів\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# Перевірити прогрес\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/memory/embed-batch-status\n```\n\n## Продуктивність\n\n| Операція | Затримка |\n|-----------|---------|\n| Генерування ембеддингу (OpenAI) | 100-200мс |\n| Семантичний пошук (1к спогадів) | 50-100мс |\n| Семантичний пошук (10к спогадів) | 200-500мс |\n| Пакетна генерація (100 спогадів) | 10-20с |\n\n> [!NOTE]\n> Семантичний пошук повільніший за FTS5 через обчислення векторів. Використовуйте\n> FTS5 для відомих ключових слів, семантичний — для концептуальних запитів.\n\n## Обмеження\n\n### Вартість ембеддингів\n\nЯкщо використовуєте OpenAI, генерування ембеддингів коштує гроші (~$0.02 за 1М\nтокенів для text-embedding-3-small). Для 10 000 спогадів у середньому по 100\nтокенів кожен — це ~$0.02, що несуттєво.\n\n### Холодний старт\n\nСпогади, збережені до налаштування ембеддингів, не матимуть ембеддингів. Запустіть\n`POST /memory/embed-batch` для заповнення.\n\n### Залежність від постачальника\n\nЯкщо постачальник ембеддингів недоступний, семантичний пошук м'яко завершується\nпомилкою (повертає порожні результати або помилку). FTS5 продовжує працювати.\n\n## Коли ембеддинги недоступні\n\nЯкщо службу ембеддингів не налаштовано:\n\n- `GET /memory/semantic-search` повертає 503 Service Unavailable\n- `POST /memory` продовжує працювати (просто ембеддинг не генерується)\n- Пошук FTS5 продовжує працювати\n\n## Найкращі практики\n\n> [!TIP]\n> - **Семантичний для концептуальних запитів** — «як ми обробляємо X?»\n> - **FTS5 для конкретних термінів** — «docker swarm»\n> - **Регулярно заповнюйте ембеддинги** — `POST /memory/embed-batch`\n> - **Моніторте стан постачальника** — від нього залежить семантичний пошук\n> - **Комбінуйте з тегами** — семантичний + фільтр тегів звужує результати\n\n## Наступні кроки\n\n- [Пошук FTS5](/docs/concepts/fts5-search)\n- [Memory API](/docs/api/memory)\n- [Архітектура](/docs/concepts/architecture)\n","content_html":"<h1>Семантичний пошук (ембеддинги)</h1>\n<p>Synapse підтримує семантичний пошук за допомогою векторних ембеддингів. На відміну\nвід FTS5 (зіставлення ключових слів), семантичний пошук знаходить спогади за\n<strong>змістом</strong> — навіть якщо ключові слова не збігаються.</p>\n<h2>Як це працює</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>Що таке ембеддинги?</h3>\n<p>Ембеддинги — це числові векторні представлення тексту. Текст зі схожим змістом\nмає схожі вектори. Synapse генерує вектор (напр. 1536 вимірів) для вмісту\nкожного спогаду.</p>\n<h3>Косинусна подібність</h3>\n<p>Для пошуку семантично схожих спогадів Synapse обчислює косинусну подібність\nміж вектором запиту та вектором кожного спогаду. Більша подібність = більша\nрелевантність.</p>\n<h2>Коли використовувати семантичний пошук</h2>\n<h3>Використовуйте семантичний пошук, коли:</h3>\n<ul>\n<li>Потрібні «спогади про X», де X описано інакше, ніж збережено</li>\n<li>FTS5 не повертає результатів (немає збігу ключових слів)</li>\n<li>Потрібне концептуальне групування (напр. усі спогади про «deployment», навіть якщо деякі кажуть «release»)</li>\n<li>Запит є питанням: «як ми обробляємо автентифікацію?»</li>\n</ul>\n<h3>Використовуйте FTS5, коли:</h3>\n<ul>\n<li>Знаєте точні ключові слова</li>\n<li>Потрібна булева логіка (AND, OR, NOT)</li>\n<li>Потрібна затримка менше мілісекунди</li>\n<li>Потрібен пошук фраз</li>\n</ul>\n<h2>Кінцева точка</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>Відповідь:</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>Приклади</h2>\n<h3>Пошук спогадів про розгортання</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># FTS5 може пропустити деякі — семантичний ловить усі</span>\ncurl .../memory/semantic-search?q=deployment+process</code></pre><p>Повертає спогади про «deployment», «release», «publishing», «rolling out» тощо.</p>\n<h3>Пошук шаблонів автентифікації</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>Повертає спогади про login, auth, JWT, session management, OAuth тощо.</p>\n<h3>Пошук подібних спогадів</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Знайти спогади, подібні до конкретного</span>\ncurl .../memory/related/mem_001</code></pre><p>Використовує семантичну подібність (через спільні теги ТА вектори ембеддингів).</p>\n<h2>Генерування ембеддингів</h2>\n<h3>Коли генеруються ембеддинги?</h3>\n<ul>\n<li><strong>При збереженні спогаду</strong> — якщо службу ембеддингів налаштовано, ембеддинг генерується синхронно</li>\n<li><strong>Пакетна генерація</strong> — <code>POST /memory/embed-batch</code> генерує ембеддинги для спогадів, що їх не мають</li>\n<li><strong>Асинхронні оновлення</strong> — при оновленні вмісту ембеддинг регенерується</li>\n</ul>\n<h3>Постачальники ембеддингів</h3>\n<p>Synapse підтримує настроюваних постачальників ембеддингів:</p>\n<ul>\n<li><strong>OpenAI</strong> (<code>text-embedding-3-small</code>, <code>text-embedding-3-large</code>)</li>\n<li><strong>Локальні моделі</strong> (через Ollama або подібні)</li>\n<li><strong>Користувацькі</strong> (реалізуйте інтерфейс ембеддингів)</li>\n</ul>\n<p>Налаштування через змінні середовища:</p>\n<pre><code class=\"hljs language-bash\">EMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small</code></pre><h3>Пакетна генерація</h3>\n<p>Для mind-ів із багатьма спогадами без ембеддингів:</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Згенерувати ембеддинги для до 100 спогадів</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\"># Перевірити прогрес</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>Продуктивність</h2>\n<table>\n<thead>\n<tr>\n<th>Операція</th>\n<th>Затримка</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Генерування ембеддингу (OpenAI)</td>\n<td>100-200мс</td>\n</tr>\n<tr>\n<td>Семантичний пошук (1к спогадів)</td>\n<td>50-100мс</td>\n</tr>\n<tr>\n<td>Семантичний пошук (10к спогадів)</td>\n<td>200-500мс</td>\n</tr>\n<tr>\n<td>Пакетна генерація (100 спогадів)</td>\n<td>10-20с</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-note\">Семантичний пошук повільніший за FTS5 через обчислення векторів. Використовуйте\nFTS5 для відомих ключових слів, семантичний — для концептуальних запитів.</div><h2>Обмеження</h2>\n<h3>Вартість ембеддингів</h3>\n<p>Якщо використовуєте OpenAI, генерування ембеддингів коштує гроші (~$0.02 за 1М\nтокенів для text-embedding-3-small). Для 10 000 спогадів у середньому по 100\nтокенів кожен — це ~$0.02, що несуттєво.</p>\n<h3>Холодний старт</h3>\n<p>Спогади, збережені до налаштування ембеддингів, не матимуть ембеддингів. Запустіть\n<code>POST /memory/embed-batch</code> для заповнення.</p>\n<h3>Залежність від постачальника</h3>\n<p>Якщо постачальник ембеддингів недоступний, семантичний пошук м&#39;яко завершується\nпомилкою (повертає порожні результати або помилку). FTS5 продовжує працювати.</p>\n<h2>Коли ембеддинги недоступні</h2>\n<p>Якщо службу ембеддингів не налаштовано:</p>\n<ul>\n<li><code>GET /memory/semantic-search</code> повертає 503 Service Unavailable</li>\n<li><code>POST /memory</code> продовжує працювати (просто ембеддинг не генерується)</li>\n<li>Пошук FTS5 продовжує працювати</li>\n</ul>\n<h2>Найкращі практики</h2>\n<div class=\"callout callout-ok\"></div><h2>Наступні кроки</h2>\n<ul>\n<li><a href=\"/docs/concepts/fts5-search\">Пошук FTS5</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/concepts/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"]}