9 دقيقة قراءة#chatbot development

بناء روبوت محادثة RAG باستخدام LangGraph: منح روبوت المحادثة الخاص بك المعرفة

بناء روبوت محادثة RAG باستخدام LangGraph: منح روبوت المحادثة الخاص بك المعرفة

مقدمة

في المقال السابق، قمنا بتوسيع قدرات روبوت المحادثة لدينا بإضافة تصنيف النوايا والتوجيه الشرطي. أصبح بإمكان روبوت المحادثة الآن تحديد ما إذا كان سؤال المستخدم مرتبطًا بـ Hiwa AI قبل اتخاذ قرار بشأن ما إذا كان يجب متابعة معالجة الطلب.

يبدو الرسم البياني بهذا الشكل:

Article Media

ومع ذلك، لا يزال لدينا قيد مهم في روبوت المحادثة الخاص بنا.

يمكنها تحديد ما إذا كان السؤال مرتبطًا بـ Hiwa AI، ولكن نموذج اللغة نفسه لا يعرف بالضرورة أي شيء عن الموقع الإلكتروني الحالي للشركة. على سبيل المثال، قد يسأل المستخدم:

ما هي الخدمات التي تقدمها Hiwa AI؟

لا يُمكن توقع أن يعرف النموذج الإجابة لمجرد وجود المعلومات على موقع الشركة.

يمكننا وضع كل محتوى الموقع داخل موجه النظام، لكن هذا النهج لا يتوسع بسهولة. يمكن أن يحتوي الموقع على مئات أو آلاف الصفحات، وإرسال كل هذه المعلومات إلى النموذج لكل سؤال سيكون غير فعال للغاية. بدلاً من ذلك، نحتاج إلى طريقة لاسترداد المعلومات ذات الصلة فقط بسؤال المستخدم.

هنا يأتي دور التوليد المعزز بالاسترجاع (RAG).


ما هو RAG؟

RAG تعني التوليد المعزز بالاسترجاع.

الفكرة الأساسية بسيطة:

  1. تخزين المعلومات في قاعدة معرفية قابلة للبحث.
  2. ابحث في قاعدة المعرفة عندما يطرح المستخدم سؤالًا.
  3. استرداد المعلومات الأكثر صلة.
  4. أعطِ تلك المعلومات لنموذج اللغة.
  5. دع النموذج يولد إجابة باستخدام السياق المسترجع.

بدلاً من هذا

Article Media

نقدم خطوة الاسترجاع:

Article Media

لا يزال نموذج اللغة مسؤولًا عن توليد الإجابة، ولكن المعلومات المستخدمة لتوليد تلك الإجابة تأتي من قاعدة المعرفة الخاصة بنا. وهذا مفيد بشكل خاص عند العمل مع النماذج المحلية لأننا لا نحتاج إلى تدريب النموذج على محتوى الموقع الإلكتروني.


الخطوة الأولى: جمع محتوى الموقع

قبل أن نتمكن من البحث في الموقع، نحتاج إلى استخراج محتواه. يحتوي الموقع على العديد من أنواع المعلومات المختلفة:

  • نص
  • قوائم التنقل
  • العناوين والتذييلات
  • الصور
  • روابط
  • عناصر HTML
  • البيانات الوصفية

بالنسبة لروبوت المحادثة الخاص بنا، نحن مهتمون بشكل أساسي بالمحتوى النصي ذو المعنى. قد يقوم زاحف بسيط باسترداد صفحة ويب مثل هذه:

python
import requests 
from bs4 import BeautifulSoup 
def extract_text(url: str) -> str: 
  response = requests.get(url) 
  response.raise_for_status()

  soup = BeautifulSoup(response.text, "html.parser") 

  for element in soup(["script", "style", "nav", "footer"]):
   element.decompose() 
  return soup.get_text(" ", strip=True)

تقوم هذه الوظيفة بتنزيل الصفحة، وإزالة العناصر غير المفيدة لقاعدة المعرفة لدينا، وإرجاع النص المتبقي. ومع ذلك، بالنسبة لموقع ويب حقيقي، نحتاج عادةً إلى زاحف أكثر تطورًا.

قد نحتاج إلى:

  • اكتشف صفحات متعددة.
  • اتبع الروابط.
  • اقرأ خريطة الموقع.
  • تجنب الزحف إلى نفس الصفحة عدة مرات.
  • التعامل مع المحتوى المُنشأ ديناميكيًا.
  • تخزين عنوان URL المرتبط بكل مستند.

الفكرة المهمة هي أن RAG يبدأ قبل روبوت الدردشة نفسه. نحتاج أولاً إلى بناء المعرفة التي سيبحث عنها روبوت الدردشة في النهاية.


الخطوة الثانية: تقسيم المحتوى إلى أجزاء

يمكن أن تحتوي صفحة الويب على كمية كبيرة من النصوص. بشكل عام، لا نريد تخزين صفحة ويب كاملة كوثيقة واحدة ضخمة. بدلاً من ذلك، نقوم بتقسيم المحتوى إلى أجزاء أصغر تُسمى أجزاء. على سبيل المثال، تخيل أن الصفحة تحتوي على:

  • تقدم Hiwa AI العديد من الخدمات المدعومة بالذكاء الاصطناعي.
  • تتيح المنصة للشركات أتمتة سير العمل المختلفة.
  • يمكن للمستخدمين أيضًا دمج إمكانيات الذكاء الاصطناعي في تطبيقاتهم الحالية.
  • توفر Hiwa AI أدوات لمعالجة المستندات والمساعدين الذكيين.

بدلاً من معالجة الصفحة بأكملها كوثيقة واحدة، يمكننا تقسيمها إلى أقسام أصغر:

  • تقدم Hiwa AI العديد من الخدمات المدعومة بالذكاء الاصطناعي.
  • تتيح المنصة للشركات أتمتة سير العمل المختلفة.
  • يمكن للمستخدمين أيضًا دمج إمكانات الذكاء الاصطناعي في تطبيقاتهم الحالية.
  • تقدم Hiwa AI أدوات لمعالجة المستندات والمساعدات الذكية.

هذا يجعل الاسترجاع أكثر دقة. إذا سأل المستخدم:

ما الذي يمكن للشركات أتمتته؟

نريد استرداد جزء النقاش حول أتمتة سير العمل بدلاً من صفحة الموقع بأكملها.


الخطوة 3: إنشاء التضمينات

الآن لدينا أجزاء من النصوص، ولكن ما زلنا بحاجة إلى طريقة للبحث فيها بناءً على معناها. هنا تأتي فائدة التضميدات. يقوم نموذج التضميد بتحويل النص إلى قائمة من الأرقام تُسمى متجهًا. على سبيل المثال:

"ما هي الخدمات التي تقدمها Hiwa AI؟"

قد يتم تحويلها إلى شيء مشابه من الناحية المفاهيمية:

[0.12, -0.43, 0.87, 0.21, ...]

المتجه الفعلي أكبر بكثير من هذا المثال. الفكرة المهمة هي أن أجزاء النصوص المتشابهة دلاليًا تميل إلى امتلاك متجهات متشابهة. على سبيل المثال:

"ما هي الخدمات التي تقدمها Hiwa AI؟"

و

تقدم "Hiwa AI" خدمات مدعومة بالذكاء الاصطناعي للشركات.

جمل مختلفة، لكن لها معنى متشابهًا. لذلك، يجب أن تكون تضميناتها متقاربة نسبيًا في فضاء المتجهات. يمكننا توليد تضمين باستخدام نموذج تضمين:

python
from openai import OpenAI 
client = OpenAI( api_key="YOUR_API_KEY" ) 
def embed_text(text: str) -> list[float]: 
  response = client.embeddings.create( model="BAAI/bge-m3", input=text, ) 
return response.data[0].embedding 

نموذج التضمين الدقيق ليس مهماً لفهم البنية. الجزء المهم هو أنه يجب استخدام نفس نموذج التضمين عند تخزين المستندات وعند البحث عنها.


الخطوة 4: تخزين الأجزاء

يجب تخزين كل جزء مع تضمينه. قد يبدو سجل قاعدة البيانات البسيط بهذا الشكل:

معرفنصتضمينأنت مترجم فني خبير متخصص في أنظمة الذكاء الاصطناعي، والبرمجيات المؤسسية، وهندسة البلوكشين. ترجم النص بدقة إلى العربية. القواعد: 1. احافظ على الدقة الفنية والأسلوب. 2. لا تترجم بناء جملة الأكواد، أو الكلمات المفتاحية البرمجية، أو أسماء الدوال، أو أسماء المتغيرات، أو عناوين URL، أو مدخلات سطر الأوامر. 3. أخرج فقط النص المترجم دون علامات اقتباس أو تعليقات محادثة. 4. قد يحتوي النص على علامات مرجعية مثل §L0§...§/L0§ تحيط بتسمية رابط مرئي. قم بترجمة الكلمات بين زوج من هذه العلامات بشكل طبيعي، ولكن أعد إنتاج علامات §L0§/§/L0§ نفسها تمامًا كما هي دون تغيير في نفس الزوج المطابق في المخرجات. لا تحذفها أبدًا أو تغير أسماءها أو تدمجها.
٤٢تقدم Hiwa AI أدوات مدعومة بالذكاء الاصطناعي للشركات.[0.12، -0.43، 0.87، ...]"https://hiwaai.com/services"

النص مهم لأن هذا هو ما سنعطيه في النهاية لنموذج اللغة. التضمين مهم لأن هذا هو ما نستخدمه للعثور على النص ذي الصلة. عنوان URL مفيد لتتبع مصدر المعلومات ويمكن استخدامه لاحقًا لتوفير استشهادات للمستخدم.


الخطوة 5: البحث في قاعدة المعرفة

الآن لدينا كل ما يلزم لإجراء عملية الاسترجاع. لنفترض أن المستخدم يسأل:

ما هي الخدمات التي تقدمها Hiwa AI؟

أولاً، نقوم بإنشاء تضمين للسؤال.

python
query_embedding = embed_text( "What services does Hiwa AI provide?")

لدينا الآن متجه يمثل سؤال المستخدم. بعد ذلك، نقارن هذا المتجه مع المتجهات المخزنة في قاعدة البيانات الخاصة بنا. من الناحية المفاهيمية، تبدو العملية كالتالي:

سؤال المستخدم │ ▼ تضمين الاستعلام │ ▼ مقارنة مع التضمينات المخزنة │ ▼ العثور على القطع الأكثر تشابهًا │ ▼ إعادة النص ذي الصلة

يمكن أن تستخدم عملية حساب التشابه مقاييس مسافة مختلفة. أحد المقاييس الشائعة الاستخدام هو تشابه جيب التمام. قد تبدو النتيجة كما يلي:

python
[ 
  {"text": "Hiwa AI provides AI-powered tools for businesses.",
  "score": 0.91 }, 
  {"text": "The platform provides intelligent document processing.", 
  "score": 0.87 }, 
  {"text": "Businesses can integrate AI assistants into their workflows.", 
  "score": 0.82 } ] 


القطع ذات الدرجات الأعلى هي التي نعتبرها الأكثر صلة بسؤال المستخدم.


الخطوة 6: تمرير المعلومات المسترجعة إلى نموذج اللغة الكبيرة (LLM)

في هذه المرحلة، لدينا المعلومات التي يحتاجها النموذج. يمكننا دمج الأجزاء المسترجعة مع سؤال المستخدم. على سبيل المثال:

python
context = "\n\n".join( chunk["text"] for chunk in retrieved_chunks ) 

ثم نقوم ببناء موجه:

python
prompt = f""" You are an assistant for Hiwa AI. Answer the user's question using the provided context. Context: {context} Question: {user_question} """

يمكننا الآن إرسال هذا الأمر إلى نموذج اللغة الخاص بنا:

python
response = llm.invoke(prompt) print(response.content) 

الشيء المهم الذي يجب ملاحظته هو أن النموذج لا يحتاج إلى معرفة الموقع مسبقًا. نحن نقدم المعلومات ذات الصلة في وقت الاستدلال. هذه هي الفكرة الأساسية وراء التوليد المعزز بالاسترجاع.


تجميع خطوة الاسترجاع

يمكننا الآن دمج الخطوات الفردية في وظيفة استرجاع بسيطة:

python
def retrieve_documents( query: str, top_k: int = 3,):
  query_embedding = embed_text(query) 
  results = search_similar_chunks(query_embedding=query_embedding, top_k=top_k,)
return results

ثم يمكن للروبوت الدردشة استخدامه بهذه الطريقة:

python
user_question = "What services does Hiwa AI provide?"
documents = retrieve_documents(user_question)
context = "\n\n".join( document["text"] for document in documents )
prompt = f""" You are an assistant for Hiwa AI. Use the following context to answer the question. Context: {context} Question: {user_question} """
response = llm.invoke(prompt) 
print(response.content) 

سير العمل العام الآن هو:

Article Media

ربط هذا بـ LangGraph الخاص بنا

في هذه المرحلة، لدينا جزأين منفصلين. من المقال السابق، لدينا تصنيف النية والتوجيه الشرطي، والآن لدينا خط أنابيب الاسترجاع. الخطوة التالية هي دمج هاتين الفكرتين. بدلاً من إرسال السؤال ذي الصلة مباشرة إلى روبوت الدردشة، يمكننا توجيهه أولاً من خلال عقدة الاسترجاع:

Article Media

الآن لدى روبوت الدردشة جميع المكونات الثلاثة المهمة:

  • يمكنه فهم نية المستخدم.
  • يمكنه استرداد المعلومات ذات الصلة.
  • يمكنه إنشاء إجابة باستخدام تلك المعلومات.

في المقالة التالية، سنقوم بدمج خطوة الاسترجاع مع سير عمل LangGraph الخاص بنا وسنقوم ببناء روبوت الدردشة RAG الكامل.


الخاتمة

نموذج اللغة بمفرده ليس كافيًا دائمًا لبناء تطبيق مفيد. عندما نحتاج إلى روبوت محادثة للإجابة على أسئلة حول مصدر معلومات محدد ومتغير، نحتاج إلى طريقة لتوفير تلك المعرفة للنموذج.

يحل RAG هذه المشكلة عن طريق فصل استرجاع المعرفة عن توليد الإجابة. العملية مباشرة:

Article Media

الأهم أننا لـسنا بحاجة إلى إعادة تدريب نموذجنا اللغوي في كل مرة يتغير فيها الموقع. يمكننا ببساطة تحديث قاعدة المعرفة. وهذا يجعل RAG نهجًا عمليًا لبناء تطبيقات الذكاء الاصطناعي التي تحتاج إلى العمل مع معلومات خاصة أو خاصة بمجال معين أو تتغير بشكل متكرر.

Hiwa AI Logo
هـيـوا للذكاء الاصطناعي

تطوير متخصص لأنظمة الذكاء الاصطناعي المستقلة والعقد الموزعة عالية الاعتمادية للمؤسسات الدولية.

منصة متقدمة للذكاء الاصطناعي والوكلاء الأذكياء
التواصل الرقمي:

المنصة

  • حول هيوا
  • الوظائف
  • المدونة

معلومات الاتصال

طهران، طريق ستاري السريع، شارع مخبري، قبل شارع شاهين، رقم 147، الطابق الثاني، الوحدة 3
© 2026 هـيـوا للذكاء الاصطناعي. جميع الحقوق المادية والمعنوية محفوظة.
سياسة الخصوصيةسياسة ملفات تعريف الارتباطإعدادات ملفات تعريف الارتباطشروط الاستخدامالإشعار القانوني
لديك سؤال؟ اسأل هيوا!