تولید تقویتشده با بازیابی (RAG) نحوه تعامل سازمانها با دادههای خصوصی خود را متحول کرده است. با این حال، پیادهسازیهای سنتی RAG اغلب هنگام کار با پرسوجوهایی که شامل چند سند پیچیده هستند یا زمانی که اطلاعات مرتبط در چندین قطعه پراکنده شدهاند، با مشکل مواجه میشوند. اینجاست که RAG با زمینه طولانی وارد عمل میشود. با بهرهگیری از پنجرههای زمینه در حال گسترش مدلهای زبانی بزرگ (LLM) مدرن، میتوانیم فراتر از تطبیق ساده کلیدواژه و جستجوی معنایی حرکت کنیم تا درک جامعتری از اسناد طولانی به دست آوریم.
در این پست، ما به تغییرات معماری مورد نیاز برای پشتیبانی از زمینههای طولانی، مبادلات بین اندازه پنجره زمینه و دقت بازیابی، و استراتژیهای عملی برای پیادهسازی خواهیم پرداخت.
تغییر از قطعات کوچک به اسناد کامل
به طور سنتی، خطوط لوله RAG اسناد را به قطعات کوچک (مثلاً ۵۰۰ تا ۱۰۰۰ توکن) تقسیم میکردند تا در پنجرههای زمینه محدود LLMهای قدیمیتر جا شوند. اگرچه این کار دقت بازیابی برای حقایق خاص را بهبود میبخشد، اما ساختار جهانی متن را از بین میبرد. RAG با زمینه طولانی این پارادایم را وارونه میکند. با قابلیت LLMهای امروزی برای پردازش ۱۲۸ هزار، ۲۰۰ هزار یا حتی بیش از ۱ میلیون توکن، ما میتوانیم کل فصلها یا اسناد را، یا حداقل بخشهای بسیار بزرگتری را، در هم تنیدگی (Embed) کنیم و انسجام معنایی را حفظ نماییم.
مزیت اصلی، کاهش از دست رفتن اطلاعات است. وقتی سوالی نیاز به ترکیب اطلاعات از ابتدای و انتهای یک راهنمای ۵۰ صفحهای دارد، رویکرد قطعهبندی شده ممکن است ارتباط را کاملاً از دست بدهد. رویکرد زمینه طولانی به مدل اجازه میدهد تا سند را در حین استنتاج (Inference) یا در مرحله بازیابی (در صورت استفاده از جستجوی ترکیبی) «بخواند».
استراتژیهای معماری برای زمینه طولانی
پیادهسازی RAG با زمینه طولانی تنها به معنای ارسال توکنهای بیشتر نیست؛ بلکه نیازمند توجه دقیق به مدلهای در هم تنیدگی و مکانیسمهای بازیابی است.
۱. مدلهای در هم تنیدگی پیشرفتهتر
مدلهای در هم تنیدگی استاندارد مانند text-embedding-ada-002 شرکت OpenAI دارای محدودیت زمینه ۸۱۹۲ توکن هستند. برای زمینههای طولانی، به مدلهایی نیاز دارید که برای وابستگیهای بلندمدت طراحی شده باشند. مدلهای جدیدتر، مانند انواع گسترشیافته sentence-transformers/all-MiniLM-L6-v2 یا در هم تنیدگیهای تخصصی زمینه طولانی، میتوانند روابط را در سراسر هزاران توکن ثبت کنند.
۲. جستجوی ترکیبی
ترکیب جستجوی برداری متراکم با جستجوی کلیدواژهای پراکنده (BM25) حیاتی است. جستجوی متراکم معنای معنایی را ثبت میکند، در حالی که جستجوی پراکنده تضمین میکند که اصطلاحات فنی خاص یا شناسههای یافت شده در متون طولانی به دلیل اثرات میانگینگیری در بردار در هم تنیدگی از دست نروند.
مثال کد: پیادهسازی بازیابی زمینه طولانی
در زیر یک مثال سادهشده با استفاده از پایتون و langchain آورده شده است که نشان میدهد چگونه ممکن است یک سند طولانی را با نگه داشتن قطعات بزرگتر از حد معمول و تکیه بر مدلی با پنجره زمینه بزرگ مدیریت کنید.
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_openai import ChatOpenAI
# 1. تعریف اندازه قطعه بزرگتر برای RAG با زمینه طولانی
# اندازه استاندارد ۵۰۰-۱۰۰۰ است، ما از ۲۰۰۰-۴۰۰۰ استفاده میکنیم
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=4000,
chunk_overlap=200,
length_function=len,
)
# 2. بارگذاری سند طولانی خود
docs = ... # متن را اینجا بارگذاری کنید
# 3. تقسیم با قطعات بزرگتر
split_docs = text_splitter.split_documents(docs)
# 4. استفاده از یک مدل در هم تنیدگی که نیازهای زمینه طولانی شما را پشتیبانی میکند
# توجه: مطمئن شوید حداکثر طول مدل شما از اندازه قطعه شما بیشتر است
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
# 5. ایجاد فروشگاه برداری
vectorstore = FAISS.from_documents(split_docs, embeddings)
# 6. بازیابی k سند برتر
# از آنجا که قطعات بزرگتر هستند، ممکن است به ضربههای (hits) کمتری نیاز داشته باشید،
# اما مطمئن شوید که از پنجره زمینه LLM تجاوز نمیکنید
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
# 7. تعریف LLM با پنجره زمینه بزرگ
llm = ChatOpenAI(model="gpt-4-1106-preview", temperature=0)
# در یک زنجیره واقعی، شما اینها را ترکیب خواهید کرد
چالشها و بهترین شیوهها
در حالی که RAG با زمینه طولانی مزایای قابل توجهی ارائه میدهد، چالشهای جدیدی را نیز به همراه دارد. اول، هزینه: ارسال ۱۰۰ هزار توکن به یک LLM به طور نمایی گرانتر از ارسال ۱ هزار توکن است. دوم، نویز: قطعات بزرگتر اطلاعات نامرتبط بیشتری را معرفی میکنند که میتواند مدل را گیج کند (پدیده «گمشده در میانه»). برای کاهش این مشکل، در نظر بگیرید استفاده از تکنیکهای فشردهسازی زمینه. قطعات بازیابیشده را قبل از ارسال به LLM اصلی از یک مرتبکننده سبک یا یک مرحله فیلتر کردن عبور دهید.
نتیجهگیری
RAG با زمینه طولانی نمایانگر تکامل بعدی در هوشمندی اسناد است. با تعادل بخشیدن به اندازه قطعات، بهرهگیری از مدلهای در هم تنیدگی مدرن و استفاده از LLMهایی با پنجرههای زمینه وسیع، توسعهدهندگان میتوانند سیستمهایی بسازند که نه تنها حقایق، بلکه روایتها و روابط پیچیده در دادهها را درک میکنند. با ادامه رشد سختافزار و قابلیتهای مدل، مرز بین «بازیابی» و «خواندن» به طور فزایندهای محو خواهد شد و مدیریت کارآمد زمینه را به یک مهارت اصلی برای مهندسان هوش مصنوعی تبدیل میکند.