بناء محرك استجابة سريعة للأسئلة (RAG) سريع وفعال باستخدام بيانات مجمعة من الويب وتقنية Together AI

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

1. تجهيز بيئة العمل وتثبيت المكتبات اللازمة

قبل البدء، نحتاج إلى تثبيت المكتبات الضرورية باستخدام الأمر التالي في محيط Python:

pip -q install --upgrade langchain-core langchain-community langchain-together faiss-cpu tiktoken beautifulsoup4 html2text

هذا الأمر يقوم بتثبيت وتحديث جميع المكتبات اللازمة، بما في ذلك:

  • LangChain: لإدارة سير العمل.
  • Together AI integration: للتكامل مع منصة Together AI.
  • FAISS: لبناء مؤشر المتجهات.
  • Tiktoken: لمعالجة الرموز.
  • BeautifulSoup4 و html2text: لتحليل صفحات الويب.

بعد ذلك، نقوم بتحديد مفتاح API الخاص بـ Together AI:

import os, getpass, warnings, textwrap, json
if "TOGETHER_API_KEY" not in os.environ:
    os.environ["TOGETHER_API_KEY"] = getpass.getpass("Enter your Together API key: ")

هذا الكود يتحقق من وجود مفتاح API في متغيرات البيئة، وإذا لم يكن موجودًا، فإنه يطلب من المستخدم إدخاله بشكل آمن.

2. جمع البيانات من صفحات الويب

نستخدم مكتبة WebBaseLoader من LangChain لجمع البيانات من صفحات الويب المحددة:

from langchain_community.document_loaders import WebBaseLoader
URLS = [
    "https://python.langchain.com/docs/integrations/text_embedding/together/",
    "https://api.together.xyz/",
    "https://together.ai/blog"
]
raw_docs = WebBaseLoader(URLS).load()

يقوم هذا الكود بتحميل محتوى صفحات الويب المحددة في متغير URLS، ويقوم بتنظيف النصوص من العناصر غير المهمة.

3. تقسيم النصوص إلى أجزاء أصغر

نقوم بتقسيم النصوص الطويلة إلى أجزاء أصغر باستخدام RecursiveCharacterTextSplitter:

from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
docs = splitter.split_documents(raw_docs)
print(f"Loaded {len(raw_docs)} pages → {len(docs)} chunks after splitting.")

هذا الكود يقسم كل صفحة إلى أجزاء بحجم 800 حرف مع تداخل 100 حرف بين الأجزاء، مما يحافظ على سياق النص.

4. إنشاء المتجهات النصية وتخزينها

نستخدم نموذج togethercomputer/m2-bert-80M-8k-retrieval من Together AI لإنشاء المتجهات النصية للأجزاء، ثم نقوم بتخزينها باستخدام FAISS:

from langchain_together.embeddings import TogetherEmbeddings
embeddings = TogetherEmbeddings(model="togethercomputer/m2-bert-80M-8k-retrieval")
from langchain_community.vectorstores import FAISS
vector_store = FAISS.from_documents(docs, embeddings)

هذا الكود يقوم بإنشاء المتجهات النصية لكل جزء من النصوص، ويخزنها في مؤشر FAISS للبحث السريع.

5. اختيار نموذج اللغة الكبير (LLM)

نستخدم نموذج mistralai/Mistral-7B-Instruct-v0.3 من Together AI كنموذج LLM:

from langchain_together.chat_models import ChatTogether
llm = ChatTogether(model="mistralai/Mistral-7B-Instruct-v0.3", temperature=0.2, max_tokens=512)

هذا الكود يحدد نموذج اللغة الكبير المستخدم، مع ضبط معاملات مثل درجة الحرارة وعدد الرموز القصوى.

6. بناء سلسلة الاستجابة للأسئلة

نقوم بإنشاء سلسلة استجابة للأسئلة باستخدام RetrievalQA:

from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vector_store.as_retriever(search_kwargs={"k": 4}),
    return_source_documents=True
)

هذا الكود يربط بين مُستخرج المعلومات (FAISS) ونموذج اللغة الكبير (LLM) لبناء سلسلة الاستجابة للأسئلة.

7. طرح الأسئلة والحصول على الإجابات

نطرح سؤالًا ونحصل على الإجابة مع مصادرها:

QUESTION = "How do I use TogetherEmbeddings inside LangChain, and what model name should I pass?"
result = qa_chain(QUESTION)
print("nAnswer:n", textwrap.fill(result['result'], 100))
print("nSources:")
for doc in result['source_documents']:
    print(" •", doc.metadata['source'])

هذا الكود يطرح سؤالًا على سلسلة الاستجابة للأسئلة، ويعرض الإجابة مع مصادرها.

8. الخاتمة

في هذا الدليل، قمنا ببناء محرك استجابة سريعة للأسئلة (RAG) كامل باستخدام تقنية Together AI، بدءًا من جمع البيانات وحتى تقديم الإجابات. يُعتبر هذا النهج مُرنًا و قابل للتعديل، حيث يمكن استبدال FAISS بـ Chroma أو استخدام نماذج لغوية كبيرة أخرى. تُسهّل منصة Together AI عملية البناء من خلال توفير واجهة برمجة تطبيقات (API) موحدة وسهلة الاستخدام.

المصدر: MarkTechPost