Retrieval-Augmented Generation (RAG)

فراتر از پنجره: مهندسی سیستم‌های RAG با زمینه طولانی

انتشار مدل‌های زبانی بزرگ (LLM) با پنجره‌های زمینه عظیم—از ۳۲ هزار تا بیش از ۱ میلیون توکن—پارادایم تولید تقویت‌شده با بازیابی (RAG) را به‌طور بنیادین تغییر داده است. پیش از این، گلوگاه اصلی حفظ کوچک و دقیق بودن زمینه برای گنجاندن در محدودیت‌های توکن بود. امروزه، می‌توانیم اسناد کامل، پایگاه‌های کد یا تاریخچه گفتگوها را به مدل تزریق کنیم. با این حال، صرفاً ریختن داده‌های بیشتر در زمینه به‌طور خودکار پاسخ‌های بهتری را به همراه ندارد. در واقع، اغلب نویز را افزایش می‌دهد، تأخیر را بالا می‌برد و هزینه‌ها را متورم می‌کند. این راهنما بررسی می‌کند که چگونه سیستم‌های RAG با زمینه طولانی را مهندسی کنیم تا از پنجره‌های گسترده به‌طور مؤثر بهره ببرند و در عین حال دقت بازیابی را حفظ کنند.

تغییر در استراتژی بازیابی

RAG سنتی بر تکه‌بندی تهاجمی و بازیابی سخت‌گیرانه top-K تکیه داشت تا اطمینان حاصل شود که فقط قطعات مرتبط به LLM می‌رسند. با قابلیت‌های زمینه طولانی، می‌توانیم رویکرد بازیابی شل، استدلال دقیق را اتخاذ کنیم.

به جای بازیابی ۵ تکه کوچک، می‌توانیم ۵۰ پاراگراف مرتبط یا حتی اسناد کامل را بازیابی کنیم. سپس LLM به عنوان یک فیلتر پیشرفته عمل می‌کند و با استفاده از مکانیزم توجه خود، جزئیات خاصی را که برای پرسش مورد نیاز است شناسایی می‌کند. این روش به‌ویژه برای وظایفی که نیاز به درک کلی دارند، مانند خلاصه‌سازی یک قرارداد حقوقی ۱۰۰ صفحه‌ای یا دیباگ کردن فایل‌های لاگ یک سیستم توزیع‌شده، مؤثر است.

ملاحظات معماری

ساخت RAG با زمینه طولانی نیاز به تعادل بین سه عامل دارد:

  • تأخیر: پردازش هزاران توکن زمان‌بر است. باید تصمیم بگیرید که آیا معامله برای دقت بالاتر برای مورد استفاده شما قابل قبول است یا خیر.
  • هزینه: توکن‌های ورودی ارزان‌تر از توکن‌های خروجی هستند، اما پنجره‌های زمینه عظیم همچنان هزینه‌ها را افزایش می‌دهند. از بازیابی سلسله‌مراتبی برای پیش‌فیلتر کردن قبل از ارسال به مدل زمینه طولانی استفاده کنید.
  • رقیق توجه: اگرچه مدل‌ها می‌توانند ورودی‌های طولانی را مدیریت کنند، اما اگر اطلاعات مرتبط در میانه یک دنباله بسیار طولانی دفن شده باشد، عملکرد می‌تواند کاهش یابد (پدیده "گم شدن در میانه").

نمونه پیاده‌سازی: بازیابی ترکیبی

یک رویکرد محکم استفاده از یک مدل کوچک و سریع برای بازیابی مجموعه گسترده‌تری از نامزدها و سپس عبور دادن آن‌ها به یک مدل زمینه طولانی برای ترکیب است. در زیر یک قطعه کد پایتون با استفاده از LangChain برای نشان دادن این جریان آورده شده است:


from langchain.chains import RetrievalQA
from langchain.llms import Ollama
from langchain.vectorstores import Chroma
from langchain.embeddings import OllamaEmbeddings

# Initialize a long-context capable model
llm = Ollama(model="llama3:13b")
embeddings = OllamaEmbeddings(model="nomic-embed-text")

# Load document store
db = Chroma(embedding_function=embeddings)

# Configure RAG to retrieve more chunks (k=20)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",  # Stuffing all retrieved docs into context
    retriever=db.as_retriever(search_kwargs={"k": 20}),
    return_source_documents=True
)

# Query with a complex question
result = qa_chain({"query": "Summarize the architectural decisions in the last three sprint reviews."})
print(result["result"])

بهینه‌سازی برای "گم شدن در میانه"

تحقیقات اخیر نشان می‌دهند که LLMها بهترین توجه را به ابتدای و انتهای زمینه می‌کنند. هنگام استفاده از RAG با زمینه طولانی، نباید اسناد بازیابی‌شده را به‌طور تصادفی اضافه کنید. استراتژی‌های زیر را در نظر بگیرید:

  1. بازرتبه‌بندی: از یک کراس-انکودر برای بازرتبه‌بندی اسناد بازیابی‌شده بر اساس مرتبط بودن استفاده کنید. اسناد مرتبط‌ترین را در ابتدای یا انتهای پرامپت قرار دهید.
  2. پرامپت‌نویسی ساختاریافته: بخش‌ها را در پرامپت خود به وضوح جدا کنید. از هدرهایی مانند ### Context Document 1 برای کمک به مدل در تجزیه ورودی استفاده کنید.
  3. RAG تکراری: برای زمینه‌های بسیار طولانی، وظیفه را شکست دهید. ابتدا از LLM بخواهید اسناد بازیابی‌شده را خلاصه کند، سپس با استفاده از خلاصه‌ها به عنوان زمینه، پرسش نهایی را بپرسید.

نتیجه‌گیری

RAG با زمینه طولانی درباره جایگزینی RAG سنتی نیست، بلکه درباره گسترش قابلیت‌های آن است. این روش امکان استدلال عمیق‌تر بر روی اطلاعات پیچیده و به هم مرتبط را فراهم می‌کند که مدل‌های زمینه کوچک اصلاً نمی‌توانند آن را درک کنند. با ترکیب استراتژی‌های بازیابی محکم با مهندسی دقیق پرامپت، توسعه‌دهندگان می‌توانند سیستم‌های هوش مصنوعی بسازند که نه تنها دقیق هستند، بلکه قادر به مدیریت پیچیدگی داده‌های سازمانی دنیای واقعی نیز می‌باشند. با ادامه رشد پنجره‌های زمینه، تمرکز از یافتن داده صحیح به استدلال مؤثر بر روی آن تغییر خواهد کرد.

Share: