تضمينات المستندات الافتراضية (HyDE): محاكاة السياق
تعرف على تقنية تضمين المستندات الافتراضية (HyDE)، وكيفية عملها، وكيفية تنفيذها خطوة بخطوة.
لماذا تضمين المستندات الافتراضية (HyDE)؟
يعتمد استرجاع المستندات التقليدي في نماذج RAG على مطابقة الاستعلامات مع المستندات الموجودة في المجموعة. يواجه هذا النهج بعض القيود:
إمكانية التعميم المحدودة: غالبًا ما تواجه طرق الاسترجاع الحالية صعوبة في التعامل مع المجالات أو الاستعلامات غير المرئية ذات الاختلافات الدقيقة.
الدقة الواقعية: قد يؤدي استرجاع المستندات استنادًا إلى مطابقة الكلمات الرئيسية فقط إلى الحصول على معلومات غير ذات صلة أو غير دقيقة، وخاصةً بالنسبة للاستعلامات المعقدة.
يتناول HyDE هذه التحديات من خلال تقديم مفهوم المستندات الافتراضية.
لُغة تعليمية: لنفترض أنك طالبٌ تُحضّر لاختبار تاريخٍ ولديك العديد من الكتب للقراءة. يُقدّم لك HyDE، كرفيقٍ دراسيٍّ ذكي، المساعدة. فهو يجمع كل هذه المعلومات ويُقدّم لك ملاحظاتٍ دراسيةً مفيدةً للغاية. هذه الملاحظات ليست نسخًا من الكتب، ولكنها أهمّ ما يجب عليك تذكّره. على سبيل المثال، إذا كنت تدرس الحرب العالمية الثانية، فقد يُلخّص HyDE الأسباب الرئيسية للحرب، والمعارك الرئيسية، وكيف انتهت. تُسهّل مُلخّصات HyDE الدراسة بشكلٍ كبير، وتُمكّنك من فهم الأفكار الرئيسية بشكلٍ أسرع.
ما هو HyDE؟
HyDE، كما هو موضح في
كيف يعمل HyDE
فيما يلي تفصيل لسير عمل HyDE:
معالجة الاستعلام: يقوم المستخدم بإرسال استعلام.
إنشاء مستندات افتراضية: يستخدم HyDE برنامج ماجستير في القانون لإنشاء "مستندات افتراضية" واحدة أو أكثر تُجيب على السؤال. قد لا تكون هذه المستندات واقعية أو كاملة، لكنها تُلخص المعلومات التي يحتويها المستند ذو الصلة. غالبًا ما تتضمن عملية التوليد هذه توجيه تعليمات إلى ماجستير في القانون مثل "اكتب ملخصًا موجزًا لصفحة ويب تُجيب على السؤال...".
إنشاء التضمين: يُحوَّل كل مستند افتراضي مُولَّد إلى تمثيل رقمي يُسمى التضمين. يُجسِّد هذا التضمين المعنى الدلالي للمستند.
استرجاع المستندات: يبحث النظام عن المستندات الموجودة في المجموعة التي تتشابه تضميناتها مع تضمينات المستندات الافتراضية. تعتمد هذه العملية على تقنيات تشابه المتجهات.
إنشاء الاستجابة: يتم إدخال المستندات المسترجعة إلى مرحلة إنشاء نموذج RAG، حيث يتم استخدامها لإنشاء استجابة لاستعلام المستخدم.
التنفيذ خطوة بخطوة
الآن، دعنا نتعمق في الكود المقدم ونفهم كيفية تنفيذه لـ HyDE:
1. استيراد الوحدات النمطية الضرورية
سنقوم باستيراد الوحدات المطلوبة من المكتبات المثبتة لتنفيذ HyDE:
تعتبر هذه المكتبات والوحدات ضرورية للخطوات اللاحقة في العملية.
2. إعداد مفتاح API OpenAI
اضبطOPENAI_API_KEY متغير البيئة مفتاح الخاص بك:
شرح الكود
الخط 1: اضبط
OPENAI_API_KEYمتغير إلى سلسلة فارغة وتعيينه إلى متغير البيئةOPENAI_API_KEYاستخدامos.environ. هذا هو المكان الذي يجب عليك فيه إضافة مفتاح API الخاص بـ OpenAI .السطرين 2-3: إذا كان
OPENAI_API_KEYلا يزال عبارة عن سلسلة فارغة بعد التعيين، قم برفعValueErrorمع الرسالة"Please set the OPENAI_API_KEY environment variable"يضمن هذا تعيين مفتاح API بشكل صحيح قبل متابعة تنفيذ البرنامج.
3. تحميل المستندات وتقسيمها
هنا، نقوم بتحميل بعض المستندات النموذجية وتجهيزها للمعالجة من قِبل برنامج الماجستير في القانون. ونظرًا لأن المستندات العملية قد تكون طويلة، سنقوم أيضًا بتقسيم النصوص لضمان توافقها مع حدود إدخال ببرنامج الماجستير في القانون.
شرح الكود
الأسطر 1-4: تهيئة قائمة تسمى
loaders، تحتوي على حالات منTextLoaderفئة من LangChain. تُستخدم هذه المحمّلات لتحميل ملفات نصية تحتوي على المستندات المراد معالجتها.الأسطر 6-8: كرر كل محمل في
loadersقم بإدراج المستندات وتحميلها باستخدامload()طريقة كل محمل. ثم تُضاف المستندات المحملة من كل محمل إلىdocsقائمة.السطر 10: إنشاء مثيل لـ
RecursiveCharacterTextSplitterالفئة، تحديدchunk_sizeمن 400 حرف. تُستخدم هذه الفئة لتقسيم المستندات الكبيرة إلى أجزاء أصغر وأسهل إدارة.الخط 11: اتصل بـ
split_documents()طريقةtext_splitterكائن معdocsقائمة إدخال. تقسم هذه الطريقة كل مستند إلىdocsتقسيم القائمة إلى أجزاء أصغر باستخدام المحددchunk_size. ثم يتم تعيين المستندات المنقسمة الناتجة مرة أخرى إلىdocsقائمة.
4. إنشاء متجر متجه
يُعدّ مخزن المتجهات عنصرًا أساسيًا في استرجاع البيانات في HyDE. فهو يسمح لنا بتخزين تضمينات المستندات والبحث بكفاءة عن مستندات مشابهة لتضمين مستند افتراضي.
شرح الكود
السطر 1: يتم إنشاء مخزن المتجهات لتسهيل استرجاع المعلومات عن طريق فهرسة تضمينات المستندات.
5. إنشاء تضمينات (فردية ومتعددة)
الوظيفة الأساسية لـ HyDE هي إنشاء تضمينات تُمثل مستندات افتراضية ذات صلة باستعلام المستخدم. سنستكشف هنا إنشاء تضمينات مفردة ومتعددة.
فيما يلي تنفيذ توليد التضمين الفردي.
شرح الكود
السطر 1 : تهيئة نموذج التضمين وLLM.
HypotheticalDocumentEmbedderتجمع الفئة بين قدرات نموذج لغة OpenAI (LLM) مع OpenAIEmbeddings لإنشاء التضمينات، خصيصًا لـ"web_search"سياق.السطر 3: عرّف استعلامًا حول LangSmith. سيُستخدم هذا السطر لإنشاء تضمين يُمثّل الاستعلام بصيغة رقمية.
السطر 5: استخدم نموذج التضمين لإنشاء تضمين لـ
query. الembed_queryتعمل الطريقة على معالجة سلسلة الاستعلام، وتحويلها إلى متجه تضمين يلتقط المعنى الدلالي للاستعلام.
فيما يلي تنفيذ لإنشاء التضمين المتعدد.
شرح الكود
السطر الأول: تهيئة برنامج OpenAI LLM بمعلمات محددة.
n=3تحدد المعلمة إنشاء ثلاث عمليات إكمال لكل موجه، وbest_of=4يعني اختيار أفضل إكمال من بين أربع محاولات.السطر 3: قم بتهيئة نموذج التضمين باستخدام نموذج LLM الذي تم إنشاؤه مسبقًا.
HypotheticalDocumentEmbedderتجمع الفئة بين قدراتmulti_llmمعOpenAIEmbeddingsلإنشاء التضمينات، على وجه التحديد لـ"web_search"سياق.السطر 5: إنشاء تضمين لاستعلام محدد.
embed_queryتعمل الطريقة على معالجة سلسلة الاستعلام"What is LangSmith, and why do we need it?"، وتحويله إلى متجه تضمين يلتقط المعنى الدلالي للاستعلام.
6. استعلام عن مخزن المتجهات لـ HyDE
قبل الخوض في تقنية HyDE، من الضروري فهم كيفية الاستعلام عن مخزن المتجهات لاسترداد المعلومات ذات الصلة:
شرح الكود
السطر ١: عرّف استعلام البحث كسلسلة نصية. هذا يُحدد المعلومات التي نبحث عنها في مخزن المتجهات.
الخط 2: اتصل بـ
similarity_searchالطريقة علىvectorstoreالكائن. تقوم هذه الطريقة بإجراء البحث الفعلي داخل مخزن المتجهات.
7. إنشاء مستند افتراضي
في هذه الخطوة، يتم إنشاء مستند افتراضي باستخدام قالب مطالبة محدد:
شرح الكود
الأسطر من ١ إلى ٦: تُعرّف رسالة النظام بأنها نموذج مُوجَّه لتوليد استجابات مُفيدة بناءً على السياق. وهي تُمهِّد الطريق لنموذج لغة الذكاء الاصطناعي لتقديم إجابات مفيدة ووافية.
الأسطر 8-13: يتم إنشاء قالب موجه باستخدام
ChatPromptTemplate.from_messages. يتكون من رسالتين:رسالة النظام: كما هو موضح أعلاه، فهي توفر التعليمات والسياق لنموذج لغة الذكاء الاصطناعي.
رسالة إنسانية: عنصر نائب لسؤال المستخدم.
السطر 15: يتم تهيئة مثيل نموذج لغة الذكاء الاصطناعي (LLM) باستخدام
ChatOpenAI. نقوم بتحديد نموذج GPT-3.5 ونضبط درجة الحرارة على 0 للاستجابات الحتمية.السطر 17: يتم إعداد سياق إنشاء الإجابة عن طريق ربط قالب المطالبة، وLLM، ومحلل إخراج السلسلة (
StrOutputParser).الأسطر 19-23: يتم استدعاء سلسلة السياق بسؤال المستخدم،
"What is LangSmith, and why do we need it?"يتم تخزين استجابة التي تم إنشاؤها بواسطة LLM فيanswerمتغير.السطر 25: تتم طباعة الإجابة الناتجة.
8. قم بإرجاع الوثيقة الافتراضية والسؤال الأصلي
أخيرًا، يتم إرجاع المستند الافتراضي والسؤال الأصلي باستخدام سلسلة HyDE.
شرح الكود:
السطر 1: يتم إنشاء سلسلة باستخدام
RunnablePassthroughتمرير الوثيقة الافتراضية والسؤال الأصلي من خلال نظام HyDE.الأسطر 3-7: يتم استدعاء السلسلة باستخدام القاموس الذي يحتوي على سؤال المستخدم،
"What is LangSmith, and why do we need it?"يؤدي هذا إلى تشغيل تنفيذ السلسلة، التي تعالج السؤال مع المستند الافتراضي.
جربها بنفسك
يمكنك التدرب على تنفيذ هذه التعليمات البرمجية بنفسك في Jupyter Notebook أدناه: