چیت‌شیت

چت‌بات‌های RAG در محیط عملیاتی و به‌روز بودن داده‌ها

Production RAG Chatbots and Freshness

فیلتر، ادغام، کَش، گاردریل و ارجاع. ایندکس را به‌روز نگه دارید و هر تغییر رتبه را ارزیابی کنید.

  • ۱۲ بخش
  • ۲ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. یک نوبت گفت‌وگوی کنترل‌شده
  2. اجرا، نمره‌دهی و بررسی
  3. نوبت گفت‌وگوی آگاه از کَش
  4. بازیابی ترکیبی در پایگاه کد
  5. توابع پروژه
  6. ورود داده و پرس‌وجو در سیستم تازگی
  7. ورودی‌ها، خروجی‌ها و بررسی‌های پروژه
  8. پیش‌فرض‌ها و اعداد
  9. عیب‌یابی
  10. معیارهای رتبه‌بندی در قالب کد
  11. پرسش‌ها
  12. نکات

یک نوبت گفت‌وگوی کنترل‌شده

معماری
تأییدواجد شرایط3 مورد برترپیشوند sha256پاسخپرس‌وجونقش + حوزه قضاییگارد ورودیBLOCKED_PATTERNSفیلتر دسترسینقش یا عمومی، برچسب یا هرکدامبازیابی ترکیبیdense + BM25، الگوریتم RRF 60PromptLayoutسیستم، خط‌مشی، زمینهPromptCacheیافتن یا نیافتن در cache_keyترکیب و بازنویسیارجاع دهید یا عدم اطمینان را اعلام کنیدپاک‌سازی PIIایمیل و کدملی پاک‌سازی شدند

اجرا، نمره‌دهی و بررسی

دستورها
دستورعملکرد ابزار
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-256load_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-IDFbuild_index(documents, aliases=None)
امتیازدهی به دو سیستمcompare_systems(systems, judgments, k)

ورود داده و پرس‌وجو در سیستم تازگی

گام‌به‌گام
  1. نرمال‌سازیمتن NFC، تبدیل CRLF به LF، حذف فاصله‌های اضافه، سپس SHA-256 بدنه.
  2. تفاوت‌های بازنگریشناسه‌ای که جدید است به insert می‌رود.
  3. تفاوت‌های بازنگریهشی که تغییر کرده به update می‌رود. تنها زمانِ updated جدید به refresh منتقل می‌شود.
  4. تفاوت‌های بازنگریشناسه‌ای که در کل پیکره متنی نیست به delete می‌رود.
  5. commitقفل‌گذاری با flock، مقایسه‌ی expected_version، نوشتن فایل موقت، fsync، اجرای os.replace.
  6. بازیابینادیده‌گرفتن سند در صورتی که سن کمتر از 0 یا بیشتر از max_age باشد.
  7. بازیابیامتیاز عبارت است از نسبت واژگان مطابقت‌یافته به واژگان پرس‌وجو. مرتب‌سازی بر اساس امتیاز، سن، شناسه.

ورودی‌ها، خروجی‌ها و بررسی‌های پروژه

مقایسه
عاملپرسش‌وپاسخ از اسنادتازگیجستجوی یادداشت‌هاآزمایشگاه ارزیابی
خروجی ساخته‌شدهرسید استنادایندکس تازهجستجوی لغوی با TF-IDFتفاوت‌های بازنگری پسرفت
ورودیپوشه‌ای از فایل‌های txt.JSON کامل پیکره متنیپوشه‌ای از فایل‌های md.3 فایل JSON
خروجیanswer.json و answer.htmlاسنپ‌شات، تغییراتmatches.jsonretrieval-diff.json
فیلدهای کلیدیstart، end، sha256version، age، hashscore، matcheddelta_ndcg
وضعیت‌هاanswered، abstainedاز insert تا deletek تطابق برترتعداد پسرفت‌ها
گاردneeds_reviewخطای نسخه منسوخ‌شدهk باید مثبت باشد--fail-on-regression

پیش‌فرض‌ها و اعداد

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
Doc QA chunk `size`200overlap برابر 30 است
--max-age3600شواهد قدیمی‌تر نادیده گرفته می‌شوند
--k3CLIهای تازگی، یادداشت‌ها و ارزیابی
Note size limit100 KBیادداشت‌های حجیم‌تر خطا می‌دهند
Relevance grades0..3فقط اعداد صحیح
Rerank pooltop-205 مورد برتر به ترکیب فرستاده می‌شوند
Cache hit target60-80%پیشوندهای پایدار در ابتدا
Drift alert5%افت کیفیت بازیابی به صورت هفتگی

عیب‌یابی

عیب‌یابی
  • "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 ثانیه انجام دهید.