استخدام RAG-Fusion لتحسين السياق
تعرف على مفهوم إعادة الترتيب، بما في ذلك التقنيات مثل RAG-Fusion، واستكشف تنفيذه خطوة بخطوة.
سنغطي ما يلي...
لنفترض أننا نبحث عن معلومات عبر الإنترنت. نكتب استعلامنا، فيُظهر النظام قائمة بالنتائج. ولكن هل هي حقًا الأكثر صلة؟ غالبًا ما تُعطي خوارزميات الترتيب التقليدية الأولوية لعوامل مثل مطابقة الكلمات المفتاحية، مما قد يُغفل المعنى الأعمق لبحثك. وهنا يأتي دور إعادة الترتيب.
ما هو إعادة الترتيب؟
إعادة الترتيب هي عملية استرجاع من مرحلتين تُحسّن صلة نتائج البحث. إليك كيفية عملها:
الاسترجاع الأولي: يقوم النظام الأساسي، مثل محرك البحث، باسترجاع مجموعة كبيرة من العناصر ذات الصلة المحتملة استنادًا إلى الكلمات الرئيسية أو عوامل أخرى.
تحسين القائمة: يقوم نموذج إعادة الترتيب، الذي يعتمد غالبًا على التعلم الآلي، بتحليل كل عنصر في المجموعة ويمنحه درجة جديدة بناءً على صلته صحيح باستعلام المستخدم. يمكن لهذه الدرجة أن تأخذ في الاعتبار عوامل مثل التشابه الدلالي وسياق المستخدم.
النتائج المعاد ترتيبها: أخيرًا، يتم إعادة ترتيب العناصر استنادًا إلى درجاتها الجديدة، مع عرض النتائج الأكثر صلة في الأعلى.
أنواع تقنيات إعادة الترتيب
يمكن استخدام العديد من التقنيات المبتكرة لإعادة ترتيب نتائج البحث. دعونا نستكشف نهجين بارزين:
دمج التوليد المعزز بالاسترجاع (RAG-Fusion): تجمع هذه التقنية بين نموذجين: مُسترجع يبحث عن مستندات ذات صلة محتملة، ونموذج توليد يفهم غرض الاستعلام. يستفيد RAG-Fusion من نقاط قوة كليهما، وغالبًا ما يستخدم مُعيد ترتيب لتحسين الاختيار النهائي للمستندات التي سيُعالجها النموذج التوليدي.
إعادة ترتيب المُرمِّز المتقاطع: هنا، يأخذ نموذج مُنفصل يُسمى "المُرمِّز المتقاطع" الاستعلام وكل عنصر مُسترجع إدخال. ثم يُخرِج درجة تُشير إلى مدى مُطابقة العنصر لنية المستخدم. تُعيد هذه الدرجة ترتيب القائمة الأولية وتُعرِض العناصر الأكثر تشابهًا دلاليًا في الأعلى.
ما هو RAG-Fusion؟
يجمع RAG-Fusion بين الاسترجاع (العثور على المستندات ذات الصلة) والتوليد (صياغة الاستعلامات). ويعتمد على برنامج ماجستير في إدارة الأعمال لإنشاء هذه الاستعلامات المتنوعة بناءً على سؤال المستخدم الأصلي. باستخدام برنامج ماجستير في إدارة الأعمال، يستطيع RAG-Fusion استيعاب الفروق الدقيقة في اللغة وإنشاء استعلامات تُمثل قصد المستخدم بفعالية.
RAG-Fusion هي تقنية تعتمد على نماذج RAG لتحسين نتائج البحث، خاصةً في سياق برامج الدردشة الآلية. إليك شرح لكيفية عملها:
فهم نية المستخدم: يبدأ RAG-Fusion باستعلام المستخدم. وكما هو الحال في نماذج RAG، يهدف إلى فهم النية صحيح وراء السؤال.
إنشاء استعلامات متعددة: يتجاوز RAG-Fusion مجرد استعلام واحد، إذ يستخدم الاستعلام الأصلي لإنشاء صيغ متعددة، ما يُعيد صياغة السؤال من زوايا مختلفة. يُساعد هذا على فهم قصد المستخدم بدقة.
الاسترجاع مع التضمين: تُحوَّل الاستعلامات الأصلية والمُولَّدة إلى تمثيل رقمي باستخدام نماذج التضمين. يتيح ذلك بحثًا فعّالاً ضمن مجموعة مستندات أو قاعدة معارف. يتم استرجاع المستندات ذات الصلة بكل استعلام.
دمج الرتب التبادلي (RRF): يستخدم RAG-Fusion تقنية دمج الرتب التبادلي (RRF). تُحدد RRF الدرجات بناءً على مدى تطابق المستندات المُسترجعة مع كل استعلام. من المرجح أن تكون المستندات ذات الدرجات العالية عبر استعلامات متعددة أكثر ملاءمةً لهدف المستخدم.
دمج المستندات والنتائج: أخيرًا، يجمع RAG-Fusion المستندات المسترجعة ونتائجها المقابلة. هذا يوفر مجموعة أغنى من المعلومات التي يمكن استخدامها لصياغة استجابة.
التنفيذ خطوة بخطوة
الآن، لنبدأ بتطبيق RAG-Fusion. الخطوات الخمس الأولى مشابهة لتقنية الاستعلامات المتعددة:
تعتبر هذه المكتبات والوحدات ضرورية للخطوات اللاحقة في العملية.
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 إلى'RAG-Fusion'.
الأسطر 6-8: إعداد مفتاح API OpenAI :
OPENAI_API_KEY: نص فارغ مفتاح API OpenAI . استبدله مفتاح الحالي.التحقق: التحقق مما إذا كان
OPENAI_API_KEYفارغ ويثيرValueErrorإذا كان الأمر كذلك، فتأكد من توفير مفتاح API صالح لمصادقة طلبات API OpenAI .
3. تحميل المستندات وتقسيمها
الآن، دعنا نحمل مستندات النصوص التي تريد استخدامها للاسترجاع ونقسمها:
شرح الكود:
الأسطر من 1 إلى 4: يتم تعريف المحملات لقراءة ملفات النصوص باستخدام
TextLoader، تحديد مسارات الملفات للمستندات التي سيتم تحميلها.الأسطر 6-8: قائمة فارغة
docsيتم إنشاء حلقة، ويتم تكرارها عبر المحملات، وتحميل محتوى كل مستند وتوسيعهdocsقائمة بالمحتوى المحمل.Lines 10–11: A
RecursiveCharacterTextSplitteris initialized with a chunk size ofcharacters and an overlap of characters between chunks. The splitter then processes the docslist, splitting each document into smaller chunks suitable for processing by large language models (LLMs).
4. فهرسة الوثائق
بعد تقسيم النص، نُنشئ مخزن متجهات لتخزين واسترجاع أجزاء المستند بكفاءة. بالإضافة إلى ذلك، نُنشئ تضمينات لكل جزء لالتقاط معناه الدلالي.
شرح الكود:
السطر 1: نستخدم
Chromaلإنشاء متجر المتجهات (vectorstoreكروما هي مكتبة مصممة لتخزين واسترجاع المستندات بكفاءة. ثم نسميهاfrom_documentsلملء المتجر بقطع النصوص التي قمنا بإعدادها (splits). لفهم معنى كل جزء، نقوم بإنشاء تضمينات باستخدامOpenAIEmbeddingsالتضمينات هي تمثيلات رقمية تلتقط العلاقات الدلالية بين الكلمات في مقتطف نصي. هذا يسمح لمخزن المتجهات باسترجاع المستندات ذات الصلة باستعلام المستخدم بكفاءة من خلال مقارنة تضمين الاستعلام بتضمينات الكتل المخزنة.الخط 2: نقوم بتحويل مخزن المتجهات إلى مسترد باستخدام
as_retriever(). وهذا يسمح لنا باسترجاع المستندات استنادًا إلى استعلام التضمين.
5. RAG-Fusion: إنشاء الاستعلامات
يتطرق مقتطف التعليمات البرمجية التالي إلى المفهوم الأساسي لـ RAG-Fusion: إنشاء أشكال استعلام متعددة استنادًا إلى السؤال الأصلي للمستخدم.
شرح الكود:
الأسطر من 1 إلى 5: نقوم بتعريف متغير سلسلة متعدد الأسطر
templateيعمل هذا كموجه لبرنامج LLM (ChatOpenAI في هذه الحالة). يُرشد هذا الموجه برنامج LLM للعمل كمساعد لمحرك بحث متجه. كما يوفر سياقًا لسؤال المستخدم ({question}) والهدف من إنشاء استعلامات بديلة (five variationsيجب أن تعكس هذه الاختلافات جوانب مختلفة من نية المستخدم لتحسين الاسترجاع. كما يحدد الموجه تنسيق إخراج المطلوب: كل اختلاف في سطر جديد، يتبع"Original question: {question}"شكل.السطر 7: نستخدم
ChatPromptTemplate.from_template(template)لتحويل قالب السلسلة إلى قالب منظمChatPromptTemplateهدف.الأسطر 9-14: نقوم بإنشاء سلسلة معالجة تسمى
generate_queriesتتضمن هذه السلسلة عدة خطوات:الخطوة الأولى تتضمن
rag_fusion_prompt_templateهدف.ثم تستخدم السلسلة
ChatOpenAI(temperature=0). يشير ChatOpenAI إلى نموذج لغة OpenAI وtemperature=0يضمن إخراج حتميًا (نفس النتائج لمطالبة معينة في كل مرة).يتم بعد ذلك تحليل النص الناتج من LLM باستخدام
StrOutputParser()، وتحويلها من بنية بيانات معقدة محتملة إلى سلسلة عادية.وأخيرا،
lambdaتقوم الوظيفة بتقسيم السلسلة إلى قائمة من الاختلافات الفردية في الاستعلام باستخدام حرف السطر الجديد (\n) كفاصل.
6. الاسترجاع باستخدام اندماج الرتبة المتبادلة (RRF)
في هذه الخطوة، سوف نقوم باسترجاع المستندات استنادًا إلى اختلافات الاستعلام المُولّدة وتحسين النتائج باستخدام Reciprocal Rank Fusion (RRF):
شرح الكود:
الأسطر من 1 إلى 29: دالة اندماج الرتبة المتبادلة
Line 1: Define the function
reciprocal_rank_function, which takes a list of lists (results) containing ranked documents and an optional parameterk(default value is). السطر 6: تهيئة قاموس فارغ
fused_scoresلتخزين النتائج التراكمية لكل مستند فريد تم مواجهته أثناء عملية الدمج.الأسطر 9: ابدأ بالتكرار على كل قائمة من المستندات المصنفة (
docs) فيresultsقائمة.السطر 11: لكل قائمة من المستندات، قم بالتكرار خلال كل مستند (
doc) ورتبتها المقابلة (rank) باستخدامenumerateوظيفة.السطر 13: تحويل المستند إلى معرف سلسلة فريد (
doc_str) استخدامstr(doc).Lines 15-16: Check if the document is already in the
fused_scoresdictionary. If not, add it with an initial score of. السطر 18: استرداد النتيجة الحالية للمستند من
fused_scoresقاموس.السطر 20: تحديث درجة المستند باستخدام صيغة RRF:
1 / (rank + k). أضف هذه قيمة إلى النتيجة الحالية فيfused_scoresقاموس.الأسطر 23-26: بعد معالجة جميع المستندات، قم بفرزها
fused_scoresقاموس قائم على النتائج مرتبة تنازليًا. خزّن النتائج المفرزة كقائمة من الثنائيات (reranked_results), كل منها يحتوي على الوثيقة ونتيجتها المدمجة.السطر 29: إرجاع
reranked_resultsقائمة توفر المستندات التي تمت إعادة ترتيبها ونتائجها المدمجة.
السطر 31: حدد سؤال المستخدم (
question) مثل"What is LangSmith, and why do we need it?"لتكون بمثابة مثال لعملية الاسترجاع.السطر 32: إنشاء
retrieval_chainمن خلال الجمع بين عدة مكونات باستخدام الأنبوب (|) المشغل:generate_queries:يُنشئ تنويعات متعددة للاستعلام.retriever.map():يتم تطبيق كل تنوع في الاستعلام على مسترد المستندات، مما يؤدي إلى استرداد قائمة مرتبة من المستندات لكل استعلام.reciprocal_rank_function:يجمع ويعيد ترتيب المستندات المسترجعة استنادًا إلى درجاتها عبر جميع أشكال الاستعلام المختلفة.
السطر 33: استدعاء
retrieval_chainمع سؤال المستخدم المقدم في القاموس ({"question": question}). يؤدي هذا إلى تشغيل عملية الاسترجاع وRRF بأكملها، وتخزين المستندات الناتجة فيdocsمتغير.السطر 34: احسب وأرجع عدد المستندات المستردة والمُعاد ترتيبها بواسطة
retrieval_chainباستخدامlen(docs)وظيفة.
بايت تعليمي: باستخدام RRF، يمكننا الاستفادة من المعلومات المستقاة من كل تنوع في الاستعلام لإنتاج مجموعة أكثر شمولاً وارتباطاً بالمستندات المسترجعة. المستندات التي تحتل مرتبة عالية باستمرار عبر تنوعات متعددة من الاستعلامات غالبًا ما تكون أكثر ارتباطًا بقصد المستخدم، حتى لو لم تتطابق تمامًا مع الكلمات الرئيسية المستخدمة في أي استعلام.
7. تشغيل نموذج RAG
يوضح مقطع الكود التالي توليد الإجابات باستخدام RAG (التوليد المعزز بالاسترجاع). باستخدام LLM، يستفيد من المستندات المسترجعة (السياق) للإجابة على سؤال المستخدم:
شرح الكود:
الأسطر من 1 إلى 4: تعريف متغير سلسلة متعدد الأسطر
templateيعمل كموجه لنموذج اللغة (LLM). يُرشد هذا القالب نموذج اللغة (LLM) للإجابة على سؤال المستخدم ({question}) بناءً على السياق المقدم ({context}). سيتكون السياق من المستندات المسترجعة ذات الصلة بالسؤال.السطر 6: تحويل قالب السلسلة إلى قالب منظم
ChatPromptTemplateكائن باستخدامChatPromptTemplate.from_template(template).السطر 8: قم بتهيئة LLM باستخدام
ChatOpenAIبدرجة حرارة 0، مما يضمن إخراج حتميًا (نفس النتائج لمطالبة معينة في كل مرة).الأسطر من 10 إلى 16: إنشاء سلسلة معالجة جديدة باسم
final_rag_chainباستخدام الأنبوب (|) المشغل، والذي يتضمن عدة مكونات:السطرين 11-12: يتم استخدام القاموس لتوفير مدخلين:
"context": يشير إلى إخراجretrieval_chain، تحتوي على المستندات المسترجعة."question":يستعيد سؤال المستخدم باستخدامitemgetter("question")وظيفة منoperatorوحدة.
الخط 13:
promptيحتوي الكائن على قالب إنشاء الإجابة.الخط 14:
llmمعالجة المطالبة والسياق والسؤال لتوليد استجابة.الخط 15:
StrOutputParser()يقوم بتحويل إخراج LLM إلى سلسلة عادية.
الخط 18: اتصل
final_rag_chain.invoke({"question": question})، مع توفير سؤال المستخدم إدخال. يؤدي هذا إلى بدء عملية توليد الإجابة بالكامل باستخدام المستندات المسترجعة (context) وسؤال المستخدم. بعد معالجة السياق والسؤال، ستكون استجابة النهائية من برنامج الماجستير في القانون هي الإجابة المُولَّدة.
بايت تعليمي: من خلال الجمع بين الاسترجاع وتوليد الإجابة، يستخدم RAG المستندات المسترجعة لتوفير إجابة أكثر إعلامًا وشاملة لاستعلام المستخدم.
لانج سميث
LangSmith أداة فعّالة لاستكشاف نماذج اللغة. سنستخدمها لتصور وفهم آلية عمل استعلاماتنا.
سنفهم كيفية معالجة نموذج اللغة واستجابته لمطالباتنا من خلال فحص الاستعلامات الفرعية والمدخلات والمخرجات:
جربها بنفسك
يمكنك التدرب على تنفيذ هذا الكود بنفسك في Jupyter Notebook أدناه: