بناء نظام RAG من الصفر: دليل عملي
RAG (التوليد المعزز بالاسترجاع) هو أشهر بنية لبناء تطبيقات LLM. هذا الدليل العملي يبني نظام RAG كاملاً من الصفر.
ما الذي نبني
نظام أسئلة وأجوبة للمستندات يمكنه الإجابة على أسئلتك حول ملفات PDF أو ملفات markdown أو أي مستندات نصية.
المتطلبات الأساسية
- Python 3.10+
- مفتاح OpenAI API (أو أي LLM API)
- فهم أساسي للغة Python
الخطوة 1: الإعداد
mkdir rag-system && cd rag-system
python -m venv venv
source venv/bin/activate
pip install openai chromadb tiktoken pypdf
الخطوة 2: استيراد المستندات
import os
from typing import List
from pypdf import PdfReader
def load_documents(folder_path: str) -> List[str]:
documents = []
for filename in os.listdir(folder_path):
if filename.endswith('.pdf'):
reader = PdfReader(os.path.join(folder_path, filename))
text = ""
for page in reader.pages:
text += page.extract_text()
documents.append(text)
elif filename.endswith('.txt') or filename.endswith('.md'):
with open(os.path.join(folder_path, filename), 'r') as f:
documents.append(f.read())
return documents
الخطوة 3: التقطيع
def chunk_text(text: str, chunk_size=500, overlap=50) -> List[str]:
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunks.append(text[start:end])
start = end - overlap
return chunks
الخطوة 4: إنشاء التضمينات والتخزين
import chromadb
from openai import OpenAI
client = OpenAI()
chroma_client = chromadb.Client()
collection = chroma_client.create_collection(name="documents")
def index_documents(chunks: List[str]):
for i, chunk in enumerate(chunks):
response = client.embeddings.create(
model="text-embedding-3-small",
input=chunk
)
embedding = response.data[0].embedding
collection.add(
embeddings=[embedding],
documents=[chunk],
ids=[str(i)]
)
الخطوة 5: الاسترجاع والتوليد
def query_rag(question: str) -> str:
# تضمين السؤال
response = client.embeddings.create(
model="text-embedding-3-small",
input=question
)
query_embedding = response.data[0].embedding
# استرجاع القطع ذات الصلة
results = collection.query(
query_embeddings=[query_embedding],
n_results=3
)
context = "
".join(results['documents'][0])
# توليد الإجابة
completion = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "أجب على السؤال بناءً على السياق المقدم."},
{"role": "user", "content": f"السياق:
{context}
السؤال: {question}"}
]
)
return completion.choices[0].message.content
الخطوة 6: النشر كواجهة API
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/query', methods=['POST'])
def query():
data = request.json
answer = query_rag(data['question'])
return jsonify({'answer': answer})
if __name__ == '__main__':
app.run(port=5000)
الخطوات التالية
- أضف إعادة الترتيب لاسترجاع أفضل
- طبق البحث الهجين (كلمات مفتاحية + دلالي)
- أضف استشهادات بالمصادر للإجابات
- جرب استراتيجيات تقطيع مختلفة
برنامجنا "ابنِ باستخدام LLMs" يغطي تقنيات RAG المتقدمة والنشر الإنتاجي.