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