---
title: ابنِ روبوت RAG يُجيب من أي صفحة ويب في n8n (7 عقد)
description: وصل مُشغِّل دردشة بوكيل AI مع ذاكرة نافذة واسترجاع من رابط مباشر. السير يجلب الصفحة مع كل سؤال، يُقسمها إلى chunks، يُرتبها بالصلة بالاستعلام، ويُؤصل إجابة gpt-5-mini بمراجع مصدر — بدون قاعدة بيانات متجهية، بدون فاتورة embeddings.
url: https://nerdleveltech.com/ar/guides/n8n-rag-chat-webpage
language: ar
last_updated: '2026-04-24'
category: tooling
reading_time_minutes: 17
author: NerdLevelTech
keywords:
  - روبوت RAG n8n
  - دردشة مع صفحة AI
  - n8n chat trigger
  - استرجاع معزز بالجيل
  - وكيل AI بذاكرة n8n
  - RAG بدون قاعدة بيانات متجهية
markdown_url: https://nerdleveltech.com/ar/guides/n8n-rag-chat-webpage.md
attribution: 'Source: NerdLevelTech — https://nerdleveltech.com/ar/guides/n8n-rag-chat-webpage'
terms: https://nerdleveltech.com/llms.txt
---

# ابنِ روبوت RAG يُجيب من أي صفحة ويب في n8n (7 عقد)

*آخر تحديث: 2026-04-24 | بُني واستُورد مباشرة على nerdleveltech.app.n8n.cloud | gpt-5-mini*

> **سبع عقد، مُشغِّل دردشة واحد، قاعدة معرفة مدعومة بـURL واحد، صفر قاعدة بيانات متجهية — وُصلت وحُفظت على n8n cloud.** هذا أبسط روبوت RAG يمكنك بناؤه في n8n، وكافٍ لـ90% من حالات استخدام "دردشة مع مستنداتنا" الحقيقية. محادثة حقيقية مُلتقطة في الأسفل.

## ما الذي ستبنيه

سير مُشغَّل بالدردشة:

- يعرض **واجهة دردشة جاهزة للمشاركة** (n8n يستضيفها على رابط عام)
- عند كل رسالة مستخدم، **يجلب رابط قاعدة المعرفة طازجاً** (يلتقط التحديثات فوراً)
- **يُقسِّم الصفحة** ويُرتب chunks حسب مطابقة الكلمات المفتاحية مع سؤال المستخدم
- يُمرر أفضل 6 chunks إلى **وكيل AI** مُؤصَّل بذلك السياق
- يستخدم **ذاكرة نافذية** فيتذكر الوكيل آخر 6 رسائل من المحادثة
- يرفض الإجابة عندما لا يحتوي السياق على الإجابة

<a href="https://nerdleveltech.com/images/guides/n8n-rag-chat-webpage/step1-workflow-overview.png" target="_blank" rel="noopener noreferrer">
  <img src="https://nerdleveltech.com/images/guides/n8n-rag-chat-webpage/step1-workflow-overview.png" alt="سير دردشة RAG: When chat message received ← Set KB URL ← Fetch KB Page ← Extract & Chunk ← RAG Agent، مع OpenAI Chat Model و Chat Memory كعقد فرعية" />
</a>

### تخطَّ البناء — استورد السير

<div className="not-prose my-2">
  <a href="https://nerdleveltech.com/downloads/n8n-rag-chat-webpage.json" download="n8n-rag-chat-webpage.json" className="inline-flex items-center gap-2 px-5 py-2.5 bg-indigo-600 hover:bg-indigo-700 text-white font-semibold rounded-lg transition-colors text-sm">⬇ تنزيل ملف JSON للسير</a>
</div>

---

## المتطلبات المسبقة

| المتطلب | التفاصيل |
|---------|----------|
| حساب n8n | تجربة مجانية |
| أرصدة OpenAI | 100 مجانية من n8n |
| رابط تدردش معه | صفحة مستنداتك أو منتجك أو مقالك |
| الوقت | حوالي 12 دقيقة |

**العقد المستخدمة:** Chat Trigger و Set و HTTP Request و Code و AI Agent و OpenAI Chat Model (فرعية) و Simple Memory Buffer Window (فرعية).

---

## الخطوة 1 — استيراد السير

أنشئ سير عمل جديد. ألصق JSON على اللوحة الفارغة. تُحمَّل سبع عقد. افتح **OpenAI Chat Model** الفرعية وتأكد من `gpt-5-mini` بدرجة حرارة `0.2` (منخفضة — إجابات مُؤصَّلة فقط).

احفظ بـ `Cmd+S` / `Ctrl+S`.

---

## الخطوة 2 — مُشغّل الدردشة

انقر نقراً مزدوجاً على **When chat message received**. مُشغِّل الدردشة لديه ثلاثة إعدادات مهمة:

| الإعداد | القيمة | لماذا |
|---------|--------|-------|
| Public | `true` | يكشف رابط الدردشة بدون مصادقة — شارك الرابط وأي شخص يجربه |
| Title | "Ask the docs" | يظهر في رأس واجهة الدردشة |
| Subtitle | "Ask anything about the URL configured in the 'Set KB URL' node." | يُحدد توقعات المستخدم |
| Allowed Origins | `*` | يتيح تضمين widget الدردشة على أي دومين |

اللوحة تُظهر رابطين. **Test URL** يُطلق أثناء التصحيح (يلتقط رسالة واحدة في كل مرة). **Production URL** يُصبح نشطاً بعد تبديل السير إلى `Active` (مفتاح أعلى اليمين)؛ هذا الرابط الذي تُشاركه مع المستخدمين.

<a href="https://nerdleveltech.com/images/guides/n8n-rag-chat-webpage/step2-chat-ui.png" target="_blank" rel="noopener noreferrer">
  <img src="https://nerdleveltech.com/images/guides/n8n-rag-chat-webpage/step2-chat-ui.png" alt="لوحة سير RAG مع لوحة الدردشة مثبتة في الأسفل — إدخال 'Type message, or press tab for previous one' جاهز لاختبار خط الأنابيب مباشرة" />
</a>

---

## الخطوة 3 — ضبط رابط قاعدة المعرفة

انقر نقراً مزدوجاً على **Set KB URL**. ثلاث تعيينات:

| الحقل | التعبير | الغرض |
|-------|---------|-------|
| `kbUrl` | `https://docs.n8n.io/` | الرابط الذي سيُجيب منه الروبوت. **عدّل هذا إلى صفحة مستنداتك/منتجك.** |
| `userQuery` | `{{ $json.chatInput \|\| $json.message \|\| '' }}` | يقرأ رسالة المستخدم عبر إصدارات n8n |
| `sessionId` | `{{ $json.sessionId \|\| 'default' }}` | يُحدد خيط المحادثة للذاكرة |

لتوجيه الروبوت إلى محتواك، فقط عدّل `kbUrl`. لا تغيير آخر ضروري.

---

## الخطوة 4 — الاسترجاع والترتيب (بدون متجهات)

انقر نقراً مزدوجاً على **Extract & Chunk**. عقدة Code هذه تقوم بأمرين:

### تجريد HTML

نفس النمط السابق — إزالة scripts و styles و nav و footer و tags و entities. يتبقى نص نظيف.

### التقسيم والترتيب

```javascript
const CHUNK = 500; // chars
const chunks = [];
for (let i = 0; i < text.length; i += CHUNK) chunks.push(text.slice(i, i + CHUNK));

const qTerms = userQuery.toLowerCase().match(/[a-z0-9]+/g) || [];
const scored = chunks.map((c, idx) => {
  const lower = c.toLowerCase();
  let score = 0;
  for (const t of qTerms) if (t.length > 2 && lower.includes(t)) score += 1;
  return { idx, score, chunk: c };
}).sort((a, b) => b.score - a.score).slice(0, 6);

const top = scored.sort((a, b) => a.idx - b.idx).map(s => s.chunk).join('\n---\n');
```

ثلاث حيل تستحق الملاحظة:

1. **chunks من 500 حرف.** كبير بما يكفي لاحتواء مفهوم كامل، صغير بما يكفي ليتسع أعلى 6 chunks في سياق LLM مع مطالبة النظام وتاريخ الدردشة.
2. **ترتيب بالعد.** كل مصطلح استعلام موجود في chunk يُضيف 1 للنتيجة. ليس حاداً مثل cosine similarity لكنه لا يتطلب استدعاء embeddings ويعمل جيداً لمحتوى نمط المستندات حيث كلمات المستخدم تطابق كلمات المستندات.
3. **إعادة الترتيب بالموقع قبل الضم.** أعلى chunks ترتيباً بالنتيجة يُعاد ترتيبها بموقعها الأصلي ليقرأ السياق بترتيب المستند الأصلي — يساعد LLM على متابعة التدفق عندما تأتي chunks من أقسام متتالية.

### لماذا يتفوق هذا على embeddings لقواعد المعرفة الصغيرة

| المقياس | ترتيب الكلمات المفتاحية | Embeddings |
|---------|------------------------|-----------|
| الإعداد | لا شيء | بناء index و vector DB و خدمة embed |
| التكلفة لكل استعلام | مجاني | 0.00002$ + تكلفة vector DB |
| زمن الانتظار البارد | <10 مللي ثانية | 200-500 مللي ثانية |
| الدقة على كلمات المستخدم الدقيقة | ممتاز | جيد |
| الدقة على الاستعلامات المُعاد صياغتها | ضعيف | ممتاز |
| يتعامل مع > 10 آلاف chunk | لا | نعم |

لصفحة مستندات واحدة أو مقال، سؤال المستخدم عادة يحتوي على نفس كلمات الإجابة — ترتيب الكلمات المفتاحية يفوز. للمجموعات الكبيرة متعددة الصفحات، بدّل إلى embeddings.

---

## الخطوة 5 — وكيل RAG المُؤصَّل

انقر نقراً مزدوجاً على **RAG Agent**. مطالبة النظام هي قلب التأصيل:

```text
You are a careful documentation assistant. Answer the user's question
using ONLY the context below. If the context does not contain the answer,
say so directly — do not invent.

KB SOURCE: {{ $json.kbUrl }}

RETRIEVED CONTEXT:
"""
{{ $json.context }}
"""

USER QUESTION: {{ $json.userQuery }}

RULES
- Cite the source inline as [source]({{ $json.kbUrl }}) once near the top.
- Prefer short, structured answers (bullets or small tables).
- Do not add disclaimers about being an AI.
- If the user's question is outside the docs, say so and suggest what they
  could ask instead.
```

### لماذا "ONLY the context below" مهمة

gpt-5-mini تدرب على الإنترنت العام — لديه آراء حول مستندات n8n سواء أعطيته السياق أم لا. بدون قيد "ONLY"، يدمج بسعادة ذكرياته من التدريب مع السياق المُسترجع، ويختلق محددات تبدو صحيحة لكنها ليست في مستنداتك.

القيد الصريح يُسقط معدل الهلوسة بشكل كبير. **نتيجة اختبار حقيقي:** سألنا "What is the n8n form trigger and what types of fields can it have?" مقابل `https://docs.n8n.io/` (الصفحة الرئيسية، التي لا تحتوي على تفاصيل form-trigger). الوكيل **رفض الاختلاق بشكل صحيح**:

<a href="https://nerdleveltech.com/images/guides/n8n-rag-chat-webpage/step3-real-conversation.png" target="_blank" rel="noopener noreferrer">
  <img src="https://nerdleveltech.com/images/guides/n8n-rag-chat-webpage/step3-real-conversation.png" alt="دردشة RAG حقيقية مُلتقطة من n8n: سؤال المستخدم 'What is the n8n form trigger and what types of fields can it have?' واستجابة الوكيل المُؤصلة بأنه لا يجد تلك المعلومات في مقتطف المستندات المُقدم ويقترح استعلامين أكثر تحديداً — مُولَّد في 7.2 ثانية بـ 880 رمز، كل العقد الـ5 خضراء" />
</a>

> "I cannot find a description of the 'n8n Form Trigger' or a list of the types of fields it supports in the provided documentation excerpt. If you want that information, you can ask for: 'Show the n8n Docs page for the n8n Form Trigger'..."

هذا هو **السلوك الصحيح** — chunks الصفحة الرئيسية لم تحتوي على تفاصيل form-trigger، فأبرز الوكيل الفجوة بدلاً من التخمين. **7.2 ثانية و ~880 رمز** من البداية للنهاية.

### AI Agent مقابل Basic LLM Chain

لماذا نستخدم `agent` بدلاً من `chainLlm`؟ سببان:

1. **دعم الذاكرة.** AI Agent لديه موصل `ai_memory` أصلي لتاريخ الدردشة. Basic LLM Chain ليس لديه.
2. **دعم الأدوات.** إذا أضفت أدوات لاحقاً (آلة حاسبة أو web search أو سير آخر)، Agent يستخدمها تلقائياً. السلسلة لا تستطيع.

---

## الخطوة 6 — ذاكرة الدردشة النافذية

انقر نقراً مزدوجاً على عقدة **Chat Memory** الفرعية. الإعدادات:

| الإعداد | القيمة | الأثر |
|---------|--------|-------|
| Session ID Type | From input | يستخدم `sessionId` المضبوط سابقاً |
| Session Key | `{{ $('Set KB URL').item.json.sessionId }}` | يحصر الذاكرة في جلسة الدردشة |
| Context Window Length | `6` | يتذكر آخر 6 رسائل |

عند 6 دورات، gpt-5-mini يرى ~12 رسالة متبادلة user/assistant إضافة إلى سياق الاسترجاع. هذا كافٍ لأسئلة المتابعة مثل "وماذا في الإنتاج؟" بدون تفجير ميزانية السياق.

ارفع النافذة إلى 10-15 لمحادثات أطول مقابل بعض مساحة السياق للاسترجاع. اخفض إلى 2-3 لـQ&A صارم حيث المتابعات لا تهم.

---

## التوسعات: قاعدة معرفة متعددة الروابط، vector store، المصادقة

### روابط متعددة (موقع مستندات حقيقي)

استبدل حقل `kbUrl` الواحد في Set KB URL بمصفوفة. أضف عقدة **Split In Batches** لجلب كل الروابط بالتوازي، ثم **Merge** + عقدة Code لدمج النصوص المُسترجعة قبل الترتيب. Chunks من صفحات مختلفة تحصل على نفس تمريرة الترتيب وأعلى 6 chunks عبر كل الصفحات تذهب إلى الوكيل.

### استبدل ترتيب الكلمات المفتاحية بـvector search

أضف عقدة **Vector Store (Pinecone/Supabase)** فرعية. انقل الترتيب من عقدة Code إلى سير ingestion يشتغل مرة، يُضمِّن chunks بعقدة OpenAI embedding، ويخزنها. في سير الدردشة، استبدل Extract & Chunk بعقدة استعلام **Vector Store**. الوكيل يستهلك النتائج بنفس الطريقة — بدون تغييرات للمطالبة.

### بوابة الدردشة بالمصادقة

اضبط مفتاح **Public** في Chat Trigger على `false`. وَلِّد رمز وصول في إعدادات العقدة، والمستخدمون يحتاجون تضمينه كـheader عند تضمين الدردشة. يدمج مع عقدة **If** قبل ذلك لإجابات بحسب الدور ("يمكنك رؤية هذا، لا يمكنك").

### تسجيل المحادثات في قاعدة بيانات

أضف عقدة **Postgres Insert** (أو Supabase أو MySQL) بعد RAG Agent. سجِّل `{ session_id, question, answer, retrieved_chunks, response_time, feedback }` للتحليلات. راجع يومياً الأسئلة التي حصلت على استجابة "لا أعرف" — تلك ثغرات مستنداتك.

---

## ما التالي

لديك الآن نمط RAG الأساسي. مكانان لأخذه:

- **نمِّ قاعدة المعرفة**: اربط هذا مع [ملخص أخبار متعدد المصادر](https://nerdleveltech.com/guides/n8n-multisource-news-digest) لتغذية محتوى مدونة يومي في vector store.
- **أبرزه**: ضمِّن widget الدردشة في صفحة هبوط مبنية بخط أنابيب محتوى [يوتيوب إلى تدوينة AI](https://nerdleveltech.com/guides/n8n-youtube-to-blog).

[^1]: LangChain Agent — [توثيق n8n](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/)
[^2]: Simple Memory Buffer Window — [توثيق n8n](https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.memorybufferwindow/)
[^3]: تضمين Chat Trigger — [توثيق n8n](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.chattrigger/)

## الأسئلة الشائعة

### لماذا بدون قاعدة بيانات متجهية؟ أليست مطلوبة لـRAG؟

قواعد البيانات المتجهية مطلوبة عندما تكون قاعدة معرفتك أكبر من نافذة سياق LLM. لرابط واحد (صفحة مستندات، صفحة منتج، مقال)، النص الكامل يتسع في سياق gpt-5-mini الـ 128k بسهولة، والاسترجاع المبني على الكلمات المفتاحية يطابق مصطلحات الاستعلام مع chunks في زمن O(n) — سريع، مجاني، بدون فاتورة embeddings. عندما توسع إلى 100+ صفحة أو مليون+ مستند، بدّل ترتيب عقدة Code بـvector store حقيقي (Pinecone، Supabase، Postgres pgvector). باقي السير يبقى كما هو.

### كيف أُشارك الروبوت مع المستخدمين؟

مُشغِّل الدردشة لديه رابطان في لوحة العقدة: رابط الاختبار ورابط الإنتاج. اضغط رابط الإنتاج بعد نشر السير (فعّل active). n8n يُقدم واجهة دردشة كاملة على ذلك الرابط — أرسل الرابط لمستخدميك، بدون مصادقة. للدردشة المدمجة في موقعك، انسخ snippet 'Embed in website' من لوحة Chat Trigger — script tag صغير تُلصقه في أي صفحة.

### الوكيل يُجيب أحياناً خارج السياق. كيف أوقف ذلك؟

ثلاث روافع في المطالبة، بترتيب الفعالية: (1) الرفض الصريح — 'إذا لم يحتوي السياق على الإجابة، قل ذلك مباشرة — لا تختلق' موجود مسبقاً في المطالبة؛ تحقق أنه لم يُحذف. (2) درجة الحرارة — اخفض من 0.2 إلى 0.0. عند 0.0 النموذج لا يحقن تخمينات إبداعية أبداً. (3) صيغة المخرجات — اطلب الإجابات تستشهد بالجملة الدقيقة من السياق المُسترجع. إذا لم يستطع النموذج الاستشهاد، لا يستطيع الإجابة.

### لماذا يجلب السير الرابط مع كل رسالة بدلاً من التخزين المؤقت؟

لصفحة مستندات/منتج تتغير أسبوعياً، إعادة الجلب مع كل رسالة تلتقط التحديثات بدون منطق cache invalidation. طلب HTTP ~100ms، تافه مقارنة بـ2-3 ثانية استجابة LLM. إذا أردت التخزين المؤقت، أضف عقدة Cache في n8n (أو Redis عبر HTTP) مفتاحها الرابط مع TTL ساعة — لكن لمعظم حالات الاستخدام، الطزاجة تفوز.
