چیتشیت
چتباتهای RAG در محیط عملیاتی و بهروز بودن دادهها
Production RAG Chatbots and Freshness
فیلتر، ادغام، کَش، گاردریل و ارجاع. ایندکس را بهروز نگه دارید و هر تغییر رتبه را ارزیابی کنید.
فهرست مطالب
یک نوبت گفتوگوی کنترلشده
معماریاجرا، نمرهدهی و بررسی
دستورها| دستور | عملکرد ابزار |
|---|---|
python3 scripts/project_test.py <project> --init learning-artifacts/<project> | میز کار شما را میسازد. کد اولیهی دستنخورده مردود میشود |
python3 scripts/project_test.py <project> --stage 1 --path learning-artifacts/<project> | یک مرحله از کد شما را نمرهدهی میکند |
python3 scripts/project_test.py <project> --all --solution --strict | پاسخ مرجع را بررسی میکند |
python3 cli.py samples/docs "When does cache expire?" --output answer.json --html answer.html | رسید استناد را در قالب JSON و HTML ثبت میکند |
cli.py query orchard-index.json tokens --now 210 --max-age 60 | اسنپشات وضعیت تازگی را پرسوجو میکند |
cli.py <notes> "release replicas" --aliases <aliases.json> --out matches.json | یک پوشهی مارکداون را جستجو میکند |
cli.py <baseline> <candidate> <judgments> --out retrieval-diff.json | تفاوتهای بازنگری دو خروجی رتبهبندی را به ازای هر پرسوجو مقایسه میکند |
python main.py | اسکلت پروژهی نهایی را بهصورت آفلاین اجرا میکند |
نوبت گفتوگوی آگاه از کَش
کدpython
ok, reason = llama_guard_input(query) # ابتدا بررسی لیست مسدودشده با regex
hits = retrieve(query, role, jurisdiction, corpus, k=3)
context = [f"[{c.anchor()}] {c.text}" for c, _ in hits]
layout = PromptLayout(system=SYSTEM_PROMPT, # بسیار پایدار
policy=f"role={role} jurisdiction={jurisdiction}",
context=context, question=query) # پرسش کَش نشده است
cache_hit = cache.check(layout.cache_key()) # هش sha256 از پیشوند، 16 کاراکتر هگز
answer = presidio_scrub(answer) # پاکسازی [email] و [ssn]
cache.hit_rate() # hits / (hits + misses)
بازیابی ترکیبی در پایگاه کد
کدpython
tokens = (tokenize(chunk.symbol) * 4 + # وزن نماد: 4
tokenize(chunk.summary) * 2 + # وزن خلاصهها: 2
tokenize(chunk.body)) # وزن بدنه: 1
dense_hits = dense.search(query, k=10)
sparse_hits = bm25.search(query, k=10)
fused = rrf(dense_hits, sparse_hits) # k_rrf: int = 60
top = rerank(query, fused, top_k=5) # نماد: 0.3، خلاصه: 0.1
citations = [c.anchor() for c, _ in top] # repo/path:start-end
توابع پروژه
کار و کد| وظیفه | کد |
|---|---|
| بارگذاری فایلهای متنی با SHA-256 | load_documents(root) |
| تکهبندی به همراه آفستها | chunk_document(doc, size=200, overlap=30) |
| اعتبارسنجی نقلقول مدل | answer(question, chunks, model) |
| برنامهریزی تغییرات ایندکس | diff(previous, incoming) |
| commit یک اسنپشات | commit(path, documents, expected_version) |
| حذف شواهد منقضیشده | retrieve(documents, query, now, max_age=3600, k=3) |
| ساخت یک ایندکس TF-IDF | build_index(documents, aliases=None) |
| امتیازدهی به دو سیستم | compare_systems(systems, judgments, k) |
ورود داده و پرسوجو در سیستم تازگی
گامبهگام- نرمالسازیمتن NFC، تبدیل CRLF به LF، حذف فاصلههای اضافه، سپس SHA-256 بدنه.
- تفاوتهای بازنگریشناسهای که جدید است به
insertمیرود. - تفاوتهای بازنگریهشی که تغییر کرده به
updateمیرود. تنها زمانِupdatedجدید بهrefreshمنتقل میشود. - تفاوتهای بازنگریشناسهای که در کل پیکره متنی نیست به
deleteمیرود. - commitقفلگذاری با flock، مقایسهی
expected_version، نوشتن فایل موقت، fsync، اجرایos.replace. - بازیابینادیدهگرفتن سند در صورتی که سن کمتر از 0 یا بیشتر از
max_ageباشد. - بازیابیامتیاز عبارت است از نسبت واژگان مطابقتیافته به واژگان پرسوجو. مرتبسازی بر اساس امتیاز، سن، شناسه.
ورودیها، خروجیها و بررسیهای پروژه
مقایسه| عامل | پرسشوپاسخ از اسناد | تازگی | جستجوی یادداشتها | آزمایشگاه ارزیابی |
|---|---|---|---|---|
| خروجی ساختهشده | رسید استناد | ایندکس تازه | جستجوی لغوی با TF-IDF | تفاوتهای بازنگری پسرفت |
| ورودی | پوشهای از فایلهای txt. | JSON کامل پیکره متنی | پوشهای از فایلهای md. | 3 فایل JSON |
| خروجی | answer.json و answer.html | اسنپشات، تغییرات | matches.json | retrieval-diff.json |
| فیلدهای کلیدی | start، end، sha256 | version، age، hash | score، matched | delta_ndcg |
| وضعیتها | answered، abstained | از insert تا delete | k تطابق برتر | تعداد پسرفتها |
| گارد | needs_review | خطای نسخه منسوخشده | k باید مثبت باشد | --fail-on-regression |
پیشفرضها و اعداد
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
Doc QA chunk `size` | 200 | overlap برابر 30 است |
--max-age | 3600 | شواهد قدیمیتر نادیده گرفته میشوند |
--k | 3 | CLIهای تازگی، یادداشتها و ارزیابی |
Note size limit | 100 KB | یادداشتهای حجیمتر خطا میدهند |
Relevance grades | 0..3 | فقط اعداد صحیح |
Rerank pool | top-20 | 5 مورد برتر به ترکیب فرستاده میشوند |
Cache hit target | 60-80% | پیشوندهای پایدار در ابتدا |
Drift alert | 5% | افت کیفیت بازیابی به صورت هفتگی |
عیبیابی
عیبیابی"unsupported model answer"
- علت
- نقلقول در تکهی ارجاعشده وجود ندارد
- راهحل
- یک اسپن دقیق و شناسه تکهی آن را برگردانید
stateبرابر needs_review است- علت
- نقلقول فاقد اصطلاحات پرسوجو است
- راهحل
- میزان ارتباط را به صورت دستی ارزیابی کنید
stateبرابر abstained است- علت
- بازیابی هیچ تکهای پیدا نکرد
- راهحل
- برای یک پرسوجوی نامربوط طبیعی است
"stale index version"
- علت
- نویسندهی دیگری زودتر commit کرده است
- راهحل
- اسنپشات را بخوانید و نسخهی آن را ارسال کنید
"duplicate document id"
- علت
- دو سند ورودی شناسهی یکسان دارند
- راهحل
- شناسهها را یکتا کنید
خطمشی ویرایششده همچنان استناد میشود
- علت
- ایندکس از منبع عقبتر است
- راهحل
- کل پیکره متنی را دوباره وارد کنید
"symlink notes are not supported"
- علت
- یادداشت یک پیوند است
- راهحل
- از یک فایل معمولی در پوشه استفاده کنید
کدهای تولیدی نتایج را آلوده میکنند
- علت
- کدهای تکراری در پیکره متنی وجود دارد
- راهحل
- آن را با عنوان "generated" مشخص کرده و وزنش را کاهش دهید
معیارهای رتبهبندی در قالب کد
مفهومها- Precision@k
- نتایج مرتبط در میان k مورد اول، تقسیم بر k.
- Recall@k
- نتایج مرتبط تقسیم بر تمام اسناد با نمرهی بالاتر از 0.
- RR
- معکوس رتبهی اولین سند مرتبط، در غیر این صورت 0.
- nDCG
- نسبت DCG با بهرهی
2 ** grade - 1به DCG ایدهآل. - ارزیابینشده
- اسناد بدون برچسب در میان k مورد اول. بهرهی آنها صفر است.
- IDF یادداشتها
math.log((1 + len(terms)) / (1 + count)) + 1.- امتیاز پرسشوپاسخ اسناد
- مجموع
(1 + math.log(bag[t]))ضرب در ضریب IDF.
پرسشها
پرسش و پاسخ- چرا ابتدا فیلتر بر اساس نقش اعمال میشود؟
- خطمشی دسترسی باید قبل از هر امتیازدهی اعمال شود.
- چرا پرسش در آخر قرار میگیرد؟
- پرامپت سیستم و زمینه، پیشوند کَششده را تشکیل میدهند.
- ایندکسگذاری مجدد روی چه بخشهایی تأثیر میگذارد؟
- فقط تکههایی که متن آنها تغییر کرده است. یالها زمانی تغییر میکنند که importها تغییر یابند.
- آیا استناد معتبر دلیلی بر صحت پاسخ است؟
- خیر. ممکن است هنوز نامربوط یا منسوخ باشد.
- آیا تازهسازی همان بازنویسی است؟
- خیر. محتوای یکسان با زمان جدیدتر تنها زمان را بهروز میکند.
نکات
نکتهها- تعداد 100 پرسش چندمخزنی را همراه با پاسخهای قطعیِ file:line برچسبگذاری کنید.
- یک مجموعهی طلایی شامل 200 پرسشوپاسخ و 50 پرامپت چالشبرانگیز نگه دارید.
- هر ادعایی را که فاقد لنگر
(repo/path:start-end)است رد کنید. - ایندکس مجدد برای یک push شامل 50 فایل را در کمتر از 60 ثانیه انجام دهید.