چیت‌شیت

تولید مبتنی بر بازیابی (RAG)

Retrieval-Augmented Generation (RAG)

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

  • ۱۲ بخش
  • ۱۰ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. پایپ‌لاین سرتاسری RAG
  2. یک پرسش: Pipeline.query
  3. وظایف در کد
  4. بازیابی ترکیبی با RRF
  5. سرهم‌بندی و پرس‌وجو از پایپ‌لاین
  6. استراتژی‌های قطعه‌بندی متن
  7. فرمول‌های کلیدی
  8. مقادیر پیش‌فرض و اعداد
  9. عیب‌یابی
  10. کوته‌نوشت‌ها
  11. پرسش‌ها
  12. نکات کاربردی

پایپ‌لاین سرتاسری RAG

معماری
قطعه‌هابازنویسی‌هاجستجوtop_ntop_kاسنادایندکس‌گذاری آفلاینابزار قطعه‌بندی متنتقسیم بازگشتیHybridIndexBM25 + متراکمتولیدکنندهپاسخ مستند یا امتناعپرسش کاربربازنویسندهHyDE، چندپرسشی، تجزیهبازیابRRF، top_n 12بازرتبه‌بندکراس‌ان‌کودر، top_k 5

یک پرسش: Pipeline.query

گام‌به‌گام
  1. بازنویسندهpick_strategy برای " and " تجزیه، برای api یا config روش hyde، و در غیر این صورت multiquery را انتخاب می‌کند.
  2. HyDEروش BM25 خود پرسش را جستجو می‌کند. جستجوی متراکم بند فرضی را جستجو می‌کند.
  3. زیرپرسش‌هاهر بازنویسی جداگانه جستجو می‌شود. rrf فهرست‌های رتبه‌بندی‌شده را ادغام می‌کند.
  4. HybridIndex8 برتر BM25 و 8 برتر متراکم ترکیب شده و top_n 12 نگه داشته می‌شود.
  5. بازرتبه‌بندامتیاز کراس‌ان‌کودر به اضافه‌ی 0.3 برابر همپوشانی با پرسش. نگه‌داشتن top_k 5.
  6. تولیدکنندهامتیاز برتر زیر REFUSE_THRESHOLD خروجی «نمی‌دانم» می‌دهد.
  7. تولیدکنندهدر غیر این صورت یک جمله از حداکثر 2 قطعه، هر کدام با ارجاع [doc_id:chunk_index].

وظایف در کد

کار و کد
وظیفهکد
قطعه‌های پنجره‌ی ثابتfixed_window(doc_id, text, size=400, overlap=80)
قطعه‌بندی در عنوان‌هاstructural_markdown(doc_id, text)
نمره‌دهی به قطعه‌بندیeval_recall(chunker, fixture, ks=(1, 3, 5))
ادغام فهرست‌های رتبه‌بندی‌شدهrrf(rankings, k=60, weights=[1.0, 1.0])
بازیابی از طریق بازنویسندهretrieve_with_rewriter(query, rewriter, retriever)
بازرتبه‌بندی کاندیداهاrerank(model, query, candidates, top_k)
نمره‌ی رتبه‌بندی درجه‌بندی‌شدهndcg_at_k(retrieved, graded, k)
اجرای دموی گیت‌دار`python3 code/main.py` exits 1 on a FAIL

بازیابی ترکیبی با RRF

کد
python
retriever = HybridRetriever()                      # BM25Index + DenseIndex
for d in CORPUS:
    retriever.add(d)                               # هر دو مدالیته را ایندکس می‌کند
result = retriever.search(q, k_each=5, k_out=5)
result["bm25"], result["dense"], result["fused"]   # سه فهرست رتبه‌بندی‌شده
bm25 = BM25Index(k1=1.5, b=0.75)                   # توکن‌های عنوان 3 بار شمرده می‌شوند
idf = math.log((n - df + 0.5) / (df + 0.5) + 1.0)  # مثبت می‌ماند
score[doc.doc_id] += w * (1.0 / (k + rank + 1))    # رتبه از 0 شروع می‌شود

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

کد
python
p = Pipeline()                      # قطعه‌بندی متن، ایندکس، بازنویسنده، بازرتبه‌بند
p.ingest(CORPUS)                    # تقسیم بازگشتی، هدف 400
p.train_reranker_on(TRAIN_TRIPLES)  # مناسب برای کراس‌ان‌کودر کوچک
result = p.query("<question>")
result.answer                       # جملات به همراه ارجاع‌ها
result.citations                    # فهرستی از doc_id:chunk_index
result.rewriter_strategy            # hyde، multiquery یا decompose
result.latency_ms                   # بازنویسی، بازیابی، بازرتبه‌بندی، تولید

استراتژی‌های قطعه‌بندی متن

دستورها
دستورعملکرد
recursive_splitمتن ساده‌ی بدون ساختار. قوی‌ترین خط مبنای تکی
structural_markdownاسناد Markdown، RFC و API. برش در عنوان‌ها
sentence_chunksپاراگراف‌های طولانی تک‌موضوعی. هدف 500
semantic_chunksپاراگراف‌های کوتاه با موضوعات ترکیبی. آستانه 0.6
fixed_windowصرفاً برای مقایسه. نمادها را در کد از وسط برش می‌دهد
Parent-documentجستجوی فرزندان کوچک، بازگرداندن والد. حذف تکراری‌های والد
Contextual retrievalافزودن 50 تا 100 کلمه‌ی زمینه‌ی تولیدشده توسط LLM به ابتدای هر قطعه
Late chunkingامبدینگ کل سند بر اساس هر توکن، سپس تجمیع به ازای هر قطعه

فرمول‌های کلیدی

مفهوم‌ها
کسینوس
$\cos(a, b) = \frac{a \cdot b}{\lVert a \rVert \, \lVert b \rVert}$، از -1 تا 1.
جمله‌ی BM25
$\mathrm{IDF}(t) \frac{tf \, (k_1 + 1)}{tf + k_1 (1 - b + b \, |d| / \mathrm{avgdl})}$
فرمول RRF
$\mathrm{RRF}(d) = \sum_R \frac{1}{k + \mathrm{rank}_R(d)}$
Precision@k
اسناد مرجع در k تای برتر، تقسیم بر k.
Recall@k
اسناد مرجع در k تای برتر، تقسیم بر کل اسناد مرجع.
MRR
میانگین 1 بر رتبه‌ی اولین سند مرتبط.
بهره‌ی DCG
$\frac{2^{rel} - 1}{\log_2(i + 2)}$ برای جایگاه $i$ از 0.
nDCG@k
معیار DCG تقسیم بر DCG در ترتیب ایدئال. از 0 تا 1.

مقادیر پیش‌فرض و اعداد

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
BM25 `k1`1.5کد درس 11.07 از 1.2 استفاده می‌کند
BM25 `b`0.750 طول را نادیده می‌گیرد، 1 نرمال‌سازی کامل
RRF `k`60رتبه‌ی 1 مقدار 1/61 را اضافه می‌کند
Chunk size256-512توکن، با همپوشانی 50 توکنی
Chunks per query5 to 102,500 تا 5,000 توکن زمینه
Rerank pool N50 to 200کراس‌ان‌کودر K تای برتر را نگه می‌دارد
`top_n`, `top_k`12پایپ‌لاین 5 مورد را بعد از بازرتبه‌بندی نگه می‌دارد
REFUSE_THRESHOLD0.05زیر این مقدار پاسخ «نمی‌دانم» خواهد بود.

عیب‌یابی

عیب‌یابی
  • مقادیر پایین recall@k و precision@k

    علت
    قطعه‌بندی پاسخ را قطع کرده، یا بازیاب آن را پیدا نکرده است
    راه‌حل
    اصلاح مرزها یا افزودن یک مدالیته
  • میزان خوب recall@k، اما MRR پایین

    علت
    قطعه‌ی درست در جایگاه 1 نیست
    راه‌حل
    افزودن یک بازرتبه‌بند کراس‌ان‌کودر
  • میزان MRR بالا، اما وفاداری پایین

    علت
    تولیدکننده از خود محتوا می‌سازد
    راه‌حل
    اجبار به ارجاع یا امتناع در پرامپت
  • وفاداری بالا، اما ارتباط پایین

    علت
    پاسخ مستند اما خارج از موضوع
    راه‌حل
    بازنویسی پرسش
  • کد دقیق E-4021 یافت نشد

    علت
    امبدینگ با آن مثل نویز رفتار می‌کند
    راه‌حل
    افزودن BM25 و ادغام با RRF
  • بازرتبه‌بندی بهبودی ایجاد نمی‌کند

    علت
    برابری N با K
    راه‌حل
    تنظیم N به حداقل 3 برابر K
  • روش HyDE سند درست را حذف می‌کند

    علت
    شناسه‌ی ساختگی در بند متن
    راه‌حل
    محدود کردن طول، کاهش وزن BM25
  • تکه‌های 40 توکنی

    علت
    قطعه‌های معنایی بدون حد کف
    راه‌حل
    اعمال min_tokens

کوته‌نوشت‌ها

اصطلاح‌ها
RAG
تولید مبتنی بر بازیابی. بازیابی، قرار دادن در پرامپت، تولید.
BM25
بهترین تطابق 25. رتبه‌بندی کلیدواژه‌ای با IDF و نرمال‌سازی طول.
RRF
ادغام رتبه‌های معکوس. جمع 1/(k + rank) روی فهرست‌های رتبه‌بندی‌شده.
HyDE
امبدینگ اسناد فرضی. جستجو با پاسخ ساختگی.
MRR
میانگین رتبه‌ی معکوس. میانگین 1 بر رتبه‌ی اولین نتیجه‌ی درست.
nDCG
بهره‌ی تجمعی تنزیل‌شده‌ی نرمال‌شده. کیفیت رتبه‌بندی درجه‌بندی‌شده.
Qrels
داده‌های مرجع ارزیابی. پرسش‌ها همراه با اسناد و پاسخ‌های مرجع.
بای / کراس‌ان‌کودر
امبدینگ جداگانه‌ی پرسش و سند، یا خواندن همزمان آنها.

پرسش‌ها

پرسش و پاسخ
چرا RRF و نه ترکیب نمرات؟
نمرات BM25 کران ندارند. رتبه‌ها در مدالیته‌های مختلف قابل مقایسه‌اند.
چرا فقط N تای برتر بازرتبه‌بندی می‌شوند؟
کراس‌ان‌کودر 100 تا 1000 برابر کندتر از بای‌ان‌کودر است.
چرا بازخوانی در K ذکر می‌شود؟
تولیدکننده می‌تواند قطعه‌ی بد را نادیده بگیرد، اما قطعه‌ای را که ندیده اصلاً نمی‌تواند استفاده کند.
چرا پاسخ نادرست HyDE کمک می‌کند؟
بازیاب از کلمات آن استفاده می‌کند، نه فکت‌های آن.
تولید مبتنی بر بازیابی یا فاین‌تیونینگ؟
RAG برای فکت‌ها. فاین‌تیونینگ برای سبک، لحن یا الگوی استدلال.

نکات کاربردی

نکته‌ها
  • با تقسیم بازگشتی 512 توکنی شروع کنید. معیار recall@5 را روی مجموعه‌ی ارزیابی 50 پرسشی بسنجید.
  • به مدل دستور دهید فقط از زمینه استفاده کند و در صورت لزوم بگوید «نمی‌دانم».
  • تنظیمات بای‌ان‌کودر، کراس‌ان‌کودر و N را با هم هماهنگ نگه دارید.
  • داوری را با خانواده‌ی مدلی متفاوت از مدل تولیدکننده انجام دهید.
  • داده‌های مرجع ارزیابی را بر اساس نوع پرسش بخش‌بندی کنید: عینی، بازنویسی‌شده، چندموضوعی.
  • ارزیابی را لایه‌بندی کنید: 20 پرسش در CI، 200 پرسش شبانه، 2000 پرسش هفتگی.