تقنيات الاستعلامات المتعددة لاسترجاع المعلومات المعقدة
تعرف على تقنية الاستعلام المتعدد، وكيفية عملها، وكيفية تنفيذها خطوة بخطوة.
سنغطي ما يلي...
الاستعلام المتعدد هو تقنية تستخدم في نماذج RAG المتقدمة التي تعمل على تحسين استرجاع المستندات ذات الصلة بأسئلة المستخدم المعقدة.
تخيل أن مستخدمًا يطرح السؤال التالي: "ما هو LangSmith، ولماذا نحتاجه؟" قد لا يجد نظام استرجاع بسيط سوى المستندات التي تحتوي على العبارة "LangSmith" بالضبط. ولكن ماذا لو ناقش المستند LangSmith باستخدام مرادفات أو مفاهيم ذات صلة؟ هنا، يُساعد الاستعلام المتعدد على توليد صيغ متعددة للسؤال الأصلي، مع رصد جوانب مختلفة من قصد المستخدم. هذا يُوسّع نطاق البحث ويستعيد مستندات قد لا تحتوي على الكلمات المفتاحية نفسها، ولكنها لا تزال تحمل معلومات قيّمة.
ما هو الاستعلام المتعدد؟
يستخدم الاستعلام المتعدد نظام إدارة التعلم (LLM) لإنشاء إعادة صياغة تلقائية لسؤال المستخدم الأصلي. يهدف هذا إلى إنشاء نسخ متعددة تعكس وجهات نظر مختلفة حول نية المستخدم، مما يزيد من فرص العثور على مستندات ذات صلة حتى مع اختلاف طفيف في الصياغة. إليك كيفية عمله:
إدخال المستخدم الفردي: يبدأ كل شيء بسؤال واحد يطرحه المستخدم.
تنويع الاستعلامات: يتمثل المفهوم الأساسي للاستعلامات المتعددة في توسيع نطاق البحث ليتجاوز الاستعلام الأصلي. ويتحقق ذلك باستخدام أساليب البحث المتعمق أو غيرها من التقنيات لإعادة صياغة السؤال بأشكال مختلفة. تخيل طرح السؤال بشكل مختلف لإبراز كامل نطاق ما تبحث عنه.
إنشاء استعلامات متعددة: يقوم برنامج LLM بإنشاء عدة إصدارات أعيدت صياغتها من الاستعلام الأصلي، حيث يلتقط كل منها جانبًا أو منظورًا مختلفًا لنية المستخدم.
تنفيذ البحث المتوازي: يتم بعد ذلك استخدام هذه الاستعلامات المتعددة التي تمت صياغتها لإجراء عمليات بحث متوازية عبر مجموعة المستندات.
استرجاع المستندات: يقوم كل استعلام تمت صياغته مرة أخرى باسترجاع مجموعة من المستندات ذات الصلة بتلك الصياغة المحددة للسؤال.
تجميع النتائج: يتم تجميع المستندات المسترجعة من جميع الاستعلامات المختلفة. يضمن هذا التجميع مجموعة أوسع وأشمل من المستندات التي قد تحتوي على المعلومات ذات الصلة.
تقييم الصلة المعززة: يتم بعد ذلك تقييم المستندات المجمعة من حيث الصلة، مما يضمن تحديد المعلومات الأكثر صلة من المجموعة المتنوعة من المستندات المسترجعة.
الأساس للخطوات التالية: تصبح المستندات المسترجعة بناءً على كل اختلاف في الاستعلام بمثابة اللبنات الأساسية للخطوات اللاحقة في عملية RAG.
التنفيذ خطوة بخطوة
فيما يلي الخطوات اللازمة لتنفيذ الاستعلامات المتعددة:
1. استيراد الوحدات النمطية الضرورية
سنقوم باستيراد الوحدات المطلوبة من المكتبات المثبتة لتنفيذ الاستعلامات المتعددة:
تعتبر هذه المكتبات والوحدات ضرورية للخطوات اللاحقة في العملية.
2. إعداد مفاتيح API بـ LangSmith و OpenAI
يُنشئ مقتطف الكود التالي مفتاح API الخاص بـ LangChain مفتاح API OpenAI من متغيرات البيئة. سنحتاج إلى مفاتيح API صالحة للتفاعل مع نماذج لغة LangChain و OpenAI :
شرح الكود
الأسطر 1-4: إعداد متغيرات بيئة LangChain:
LANGCHAIN_TRACING_V2: يمكّن التتبع لعمليات LangChain.LANGCHAIN_ENDPOINT: يحدد نقطة النهاية لواجهة API LangChain.LANGCHAIN_API_KEY: عنصر نصي فارغ مفتاح واجهة API LangSmith LangChain. استبدله مفتاح الحالي.LANGCHAIN_PROJECT: يضبط اسم المشروع لعمليات LangChain إلى'Multi-Query'.
الأسطر 6-8: إعداد مفتاح API OpenAI :
OPENAI_API_KEY: نص فارغ مفتاح API OpenAI . استبدله مفتاح الحالي.التحقق: التحقق مما إذا كان
OPENAI_API_KEYفارغ ويثيرValueErrorإذا كان الأمر كذلك، فتأكد من توفير مفتاح API صالح لمصادقة طلبات API OpenAI .
3. تحضير البيانات وتقسيم النص
الآن، دعنا نحمل مستندات النصوص التي تريد استخدامها للاسترجاع ونقسمها:
شرح الكود
الأسطر 1-3: يتم تعريف المحملات لقراءة ملفات النصوص باستخدام
TextLoader، تحديد مسارات الملفات للمستندات التي سيتم تحميلها.الأسطر 5-7: قائمة فارغة
docsيتم إنشاء حلقة، ويتم تكرارها عبر المحملات، وتحميل محتوى كل مستند وتوسيعهdocsقائمة بالمحتوى المحمل.السطرين 9-10: أ
RecursiveCharacterTextSplitterيتم تهيئة حجم كتلة يبلغ 400 حرف وتداخل 60 حرفًا بين الكتل. ثم يقوم المُقسِّم بمعالجةdocsقائمة، وتقسيم كل مستند إلى أجزاء أصغر مناسبة للمعالجة من قبل طلاب الماجستير في القانون.
4. فهرسة الوثائق
بعد تقسيم النص، نُنشئ مخزن متجهات لتخزين واسترجاع أجزاء المستند بكفاءة. بالإضافة إلى ذلك، نُنشئ تضمينات لكل جزء لالتقاط معناه الدلالي.
شرح الكود
الخط 2: نستخدم
Chromaلإنشاء متجر المتجهات (vectorstore) مع أجزاء النص المحضرة لدينا (splits) وتوليد التضمينات باستخدامOpenAIEmbeddingsلالتقاط العلاقات الدلالية بين الكلمات في مقتطفات النص.السطر 4: أخيرًا، نقوم بتحويل مخزن المتجهات إلى مسترد باستخدام
as_retriever()، مما يتيح استرجاع المستندات استنادًا إلى استعلام التضمين.
5. إنشاء استعلام متعدد المنظورات باستخدام LLM
بعد أن أعددنا بياناتنا وفهرسناها، يمكننا التركيز على الوظيفة الأساسية للاستعلامات المتعددة. هنا، سنستخدم نموذجًا تجريبيًا لتوليد صيغ متعددة من سؤال المستخدم الأصلي:
شرح الكود
الأسطر من ١ إلى ٥: نُحدد نموذجًا مُوجَّهًا يُوجِّه الذكاء الاصطناعي لتوليد ثلاثة أشكال مُختلفة من سؤال المستخدم، مع التركيز على جوانب مُختلفة لمساعدة مُحرِّك البحث على استرجاع المستندات ذات الصلة. ينبغي أن يُقدِّم الذكاء الاصطناعي هذه الأسئلة البديلة في أسطر مُنفصلة.
الخط 7: نقوم بإنشاء
prompt_perspectivesكائن باستخدامChatPromptTemplate.from_template(template)يؤدي هذا إلى إعداد القالب الذي يجب على الذكاء الاصطناعي اتباعه عند إنشاء تنويعات الاستعلام.الأسطر 9-14: نحدد
generate_queriesسلسلة، تقوم بمعالجة المطالبة وتوليد الاستعلامات المعاد صياغتها:prompt_perspectives: هذا هو إخراج من السطر السابق، والذي يحتوي على معلومات حول سؤال المستخدم.| ChatOpenAI(temperature=0):يستخدم هذا الجزء دالة تسمىChatOpenAI.ChatOpenAIيتفاعل مع API OpenAI لإنشاء تنسيقات نصية إبداعية وtemperature=0تعيين معلمة للتحكم في عشوائية النص الناتج (0 يعني الحد الأدنى من العشوائية).| StrOutputParser(): الStrOutputParserيقوم بتحويل إخراج النموذج إلى سلسلة نصية.| (lambda x: x.split("\n")): أخيرًا، تقوم دالة lambda بتقسيم هذه السلسلة بواسطة أسطر جديدة (\n), مما أدى إلى إنشاء قائمة بالسؤال الأصلي وثلاثة أشكال مختلفة للاستعلام الناتج.
6. استرداد المستندات باستخدام الاستعلامات المتعددة
سنستخدم الآن استعلامات المنظور المتعددة المولدة لاسترداد المستندات ذات الصلة من مجموعة النصوص المفهرسة:
شرح الكود
الأسطر 1-19:
get_unique_unionتضمن الوظيفة استرجاع المستندات الفريدة من نتائج البحث.تسطيح الهيكل: تبدأ الوظيفة بتسطيح قائمة القوائم التي تحتوي على المستندات المُسترجَعة. هذا يُحوِّلها إلى قائمة واحدة، حيث يكون كل مستند عنصرًا مُستقلًا.
التحقق من التفرد: يتحقق مما إذا كانت المستندات تحتوي على سمة معرف فريدة، مثل
'id'إذا كانت هذه السمة موجودة، فإنها تستخرج هذه المعرفات الفريدة وتستخدم مجموعة منها لإزالة التكرارات.تحويل السلسلة (بديل): إذا لم يتم العثور على سمة مُعرِّف فريدة، تُحوِّل الدالة كل كائن مستند إلى تمثيل سلسلة نصية. هذا يسمح للعمليات القائمة على المجموعات بتحديد العناصر المكررة وإزالتها.
إرجاع المستندات الفريدة: أخيرًا، تقوم الوظيفة بإرجاع قائمة تحتوي فقط على المستندات الفريدة.
السطر 17: نقوم بتحديد سؤال المستخدم النموذجي،
"What is LangSmith, and why do we need it?".الخط 18:
retrieval_chainيجمع عملية إنشاء استعلامات متعددة (generate_queries) مع وظيفة استرجاع المستندات (retriever.map). يتم تمرير إخراج سلسلة الاسترجاع من خلالget_unique_unionلضمان النظر فقط في المستندات الفريدة في النتائج النهائية.السطرين 19-20: يتم استدعاء السلسلة باستخدام سؤال المستخدم إدخال، مما يؤدي إلى بدء عملية الاسترجاع وتخزين المستندات المستردة في
docsمتغير. طولdocsيشير إلى عدد المستندات الفريدة التي تم استردادها باستخدام استعلامات وجهات النظر المتعددة.
7. تشغيل نموذج RAG
يتم استدعاء السلسلة النهائية باستخدام سؤال المستخدم،"What is LangSmith, and why do we need it?" يؤدي هذا إلى استرداد المستندات ذات الصلة واستخدامها لإنشاء إجابة من خلال نموذج RAG:
شرح الكود
الأسطر 1-7: يحدد القالب كيفية قيام الذكاء الاصطناعي ببناء استجابة:
السياق والسؤال: يطلب من الذكاء الاصطناعي الإجابة على السؤال بناءً على السياق المقدم.
تهيئة القالب:
ChatPromptTemplate.from_templateتقوم الطريقة بتهيئة المطالبة باستخدام هذا القالب.
Line 9: The
ChatOpenAImodel is initialized with a temperature setting of, indicating deterministic responses. الأسطر 11-17:
final_rag_chainينظم عملية الاسترجاع والتوليد:استخراج السياق والسؤال: يستخرج السياق باستخدام
retrieval_chainوالسؤال باستخدامitemgetter.تطبيق المطالبة: يتم تنسيق السياق والسؤال المستخرجين في المطالبة.
تفاعل LLM: يتم تمرير المطالبة المنسقة إلى
ChatOpenAIنموذج لتوليد استجابة.تحليل استجابة: يتم تحليل استجابة من LLM إلى تنسيق سلسلة باستخدام
StrOutputParser.
الخط 19:
final_rag_chainيتم استدعاؤها بسؤال المستخدم،"What is LangSmith, and why do we need it?"يؤدي هذا إلى استرجاع المستندات ذات الصلة واستخدامها لتوليد إجابة من خلال نموذج RAG.
لانج سميث
LangSmith أداة فعّالة لاستكشاف نماذج اللغة. سنستخدمها لتصور وفهم آلية عمل استعلاماتنا.
سنفهم كيفية معالجة نموذج اللغة واستجابته لمطالباتنا من خلال فحص الاستعلامات الفرعية والمدخلات والمخرجات:
جربها بنفسك
يمكنك التدرب على تنفيذ هذا الكود بنفسك في Jupyter Notebook أدناه: