{"title":"Wyszukiwanie semantyczne (osadzenia)","slug":"semantic-search","category":"concepts","summary":"Koncepcyjne wyszukiwanie wspomnień z użyciem osadzeń wektorowych — znajdowanie po znaczeniu, nie tylko słowach kluczowych.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":528,"read_minutes":3,"lang":"pl","translated":true,"requested_lang":"pl","content_markdown":"\n# Wyszukiwanie semantyczne (osadzenia)\n\nSynapse obsługuje wyszukiwanie semantyczne z użyciem osadzeń wektorowych. W\nprzeciwieństwie do FTS5 (dopasowywanie słów kluczowych), wyszukiwanie semantyczne\nznajduje wspomnienia po **znaczeniu** — nawet gdy nie ma dopasowania słów\nkluczowych.\n\n## Jak to działa\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### Czym są osadzenia?\n\nOsadzenia to liczbowe reprezentacje wektorowe tekstu. Tekst o podobnym znaczeniu\nma podobne wektory. Synapse generuje wektor (np. 1536 wymiarów) dla treści\nkażdego wspomnienia.\n\n### Podobieństwo cosinusowe\n\nAby znaleźć semantycznie podobne wspomnienia, Synapse oblicza podobieństwo\ncosinusowe między wektorem zapytania a każdym wektorem wspomnienia. Wyższe\npodobieństwo = większa trafność.\n\n## Kiedy używać wyszukiwania semantycznego\n\n### Użyć wyszukiwania semantycznego, gdy:\n\n- Potrzebne są „wspomnienia o X\", gdzie X jest opisane inaczej niż zapisane\n- FTS5 nie zwraca wyników (brak dopasowania słów kluczowych)\n- Wymagane grupowanie koncepcyjne (np. wszystkie wspomnienia o „wdrożeniu\", nawet jeśli niektóre mówią „release\")\n- Zapytanie jest pytaniem: „jak obsługujemy autoryzację?\"\n\n### Użyć FTS5, gdy:\n\n- Znane są dokładne słowa kluczowe\n- Wymagana logika boolowska (AND, OR, NOT)\n- Wymagana odpowiedź poniżej milisekundy\n- Wymagane dopasowanie frazy\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\nOdpowiedź:\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## Przykłady\n\n### Znajdowanie wspomnień o wdrożeniu\n\n```bash\n# FTS5 może niektóre pominąć — semantyczne wyłapuje wszystkie\ncurl .../memory/semantic-search?q=deployment+process\n```\n\nZwraca wspomnienia o „deployment\", „release\", „publishing\", „rolling out\" itp.\n\n### Znajdowanie wzorców autoryzacji\n\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nZwraca wspomnienia o logowaniu, autoryzacji, JWT, zarządzaniu sesjami, OAuth itp.\n\n### Znajdowanie podobnych wspomnień\n\n```bash\n# Znalezienie wspomnień podobnych do konkretnego\ncurl .../memory/related/mem_001\n```\n\nUżywa podobieństwa semantycznego (przez współdzielone tagi i wektory osadzeń).\n\n## Generowanie osadzeń\n\n### Kiedy generowane są osadzenia?\n\n- **Przy zapisie wspomnienia** — jeśli skonfigurowano usługę osadzeń, są one generowane synchronicznie\n- **Generowanie wsadowe** — `POST /memory/embed-batch` generuje osadzenia dla wspomnień, które ich nie mają\n- **Aktualizacje asynchroniczne** — gdy treść jest aktualizowana, osadzenie jest regenerowane\n\n### Dostawcy osadzeń\n\nSynapse obsługuje konfigurowalnych dostawców osadzeń:\n\n- **OpenAI** (`text-embedding-3-small`, `text-embedding-3-large`)\n- **Modele lokalne** (przez Ollama lub podobne)\n- **Własne** (implementacja interfejsu osadzeń)\n\nKonfiguracja przez zmienne środowiskowe:\n\n```bash\nEMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small\n```\n\n### Generowanie wsadowe\n\nDla umysłów z wieloma wspomnieniami bez osadzeń:\n\n```bash\n# Generowanie osadzeń dla maksymalnie 100 wspomnień\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# Sprawdzenie postępu\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/memory/embed-batch-status\n```\n\n## Wydajność\n\n| Operacja | Opóźnienie |\n|-----------|---------|\n| Generowanie osadzenia (OpenAI) | 100-200 ms |\n| Wyszukiwanie semantyczne (1k wspomnień) | 50-100 ms |\n| Wyszukiwanie semantyczne (10k wspomnień) | 200-500 ms |\n| Generowanie wsadowe (100 wspomnień) | 10-20 s |\n\n> [!NOTE]\n> Wyszukiwanie semantyczne jest wolniejsze niż FTS5 z powodu obliczeń wektorowych.\n> FTS5 należy stosować dla znanych słów kluczowych, semantyczne — do zapytań\n> koncepcyjnych.\n\n## Ograniczenia\n\n### Koszt osadzeń\n\nW przypadku użycia OpenAI generowanie osadzeń kosztuje (około 0,02 USD za 1M\ntokenów dla text-embedding-3-small). Dla 10 000 wspomnień średnio po 100 tokenów\nkażde — około 0,02 USD — zaniedbywalne.\n\n### Zimny start\n\nWspomnienia zapisane przed skonfigurowaniem osadzeń nie będą ich miały. Należy\nuruchomić `POST /memory/embed-batch`, aby wykonać backfill.\n\n### Zależność od dostawcy\n\nJeśli dostawca osadzeń jest niedostępny, wyszukiwanie semantyczne kończy się\nłagodnie (zwraca puste wyniki lub błąd). FTS5 nadal działa.\n\n## Gdy osadzenia nie są dostępne\n\nJeśli usługa osadzeń nie jest skonfigurowana:\n\n- `GET /memory/semantic-search` zwraca 503 Service Unavailable\n- `POST /memory` nadal działa (tylko bez generowania osadzenia)\n- Wyszukiwanie FTS5 nadal działa\n\n## Najlepsze praktyki\n\n> [!TIP]\n> - **Semantyczne do zapytań koncepcyjnych** — „jak obsługujemy X?\"\n> - **FTS5 dla konkretnych terminów** — „docker swarm\"\n> - **Regularnie wykonywać backfill osadzeń** — `POST /memory/embed-batch`\n> - **Monitorować kondycję dostawcy** — wyszukiwanie semantyczne od niego zależy\n> - **Łączyć z tagami** — semantyczne + filtr tagów zawęża wyniki\n\n## Następne kroki\n\n- [Wyszukiwanie FTS5](/docs/concepts/fts5-search)\n- [Memory API](/docs/api/memory)\n- [Architektura](/docs/concepts/architecture)\n","content_html":"<h1>Wyszukiwanie semantyczne (osadzenia)</h1>\n<p>Synapse obsługuje wyszukiwanie semantyczne z użyciem osadzeń wektorowych. W\nprzeciwieństwie do FTS5 (dopasowywanie słów kluczowych), wyszukiwanie semantyczne\nznajduje wspomnienia po <strong>znaczeniu</strong> — nawet gdy nie ma dopasowania słów\nkluczowych.</p>\n<h2>Jak to działa</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>Czym są osadzenia?</h3>\n<p>Osadzenia to liczbowe reprezentacje wektorowe tekstu. Tekst o podobnym znaczeniu\nma podobne wektory. Synapse generuje wektor (np. 1536 wymiarów) dla treści\nkażdego wspomnienia.</p>\n<h3>Podobieństwo cosinusowe</h3>\n<p>Aby znaleźć semantycznie podobne wspomnienia, Synapse oblicza podobieństwo\ncosinusowe między wektorem zapytania a każdym wektorem wspomnienia. Wyższe\npodobieństwo = większa trafność.</p>\n<h2>Kiedy używać wyszukiwania semantycznego</h2>\n<h3>Użyć wyszukiwania semantycznego, gdy:</h3>\n<ul>\n<li>Potrzebne są „wspomnienia o X&quot;, gdzie X jest opisane inaczej niż zapisane</li>\n<li>FTS5 nie zwraca wyników (brak dopasowania słów kluczowych)</li>\n<li>Wymagane grupowanie koncepcyjne (np. wszystkie wspomnienia o „wdrożeniu&quot;, nawet jeśli niektóre mówią „release&quot;)</li>\n<li>Zapytanie jest pytaniem: „jak obsługujemy autoryzację?&quot;</li>\n</ul>\n<h3>Użyć FTS5, gdy:</h3>\n<ul>\n<li>Znane są dokładne słowa kluczowe</li>\n<li>Wymagana logika boolowska (AND, OR, NOT)</li>\n<li>Wymagana odpowiedź poniżej milisekundy</li>\n<li>Wymagane dopasowanie frazy</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>Odpowiedź:</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>Przykłady</h2>\n<h3>Znajdowanie wspomnień o wdrożeniu</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># FTS5 może niektóre pominąć — semantyczne wyłapuje wszystkie</span>\ncurl .../memory/semantic-search?q=deployment+process</code></pre><p>Zwraca wspomnienia o „deployment&quot;, „release&quot;, „publishing&quot;, „rolling out&quot; itp.</p>\n<h3>Znajdowanie wzorców autoryzacji</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>Zwraca wspomnienia o logowaniu, autoryzacji, JWT, zarządzaniu sesjami, OAuth itp.</p>\n<h3>Znajdowanie podobnych wspomnień</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Znalezienie wspomnień podobnych do konkretnego</span>\ncurl .../memory/related/mem_001</code></pre><p>Używa podobieństwa semantycznego (przez współdzielone tagi i wektory osadzeń).</p>\n<h2>Generowanie osadzeń</h2>\n<h3>Kiedy generowane są osadzenia?</h3>\n<ul>\n<li><strong>Przy zapisie wspomnienia</strong> — jeśli skonfigurowano usługę osadzeń, są one generowane synchronicznie</li>\n<li><strong>Generowanie wsadowe</strong> — <code>POST /memory/embed-batch</code> generuje osadzenia dla wspomnień, które ich nie mają</li>\n<li><strong>Aktualizacje asynchroniczne</strong> — gdy treść jest aktualizowana, osadzenie jest regenerowane</li>\n</ul>\n<h3>Dostawcy osadzeń</h3>\n<p>Synapse obsługuje konfigurowalnych dostawców osadzeń:</p>\n<ul>\n<li><strong>OpenAI</strong> (<code>text-embedding-3-small</code>, <code>text-embedding-3-large</code>)</li>\n<li><strong>Modele lokalne</strong> (przez Ollama lub podobne)</li>\n<li><strong>Własne</strong> (implementacja interfejsu osadzeń)</li>\n</ul>\n<p>Konfiguracja przez zmienne środowiskowe:</p>\n<pre><code class=\"hljs language-bash\">EMBEDDINGS_PROVIDER=openai\nEMBEDDINGS_API_KEY=sk-...\nEMBEDDINGS_MODEL=text-embedding-3-small</code></pre><h3>Generowanie wsadowe</h3>\n<p>Dla umysłów z wieloma wspomnieniami bez osadzeń:</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Generowanie osadzeń dla maksymalnie 100 wspomnień</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\"># Sprawdzenie postępu</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>Wydajność</h2>\n<table>\n<thead>\n<tr>\n<th>Operacja</th>\n<th>Opóźnienie</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Generowanie osadzenia (OpenAI)</td>\n<td>100-200 ms</td>\n</tr>\n<tr>\n<td>Wyszukiwanie semantyczne (1k wspomnień)</td>\n<td>50-100 ms</td>\n</tr>\n<tr>\n<td>Wyszukiwanie semantyczne (10k wspomnień)</td>\n<td>200-500 ms</td>\n</tr>\n<tr>\n<td>Generowanie wsadowe (100 wspomnień)</td>\n<td>10-20 s</td>\n</tr>\n</tbody></table>\n<div class=\"callout callout-note\">Wyszukiwanie semantyczne jest wolniejsze niż FTS5 z powodu obliczeń wektorowych.\nFTS5 należy stosować dla znanych słów kluczowych, semantyczne — do zapytań\nkoncepcyjnych.</div><h2>Ograniczenia</h2>\n<h3>Koszt osadzeń</h3>\n<p>W przypadku użycia OpenAI generowanie osadzeń kosztuje (około 0,02 USD za 1M\ntokenów dla text-embedding-3-small). Dla 10 000 wspomnień średnio po 100 tokenów\nkażde — około 0,02 USD — zaniedbywalne.</p>\n<h3>Zimny start</h3>\n<p>Wspomnienia zapisane przed skonfigurowaniem osadzeń nie będą ich miały. Należy\nuruchomić <code>POST /memory/embed-batch</code>, aby wykonać backfill.</p>\n<h3>Zależność od dostawcy</h3>\n<p>Jeśli dostawca osadzeń jest niedostępny, wyszukiwanie semantyczne kończy się\nłagodnie (zwraca puste wyniki lub błąd). FTS5 nadal działa.</p>\n<h2>Gdy osadzenia nie są dostępne</h2>\n<p>Jeśli usługa osadzeń nie jest skonfigurowana:</p>\n<ul>\n<li><code>GET /memory/semantic-search</code> zwraca 503 Service Unavailable</li>\n<li><code>POST /memory</code> nadal działa (tylko bez generowania osadzenia)</li>\n<li>Wyszukiwanie FTS5 nadal działa</li>\n</ul>\n<h2>Najlepsze praktyki</h2>\n<div class=\"callout callout-ok\"></div><h2>Następne kroki</h2>\n<ul>\n<li><a href=\"/docs/concepts/fts5-search\">Wyszukiwanie FTS5</a></li>\n<li><a href=\"/docs/api/memory\">Memory API</a></li>\n<li><a href=\"/docs/concepts/architecture\">Architektura</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"]}