How-To Guides

بناء روبوت محادثة ذكي مدعوم بتقنية RAG باستخدام قواعد البيانات المتجهة وLangChain

يتطور الذكاء الاصطناعي بسرعة، لكن النماذج اللغوية الكبيرة (LLMs) لا تزال تعاني من قيد حرج: فهي تعرف فقط ما تم تدريبها عليه. يخلق هذا فجوة كبيرة عند التعامل مع البيانات الخاصة، أو الأحداث الحديثة، أو المعرفة المتخصصة. يعالج التوليد المعزز بالاسترجاع (RAG) هذه الفجوة من خلال السماح للذكاء الاصطناعي باسترجاع المعلومات ذات الصلة من مصادر خارجية قبل توليد رد. في هذا الدليل، سنستكشف كيفية بناء خط أنابيب RAG قوي باستخدام LangChain وقواعد البيانات المتجهة.

فهم بنية RAG

في جوهره، يتكون نظام RAG من مرحلتين رئيسيتين: الفهرسة والاسترجاع. خلال مرحلة الفهرسة، تقوم باستيعاب البيانات غير المهيكلة (مثل ملفات PDF، أو ملفات الماركداون، أو سجلات قاعدة البيانات) وتحويلها إلى تمثيلات رقمية تسمى المتجهات (embeddings). يتم تخزين هذه المتجهات في قاعدة بيانات متجهة، مما يتيح البحث عن التشابه. في مرحلة الاسترجاع، عندما يطرح المستخدم سؤالاً، يقوم النظام بتحويل الاستعلام إلى متجه، وإيجاد المستندات الأكثر تشابهاً في قاعدة البيانات، ثم تغذية تلك المستندات كسياق إلى النموذج اللغوي الكبير (LLM) لتوليد إجابة دقيقة وموثقة.

إعداد البيئة

قبل الغوص في الكود، تأكد من تثبيت Python. سنحتاج إلى عدة مكتبات رئيسية: langchain لإطار العمل التوجيهي، وlangchain-community للتكاملات المحددة، ومخزن متجه. لهذا المثال، سنستخدم faiss-cpu للتخزين المحلي، على الرغم من أن بيئات الإنتاج غالباً ما تستخدم Pinecone أو Weaviate أو Elasticsearch.

قم بتثبيت التبعيات باستخدام pip:

pip install langchain langchain-community langchain-openai faiss-cpython python-dotenv

قم بإنشاء ملف .env لتخزين مفتاح واجهة برمجة تطبيقات OpenAI الخاص بك بأمان:

OPENAI_API_KEY=your_api_key_here

الخطوة 1: تحميل المستندات وتجزئتها

لدي نماذج LLM حدود لنافذة السياق، لذا يجب علينا تقسيم مستنداتنا إلى قطع أصغر. سنستخدم RecursiveCharacterTextSplitter لتقسيم النص إلى أجزاء قابلة للإدارة، مع ضمان الحفاظ على المعنى الدلالي.

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import PyPDFLoader

# تحميل المستندات
loader = PyPDFLoader("example.pdf")
documents = loader.load()

# تقسيم إلى قطع
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)

الخطوة 2: المتجهات والتخزين المتجهي

بعد ذلك، نحتاج إلى تحويل هذه القطع النصية إلى متجهات. سنستخدم نموذج المتجهات الخاص بـ OpenAI ومخزن FAISS المتجه. هذه الخطوة تنشئ "ذاكرة" روبوت المحادثة الخاص بنا.

from langchain.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)

الخطوة 3: بناء المسترجع والسلسلة

الآن نحدد كيفية استرجاع المعلومات بواسطة روبوت المحادثة. نقوم بإنشاء مسترجع من مخزننا المتجه ودمجه مع نموذج لغوي كبير (LLM) لتكوين السلسلة النهائية. هنا يحدث جزء "التوليد" من RAG. يتلقى النموذج اللغوي الكبير السياق المسترجع وسؤال المستخدم لصياغة رد.

from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# إنشاء سلسلة الاسترجاع والإجابة
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever()
)

الخطوة 4: التفاعل مع روبوت المحادثة

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

query = "ما هي النتائج الرئيسية في المستند؟"
result = qa_chain.invoke({"query": query})
print(result["result"])

الخاتمة

يؤدي بناء روبوت محادثة مدعوم بتقنية RAG إلى تحويل النماذج اللغوية الكبيرة الثابتة إلى مساعدين ديناميكيين واعين بالمعرفة. من خلال الاستفادة من قواعد البيانات المتجهة وLangChain، يمكن للمطورين إنشاء تطبيقات ليست فقط ذكية، ولكن أيضاً دقيقة ومحدثة. على الرغم من أن هذا المثال يستخدم FAISS وملفات PDF محلية، فإن نفس المبادئ تنطبق على بحيرات البيانات على نطاق المؤسسات وقواعد البيانات في الوقت الفعلي. أثناء تحسين تنفيذك، فكر في تجربة نماذج متجهات مختلفة، واستراتيجيات التجزئة، وتقنيات الاسترجاع لتحسين الأداء لحالة الاستخدام الخاصة بك.

Share: