چیت‌شیت

تست‌های حالت سایه، قناری و A/B برای مدل‌های زبانی بزرگ (LLM)

Shadow, Canary and A/B Tests for LLMs

اجراهای سایه، گیت‌های قناری، بازگشت به عقب سریع، تست‌های ترتیبی A/B، محافظ‌های آشوب و گزارش‌های دریفت کانفیگ.

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

توالی مسیر پیش‌روی شبیه‌سازی‌شده

گام‌به‌گام
  1. حالت سایهکاندیدا رونوشت درخواست‌های محیط عملیاتی را می‌گیرد. خروجی‌ها به لاگ‌ها می‌روند، نه به کاربران.
  2. لاگ سایهخروجی را Diff بگیرید. تعداد توکن‌ها، تاخیر، امتناع مدل و خطاها را لاگ کنید.
  3. قناریشیفت ترافیک به میزان 1٪، 10٪، 25٪، 50٪، 75٪ و 100٪.
  4. گیت‌های کنترلیبررسی پنج متریک در هر مرحله، هر 5 تا 15 دقیقه.
  5. تست A/Bاختیاری. وقتی مدل جدید به‌طور مشخص متفاوت است، آن را با ترافیک 50٪ اجرا کنید.
  6. ارتقا به مرحله بعدرفتن به 100٪ ترافیک پس از گذراندن تمام گیت‌های قناری.
  7. بازگشت به عقببرگرداندن پرچم. دایجست پین‌شده را روی مدل قبلی قرار دهید.

گیت‌های کنترلی قناری در شبیه‌ساز

پیش‌فرض‌ها
تنظیمپیش‌فرضیادداشت
STAGES0.01, 0.10, 0.25, 0.50, 0.75, 1.00شش سهمیه ترافیک
latency_p99_ms1.5خط مبنا 900 میلی‌ثانیه
cost_per_req1.2خط مبنا 0.02. تخطی بالاتر از 20٪
error_rate2.0خطاهای 5xx به علاوه‌ی امتناع صریح مدل
output_len_p991.4خط مبنا 450 توکن
thumbs_down_rate1.5خط مبنا 0.03
`rng.uniform` noise0.92, 1.08نویز روی هر متریک سنجیده‌شده

اجرای آزمایشگاه‌ها

کار و کد
وظیفهکد
شبیه‌ساز قناری، درس 20code/main.py
تزریق 25٪ پس‌رفت هزینهRegression(cost_mult=1.25)
تزریق 80٪ پس‌رفت تاخیرRegression(latency_mult=1.80)
بررسی یک مرحله در برابر گیت‌های کنترلیcheck_gates(metrics)
شبیه‌ساز ترتیبی A/B، درس 21code/main.py
اندازه نمونه در توان آزمون 80٪fixed_sample_size(baseline, lift)
شبیه‌سازی 5٪ بهبودsimulate(0.03, 0.0315)
اجراکننده‌ی آشوب، درس 24run_experiment(e)

اصطلاحات مسیر پیش‌روی شبیه‌سازی‌شده و تست A/B

مفهوم‌ها
حالت سایه
بدون هیچ اثری روی کاربر. یک اسموک‌تست، نه آزمون کیفیت.
قناری
مسیر پیش‌روی تدریجی به سمت کاربران واقعی، همراه با گیت‌های کنترلی متریک.
غیرقطعی بودن
تا 15٪ واریانس دقت در اجراهای متوالی روی ورودی‌های یکسان.
پرچم سیاست
بازگشت به عقب در کانفیگ. در چند ثانیه انجام می‌شود، نه چند ساعت.
پین مدل
دایجست تغییرناپذیر در رجیستری. خودکار ارتقا پیدا نمی‌کند.
ارزیابی در مقابل تست A/B
ارزیابی می‌پرسد «آیا مدل از پس کار برمی‌آید؟» تست A/B می‌پرسد «آیا کاربران به آن اهمیت می‌دهند؟»
روش CUPED
حذف اثر واریانس دوره‌ی قبل با رگرسیون. کاهش متداول 30 تا 70 درصدی.
روش SRM
عدم‌انطباق نسبت نمونه. تقسیم 50/50 که خروجی 47/53 بدهد دچار مشکل است.

قاعده‌ی توقف ترتیبی

کد
python
required = fixed_sample_size(baseline, lift)                           # توان آزمون 80٪، آلفا 0.05
adjusted = int(required * 1.4)                                         # بافر غیرقطعی بودن LLM
if n_a > 100 and n_b > 100 and sequential_stopped_at is None:
    z = z_statistic(success_a, n_a, success_b, n_b)
    n_total = n_a + n_b
    threshold = math.sqrt(2 * math.log(1 / 0.05) + math.log(n_total))  # رشد همراه با log(n)
    if abs(z) > threshold:
        sequential_stopped_at = n_total                                # توقف زودهنگام با مشخص‌شدن برنده‌ی قطعی

صفحات مهندسی آشوب

معماری
تزریق خرابیمتریک‌ها، ردیابی‌ها، لاگ‌هانرخ مصرف خطالغو عملیاتیافته‌هاصفحه‌ی کنترلاسکژولر آزمایشصفحه‌ی هدفسرویس‌ها، پادها، منابع ذخیره‌سازی دادهصفحه‌ی مشاهده‌پذیریانطباق به کمک trace-IDصفحه‌ی ایمنیسوییچ قطع اضطراری، گیت‌های بودجهحلقه‌ی بازخورداهداف سطح سرویس (SLO)، ران‌بوک‌ها، اصلاحات کد

آزمایش‌های اجراکننده‌ی آشوب

دستورها
دستورکارکرد
ERROR_BUDGET_PER_DAY = 0.001سطح توافق SLO برابر 99.9٪
EXPECTED_ERROR_RATE = 0.0005نرخ خطای خط مبنا
burn_rate > 2.0نیمه‌ی اول قاعده‌ی لغو
e.blast_radius_pct > 0.2نیمه‌ی دوم. هر دو باید برقرار باشند
pod kill (1 decode replica)5 دقیقه، شعاع تخریب 5٪. تکمیل شد
provider 429 fallback5 دقیقه، شعاع تخریب 30٪. لغو شد
malformed prompt tokenizer stall3 دقیقه، شعاع تخریب 10٪. تکمیل شد

دستورهای تحلیل‌گر دریفت

دستورها
دستورکارکرد
go run . --input fixtures/config.json --out /tmp/drift.jsonنوشتن گزارش دریفت در یک فایل
go build -o /tmp/drift-explainer .بیلد کردن باینری
/tmp/drift-explainer --input fixtures/config.json --checkبازگرداندن کد 2 در صورت وجود دریفت
python3 scripts/project_test.py configuration-drift-explainer --init <work>ایجاد یک کد اولیه‌ی تازه
python3 scripts/project_test.py configuration-drift-explainer --stage 1 --path <work> --strictنمره‌دهی به یک مرحله
python3 scripts/project_test.py configuration-drift-explainer --all --solution --strictنمره‌دهی به پاسخ مرجع

گزارش دریفت

مفهوم‌ها
ورودی
layers، observed و گزینه‌ی اختیاری sensitive. اولویت با لایه‌های بعدی است.
برابر (equal)
مقدار مؤثر با مقدار دیده‌شده مطابقت دارد.
تغییریافته (changed)
مقادیر بر اساس reflect.DeepEqual فرق دارند.
مفقود (missing)
لایه‌ها کلید را تعریف کرده‌اند اما کانفیگ دیده‌شده ندارد.
غیرمنتظره (unexpected)
کانفیگ دیده‌شده کلیدی دارد که در هیچ لایه‌ای تعریف نشده است.
تاریخچه
همه‌ی لایه‌هایی که کلید را مقداردهی کرده‌اند، به ترتیب. مقادیر سایه‌انداخته باقی می‌مانند.
پاک‌سازی داده‌های حساس
نام‌های رمزعبور، secret، توکن، api-key و گواهی‌ها به [REDACTED] تبدیل می‌شوند.
خروجی
نسخه‌ی شمای schemaVersion برابر با 1. مجوز فایل دسترسی فقط‌مالک 0600 است.

عیب‌یابی

عیب‌یابی
  • افزایش 40 درصدی هزینه یک روز پس از تغییر وضعیت

    علت
    نبود مراحل سایه یا قناری
    راه‌حل
    ابتدا اجرای سایه. بستن گیت روی سقف 20٪ بالای هزینه خط مبنا
  • بازگشت به عقب 3 ساعت طول می‌کشد

    علت
    بازگشت به عقب نیاز به دیپلوی مجدد دارد
    راه‌حل
    تغییر دادن پرچم سیاست. پین کردن دایجست قدیمی
  • هشدار کاذب در گیت‌های کنترلی قناری

    علت
    گیت‌ها داخل کف نویز تعریف شده‌اند
    راه‌حل
    تنظیم گیت‌ها در نقطه‌ای بالاتر از کف نویز
  • نویزی بودن گیت بازخورد در ترافیک 1٪

    علت
    تنها 50 تا 150 نقطه‌ی داده در هر بازه
    راه‌حل
    توقف طولانی‌تر در هر مرحله
  • تقسیم 50/50 خروجی 47/53 می‌دهد

    علت
    مشکل SRM. سیستم تخصیص مختل است
    راه‌حل
    ابتدا هش تخصیص را اصلاح کنید
  • تست A/B هرگز به معناداری آماری نمی‌رسد

    علت
    غیرقطعی بودن اندازه نمونه مؤثر را پایین می‌آورد
    راه‌حل
    اندازه نمونه را 1.3 تا 1.5 برابر کنید
  • خطای OOM پس از خطاهای 429 پرووایدر

    علت
    تلاش‌های مجدد گیت‌وی همروندی را تشدید می‌کنند
    راه‌حل
    تزریق یک خطای 429 پرووایدر به مدت 5 دقیقه
  • مقدار سکرت در گزارش دریفت دیده می‌شود

    علت
    یک کلید با نام بی‌خطر حاوی مقادیر حساس است
    راه‌حل
    اضافه کردن کلید به لیست sensitive

پرسش و پاسخ

پرسش و پاسخ
آیا حالت سایه کیفیت را اثبات می‌کند؟
خیر. تنها خطاهای قطعی، هزینه، طول خروجی و امتناع مدل را شناسایی می‌کند.
چه زمانی از مرحله‌ی تست A/B صرف‌نظر می‌کنید؟
وقتی که مدل جدید فقط یک نسخه‌ی بهبودیافته باشد.
آیا «پایدار» به معنی همان خط مبنا است؟
خیر. پایدار یعنی درون دامنه‌ی واریانس مورد انتظار.
20 تست با اطمینان 95٪؟
یک مثبت کاذب بر اساس تصادف رخ می‌دهد. از روش Bonferroni یا Benjamini-Hochberg استفاده کنید.
کدام آزمایش مهندسی آشوب لغو می‌شود؟
خطای 429 پرووایدر. در صورتی که نرخ مصرف خطا بالای 2.0 و شعاع تخریب بالای 20٪ باشد.
گزینه‌ی --check در صورت وجود دریفت چه کدی برمی‌گرداند؟
کد خروج 2.

نکات کلیدی

نکته‌ها
  • مسیر بازگشت به عقب را پیش از استقرار اصلاح کنید؛ نباید نیازی به دیپلوی مجدد داشته باشد.
  • هزینه‌ی هر درخواست را پایش کنید. مدلی با 20٪ کیفیت بهتر ممکن است در هر فراخوانی 3 برابر گران‌تر باشد.
  • هر زمان که مصرف بودجه خطای روزانه از 2 برابر حد انتظار فراتر رفت، آزمایش‌های آشوب را متوقف کنید.
  • اولین آزمون آشوب: متوقف کردن ناگهانی یک رپلیکای رمزگشایی زیر بار ترافیک یکنواخت.
  • زمان‌بندی دوره‌ای: استقرار قناری هفتگی، روز مانور ماهانه و ممیزی فصلی.
  • شناسه‌های مبدا را در نام لایه‌ها بیاورید، هرگز مقادیر سکرت را در آن‌ها قرار ندهید.