AI Observability

شناسایی انحراف پرامپت: خودکارسازی تست رگرسیون LLM با Braintrust در CI/CD

ادغام مدل‌های زبانی بزرگ (LLM) در برنامه‌های تولیدی یک چالش منحصربه‌فرد ایجاد می‌کند: مدل غیرقطعی است. برخلاف نرم‌افزارهای سنتی، جایی که یک تست بر اساس منطق سخت‌گیرانه یا موفق یا ناموفق است، خروجی‌های LLM می‌توانند در هر اجرا کمی متفاوت باشند و با این حال «درست» باشند، یا به دلیل تنظیمات جزئی پرامپت، کیفیت آن‌ها به‌طور ظریفی کاهش یابد. بدون تست‌های دقیق، این تغییرات ظریف—که اغلب به عنوان انحراف پرامپت (prompt drift) شناخته می‌شوند—می‌توانند منجر به شکست‌های خاموش، کاهش اعتماد کاربر و افزایش هزینه‌های عملیاتی شوند.

این مقاله بررسی می‌کند که چگونه می‌توان یک فرآیند تست رگرسیون قوی برای پرامپت‌های LLM را با استفاده از Braintrust پیاده‌سازی کرد، پلتفرمی که به‌طور خاص برای مشاهده‌پذیری و ارزیابی LLM طراحی شده است. ما نشان خواهیم داد که چگونه می‌توان این فرآیند را مستقیماً در خط CI/CD خود ادغام کرد تا اطمینان حاصل شود که هر تغییر در پرامپت قبل از استقرار، در مقابل یک معیار استاندارد اعتبارسنجی می‌شود.

چرا تست‌های واحد سنتی برای LLM‌ها شکست می‌خورند

تست‌های واحد سنتی بر تطبیق دقیق تکیه دارند. برای یک LLM، بررسی اینکه آیا خروجی با "The weather is sunny." برابر است، شکننده است. یک بازنویسی جزئی به "It’s a sunny day." باید موفق شود، اما یک تست سنتی آن را ناموفق علامت‌گذاری خواهد کرد. علاوه بر این، LLM‌ها به زمینه، تنظیمات دما و حتی نسخه خاص مدل پایه حساس هستند. اگر مدل پایه خود را از GPT-4 به نسخه جدیدتر به‌روزرسانی کنید یا پرامپت سیستم خود را برای شفافیت تنظیم کنید، ریسک شکستن موارد حاشیه‌ای (edge cases) که تست‌های قبلی آن‌ها را پوشش نمی‌دادند وجود دارد.

تست رگرسیون در زمینه LLM نیاز به تست مبتنی بر ارزیابی دارد. به جای بررسی رشته‌های دقیق، از توابع امتیازدهی استفاده می‌کنیم که صحت معنایی، ایمنی و فرمت پاسخ را ارزیابی می‌کنند. Braintrust به شما امکان می‌دهد این ارزیاب‌ها را یک بار تعریف کنید و هر بار که پرامپت تغییر کرد، آن‌ها را در مقابل کل مجموعه داده خود دوباره اجرا کنید.

راه‌اندازی فرآیند ارزیابی Braintrust

اول، باید منطق ارزیابی خود را تعریف کنید. Braintrust یک SDK پایتون ارائه می‌دهد که این کار را ساده می‌کند. مفهوم اصلی شامل ایجاد یک Task است که پرامپت‌های ورودی را به پاسخ‌های مدل نگاشت می‌کند و یک تابع امتیازدهی را اعمال می‌کند.

در زیر یک مثال عملی از یک اسکریپت ارزیابی، evals.py، آورده شده است که یک پرامپت خلاصه‌سازی را تست می‌کند. این اسکریپت دو متریک را بررسی می‌کند: دقت (آیا حاوی حقایق کلیدی است؟) و لحن (آیا حرفه‌ای است؟).

import braintrust
from braintrust import Task, Eval
from my_app.llm import generate_summary

# تعریف تابع امتیازدهی
def score(output, input, metadata):
    # از یک LLM داور یا الگوریتم برای امتیازدهی به خروجی استفاده کنید
    accuracy = check_factuality(output, input['expected_facts'])
    tone = check_tone(output)
    
    return {
        "accuracy": accuracy,
        "tone": tone,
        "pass": accuracy > 0.8 and tone > 0.7
    }

# راه‌اندازی پروژه Braintrust
project = braintrust.Project("summarizer-eval")

# ایجاد تسک با نسخه فعلی پرامپت
task = Task(
    name="v2.1_prompt_update",
    evals=[
        Eval(
            name="summarization_test",
            data=[
                {"input": "Long text here...", "expected_facts": ["fact1", "fact2"]},
                # ... بارگذاری کل مجموعه داده از CSV/JSON
            ],
            query=generate_summary,
            score=score
        )
    ]
)

# اجرای ارزیابی
result = project.create(task=task)
print(f"Evaluation ID: {result.id}")

ادغام با CI/CD: مرحله دروازه‌بان

قدرت واقعی این فرآیند دروازه‌بانی خودکار است. در پیکربندی GitHub Actions یا GitLab CI خود، می‌توانید این اسکریپت ارزیابی را در هر درخواستی که دایرکتوری prompts/ یا کد فراخوانی LLM را تغییر می‌دهد، اجرا کنید.

اگر میانگین امتیاز از یک آستانه تعریف‌شده (مثلاً ۹۰٪ نرخ موفقیت) پایین‌تر بیاید، شغل CI شکست می‌خورد و ادغام (merge) را مسدود می‌کند. این به عنوان یک دروازه‌بان عمل می‌کند و اطمینان حاصل می‌کند که هیچ رگرسیون پرامپتی به محیط تولید نمی‌رسد.

# .github/workflows/llm-regression.yml
name: LLM Regression Tests

on: [pull_request]

jobs:
  llm-eval:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'
      
      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          pip install braintrust
      
      - name: Set Braintrust Token
        run: |
          echo "BRAINTRUST_TOKEN=${{ secrets.BRAINTRUST_TOKEN }}" >> $GITHUB_ENV
      
      - name: Run Evaluation
        run: |
          python evals.py
      
      - name: Check Pass Rate
        run: |
          # اسکریپتی برای دریافت نتایج از API Braintrust و شکست در صورت کمتر از ۹۰٪ موفقیت
          python check_threshold.py --min-pass-rate 0.90

مانیتورینگ عملکرد تولید

اگرچه CI/CD از رگرسیون‌ها قبل از استقرار جلوگیری می‌کند، اما انحراف پرامپت همچنین می‌تواند در محیط تولید به دلیل تغییرات در توزیع داده‌های کاربر رخ دهد. قابلیت‌های مشاهده‌پذیری Braintrust به شما امکان می‌دهد ردپاهای تولید را در کنار داده‌های ارزیابی خود ثبت کنید. با مقایسه امتیازهای ارزیابی‌های آفلاین خود با امتیازهای ترافیک زنده تولید، می‌توانید زمانی را که مدل شروع به مشکل داشتن با انواع جدید ورودی‌هایی که در مجموعه داده تست شما نبودند، شناسایی کنید.

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

نتیجه‌گیری

خودکارسازی تست رگرسیون برای پرامپت‌های LLM دیگر اختیاری نیست—این یک جزء حیاتی مهندسی هوش مصنوعی قابل اعتماد است. با استفاده از ابزارهایی مانند Braintrust، توسعه‌دهندگان می‌توانند از تست‌های شکننده تطبیق رشته به سمت ارزیابی‌های معنایی قوی حرکت کنند. ادغام این فرآیند در خط CI/CD شما یک تور ایمنی ایجاد می‌کند که انحراف پرامپت را زودتر شناسایی می‌کند، زمان دیباگ را کاهش می‌دهد و در نهایت یک تجربه کاربری پایدارتر و قابل‌اعتمادتر ارائه می‌دهد. با مقیاس‌پذیری برنامه‌های LLM، ساخت این زیرساخت مشاهده‌پذیری و تست از روز اول تفاوت بین یک محصول پایدار و یک تجربه استقرار آشوبناک خواهد بود.

Share: