في درس تطبيقات البحث، تعلمنا باختصار كيفية دمج بياناتك الخاصة في نماذج اللغة الكبيرة (LLMs). في هذا الدرس، سوف نغوص أكثر في مفاهيم تأصيل بياناتك في تطبيق LLM الخاص بك، وآلية العملية وطرق تخزين البيانات، بما في ذلك كل من التضمينات والنصوص.
الفيديو قادم قريباً
في هذا الدرس سنغطي ما يلي:
-
مقدمة إلى RAG، ما هو ولماذا يُستخدم في الذكاء الاصطناعي.
-
فهم ماهية قواعد البيانات الشعاعية وإنشاء واحدة لتطبيقنا.
-
مثال عملي حول كيفية دمج RAG في تطبيق.
بعد إكمال هذا الدرس، ستتمكن من:
-
شرح أهمية RAG في استرجاع البيانات ومعالجتها.
-
إعداد تطبيق RAG وتأصيل بياناتك على LLM.
-
التكامل الفعّال لـ RAG وقواعد البيانات الشعاعية في تطبيقات LLM.
لهذا الدرس، نريد إضافة ملاحظاتنا الخاصة إلى شركة ناشئة تعليمية، مما يسمح للروبوت المحادثة بالحصول على مزيد من المعلومات حول المواضيع المختلفة. باستخدام الملاحظات التي لدينا، سيتمكن المتعلمون من الدراسة بشكل أفضل وفهم المواضيع المختلفة، مما يسهل عليهم المراجعة لامتحاناتهم. لإنشاء سيناريو خاص بنا، سنستخدم:
-
Azure OpenAI:نموذج اللغة الكبير الذي سنستخدمه لإنشاء روبوت المحادثة الخاص بنا -
درس AI للمبتدئين حول الشبكات العصبية: ستكون هذه هي البيانات التي سنؤصل عليها نموذج LLM -
Azure AI SearchوAzure Cosmos DB:قاعدة البيانات الشعاعية لتخزين بياناتنا وإنشاء مؤشر بحث
سيتمكن المستخدمون من إنشاء اختبارات تدريبية من ملاحظاتهم، وبطاقات مراجعة تلخيصية، وتلخيصها إلى نظرات عامة موجزة. للبدء، دعونا نلقي نظرة على ما هو RAG وكيف يعمل:
يعالج روبوت المحادثة المدعوم بـ LLM استفسارات المستخدم لتوليد الردود. وهو مصمم ليكون تفاعليًا ويتواصل مع المستخدمين في مجموعة واسعة من المواضيع. مع ذلك، ردوده محدودة بالسياق المقدم وبيانات التدريب الأساسية الخاصة به. على سبيل المثال، موعد انتهاء معرفة GPT-4 هو سبتمبر 2021، مما يعني أنه يفتقد المعرفة بالأحداث التي وقعت بعد هذه الفترة. بالإضافة إلى ذلك، تستبعد بيانات تدريب نماذج LLM المعلومات السرية مثل الملاحظات الشخصية أو دليل منتجات الشركة.
افترض أنك تريد نشر روبوت محادثة ينشئ اختبارات تدريبية من ملاحظاتك، ستحتاج إلى اتصال بقاعدة المعرفة. هنا يأتي دور RAG. تعمل RAGs كما يلي:
-
قاعدة المعرفة: قبل الاسترجاع، يجب إدخال هذه المستندات ومعالجتها مسبقًا، عادةً عن طريق تقسيم المستندات الكبيرة إلى أجزاء أصغر، وتحويلها إلى تضمينات نصية وتخزينها في قاعدة بيانات.
-
استعلام المستخدم: يسأل المستخدم سؤالاً
-
الاسترجاع: عندما يسأل المستخدم سؤالاً، يقوم نموذج التضمين باسترجاع المعلومات ذات الصلة من قاعدة المعرفة لتوفير سياق أكثر سيتم دمجه في الطلب.
-
التوليد المعزز: يقوم LLM بتحسين استجابته استنادًا إلى البيانات المُسترجعة. يتيح ذلك أن تكون الاستجابة المولدة ليست فقط بناءً على بيانات التدريب المسبق ولكن أيضًا معلومات ذات صلة من السياق المضاف. تستخدم البيانات المسترجعة لتعزيز ردود LLM. ثم يعيد LLM إجابة على سؤال المستخدم.
يتم تنفيذ بنية RAGs باستخدام المحولات التي تتكون من جزأين: مشفر وفك ترميز. على سبيل المثال، عندما يطرح المستخدم سؤالاً، يتم "ترميز" نص الإدخال إلى متجهات تلتقط معنى الكلمات ويتم "فك ترميز" هذه المتجهات في مؤشر المستندات لدينا ويولد نصًا جديدًا بناءً على استعلام المستخدم. يستخدم LLM نموذج مشفر-فك ترميز لتوليد الإخراج.
هناك نهجان عند تنفيذ RAG وفقًا للورقة المقترحة: التوليد المعزز بالاسترجاع للمهام الشديدة المعرفة في معالجة اللغة الطبيعية:
-
RAG-Sequence يستخدم المستندات المسترجعة للتنبؤ بأفضل إجابة ممكنة على استعلام المستخدم
-
RAG-Token يستخدم المستندات لتوليد الرمز التالي، ثم يسترجعها للرد على استعلام المستخدم
-
غنى المعلومات: يضمن أن الاستجابات النصية محدثة وحالية. وبالتالي، يعزز الأداء في المهام الخاصة بالمجال من خلال الوصول إلى قاعدة المعرفة الداخلية.
-
يقلل من الاختلاق باستخدام البيانات القابلة للتحقق في قاعدة المعرفة لتوفير سياق لاستفسارات المستخدم.
-
هو اقتصادي حيث أنه أكثر توفيرًا مقارنة بضبط إحدى نماذج LLM بدقة.
تعتمد تطبيقنا على بياناتنا الشخصية أي، درس الشبكات العصبية في منهج AI للمبتدئين.
قاعدة البيانات الشعاعية، على عكس قواعد البيانات التقليدية، هي قاعدة بيانات متخصصة مصممة لتخزين وإدارة والبحث في المتجهات المضمنة. تخزن تمثيلات عددية للمستندات. تقسيم البيانات إلى تضمينات عددية يجعل من الأسهل على نظام الذكاء الاصطناعي فهم ومعالجة البيانات.
نخزن التضمينات في قواعد البيانات الشعاعية لأن نماذج LLM لها حد لعدد الرموز التي تقبلها كمدخل. نظرًا لأنه لا يمكنك تمرير التضمينات كاملة إلى LLM، سنحتاج إلى تقسيمها إلى أجزاء وعندما يسأل المستخدم سؤالًا، يتم إرجاع التضمينات الأكثر تشابهًا للسؤال مع الطلب. التقسيم يقلل أيضًا من التكاليف المرتبطة بعدد الرموز المرسلة عبر LLM.
بعض قواعد البيانات الشعاعية الشهيرة تشمل Azure Cosmos DB، Clarifyai، Pinecone، Chromadb، ScaNN، Qdrant و DeepLake. يمكنك إنشاء نموذج Azure Cosmos DB باستخدام Azure CLI بالأمر التالي:
az login
az group create -n <resource-group-name> -l <location>
az cosmosdb create -n <cosmos-db-name> -r <resource-group-name>
az cosmosdb list-keys -n <cosmos-db-name> -g <resource-group-name>قبل تخزين بياناتنا، سنحتاج إلى تحويلها إلى تضمينات شعاعية قبل تخزينها في قاعدة البيانات. إذا كنت تعمل مع مستندات كبيرة أو نصوص طويلة، يمكنك تقسيمها استنادًا إلى الاستعلامات المتوقعة. يمكن أن يتم التقسيم على مستوى الجملة أو الفقرة. بما أن التجزئة تستمد معانيها من الكلمات المحيطة بها، يمكنك إضافة بعض السياق الآخر إلى جزء ما، مثلاً عن طريق إضافة عنوان المستند أو تضمين بعض النص قبل أو بعد الجزء. يمكنك تقسيم البيانات كما يلي:
def split_text(text, max_length, min_length):
words = text.split()
chunks = []
current_chunk = []
for word in words:
current_chunk.append(word)
if len(' '.join(current_chunk)) < max_length and len(' '.join(current_chunk)) > min_length:
chunks.append(' '.join(current_chunk))
current_chunk = []
# إذا لم يصل الجزء الأخير إلى الحد الأدنى للطول، أضفه على أي حال
if current_chunk:
chunks.append(' '.join(current_chunk))
return chunksبمجرد التقسيم، يمكننا بعد ذلك تضمين نصنا باستخدام نماذج تضمين مختلفة. بعض النماذج التي يمكنك استخدامها تشمل: word2vec، ada-002 من OpenAI، Azure Computer Vision والعديد غيرها. اختيار نموذج للاستخدام يعتمد على اللغات التي تستخدمها، نوع المحتوى المشفر (نص/صور/صوت)، حجم الإدخال الذي يمكنه تشفيره وطول ناتج التضمين.
مثال على نص مضمّن باستخدام نموذج OpenAI text-embedding-ada-002 هو:

عندما يطرح المستخدم سؤالاً، يقوم جهاز الاسترجاع بتحويله إلى متجه باستخدام مُرمز الاستعلام، ثم يبحث في فهرس نتائج البحث عن المتجهات ذات الصلة في المستندات المتعلقة بالإدخال. بمجرد الانتهاء، يحول كل من المتجه المدخل ومتجهات المستند إلى نص ويمررهما عبر LLM.
يحدث الاسترجاع عندما يحاول النظام بسرعة إيجاد المستندات من الفهرس التي تلبي معايير البحث. هدف جهاز الاسترجاع هو الحصول على مستندات ستُستخدم لتوفير سياق وتأصيل LLM على بياناتك.
هناك عدة طرق للبحث داخل قاعدة بياناتنا مثل:
-
بحث بالكلمات المفتاحية - يُستخدم للبحث النصي
-
البحث الشعاعي - يحول المستندات من نص إلى تمثيلات شعاعية باستخدام نماذج التضمين، مما يسمح بـ بحث دلالي باستخدام معنى الكلمات. يتم الاسترجاع من خلال الاستعلام عن المستندات التي تمثيلاتها الشعاعية الأقرب إلى سؤال المستخدم.
-
هجيني - مزيج من كل من بحث الكلمات المفتاحية والبحث الشعاعي.
يظهر تحدي في الاسترجاع عندما لا يوجد رد مشابه للاستعلام في قاعدة البيانات، عندها يعيد النظام أفضل المعلومات التي يمكنه الحصول عليها، ومع ذلك، يمكنك استخدام تكتيكات مثل تحديد الحد الأقصى للمسافة للملاءمة أو استخدام البحث الهجين الذي يجمع بين الكلمات المفتاحية والبحث الشعاعي. في هذا الدرس سنستخدم البحث الهجين، وهو مزيج من كلا من البحث الشعاعي وبحث الكلمات المفتاحية. سنخزن بياناتنا في إطار بيانات يحتوي أعمدته على الأجزاء وكذلك التضمينات.
سيبحث جهاز الاسترجاع في قاعدة المعرفة عن التضمينات التي تكون متقاربة، الجار الأقرب، لأن النصوص مشابهة. في السيناريو، عندما يطرح المستخدم استعلامًا، يتم تضمينه أولاً ثم مطابقته مع التضمينات المشابهة. المقياس الشائع المستخدم لقياس التشابه بين المتجهات هو تشابه جيب تمام الزاوية (cosine similarity) والذي يعتمد على الزاوية بين متجهين.
يمكننا قياس التشابه باستخدام بدائل أخرى مثل المسافة الإقليدية وهي الخط المستقيم بين نقاط نهاية المتجه ومتجه جداء النقطة التي تقيس مجموع حاصل ضرب عناصر متقابلة بين متجهين.
عند القيام بالاسترجاع، سنحتاج إلى بناء فهرس بحث لقاعدة المعرفة قبل تنفيذ البحث. يقوم الفهرس بتخزين التضمينات الخاصة بنا ويمكنه استرجاع الأجزاء الأكثر تشابهًا بسرعة حتى في قاعدة بيانات كبيرة. يمكننا إنشاء فهرسنا محليًا باستخدام:
from sklearn.neighbors import NearestNeighbors
embeddings = flattened_df['embeddings'].to_list()
# إنشاء فهرس البحث
nbrs = NearestNeighbors(n_neighbors=5, algorithm='ball_tree').fit(embeddings)
# للاستعلام من الفهرس، يمكنك استخدام طريقة kneighbors
distances, indices = nbrs.kneighbors(embeddings)بمجرد أن تستعلم قاعدة البيانات، قد تحتاج إلى ترتيب النتائج من الأكثر صلة. يستخدم LLM لإعادة الترتيب التعلم الآلي لتحسين صلة نتائج البحث عن طريق ترتيبها من الأكثر صلة. باستخدام Azure AI Search، تتم إعادة الترتيب تلقائيًا باستخدام معيد ترتيب دلالي. مثال على كيفية عمل إعادة الترتيب باستخدام الجيران الأقرب:
# ابحث عن المستندات الأكثر تشابهًا
distances, indices = nbrs.kneighbors([query_vector])
index = []
# اطبع المستندات الأكثر تشابهًا
for i in range(3):
index = indices[0][i]
for index in indices[0]:
print(flattened_df['chunks'].iloc[index])
print(flattened_df['path'].iloc[index])
print(flattened_df['distances'].iloc[index])
else:
print(f"Index {index} not found in DataFrame")الخطوة الأخيرة هي إضافة نموذج LLM الخاص بنا إلى المزيج ليكون قادرًا على الحصول على ردود مؤصلة على بياناتنا. يمكننا تطبيق ذلك كما يلي:
user_input = "what is a perceptron?"
def chatbot(user_input):
# تحويل السؤال إلى متجه استعلام
query_vector = create_embeddings(user_input)
# العثور على المستندات الأكثر تشابهًا
distances, indices = nbrs.kneighbors([query_vector])
# إضافة المستندات إلى الاستعلام لتوفير السياق
history = []
for index in indices[0]:
history.append(flattened_df['chunks'].iloc[index])
# دمج التاريخ ومدخلات المستخدم
history.append(user_input)
# إنشاء كائن رسالة
messages=[
{"role": "system", "content": "You are an AI assistant that helps with AI questions."},
{"role": "user", "content": "\n\n".join(history) }
]
# استخدام إكمال الدردشة لتوليد استجابة
response = openai.chat.completions.create(
model="gpt-4",
temperature=0.7,
max_tokens=800,
messages=messages
)
return response.choices[0].message
chatbot(user_input)-
جودة الردود المقدمة مع التأكد من أنها تبدو طبيعية، سلسة وشبيهة بالبشر
-
تأصيل البيانات: تقييم ما إذا كانت الاستجابة أتت من المستندات المقدمة
-
الصلة: تقييم ما إذا كانت الاستجابة تطابق وتتعلق بالسؤال المطروح
-
الطلاقة - ما إذا كانت الاستجابة منطقية نحويًا
هناك العديد من حالات الاستخدام حيث يمكن لاستدعاءات الوظائف تحسين تطبيقك مثل:
-
الأسئلة والإجابات: تأصيل بيانات شركتك إلى محادثة يمكن للموظفين استخدامها لطرح الأسئلة.
-
أنظمة التوصية: حيث يمكنك إنشاء نظام يطابق القيم الأكثر تشابهًا مثل الأفلام، المطاعم والعديد غيرها.
-
خدمات روبوت المحادثة: يمكنك تخزين سجل المحادثات وتخصيص المحادثة بناءً على بيانات المستخدم.
-
البحث عن الصور استنادًا إلى التضمينات الشعاعية، مفيد عند القيام بالتعرف على الصور واكتشاف الشذوذ.
لقد غطينا المجالات الأساسية لـ RAG من إضافة بياناتنا إلى التطبيق، استعلام المستخدم والإخراج. لتبسيط إنشاء RAG، يمكنك استخدام أُطُر مثل Semanti Kernel، Langchain أو Autogen.
لمتابعة تعلمك حول التوليد المعزز بالاسترجاع (RAG) يمكنك بناء:
-
إنشاء واجهة أمامية للتطبيق باستخدام الإطار الذي تفضله
-
استخدام إطار عمل، إما LangChain أو Semantic Kernel، وإعادة إنشاء تطبيقك.
تهانينا على إكمال الدرس 👏.
بعد إكمال هذا الدرس، تصفح مجموعتنا تعلم الذكاء الاصطناعي التوليدي للاستمرار في رفع مستوى معرفتك بالذكاء الاصطناعي التوليدي!
تنويه:
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية Co-op Translator. على الرغم من سعينا لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات المهمة والحرجة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة.


