Local AI

بناء خط أنابيب RAG محلي باستخدام Ollama وLangChain لاسترجاع معرفة المؤسسات في الوقت الفعلي

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

يرشدك هذا الدليل عبر المكونات المعمارية لنظام RAG المحلي، ويقدم تطبيقاً عملياً باستخدام لغة بايثون. سنركز على استيعاب المستندات المؤسسية، وتضميمها محلياً، واستعلام قاعدة المعرفة في الوقت الفعلي.

لماذا نختار الحل المحلي؟

توفر واجهات برمجة التطبيقات (APIs) لنماذج اللغات الكبيرة المعتمدة على السحابة الراحة، لكنها تأتي مع عيوب كبيرة لاستخدامات المؤسسات. يمكن أن تشكل مخاوف عبور الحدود للبيانات، وتكاليف واجهات برمجة التطبيقات غير المتوقعة، وزمن استجابة الشبكة عوائق أمام التطبيقات في الوقت الفعلي. يحل الاستدلال المحلي هذه المشاكل من خلال:

  • سيادة البيانات: لا تغادر بيانات المستندات الخام خادمك.
  • الكفاءة من حيث التكلفة: لا توجد رسوم لكل رمز؛ أنت تدفع مقابل الكهرباء والأجهزة.
  • التخصيص: سهولة ضبط النماذج الدقيقة أو توسيع نافذة السياق باستخدام الأجهزة المحلية.

نظرة عامة على البنية

يتكون خط أنابيب RAG المحلي عادةً من أربع مراحل رئيسية: الاستيعاب، والتضميم، والتخزين، والاسترجاع مع التوليد. في هذا البرنامج التعليمي، سنستخدم Mistral عبر Ollama للتوليد وnomic-embed-text للتضميم، وكلاهما محسّن للتنفيذ المحلي.

إعداد البيئة

قبل الغوص في الكود، تأكد من تثبيت Ollama وتشغيله. قم بسحب النماذج اللازمة:

ollama pull mistral
ollama pull nomic-embed-text

بعد ذلك، قم بتثبيت مكتبات بايثون المطلوبة:

pip install langchain langchain-community langchain-huggingface unstructured

تنفيذ سلسلة RAG

يعتمد جوهر حلنا على استخدام UnstructuredFileLoader الخاص بـ LangChain لاستيعاب المستندات وOllamaEmbeddings لتحويل النص إلى متجهات. يوضح البرنامج النصي التالي منتجاً قابلاً للتنفيذ الأدنى (MVP) لاستعلام مستند PDF محلي.

from langchain_community.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.llms import Ollama
from langchain.chains import RetrievalQA
import os

# 1. تحميل وتجزئة المستندات
loader = UnstructuredFileLoader("enterprise_policy.pdf")
documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000, 
    chunk_overlap=200
)
docs = text_splitter.split_documents(documents)

# 2. إنشاء التضميمات محلياً
embeddings = Ollama(model="nomic-embed-text")

# 3. التخزين في قاعدة بيانات المتجهات (FAISS)
db = FAISS.from_documents(docs, embeddings)

# 4. تهيئة نموذج اللغة الكبير وسلسلة الاسترجاع
llm = Ollama(model="mistral", temperature=0.1)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm, 
    chain_type="stuff", 
    retriever=db.as_retriever(),
    return_source_documents=True
)

# 5. استعلام النظام
query = "ما هي سياسة الشركة بشأن العمل عن بُعد؟"
result = qa_chain.invoke({"query": query})
print(result['result'])

اعتبارات عملية للإنتاج

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

أخيراً، راقب استخدام وحدة معالجة الرسومات (GPU). يعد الاستدلال المحلي مكثفاً من حيث الأجهزة. يمكن أن تساعدك أدوات مثل nvtop في تحسين أحجام الدفعات وحدود التزامن لمنع تحميل النظام الزائد أثناء ذروة استخدام المؤسسات.

الخاتمة

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

Share: