Search⌘ K
AI Features

تضمينات المستندات الافتراضية (HyDE): محاكاة السياق

تعرف على تقنية تضمين المستندات الافتراضية (HyDE)، وكيفية عملها، وكيفية تنفيذها خطوة بخطوة.

لماذا تضمين المستندات الافتراضية (HyDE)؟

يعتمد استرجاع المستندات التقليدي في نماذج RAG على مطابقة الاستعلامات مع المستندات الموجودة في المجموعة. يواجه هذا النهج بعض القيود:

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

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

يتناول HyDE هذه التحديات من خلال تقديم مفهوم المستندات الافتراضية.

لُغة تعليمية: لنفترض أنك طالبٌ تُحضّر لاختبار تاريخٍ ولديك العديد من الكتب للقراءة. يُقدّم لك HyDE، كرفيقٍ دراسيٍّ ذكي، المساعدة. فهو يجمع كل هذه المعلومات ويُقدّم لك ملاحظاتٍ دراسيةً مفيدةً للغاية. هذه الملاحظات ليست نسخًا من الكتب، ولكنها أهمّ ما يجب عليك تذكّره. على سبيل المثال، إذا كنت تدرس الحرب العالمية الثانية، فقد يُلخّص HyDE الأسباب الرئيسية للحرب، والمعارك الرئيسية، وكيف انتهت. تُسهّل مُلخّصات HyDE الدراسة بشكلٍ كبير، وتُمكّنك من فهم الأفكار الرئيسية بشكلٍ أسرع.

ما هو HyDE؟

HyDE، كما هو موضح في هذا غاو، لويو، شيوغوانغ ما، جيمي لين، وجيمي كالين. "استرجاع دقيق وكثيف بدون علامات صلة." طبعة مسبقة من arXiv، arXiv:2212.10496 (2022). ورقة بحثية من إعداد لويو غاو، تستفيد من برامج ماجستير القانون لإنشاء تضمينات افتراضية للمستندات تُمثل مستندات مثالية للإجابة على استفسار معين. هذه التضمينات، وإن لم تكن مطابقة للمستندات الفعلية، إلا أنها تُجسد جوهر المعلومات المطلوبة. هذا يسمح لعملية الاسترجاع بالتركيز على المستندات ذات المحتوى ذي الصلة، مما يؤدي إلى إجابات أكثر دقة وإثراءً.

An illustration of the HyDE model (source: Luyu Gao, Precise Zero-Shot Dense Retrieval without Relevance Labels)
An illustration of the HyDE model (source: Luyu Gao, Precise Zero-Shot Dense Retrieval without Relevance Labels)

كيف يعمل HyDE

فيما يلي تفصيل لسير عمل HyDE:

  • معالجة الاستعلام: يقوم المستخدم بإرسال استعلام.

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

  • إنشاء التضمين: يُحوَّل كل مستند افتراضي مُولَّد إلى تمثيل رقمي يُسمى التضمين. يُجسِّد هذا التضمين المعنى الدلالي للمستند.

  • استرجاع المستندات: يبحث النظام عن المستندات الموجودة في المجموعة التي تتشابه تضميناتها مع تضمينات المستندات الافتراضية. تعتمد هذه العملية على تقنيات تشابه المتجهات.

  • إنشاء الاستجابة: يتم إدخال المستندات المسترجعة إلى مرحلة إنشاء نموذج RAG، حيث يتم استخدامها لإنشاء استجابة لاستعلام المستخدم.

The high level workflow of HyDE
The high level workflow of HyDE

التنفيذ خطوة بخطوة

الآن، دعنا نتعمق في الكود المقدم ونفهم كيفية تنفيذه لـ HyDE:

Steps for implementing HyDE
Steps for implementing HyDE

1. استيراد الوحدات النمطية الضرورية

سنقوم باستيراد الوحدات المطلوبة من المكتبات المثبتة لتنفيذ HyDE:

Python 3.10.4
import os
from langchain_openai import OpenAI
from langchain_openai import OpenAIEmbeddings
from langchain.chains import HypotheticalDocumentEmbedder
from langchain.prompts import PromptTemplate
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

تعتبر هذه المكتبات والوحدات ضرورية للخطوات اللاحقة في العملية.

2. إعداد مفتاح API OpenAI

اضبطOPENAI_API_KEY متغير البيئة مفتاح الخاص بك:

Python 3.10.4
OPENAI_API_KEY = os.environ["OPENAI_API_KEY"] = "" # Add your OpenAI API key
if OPENAI_API_KEY == "":
raise ValueError("Please set the OPENAI_API_KEY environment variable")

شرح الكود

  • الخط 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. تحميل المستندات وتقسيمها

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

Python 3.10.4
loaders = [
TextLoader("blog.langchain.dev_announcing-langsmith_.txt"),
TextLoader("blog.langchain.dev_automating-web-research_.txt"),
]
docs = []
for loader in loaders:
docs.extend(loader.load())
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=400, chunk_overlap=60)
splits = text_splitter.split_documents(docs)

شرح الكود

  • الأسطر 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. فهو يسمح لنا بتخزين تضمينات المستندات والبحث بكفاءة عن مستندات مشابهة لتضمين مستند افتراضي.

Python 3.10.4
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())

شرح الكود

  • السطر 1: يتم إنشاء مخزن المتجهات لتسهيل استرجاع المعلومات عن طريق فهرسة تضمينات المستندات.

5. إنشاء تضمينات (فردية ومتعددة)

الوظيفة الأساسية لـ HyDE هي إنشاء تضمينات تُمثل مستندات افتراضية ذات صلة باستعلام المستخدم. سنستكشف هنا إنشاء تضمينات مفردة ومتعددة.

فيما يلي تنفيذ توليد التضمين الفردي.

Python 3.10.4
embeddings = HypotheticalDocumentEmbedder.from_llm(OpenAI(), OpenAIEmbeddings(), "web_search")
query = "What is LangSmith, and why do we need it?"
result = embeddings.embed_query(query)

شرح الكود

  • السطر 1 : تهيئة نموذج التضمين وLLM.HypotheticalDocumentEmbedder تجمع الفئة بين قدرات نموذج لغة OpenAI (LLM) مع OpenAIEmbeddings لإنشاء التضمينات، خصيصًا لـ"web_search" سياق.

  • السطر 3: عرّف استعلامًا حول LangSmith. سيُستخدم هذا السطر لإنشاء تضمين يُمثّل الاستعلام بصيغة رقمية.

  • السطر 5: استخدم نموذج التضمين لإنشاء تضمين لـquery . الembed_query تعمل الطريقة على معالجة سلسلة الاستعلام، وتحويلها إلى متجه تضمين يلتقط المعنى الدلالي للاستعلام.

فيما يلي تنفيذ لإنشاء التضمين المتعدد.

Python 3.10.4
multi_llm = OpenAI(n=3, best_of=4)
embeddings = HypotheticalDocumentEmbedder.from_llm(multi_llm, OpenAIEmbeddings(), "web_search")
result = embeddings.embed_query("What is LangSmith, and why do we need it?")

شرح الكود

  • السطر الأول: تهيئة برنامج 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، من الضروري فهم كيفية الاستعلام عن مخزن المتجهات لاسترداد المعلومات ذات الصلة:

Python 3.10.4
query = "What is LangSmith, and why do we need it?"
vectorstore.similarity_search(query)

شرح الكود

  • السطر ١: عرّف استعلام البحث كسلسلة نصية. هذا يُحدد المعلومات التي نبحث عنها في مخزن المتجهات.

  • الخط 2: اتصل بـsimilarity_search الطريقة علىvectorstore الكائن. تقوم هذه الطريقة بإجراء البحث الفعلي داخل مخزن المتجهات.

7. إنشاء مستند افتراضي

في هذه الخطوة، يتم إنشاء مستند افتراضي باستخدام قالب مطالبة محدد:

Python 3.10.4
system = """
As a knowledgeable and helpful research assistant, your task is to provide informative answers based on the given context.
Use your extensive knowledge base to offer clear, concise, and accurate responses to the user's inquiries.
Question: {question}
Answer:
"""
prompt = ChatPromptTemplate.from_messages(
[
("system", system),
("human", "{question}"),
]
)
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
context = prompt | llm | StrOutputParser()
answer = context.invoke(
{
"What is LangSmith, and why do we need it?"
}
)
print(answer)

شرح الكود

  • الأسطر من ١ إلى ٦: تُعرّف رسالة النظام بأنها نموذج مُوجَّه لتوليد استجابات مُفيدة بناءً على السياق. وهي تُمهِّد الطريق لنموذج لغة الذكاء الاصطناعي لتقديم إجابات مفيدة ووافية.

  • الأسطر 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.

Python 3.10.4
chain = RunnablePassthrough.assign(hypothetical_document=context)
chain.invoke(
{
"question": "What is LangSmith, and why do we need it?"
}
)

شرح الكود:

  • السطر 1: يتم إنشاء سلسلة باستخدامRunnablePassthrough تمرير الوثيقة الافتراضية والسؤال الأصلي من خلال نظام HyDE.

  • الأسطر 3-7: يتم استدعاء السلسلة باستخدام القاموس الذي يحتوي على سؤال المستخدم،"What is LangSmith, and why do we need it?" يؤدي هذا إلى تشغيل تنفيذ السلسلة، التي تعالج السؤال مع المستند الافتراضي.

جربها بنفسك

يمكنك التدرب على تنفيذ هذه التعليمات البرمجية بنفسك في Jupyter Notebook أدناه:

Please login to launch live app!