تصویر از نویسنده
تصویر از نویسنده

ساخت یک برنامه RAG با استفاده از LlamaIndex

مدل‌های زبانی بزرگ (LLM) مانند ChatGPT و Llama در پاسخ دادن به سوالات عالی هستند، اما به دانشی که بر اساس آن آموزش دیده‌اند محدود می‌شوند. آنها نمی‌توانند به داده‌های خصوصی دسترسی داشته باشند یا فراتر از قطع آموزش خود یاد بگیرند. بنابراین، سوال اصلی این است... چگونه می‌توانیم دانش آنها را گسترش دهیم؟

پاسخ در تولید افزوده شده با بازیابی (RAG) نهفته است. امروز ما خط لوله RAG را بررسی خواهیم کرد و نحوه ساخت آن با استفاده از LLama Index را نشان خواهیم داد.

بیایید شروع کنیم!

تولید افزوده شده با بازیابی: اصول اولیه

LLM ها پیشرفته‌ترین مدل‌های پردازش زبان طبیعی (NLP) امروزی هستند که در ترجمه، نوشتن و پرسش و پاسخ عمومی عالی هستند. با این حال، آنها با پرسش‌های خاص دامنه مشکل دارند و اغلب توهم ایجاد می‌کنند.

در چنین مواردی، ممکن است فقط چند سند حاوی زمینه مرتبط در هر پرسش باشند. برای رفع این مشکل، به یک سیستم ساده نیاز داریم که به طور موثر اطلاعات مربوطه را بازیابی و ادغام کند قبل از اینکه پاسخ تولید کند - این جوهر RAG است.

LLM های از پیش آموزش دیده، دانش را از طریق سه رویکرد اصلی به دست می‌آورند که هر کدام محدودیت‌هایی دارند:

  1. آموزش: ساخت یک LLM از ابتدا نیاز به آموزش شبکه‌های عصبی عظیم بر روی تریلیون‌ها توکن دارد که صدها میلیون دلار هزینه دارد - و این برای اکثر افراد غیرممکن است.
  2. Fine-tuning (تنظیم دقیق): این روش یک مدل از پیش آموزش دیده را با داده‌های جدید تطبیق می‌دهد اما از نظر زمان و منابع پرهزینه است. مگر اینکه نیاز خاصی وجود داشته باشد، همیشه عملی نیست.
  3. Prompting (درخواست): در دسترس‌ترین رویکرد، prompting اطلاعات جدید را در پنجره زمینه LLM وارد می‌کند و آن را قادر می‌سازد تا بر اساس داده‌های ارائه شده به پرسش‌ها پاسخ دهد. با این حال، از آنجایی که اندازه‌های سند اغلب از محدودیت‌های زمینه فراتر می‌روند، این روش به تنهایی کافی نیست.

RAG با پردازش، ذخیره و بازیابی کارآمد بخش‌های مربوطه سند در زمان پرسش، بر این محدودیت‌ها غلبه می‌کند. این اطمینان می‌دهد که LLM ها پاسخ‌های دقیق‌تر و آگاهانه‌تری را بدون نیاز به آموزش مجدد یا تنظیم دقیق پرهزینه تولید می‌کنند.

شمای یک برنامه RAG ساده
تصویر از نویسنده

اجزای اصلی یک خط لوله RAG

یک سیستم RAG از چندین جزء ضروری تشکیل شده است:

  • Text Splitter (تقسیم‌کننده متن): اسناد بزرگ را به تکه‌های کوچکتر تقسیم می‌کند که در پنجره زمینه LLM قرار می‌گیرند.
  • Embedding Model (مدل جاسازی): متن را به نمایش‌های برداری تبدیل می‌کند و جستجوهای مشابه کارآمد را امکان‌پذیر می‌سازد.
  • Vector Store (فروشگاه برداری): یک پایگاه داده تخصصی که جاسازی‌های سند را به همراه فراداده ذخیره و بازیابی می‌کند.
  • LLM: مدل زبانی اصلی که بر اساس اطلاعات بازیابی شده پاسخ تولید می‌کند.
  • Utility Functions (توابع ابزار): شامل ابزارهایی مانند بازیاب‌های وب و تجزیه‌کننده‌های سند برای پیش پردازش و بهبود بازیابی داده‌ها است.

هر یک از این اجزا نقش مهمی در دقیق و کارآمد کردن سیستم‌های RAG ایفا می‌کنند.

LlamaIndex چیست؟

LlamaIndex (که قبلاً GPTIndex نامیده می‌شد) یک چارچوب پایتون است که برای ساخت برنامه‌های کاربردی مبتنی بر LLM طراحی شده است. این به عنوان یک پل بین منابع داده سفارشی و مدل‌های زبانی بزرگ عمل می‌کند و ورود، فهرست‌بندی و پرس و جو از داده‌ها را ساده می‌کند.

LlamaIndex با پشتیبانی داخلی از منابع داده مختلف، پایگاه‌های داده برداری و رابط‌های پرس و جو، به عنوان یک راه حل جامع برای برنامه‌های RAG عمل می‌کند. همچنین به طور یکپارچه با ابزارهایی مانند LangChain، Flask و Docker ادغام می‌شود و آن را برای پیاده‌سازی‌های دنیای واقعی بسیار انعطاف‌پذیر می‌سازد.

مخزن رسمی LlamaIndex در GitHub را اینجا بررسی کنید.

پیاده‌سازی یک سیستم RAG ساده با LlamaIndex

مرحله 1: تنظیم محیط

قبل از پرداختن به پیاده‌سازی، باید محیط پایتون خود را تنظیم کرده و وابستگی‌های لازم را نصب کنیم. استفاده از یک محیط مجازی به مدیریت کارآمد وابستگی‌ها کمک می‌کند:

python -m venv rag_env
source rag_env/bin/activate  # On Windows, use: rag_env\Scripts\activate

اکنون می‌توانید کتابخانه‌های مورد نیاز را نصب کنید. LlamaIndex، OpenAI و FAISS برای ساخت سیستم RAG ما ضروری هستند:

pip install llama-index openai faiss-cpu

برای اینکه LlamaIndex بتواند یک مدل OpenAI را پرس و جو کند، فراموش نکنید که کلید API OpenAI خود را پیکربندی کنید:

import os 
os.environ["OPENAI_API_KEY"] = "your-api-key-here"

مرحله 2: بارگیری اسناد

برای اینکه بازیابی کار کند، ابتدا باید اسناد را در سیستم بارگیری کنیم. LlamaIndex SimpleDirectoryReader را برای رسیدگی کارآمد به این فرآیند ارائه می‌دهد. در مورد من، من از مقاله Attention Is All You Need برای گسترش دانش LLM خود استفاده خواهم کرد.

from llama_index import SimpleDirectoryReader

# Load text files from a directory
documents = SimpleDirectoryReader("./data").load_data()

print(f"Loaded {len(documents)} documents")

مرحله 3: ایجاد تقسیم متن

LLM ها محدودیت پنجره زمینه دارند، بنابراین نمی‌توانیم کل اسناد را به طور همزمان ارسال کنیم. در عوض، ما آنها را به تکه‌های کوچکتر و ساختاریافته برای بازیابی کارآمد تقسیم می‌کنیم.

from llama_index.text_splitter import SentenceSplitter

# Define a sentence-based text splitter
text_splitter = SentenceSplitter(chunk_size=512, chunk_overlap=50)

# Apply text splitting to documents
nodes = text_splitter.split_text([doc.text for doc in documents])

print(f"Split into {len(nodes)} chunks")

مرحله 4: فهرست‌بندی اسناد با جاسازی

برای انجام جستجوی معنایی، باید تکه‌های سند خود را به جاسازی برداری تبدیل کرده و آنها را در یک فهرست ذخیره کنیم.

from llama_index import VectorStoreIndex

# Create an index
index = VectorStoreIndex(nodes)

# Persist the index (optional)
index.storage_context.persist(persist_dir="./storage")

مرحله 5: پرس و جو از فهرست با RAG

اینجاست که RAG (بالاخره) وارد عمل می‌شود. ما از اسناد فهرست‌بندی شده پرس و جو می‌کنیم تا اطلاعات مربوطه را بازیابی کرده و یک پاسخ مبتنی بر LLM تولید کنیم.

from llama_index.query_engine import RetrieverQueryEngine

query_engine = RetrieverQueryEngine.from_args(index.as_retriever())

response = query_engine.query("What is attention?")
print(response)

اگر موارد فوق را اجرا کنیم، موارد زیر را به دست می‌آوریم:

Attention is a mechanism used in deep learning models to focus on relevant parts of the input sequence while processing data. In the paper 'Attention Is All You Need,' Vaswani et al. introduced the Transformer architecture, which relies entirely on self-attention mechanisms instead of recurrence or convolution. The key innovation is the self-attention mechanism, which allows the model to weigh the importance of different words in a sentence relative to each other, enabling better parallelization and long-range dependencies.

ما این کار را انجام دادیم!

سخن پایانی

ساخت یک سیستم RAG با LlamaIndex امکانات هیجان انگیزی را برای استفاده از LLM ها فراتر از داده‌های آموزشی آنها باز می‌کند. RAG با ادغام بازیابی سند، فهرست‌بندی مبتنی بر جاسازی و پرس و جو در زمان واقعی، دقت را افزایش می‌دهد و توهمات را کاهش می‌دهد و آن را به یک راه حل قدرتمند برای برنامه‌های خاص دامنه تبدیل می‌کند.

با پیاده‌سازی گام به گام در این راهنما، اکنون یک خط لوله RAG کاربردی دارید که می‌تواند به روش‌های مختلفی گسترش یابد، که ما آن را به عنوان تمرین برای خواننده باقی می‌گذاریم:

  1. سفارشی کردن جاسازی‌ها با مدل‌هایی مانند OpenAI، Cohere یا Hugging Face
  2. ادغام پایگاه‌های داده برداری مانند Pinecone، Weaviate یا ChromaDB برای بازیابی مقیاس‌پذیر
  3. استقرار سیستم از طریق API ها با استفاده از Flask، FastAPI یا یک رابط چت بات
  4. بهینه‌سازی استراتژی‌های تکه‌تکه کردن متن برای بهبود کیفیت بازیابی

اکنون نوبت شماست - آزمایش کنید، تکرار کنید و مرزهای آنچه با LlamaIndex امکان‌پذیر است را جابجا کنید!

ژوزپ فرر یک مهندس تجزیه و تحلیل از بارسلونا است. او در رشته مهندسی فیزیک فارغ التحصیل شده و در حال حاضر در زمینه علم داده کاربردی برای تحرک انسان فعالیت می‌کند. او یک تولید کننده محتوای پاره وقت است که بر علم داده و فناوری تمرکز دارد. ژوزپ در مورد همه چیزهای مرتبط با هوش مصنوعی می‌نویسد و کاربرد انفجار مداوم در این زمینه را پوشش می‌دهد.