Skip to content

Instantly share code, notes, and snippets.

@saas-coder
Created August 27, 2024 11:41
Show Gist options
  • Select an option

  • Save saas-coder/bc14a681513133c7c54f03b65cf052fd to your computer and use it in GitHub Desktop.

Select an option

Save saas-coder/bc14a681513133c7c54f03b65cf052fd to your computer and use it in GitHub Desktop.

توضيح كود نظام الأسئلة والأجوبة (RAG)

في هذا المستند، سنقوم بشرح مفصل لكود نظام الأسئلة والأجوبة (RAG) المطبق في ملف Python. سنتناول كيفية عمل النظام من الأساسيات إلى التفاصيل التقنية، بما في ذلك تقسيم المستندات، التضمين (embedding)، ونظام البحث القائم على FAISS.

مقدمة

نظام الأسئلة والأجوبة (RAG) هو نظام يتعامل مع استخراج المعلومات من مستندات نصية للإجابة على الأسئلة بناءً على المحتوى المستخرج. يتضمن هذا النظام عدة خطوات أساسية: تحميل المستندات، تقسيم النصوص، إنشاء قاعدة بيانات بحثية، والتعامل مع نموذج ذكاء اصطناعي للإجابة على الأسئلة.

كيفية عمل نظام RAG

1. تحميل المكتبات والتكوينات الأساسية

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، التي تُستخدم في معالجة النصوص والبحث والذكاء الاصطناعي.

2. إعداد البيئة

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، والتي تستخدمها المكتبات للقيام بالمهام الذكية.

3. تحميل المستندات وتقسيم النصوص

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) لزيادة دقة المعالجة.

4. إنشاء قاعدة بيانات بحثية

embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(docs_splitted, embeddings)
  • التضمين (Embedding): يتم تحويل النصوص إلى تمثيلات عددية (embeddings) باستخدام OpenAIEmbeddings. التضمين هو عملية تحويل النصوص إلى قِيَم عددية بحيث يمكن للنماذج فهمها ومعالجتها.

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

5. تحميل نموذج الأسئلة والأجوبة

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) للتحكم في طبيعة الإجابات.

  • سلسلة الأسئلة والأجوبة: يتم تحميل سلسلة الأسئلة والأجوبة التي تستخدم النموذج للإجابة على الأسئلة بناءً على النصوص التي تم تحويلها إلى تضمينات.

6. حفظ سلسلة الأسئلة والأجوبة

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. هذا يسهل الوصول إلى التكوين لاحقًا أو استخدامه في مشاريع أخرى.

7. وظيفة الحصول على الإجابات

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 بناءً على استعلام المستخدم.

  • توليد الإجابات: بعد العثور على النصوص ذات الصلة، يتم استخدام سلسلة الأسئلة والأجوبة لتوليد إجابات استنادًا إلى المحتوى المستخرج.

ملخص

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

  1. تحميل المستندات وتقسيمها إلى أجزاء صغيرة.
  2. تحويل النصوص إلى تمثيلات عددية (التضمين).
  3. إنشاء قاعدة بيانات بحثية باستخدام FAISS.
  4. تحميل نموذج لغة للإجابة على الأسئلة.
  5. حفظ التكوين الحالي للنظام.
  6. استخدام النظام للإجابة على الأسئلة بناءً على النصوص المستخرجة.

هذا التصميم يضمن فعالية النظام في استخراج المعلومات الدقيقة والإجابة على الأسئلة بدقة عالية.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment