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

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: مراقبة الإنتاج والخطوات التالية

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.