موفقیت تکتک اجزای یک سیستم بازیابی اطلاعات بهتنهایی تضمینی برای کارکرد درست کل سامانه نیست. تکهساز، مدل بازنویسی و بازرتبهبند ممکن است در آزمایشهای ایزوله نتایج درخشانی نشان دهند، اما وقتی در یک زنجیره کنار هم قرار میگیرند، ناهماهنگی در خروجی یک بخش کل زنجیره را مختل میکند. در این درس یاد میگیرید چطور تمام این قطعات را در یک پایپلاین سرتاسری (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 آن، مراحل را به ترتیب اجرا میکند. هر مرحله نیز قابل تعویض است: میتوانید تکهساز، بازیاب، بازنویس، بازرتبهبند یا تولیدکنندهی متفاوتی به آن بدهید و پایپلاین همچنان اجرا شود.
تولیدکنندهی پاسخ همراه با ارجاع
تولیدکننده آخرین مرحلهی کار است و راحتتر از بقیهی بخشها خراب میشود. در این درس یک ماکِ قطعی از تولیدکننده ارائه میدهیم که:
- K تکهی برترِ بازرتبهبندیشده را دریافت میکند.
- حداکثر دو تکه را که متن آنها بیشترین همپوشانی توکنهای محتوایی را با پرسوجو دارد، انتخاب میکند.
- پاسخی خروجی میدهد که از اتصالِ «یک جمله از هر تکهی انتخابی» تشکیل شده و بعد از هر جمله، یک لنگر به شکل
[doc_id:chunk_index]قرار میگیرد. - اگر همپوشانی هیچ تکهای بالاتر از آستانهی رد پاسخ نباشد، بدون هیچ ارجاعی عبارت «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 استفاده میشود. پایپلاین بهصورت آفلاین، سریع و قطعی اجرا میشود. آستانهها را عمداً روی دادههای نمونه سختگیرانه چیدهایم تا هر افتی در کدهای این شش درس، دمو را متوقف کند.
پیادهسازی
فایل 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 بر پایهی آن جلو میروند. در درسهای بعدی مواردی مثل خودکارسازی بارگذاری داده، نمایهسازی مجدد تدریجی، تلهمتری و لایهی سرویسدهی روی آن سوار میشوند. بخشهای بازیابی، بازرتبهبندی، بازنویسی و ارزیابی در این مرحله کامل شدهاند.
تمرینها
- یک انتخابگر راهبرد به ازای هر پرسوجو به داخل بازنویس اضافه کنید: از قواعد سرانگشتی درس 67 (طول، حروف ربط، نسبت واژگان تخصصی) برای انتخاب میان HyDE، چندپرسوجویی یا تجزیه استفاده کنید.
- فراخوانی واقعی مدل زبانی را با یک متغیر محیطی (env flag) به تولیدکننده اضافه کنید؛ حالت پیشفرض همان ماک بماند. تفاوت تاخیر را اندازه بگیرید.
- دمو را طوری توسعه دهید که آرگومان
--corpus pathرا برای بارگذاری یک مجموعهمتن واقعی بپذیرد. سپس ارزیابی و بررسی آستانهها را دوباره اجرا کنید. - فلگ
--strategyرا به تکهساز اضافه کنید. سهم هر راهبرد را در بازخوانی (recall) سرتاسری بسنجید. - اینترفیس استریمینگ را به تولیدکننده اضافه کنید و خروجی آن را به ارزیابی بدهید. بررسی کنید که وفاداری (faithfulness) بر اساس رشتهی نهایی محاسبه شود، نه پیشوند استریمشده.
اصطلاحات کلیدی
| اصطلاح | در گفتوگوها | معنای دقیق فنی |
|---|---|---|
| Pipeline | «پایپلاین RAG» | مراحل متصلبههم از بارگذاری داده تا پاسخ ارجاعدادهشده |
| Citation anchor | «لینک منبع» | ارجاع (doc_id, chunk_index) متصل به هر ادعا |
| Refuse-on-low-confidence | «نمیدانم» | وضعیتی که وقتی امتیاز رتبهی 1 بازرتبهبند زیر آستانه باشد، تولیدکننده پاسخی برنمیگرداند |
| Smoke set | «ارزیابی CI» | کوچکترین زیرمجموعهی qrels که در بررسی هر PR اجرا میشود |
| Stage interface | «امضای تابع» | نوع دادهی ثابت ورودی و خروجی در هر مرحله از پایپلاین |
برای مطالعهی بیشتر
- Anthropic, Building search and retrieval
- Pinterest, MCP internal search - معماری مرجع برای محیط عملیاتی
- Ragas: Automated Evaluation of RAG Pipelines
- فاز 11 درس 06 - مبانی RAG
- فاز 19 درسهای 64 تا 68 - مؤلفههایی که در اینجا ترکیب شدند
