في هذا المستند، سنقوم بشرح مفصل لكود نظام الأسئلة والأجوبة (RAG) المطبق في ملف Python. سنتناول كيفية عمل النظام من الأساسيات إلى التفاصيل التقنية، بما في ذلك تقسيم المستندات، التضمين (embedding)، ونظام البحث القائم على FAISS.
نظام الأسئلة والأجوبة (RAG) هو نظام يتعامل مع استخراج المعلومات من مستندات نصية للإجابة على الأسئلة بناءً على المحتوى المستخرج. يتضمن هذا النظام عدة خطوات أساسية: تحميل المستندات، تقسيم النصوص، إنشاء قاعدة بيانات بحثية، والتعامل مع نموذج ذكاء اصطناعي للإجابة على الأسئلة.
from google.colab import drive
drive.mount("/content/drive", force_remount=True)
!pip install langchain -q
!pip install langchain-community -q
!pip install unstructured -q
!pip install langchain_openai -q
!pip install faiss-cpu -q
!pip install chromadb -q
!pip install sentence-transformers -q
!pip install pypdf- تحميل المكتبات: يتم تحميل المكتبات الضرورية مثل
langchainوfaiss-cpuوsentence-transformers، التي تُستخدم في معالجة النصوص والبحث والذكاء الاصطناعي.
import os
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain
from pprint import pprint
os.environ["OPENAI_API_KEY"] = "sk-proj-dKOppS5IV1pzLPS4oXndT3BlbkFJqsbqEQonQwY2KK9HlNPb"
os.environ["HUGGINGFACEHUB_API_TOKEN"] = "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"- تعيين مفاتيح API: يتم تعيين مفاتيح API للوصول إلى خدمات OpenAI وHugging Face، والتي تستخدمها المكتبات للقيام بالمهام الذكية.
files_dir = "/content/drive/MyDrive/reem/"
path = "/content/drive/MyDrive/reem/"
documents = []
for doc in os.listdir(path):
print(doc)
loader = PyPDFLoader(path + doc)
documents.extend(loader.load())
text_splitter = CharacterTextSplitter(chunk_size=2200, chunk_overlap=220, separator="\n")
docs_splitted = text_splitter.split_documents(documents)-
تحميل المستندات: يتم تحميل مستندات PDF من المجلد المحدد باستخدام
PyPDFLoader. هذه المكتبة تدير استخراج النصوص من ملفات PDF. -
تقسيم النصوص: يتم استخدام
CharacterTextSplitterلتقسيم النصوص الكبيرة إلى أجزاء أصغر. هذا مفيد لأن معالجة النصوص الكبيرة قد تكون غير فعالة، وتقسيمها إلى أجزاء صغيرة يساعد في تحسين الأداء والبحث. يتم تحديد حجم الجزء (chunk_size) وحجم التداخل بين الأجزاء (chunk_overlap) لزيادة دقة المعالجة.
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(docs_splitted, embeddings)-
التضمين (Embedding): يتم تحويل النصوص إلى تمثيلات عددية (embeddings) باستخدام
OpenAIEmbeddings. التضمين هو عملية تحويل النصوص إلى قِيَم عددية بحيث يمكن للنماذج فهمها ومعالجتها. -
قاعدة بيانات FAISS: يتم إنشاء قاعدة بيانات بحثية باستخدام مكتبة FAISS. FAISS هو أداة بحث فعالة تبحث في مجموعات كبيرة من التضمينات بسرعة. هذا يتيح البحث عن نصوص مشابهة بسرعة بناءً على الاستعلامات.
llm = ChatOpenAI(temperature=0, max_tokens=256, model="gpt-3.5-turbo")
chain = load_qa_chain(llm, chain_type="stuff")-
نموذج الذكاء الاصطناعي: يتم تحميل نموذج GPT-3.5-turbo، وهو نموذج لغة من OpenAI، لضمان جودة عالية للإجابات. يتم تعيين معلمات مثل درجة الحرارة (temperature) وحد أقصى للرموز (max_tokens) للتحكم في طبيعة الإجابات.
-
سلسلة الأسئلة والأجوبة: يتم تحميل سلسلة الأسئلة والأجوبة التي تستخدم النموذج للإجابة على الأسئلة بناءً على النصوص التي تم تحويلها إلى تضمينات.
from langchain_core.load import dumpd, dumps, load, loads
dict_representation = dumpd(chain)
print(type(dict_representation))
import json
with open("/content/drive/MyDrive/ryan/chain.json", "w") as fp:
string_representation = dumps(chain, pretty=True)
json.dump(string_representation, fp)- حفظ التكوين: يتم حفظ التكوين الحالي لسلسلة الأسئلة والأجوبة بتنسيق JSON. هذا يسهل الوصول إلى التكوين لاحقًا أو استخدامه في مشاريع أخرى.
def get_answer(query):
faiss_out = db.similarity_search(query)
result = chain.run(input_documents=faiss_out, question=query)
return result
get_answer("ما هو البريد الإلكتروني للحصول على مزيد من التفاصيل؟")
get_answer("ما هو المعدل المطلوب في اللغة الإنجليزية للقبول في تخصص الطب والجراحة؟")-
البحث عن النصوص: يتم استخدام وظيفة
get_answerللبحث في قاعدة بيانات FAISS بناءً على استعلام المستخدم. -
توليد الإجابات: بعد العثور على النصوص ذات الصلة، يتم استخدام سلسلة الأسئلة والأجوبة لتوليد إجابات استنادًا إلى المحتوى المستخرج.
يوفر هذا الكود نظامًا متكاملاً للإجابة على الأسئلة باستخدام تقنيات حديثة في معالجة النصوص والبحث والذكاء الاصطناعي. النظام يشمل:
- تحميل المستندات وتقسيمها إلى أجزاء صغيرة.
- تحويل النصوص إلى تمثيلات عددية (التضمين).
- إنشاء قاعدة بيانات بحثية باستخدام FAISS.
- تحميل نموذج لغة للإجابة على الأسئلة.
- حفظ التكوين الحالي للنظام.
- استخدام النظام للإجابة على الأسئلة بناءً على النصوص المستخرجة.
هذا التصميم يضمن فعالية النظام في استخراج المعلومات الدقيقة والإجابة على الأسئلة بدقة عالية.