فاز 19 · درس 69

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

نوع
ساختنی
زمان
حدود 90 دقیقه
زبان‌ها
Python
یک خط لوله صنعتی مدولار که چندین بخش مکانیکی را به یک مخزن و سیستم سنجش دیجیتال متصل کرده است
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. انتخاب‌های نحوه‌ی اتصال
  5. تولیدکننده‌ی پاسخ همراه با ارجاع
  6. دموی خودپایان‌دهنده
  7. پیاده‌سازی
  8. حالت‌های شکستی که در دمو دیده نمی‌شوند
  9. کاربرد در محیط عملیاتی
  10. تحویل نهایی
  11. تمرین‌ها
  12. اصطلاحات کلیدی
  13. برای مطالعه‌ی بیشتر

موفقیت تک‌تک اجزای یک سیستم بازیابی اطلاعات به‌تنهایی تضمینی برای کارکرد درست کل سامانه نیست. تکه‌ساز، مدل بازنویسی و بازرتبه‌بند ممکن است در آزمایش‌های ایزوله نتایج درخشانی نشان دهند، اما وقتی در یک زنجیره کنار هم قرار می‌گیرند، ناهماهنگی در خروجی یک بخش کل زنجیره را مختل می‌کند. در این درس یاد می‌گیرید چطور تمام این قطعات را در یک پایپ‌لاین سرتاسری (end-to-end) متصل کنید.

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

اجرای این ساختار بر پایه‌ی داده‌های نمونه و مدل‌های محلی طراحی شده است؛ بنابراین برای اجرای کدها و تایید معیارهای ارزیابی به GPUهای ابری نیازی نخواهید داشت و تست‌ها به‌صورت قطعی و سریع روی پردازنده‌ی استاندارد قابل اجرا هستند.

شش درس برای ساخت مؤلفه‌ها. یک پایپ‌لاین. یک حلقه‌ی ارزیابی. یک دموی خودپایان‌دهنده. این همان سیستمی است که تحویل می‌دهید.

اهداف یادگیری

  • ترکیب تکه‌ساز (chunker)، بازیاب ترکیبی (hybrid retriever)، بازنویس پرس‌وجو (query rewriter)، بازرتبه‌بند کراس‌ان‌کودر (cross-encoder reranker) و تولیدکننده‌ی پاسخ (answer generator) در قالب یک پایپ‌لاین سرتاسری (end-to-end) واحد.
  • پیاده‌سازی تولیدکننده‌ی پاسخی که ادعاهایش را با لنگر تکه (chunk anchor) ارجاع می‌دهد و از طرح پشتیبان (fallback)ِ «رد پاسخ در صورت اطمینان پایین» بهره می‌برد.
  • اجرای ارزیابی درس 68 روی پایپ‌لاین سرهم‌شده و اثبات برتری این ساختار مرحله‌به‌مرحله در تمام معیارها نسبت به همان مؤلفه‌ها در حالت مجزا.
  • ساخت یک دموی CLI با خروج خودکار که مجموعه‌داده‌ی نمونه را بارگذاری می‌کند، مجموعه‌ای ثابت از پرس‌وجوها را اجرا می‌کند و با کد خروج صفر و یک گزارش خلاصه به کارش پایان می‌دهد.

صورت مسئله

شش مؤلفه‌ی مجزا به‌خودی‌خود هیچ چیزی را اثبات نمی‌کنند. ممکن است تکه‌ساز در recall@5 روی مجموعه‌متن برنده شود، اما در recall@5 کل سیستم ببازد؛ چون بازیاب نمی‌تواند خروجی تکه‌ساز را درست رتبه‌بندی کند. شاید بازرتبه‌بند، MRR را روی مجموعه‌ای مصنوعی از کاندیداها بالا ببرد، اما روی کاندیداهای واقعیِ بای‌ان‌کودر شکست بخورد؛ زیرا بازخوانیِ بای‌ان‌کودر در سقف کاندیداهای بازرتبه‌بندی بیش از حد پایین است. همچنین ممکن است بازنویس پرس‌وجو برای یک پرسمان، سند مرجع را بالا بکشد، اما در پرس‌وجوی بعدی به‌خاطر خروجی ساختگی و بی‌کیفیتِ ماک مدل زبانی، کار را خراب کند.

آزمون یکپارچگی (integration test) یعنی اجرای کل پایپ‌لاین به‌صورت سرتاسری روی همان مجموعه‌ی ارزیابی استاندارد (qrels)، با همان معیار سنجش، و تنها با یک فایل هماهنگ‌کننده (orchestrator) که همه‌چیز را به هم متصل می‌کند. در این درس دقیقاً همین را می‌سازیم. اگر معیارهای پایپ‌لاین یکپارچه توانستند معیارهای دموی مجزای هر مرحله را شکست دهند، سیستم شما اثبات شده است.

مفاهیم پایه

اسناد منبعبخش‌بندی‌کنندهشاخص ترکیبیپرسش کاربربازنویسی پرسشبازیاب ترکیبیرتبه‌بندی مجدد کراس‌ان‌کودرتولیدکننده پاسخپاسخ با ارجاعارزیابیگزارش دموی خودپایان

انتخاب‌های نحوه‌ی اتصال

پایپ‌لاین ما یک گراف کوچک است. هر مرحله از آن تابعی با امضای مشخص است.

مرحله ورودی خروجی
تکه‌ساز متن سند فهرستی از رکوردهای تکه (Chunk)
بازیاب رشته‌ی پرس‌وجو N رکورد برتر تکه
بازنویس (اختیاری) رشته‌ی پرس‌وجو فهرستی از بازنویسی‌ها + متن فرضی
بازرتبه‌بند پرس‌وجو، کاندیداها K رکورد برتر تکه همراه با امتیاز کراس
تولیدکننده پرس‌وجو، K رکورد برتر تکه رشته‌ی پاسخ همراه با ارجاع‌ها

وقتی امضای هر مرحله ثابت بماند، ترکیب کردن آن‌ها سرراست خواهد بود. کلاس Pipeline در این درس این پنج مرحله را در خود نگه می‌دارد و متد query آن، مراحل را به ترتیب اجرا می‌کند. هر مرحله نیز قابل تعویض است: می‌توانید تکه‌ساز، بازیاب، بازنویس، بازرتبه‌بند یا تولیدکننده‌ی متفاوتی به آن بدهید و پایپ‌لاین همچنان اجرا شود.

تولیدکننده‌ی پاسخ همراه با ارجاع

تولیدکننده آخرین مرحله‌ی کار است و راحت‌تر از بقیه‌ی بخش‌ها خراب می‌شود. در این درس یک ماکِ قطعی از تولیدکننده ارائه می‌دهیم که:

  1. K تکه‌ی برترِ بازرتبه‌بندی‌شده را دریافت می‌کند.
  2. حداکثر دو تکه را که متن آن‌ها بیشترین همپوشانی توکن‌های محتوایی را با پرس‌وجو دارد، انتخاب می‌کند.
  3. پاسخی خروجی می‌دهد که از اتصالِ «یک جمله از هر تکه‌ی انتخابی» تشکیل شده و بعد از هر جمله، یک لنگر به شکل [doc_id:chunk_index] قرار می‌گیرد.
  4. اگر همپوشانی هیچ تکه‌ای بالاتر از آستانه‌ی رد پاسخ نباشد، بدون هیچ ارجاعی عبارت «I do not know» را خروجی می‌دهد.

در محیط عملیاتی (پروداکشن)، این ماک را با یک فراخوانی واقعی مدل زبانی و قالب پرامپت (prompt template) زیر جایگزین می‌کنید:

You are answering a question using only the snippets below.
Cite every claim with the anchor in parentheses.
If the snippets do not answer the question, say "I do not know".

Question: {query}

Snippets:
{enumerated chunks with anchors}

Answer:

دلیل اصلی ثبت امتیاز رتبه‌ی 1 در کراس‌ان‌کودر، همین مسیرِ رد پاسخ در صورت اطمینان پایین است. اگر این امتیاز پایین‌تر از آستانه‌ی مجموعه‌متن باشد، تولیدکننده پاسخ را رد می‌کند. این مکانیزم، سوپاپ اطمینان ما در برابر پاسخ‌های توهم‌آمیز است.

دموی خودپایان‌دهنده

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

این همان شیوه‌ای است که در تست‌های سریع اعتبارسنجی (smoke test) در CI استفاده می‌شود. پایپ‌لاین به‌صورت آفلاین، سریع و قطعی اجرا می‌شود. آستانه‌ها را عمداً روی داده‌های نمونه سخت‌گیرانه چیده‌ایم تا هر افتی در کدهای این شش درس، دمو را متوقف کند.

RAG سرتاسرییک پرسش، چهار مرحله
END-TO-END RAGThe packet carries one query through the assembled pipeline: rewrite expands it, the hybrid index retrieves, the cross-encoder reranks, the generator answers with a chunk-anchored citation or refuses when confidence is low. Six isolated components become one system that beats each stage measured alone.بازنویسیبازیابیبازرتبه‌بندیتولیدپیکره متنی + پرسشanswer + [chunk:42] citationیا امتناع در اطمینان پایین
بسته، یک پرسش را در سراسر پایپ‌لاین سرهم‌شده هدایت می‌کند: بازنویسی آن را بسط می‌دهد، نمایه ترکیبی بازیابی می‌کند، کراس‌ان‌کودر بازرتبه‌بندی می‌کند و تولیدکننده با ارجاع متصل به چانک پاسخ می‌دهد یا در صورت اطمینان پایین، امتناع می‌کند. شش بخش مجزا به سیستمی یکپارچه تبدیل می‌شوند که از عملکرد جداگانه هر مرحله برتر است.

پیاده‌سازی

فایل code/main.py این بخش‌ها را پیاده می‌کند:

  • Chunk - رکوردی که در تمام مراحل دست‌به‌دست می‌شود (نسخه‌ی گسترش‌یافته‌ی درس 64 همراه با chunk_index و doc_id مرجع).
  • Chunker - انتخاب راهبردی از درس 64 (پیش‌فرض: برش بازگشتی یا recursive split).
  • HybridIndex - ترکیب BM25 به‌علاوه‌ی متراکم (dense) و RRF از درس 65.
  • Rewriter (اختیاری) - انتخاب یکی از روش‌های HyDE، چندپرس‌وجویی یا تجزیه از درس 67 بر اساس طول پرس‌وجو و وجود حروف ربط.
  • Reranker - کراس‌ان‌کودر آموزش‌دیده‌ی درس 66 با مجموعه‌داده‌ی آموزشی نمونه‌ی کوچک‌تر تا در چند ثانیه همگرا شود.
  • Generator - ماک قطعی تولیدکننده با ارجاع‌دهی و رد پاسخ در صورت اطمینان پایین.
  • Pipeline - ترکیب این پنج مرحله با متد query(question) که شیء Result(answer, top_k, latency_ms_per_stage) را برمی‌گرداند.
  • run_demo() - مجموعه‌متن را بارگذاری می‌کند، سه پرس‌وجوی نمونه را می‌فرستد، ارزیابی را اجرا می‌کند، نتایج را نمایش می‌دهد و کد خروج را بر اساس آستانه‌ها تنظیم می‌کند.

اجرای آن:

python3 code/main.py

خروجی برنامه شامل یک ردگیری محاسبات (trace) برای پرس‌وجو، جدول کامل ارزیابی و وضعیت نهایی قبولی/ردی است. روی داده‌های نمونه، با کد خروج 0 خارج می‌شود.

حالت‌های شکستی که در دمو دیده نمی‌شوند

جابه‌جایی مرزهای تکه‌ساز. اگر راهبرد تکه‌ساز را بین مرحله‌ی برچسب‌گذاری qrels ارزیابی و اجرای دمو تغییر دهید، شناسه‌ی سندهای مرجع دیگر همخوانی نخواهند داشت. راهبرد تکه‌ساز را حتماً در فایل qrels قفل کنید. دمو شامل هدری است که نام تکه‌ساز در آن قید می‌شود.

نشت مجموعه‌داده‌ی آموزشی بازرتبه‌بند به ارزیابی. 14 سه‌گانه‌ی (triple) آموزشی درس 66 شامل پرس‌وجوهایی شبیه به پرس‌وجوهای ارزیابی هستند. در محیط عملیاتی، پرس‌وجوهای ارزیابی را کاملاً جدا نگه دارید. پرس‌وجوهای ارزیابیِ این دمو تعمداً هیچ اشتراکی با مجموعه‌ی آموزشی بازرتبه‌بندی ندارند.

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

نبود استریمینگ. این پایپ‌لاین در پایان هر مرحله، پاسخ کامل را برمی‌گرداند. یک سیستم عملیاتی خروجی تولیدکننده را به‌صورت استریمینگ (streaming) ارسال می‌کند. استریمینگ خارج از دامنه‌ی (scope) این درس است؛ در هر صورت معیارهای سنجش کیفیت پاسخ، روی همان رشته‌ی نهایی کار می‌کنند.

تاخیر در حالت آفلاین محاسبه می‌شود. فراخوانی‌های ماک مدل زبانی زمان ثابتی می‌برند، اما در دنیای واقعی فراخوانی‌های مدل زبانی بیشترین سهم زمان را دارند. حتماً یک سقف تاخیر (latency budget) در دامنه‌ی درخواست در نظر بگیرید؛ زمان‌سنجی مرحله‌به‌مرحله در این درس فقط بار کاری پردازنده را اندازه می‌گیرد.

کاربرد در محیط عملیاتی

الگوهای محیط عملیاتی:

  • فایل پایپ‌لاین را تحت مدیریت یک هماهنگ‌کننده و با اینترفیس‌های مرحله‌ایِ صریح مستقر کنید. از پخش کردن سیم‌کشی سیستم در بخش‌های مختلف مخزن کد خودداری کنید.
  • قبل از هر merge که کدهای یکی از مراحل را دستکاری می‌کند، ارزیابی را اجرا کنید. اگر نتیجه افت کرد، نباید merge انجام شود.
  • خروجی ردگیری محاسبات معیارها را به ازای هر بار اجرای CI ذخیره کنید تا بتوانید افت کارایی را دقیقاً به تعویض یک مرحله نسبت دهید.
  • یک مجموعه‌ی تست سریع (smoke set) شامل 20 پرس‌وجو (زیرمجموعه‌ای از تست رگرسیون) بسازید که زیر 30 ثانیه اجرا شود؛ اجرای تست رگرسیون کامل را به برنامه‌ی شبانه بسپارید.

تحویل نهایی

ساختار فایل پایپ‌لاین در این درس، همان شکلی است که درس‌های بعدی مسیر F در فاز 19 بر پایه‌ی آن جلو می‌روند. در درس‌های بعدی مواردی مثل خودکارسازی بارگذاری داده، نمایه‌سازی مجدد تدریجی، تله‌متری و لایه‌ی سرویس‌دهی روی آن سوار می‌شوند. بخش‌های بازیابی، بازرتبه‌بندی، بازنویسی و ارزیابی در این مرحله کامل شده‌اند.

تمرین‌ها

  1. یک انتخاب‌گر راهبرد به ازای هر پرس‌وجو به داخل بازنویس اضافه کنید: از قواعد سرانگشتی درس 67 (طول، حروف ربط، نسبت واژگان تخصصی) برای انتخاب میان HyDE، چندپرس‌وجویی یا تجزیه استفاده کنید.
  2. فراخوانی واقعی مدل زبانی را با یک متغیر محیطی (env flag) به تولیدکننده اضافه کنید؛ حالت پیش‌فرض همان ماک بماند. تفاوت تاخیر را اندازه بگیرید.
  3. دمو را طوری توسعه دهید که آرگومان --corpus path را برای بارگذاری یک مجموعه‌متن واقعی بپذیرد. سپس ارزیابی و بررسی آستانه‌ها را دوباره اجرا کنید.
  4. فلگ --strategy را به تکه‌ساز اضافه کنید. سهم هر راهبرد را در بازخوانی (recall) سرتاسری بسنجید.
  5. اینترفیس استریمینگ را به تولیدکننده اضافه کنید و خروجی آن را به ارزیابی بدهید. بررسی کنید که وفاداری (faithfulness) بر اساس رشته‌ی نهایی محاسبه شود، نه پیشوند استریم‌شده.

اصطلاحات کلیدی

اصطلاح در گفت‌وگوها معنای دقیق فنی
Pipeline «پایپ‌لاین RAG» مراحل متصل‌به‌هم از بارگذاری داده تا پاسخ ارجاع‌داده‌شده
Citation anchor «لینک منبع» ارجاع (doc_id, chunk_index) متصل به هر ادعا
Refuse-on-low-confidence «نمی‌دانم» وضعیتی که وقتی امتیاز رتبه‌ی 1 بازرتبه‌بند زیر آستانه باشد، تولیدکننده پاسخی برنمی‌گرداند
Smoke set «ارزیابی CI» کوچک‌ترین زیرمجموعه‌ی qrels که در بررسی هر PR اجرا می‌شود
Stage interface «امضای تابع» نوع داده‌ی ثابت ورودی و خروجی در هر مرحله از پایپ‌لاین

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسچرا تست یکپارچگی تنها معیار صادقانه برای ارزیابی پایپ‌لاین RAG شش‌بخشی است؟
  2. پیش از درسنقش مکانیزم امتناع در اطمینان پایین (refuse-on-low-confidence) در تولیدکننده پاسخ چیست؟
  3. حین درسچرا سه‌گانه‌های آموزشی بازرتبه‌بندی کاملاً مجزا از پرسش‌های ارزیابی نگه داشته می‌شوند؟
  4. حین درسهدف از کد خروج (exit code) دموی خود‌پایان‌پذیر چیست؟
  5. حین درسلنگر ارجاع در این پایپ‌لاین به چه شکلی است؟
  6. پس از درسکدام حالت خرابی برای تولیدکننده ماک (mock) نامرئی است و باید قبل از انتشار با یک LLM واقعی تست شود؟

سؤالات متداول

چرا تست مجزای هر مؤلفه برای تضمین کیفیت سیستم RAG کافی نیست؟

چون بهبود در یک بخش (مانند بازخوانی تکه‌ساز یا MRR بازرتبه‌بند روی کاندیداهای مصنوعی) ممکن است با ورودی‌های واقعی بخش بعدی همخوانی نداشته باشد و در نتیجه بازخوانی کل پایپ‌لاین کاهش یابد.

مکانیزم رد پاسخ در صورت اطمینان پایین (refuse-on-low-confidence) چگونه کار می‌کند؟

اگر بیشترین امتیاز کراس‌ان‌کودر برای کاندیدای رتبه‌ی اول زیر آستانه‌ی تعیین‌شده باشد، تولیدکننده به‌جای حدس زدن پاسخ، عبارت «I do not know» را برمی‌گرداند تا جلوی توهم گرفته شود.

منظور از لنگر ارجاع (citation anchor) در پاسخ نهایی چیست؟

شناسه‌ای به فرمت [doc_id:chunk_index] است که در انتهای هر جمله قرار می‌گیرد تا مشخص کند ادعای مطرح‌شده مستقیماً از کدام تکه و سند استخراج شده است.

دموی خودپایان‌دهنده (self-terminating demo) چه کاربردی در چرخه‌ی توسعه دارد؟

به‌عنوان تست سریع (smoke test) در خط لوله‌ی CI عمل می‌کند؛ پایپ‌لاین را روی داده‌های نمونه اجرا کرده و اگر هر یک از معیارها از آستانه‌ی مجاز پایین‌تر بیاید، با کد غیرصفر خارج می‌شود.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.