{"title":"البحث الدلالي (التضمينات)","slug":"semantic-search","category":"concepts","summary":"بحث مفاهيمي في الذاكرة باستخدام التضمينات المتجهة — ابحث بالمعنى، لا بالكلمات المفتاحية فقط.","audience":["human","llm"],"tags":["concept","semantic","embeddings","vector-search"],"difficulty":"advanced","updated":"2026-06-27","word_count":516,"read_minutes":3,"lang":"ar","translated":true,"requested_lang":"ar","content_markdown":"\n# البحث الدلالي (التضمينات)\n\nيدعم Synapse البحث الدلالي باستخدام التضمينات المتجهة. على عكس FTS5 (مطابقة\nالكلمات المفتاحية)، يجد البحث الدلالي الذكريات بـ **المعنى** — حتى لو لم تتطابق\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لإيجاد الذكريات المتشابهة دلاليًا، يحسب Synapse تشابه جيب التمام\nبين متجه الاستعلام ومتجه كل ذاكرة. تشابه أعلى = صلة\nأكبر.\n\n## متى تستخدم البحث الدلالي\n\n### استخدم البحث الدلالي عندما:\n\n- تريد \"ذكريات حول X\" حيث يُوصف X بشكل مختلف عن المخزّن\n- لا يُرجع FTS5 نتائج (لا مطابقة للكلمات المفتاحية)\n- تريد تجميعًا مفاهيميًا (مثلًا جميع ذكريات \"النشر\"، حتى لو قال بعضها \"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\n```bash\ncurl .../memory/semantic-search?q=how+do+users+log+in\n```\n\nيُرجع الذكريات حول login و auth و JWT و إدارة الجلسة و OAuth، إلخ.\n\n### إيجاد ذكريات مماثلة\n\n```bash\n# إيجاد ذكريات مشابهة لذاكرة محددة\ncurl .../memory/related/mem_001\n```\n\nيستخدم التشابه الدلالي (عبر الوسوم المشتركة AND متجهات التضمين).\n\n## توليد التضمينات\n\n### متى تُولّد التضمينات؟\n\n- **عند تخزين الذاكرة** — إذا كانت خدمة التضمينات مُعدّة، يُولّد التضمين تزامنيًا\n- **التوليد الدفعي** — يُولّد `POST /memory/embed-batch` تضمينات للذكريات المفتقرة إليها\n- **التحديثات غير المتزامنة** — عند تحديث المحتوى، يُعاد توليد التضمين\n\n### مزوّدو التضمينات\n\nيدعم Synapse مزوّدي تضمينات قابلين للإعداد:\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للعقول التي تفتقر ذكرياتها الكثيرة إلى التضمينات:\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| بحث دلالي (1k ذاكرة) | 50-100 مللي ث |\n| بحث دلالي (10k ذاكرة) | 200-500 مللي ث |\n| توليد دفعي (100 ذاكرة) | 10-20 ث |\n\n> [!NOTE]\n> البحث الدلالي أبطأ من FTS5 بسبب حساب المتجهات. استخدم FTS5\n> للكلمات المفتاحية المعروفة، والدلالي للاستعلامات المفاهيمية.\n\n## القيود\n\n### تكلفة التضمينات\n\nإذا كنت تستخدم OpenAI، فإن توليد التضمينات يكلف مالًا (~$0.02 لكل 1M رمزًا\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 البحث الدلالي باستخدام التضمينات المتجهة. على عكس FTS5 (مطابقة\nالكلمات المفتاحية)، يجد البحث الدلالي الذكريات بـ <strong>المعنى</strong> — حتى لو لم تتطابق\nالكلمات المفتاحية.</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 بُعدًا) لكل محتوى ذاكرة.</p>\n<h3>تشابه جيب التمام</h3>\n<p>لإيجاد الذكريات المتشابهة دلاليًا، يحسب Synapse تشابه جيب التمام\nبين متجه الاستعلام ومتجه كل ذاكرة. تشابه أعلى = صلة\nأكبر.</p>\n<h2>متى تستخدم البحث الدلالي</h2>\n<h3>استخدم البحث الدلالي عندما:</h3>\n<ul>\n<li>تريد &quot;ذكريات حول X&quot; حيث يُوصف X بشكل مختلف عن المخزّن</li>\n<li>لا يُرجع FTS5 نتائج (لا مطابقة للكلمات المفتاحية)</li>\n<li>تريد تجميعًا مفاهيميًا (مثلًا جميع ذكريات &quot;النشر&quot;، حتى لو قال بعضها &quot;release&quot;)</li>\n<li>الاستعلام سؤال: &quot;كيف نتعامل مع المصادقة؟&quot;</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>يُرجع الذكريات حول &quot;deployment&quot; و &quot;release&quot; و &quot;publishing&quot; و &quot;rolling out&quot;،\nإلخ.</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 و إدارة الجلسة و 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>يستخدم التشابه الدلالي (عبر الوسوم المشتركة AND متجهات التضمين).</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>للعقول التي تفتقر ذكرياتها الكثيرة إلى التضمينات:</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>بحث دلالي (1k ذاكرة)</td>\n<td>50-100 مللي ث</td>\n</tr>\n<tr>\n<td>بحث دلالي (10k ذاكرة)</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 بسبب حساب المتجهات. استخدم FTS5\nللكلمات المفتاحية المعروفة، والدلالي للاستعلامات المفاهيمية.</div><h2>القيود</h2>\n<h3>تكلفة التضمينات</h3>\n<p>إذا كنت تستخدم OpenAI، فإن توليد التضمينات يكلف مالًا (~$0.02 لكل 1M رمزًا\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>إذا كان مزوّد التضمينات متوقفًا، يفشل البحث الدلالي بلطف (يُرجع\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"]}