چیتشیت
تولید مبتنی بر بازیابی (RAG)
Retrieval-Augmented Generation (RAG)
قطعهبندی متن، ایندکس، بازیابی، ترکیب، بازرتبهبندی، تولید همراه با ارجاع و نمرهدهی به هر مرحله. پایتون برگرفته از درسها.
فهرست مطالب
پایپلاین سرتاسری RAG
معمارییک پرسش: Pipeline.query
گامبهگام- بازنویسنده
pick_strategyبرای " and " تجزیه، برای api یا config روش hyde، و در غیر این صورت multiquery را انتخاب میکند. - HyDEروش BM25 خود پرسش را جستجو میکند. جستجوی متراکم بند فرضی را جستجو میکند.
- زیرپرسشهاهر بازنویسی جداگانه جستجو میشود.
rrfفهرستهای رتبهبندیشده را ادغام میکند. - HybridIndex8 برتر BM25 و 8 برتر متراکم ترکیب شده و
top_n12 نگه داشته میشود. - بازرتبهبندامتیاز کراسانکودر به اضافهی 0.3 برابر همپوشانی با پرسش. نگهداشتن
top_k5. - تولیدکنندهامتیاز برتر زیر
REFUSE_THRESHOLDخروجی «نمیدانم» میدهد. - تولیدکنندهدر غیر این صورت یک جمله از حداکثر 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.75 | 0 طول را نادیده میگیرد، 1 نرمالسازی کامل |
RRF `k` | 60 | رتبهی 1 مقدار 1/61 را اضافه میکند |
Chunk size | 256-512 | توکن، با همپوشانی 50 توکنی |
Chunks per query | 5 to 10 | 2,500 تا 5,000 توکن زمینه |
Rerank pool N | 50 to 200 | کراسانکودر K تای برتر را نگه میدارد |
`top_n`, `top_k` | 12 | پایپلاین 5 مورد را بعد از بازرتبهبندی نگه میدارد |
REFUSE_THRESHOLD | 0.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 پرسش هفتگی.