مراقبة الإنتاج والخطوات التالية

CI/CD لجودة LLM

3 دقيقة للقراءة

ادمج تقييم LLM في خط أنابيب CI/CD الخاص بك لاكتشاف انحدارات الجودة قبل وصولها للإنتاج.

لماذا CI/CD لجودة LLM؟

CI التقليدي CI لـ LLM
اختبارات الوحدة مجموعات التقييم
تغطية الكود مقاييس الجودة
التحقق من الصياغة التحقق من الموجهات
فحوصات البناء صحة نقطة نهاية النموذج

مثال GitHub Actions

شغّل التقييمات على كل PR:

# .github/workflows/llm-evaluation.yml
name: فحص جودة LLM

on:
  pull_request:
    paths:
      - 'prompts/**'
      - 'src/llm/**'

jobs:
  evaluate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: إعداد Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: تثبيت التبعيات
        run: |
          pip install langsmith mlflow weave openai

      - name: تشغيل مجموعة التقييم
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          LANGCHAIN_API_KEY: ${{ secrets.LANGCHAIN_API_KEY }}
        run: |
          python scripts/run_evaluations.py

      - name: فحص عتبات الجودة
        run: |
          python scripts/check_thresholds.py

سكربت التقييم

# scripts/run_evaluations.py
import json
from langsmith.evaluation import evaluate
from my_app import my_llm_function
from my_evaluators import accuracy_scorer, helpfulness_scorer

def run_ci_evaluation():
    """شغّل مجموعة التقييم لـ CI."""
    results = evaluate(
        my_llm_function,
        data="ci-test-dataset",
        evaluators=[accuracy_scorer, helpfulness_scorer],
        experiment_prefix="ci-check"
    )

    # احفظ النتائج لفحص العتبات
    with open("eval_results.json", "w") as f:
        json.dump(results.metrics, f)

    return results

if __name__ == "__main__":
    run_ci_evaluation()

فحص العتبات

# scripts/check_thresholds.py
import json
import sys

THRESHOLDS = {
    "accuracy": 0.85,
    "helpfulness": 0.80,
}

def check_thresholds():
    with open("eval_results.json") as f:
        results = json.load(f)

    failures = []
    for metric, threshold in THRESHOLDS.items():
        value = results.get(f"{metric}/mean", 0)
        if value < threshold:
            failures.append(f"{metric}: {value:.2f} < {threshold}")

    if failures:
        print("فشل فحص الجودة:")
        for f in failures:
            print(f"  - {f}")
        sys.exit(1)
    else:
        print("نجح فحص الجودة")
        print(f"  الدقة: {results.get('accuracy/mean', 0):.2f}")
        print(f"  المساعدة: {results.get('helpfulness/mean', 0):.2f}")

if __name__ == "__main__":
    check_thresholds()

تعليقات PR

أضف نتائج التقييم لتعليقات PR:

- name: التعليق على PR
  uses: actions/github-script@v7
  with:
    script: |
      const results = require('./eval_results.json');
      const comment = `
      ## تقرير جودة LLM

      | المقياس | الدرجة | العتبة | الحالة |
      |--------|-------|--------|--------|
      | الدقة | ${results['accuracy/mean'].toFixed(2)} | 0.85 | ${results['accuracy/mean'] >= 0.85 ? '✅' : '❌'} |
      | المساعدة | ${results['helpfulness/mean'].toFixed(2)} | 0.80 | ${results['helpfulness/mean'] >= 0.80 ? '✅' : '❌'} |
      `;

      github.rest.issues.createComment({
        issue_number: context.issue.number,
        owner: context.repo.owner,
        repo: context.repo.repo,
        body: comment
      });

النشر المرحلي

استخدم نتائج CI للتحكم في عمليات النشر:

deploy:
  needs: evaluate
  if: success()
  runs-on: ubuntu-latest
  steps:
    - name: النشر للاختبار
      if: github.event_name == 'pull_request'
      run: ./deploy.sh staging

    - name: النشر للإنتاج
      if: github.ref == 'refs/heads/main'
      run: ./deploy.sh production

مجموعات بيانات التقييم لـ CI

حافظ على مجموعة بيانات خاصة بـ CI:

نوع مجموعة البيانات الحجم الغرض
CI سريع 20-50 مثال تعليقات سريعة على PRs
CI كامل 100-200 مثال بوابة الدمج
ليلي 500+ مثال فحص شامل
# اختر مجموعة البيانات بناءً على السياق
import os

if os.environ.get("CI_QUICK"):
    dataset = "ci-quick-dataset"
elif os.environ.get("CI_FULL"):
    dataset = "ci-full-dataset"
else:
    dataset = "nightly-dataset"

أفضل الممارسات

الممارسة لماذا
حافظ على سرعة CI استخدم مجموعات بيانات صغيرة لـ PRs
خزّن مؤقتاً عند الإمكان لا تُعد تقييم الكود غير المتغير
أصدر مجموعات البيانات تتبع ما اختبرت مقابله
افشل سريعاً امنع الدمج عند انخفاض الجودة
تتبع الاتجاهات خزّن النتائج للمقارنة التاريخية

التعامل مع التقلب

LLMs يمكن أن تنتج مخرجات متغيرة:

def run_stable_evaluation(n_runs=3):
    """شغّل التقييم عدة مرات وخذ المتوسط."""
    all_results = []

    for _ in range(n_runs):
        results = evaluate(model, data=dataset, evaluators=evaluators)
        all_results.append(results.metrics)

    # المتوسط عبر التشغيلات
    avg_metrics = {}
    for key in all_results[0].keys():
        avg_metrics[key] = sum(r[key] for r in all_results) / n_runs

    return avg_metrics

نصيحة: ابدأ بمجموعة بيانات CI صغيرة وعالية الجودة. وسّعها مع اكتشاف الحالات الحدية في الإنتاج.

أخيراً، لنلخص ما تعلمته ونستكشف الخطوات التالية في رحلتك في LLMOps. :::

اختبار

الوحدة 6: مراقبة الإنتاج والخطوات التالية

خذ الاختبار