التقييم والتصدير
بعد التدريب، تحتاج إلى تقييم جودة النموذج وتصديره إلى تنسيق قابل للنشر. تغطي هذه الصفحة كلا من مجموعة معايير التقييم ومسار التصدير/العرض النموذجي.
نظرة عامة على التقييم
يختبر البرنامج النصي للتقييم (training/scripts/evaluate_model.py) النموذج مقابل 8 معايير أداء منظمة عبر 12 مجال أمان، ويسجل الاستجابات بناءً على مطابقة الكلمات الرئيسية وجودة الاستجابة.
لماذا التقييم؟
- اكتشف الانحدارات — تأكد من أن النموذج لم يهلوس أو ينسى المعرفة الأساسية لـ SOC
- مقارنة المتغيرات — المتخصصين العامين مقابل المتخصصين لكل وكيل، ورتب LoRA المختلفة، والنماذج الأساسية المختلفة
- عمليات نشر البوابة — نشر النماذج التي تتجاوز الحد الأدنى من النقاط فقط
مجالات التقييم
يغطي التقييم 12 مجالًا أمنيًا:
| اِختِصاص | ما يختبره |
|---|---|
alert_triage | تصنيف خطورة التنبيه، واستخراج IOC |
threat_hunting | الصيد المبني على الفرضيات واستعلامات KQL |
malware_analysis | الهندسة العكسية، قواعد YARA، تحليل PE |
incident_response | كتيبات NIST وخطط الاحتواء |
network_security | تحليل التدفق، قواعد سوريكاتا، نفق DNS |
vulnerability_management | تحليل CVE، وتسجيل CVSS، وتحديد أولويات التصحيح |
forensics | الطب الشرعي للذاكرة، تحليل القرص، التعامل مع الأدلة |
threat_intelligence | إسناد APT، STIX/TAXII، نموذج الماس |
compliance | معايير رابطة الدول المستقلة، NIST 800-53، PCI DSS |
cloud_security | AWS/Azure IAM، وهروب الحاويات، ومسارات السحابة |
endpoint_security | فرز EDR، تحليل العمليات، كشف الثبات |
ics_ot_security | تحليل Modbus/DNP3، نموذج بوردو، IEC 62443 |
معايير التقييم
كل معيار هو اختبار منظم ذو نطاق سريع ومتوقع وتسجيل يعتمد على الكلمات الرئيسية:
تنبيه الفرز المعياري
Prompt: "Analyze this alert: ET TROJAN Cobalt Strike Beacon C2 Activity
detected from 10.0.1.50 to 185.220.101.42:443"
Expected keywords: cobalt strike, beacon, c2, command and control,
severity, critical, high, ioc, indicator
معيار صيد التهديد
Prompt: "Create a threat hunting hypothesis for detecting lateral movement
via PsExec in an enterprise Windows environment"
Expected keywords: psexec, lateral movement, hypothesis, windows,
event log, sysmon, network, smb, admin share
معيار تحليل البرامج الضارة
Prompt: "You received a suspicious PE file with high entropy sections and
imports from ws2_32.dll. Perform initial triage analysis."
Expected keywords: entropy, pe, portable executable, ws2_32, network,
packed, obfuscated, sandbox, import, section
معايير أخرى
- الاستجابة للحوادث — استجابة متوافقة مع NIST لبرامج الفدية
- أمان الشبكة — اكتشاف نفق DNS
- إدارة الثغرات الأمنية — تقييم مكافحة التطرف العنيف
- الطب الشرعي — اكتساب الذاكرة المتقلبة
- استخبارات التهديدات — تحليل حملة التهديدات المستمرة المتقدمة
نظام التسجيل
يتم تسجيل كل استجابة باستخدام المطابقة القائمة على الكلمات الرئيسية:
def score_response(response: str, benchmark: dict) -> dict:
response_lower = response.lower()
matched = [kw for kw in benchmark["expected_keywords"]
if kw in response_lower]
keyword_score = len(matched) / len(benchmark["expected_keywords"])
# Response quality heuristics
length_score = min(len(response.split()) / 100, 1.0)
structure_score = any(marker in response
for marker in ["1.", "- ", "## ", "**"])
final_score = (keyword_score * 0.5 +
length_score * 0.3 +
(0.2 if structure_score else 0.0))
return {
"keyword_score": keyword_score,
"keywords_matched": matched,
"keywords_missed": [kw for kw in benchmark["expected_keywords"]
if kw not in response_lower],
"length_score": length_score,
"structure_score": structure_score,
"final_score": final_score,
}
| مكون النتيجة | وزن | ما يقيسه |
|---|---|---|
| مطابقة الكلمات الرئيسية | 50% | هل ذكر الرد المفاهيم الأمنية المتوقعة؟ |
| طول الرد | 30% | هل الاستجابة جوهرية (> 100 كلمة = الحد الأقصى)؟ |
| بناء | 20% | هل يستخدم التنسيق المنظم (القوائم، الرؤوس)؟ |
الحد الأدنى من درجات النجاح
| النتيجة الإجمالية | الحكم |
|---|---|
| ≥ 0.70 | تمرير — جاهز للنشر |
| 0.50 - 0.69 | هامشية — قد تحتاج إلى مزيد من البيانات أو الفترات التدريبية |
| < 0.50 | فشل — تحقق من فقدان التدريب، أو جودة البيانات، أو التكوين |
تشغيل التقييم
تقييم نموذج أولاما
# Evaluate a model served by Ollama
python training/scripts/evaluate_model.py ollama:granite-soc:latest
# With custom Ollama URL
OLLAMA_BASE_URL=http://localhost:11434 \
python training/scripts/evaluate_model.py ollama:granite-soc:latest
تقييم نقطة تفتيش محلية
# Evaluate directly from a training checkpoint (no Ollama needed)
python training/scripts/evaluate_model.py training/output/generic/
# Evaluate a per-agent specialist
python training/scripts/evaluate_model.py training/output/threat_hunter/
التقييم عبر Docker
docker compose -f docker-compose.training.yml run eval
التقييم عبر Makefile
make train-eval
مخرجات التقييم
ينتج البرنامج النصي تقريرًا مفصلاً:
╔══════════════════════════════════════════╗
║ AuroraSOC Model Evaluation Report ║
╠══════════════════════════════════════════╣
║ Model: granite-soc:latest ║
║ Benchmarks: 8 | Domains: 12 ║
╠══════════════════════════════════════════╣
║ Benchmark Score Status ║
║ ────────────────────── ───── ────── ║
║ Alert Triage 0.82 PASS ✓ ║
║ Threat Hunting 0.78 PASS ✓ ║
║ Malware Analysis 0.75 PASS ✓ ║
║ Incident Response 0.80 PASS ✓ ║
║ Network Security 0.71 PASS ✓ ║
║ Vulnerability Mgmt 0.68 MARGINAL ║
║ Forensics 0.74 PASS ✓ ║
║ Threat Intelligence 0.77 PASS ✓ ║
╠══════════════════════════════════════════╣
║ Average Score: 0.756 │ Overall: PASS ║
╚══════════════════════════════════════════╝
نموذج خط أنابيب التصدير
بعد التدريب والتقييم، يقوم مسار التصدير بتحويل النموذج إلى تنسيقات قابلة للنشر:
تنسيقات التصدير
| شكل | ملف | الخلفية | حالة الاستخدام |
|---|---|---|---|
| محول لورا | adapter_model.safetensors | غير متوفر (يتطلب الدمج) | استئناف التدريب، ومشاركة الضبط الدقيق |
| ** تم دمج FP16 ** | model-*.safetensors | vLLM | خدمة الإنتاج عبر vLLM |
| ** GGUF الكمي ** | unsloth.Q8_0.gguf | أولاما | النشر المحلي/الحافة |
| ** معانقة الوجه المحور ** | بعيد | أي | المشاركة والتعاون |
التصدير التلقائي (أثناء التدريب)
يتم تصدير البرنامج النصي للتدريب تلقائيًا استنادًا إلى قسم YAML config export:
export:
save_lora: true # Always save — lightweight, resumable
save_merged_16bit: false # Only if you need vLLM deployment
save_gguf: true # For Ollama deployment
gguf_quantization_methods:
- "q8_0" # Standard quality
push_to_hub: false # Set true + HF_TOKEN to upload
hub_model_name: "" # HuggingFace repo name
التصدير اليدوي (من نقطة التفتيش)
إعادة تصدير نموذج دون إعادة التدريب:
# Export from a LoRA checkpoint
python training/scripts/finetune_granite.py \
--config training/configs/granite_soc_finetune.yaml \
--export-only \
--agent threat_hunter
يتخطى --export-only التدريب بالكامل ويقوم فقط بتشغيل خط أنابيب التصدير على نقطة التفتيش الحالية.
طرق التكميم GGUF
| طريقة | جودة | سرعة | مقاس | متى تستخدم |
|---|---|---|---|---|
q8_0 | الأعلى | خط الأساس | ~2-4 جيجابايت | الافتراضي — أفضل مقايضة للجودة/الحجم |
q4_k_m | جيد | ~20% أسرع | ~1-2 جيجابايت | أجهزة الحافة المقيدة |
q5_k_m | أحسن | ~10% أسرع | ~1.5-3 جيجابايت | التوازن بين q4 و q8 |
f16 | ممتاز | الأبطأ | ~4-8 جيجابايت | عندما تكون الجودة هي الأهم |
نماذج الخدمة
أولاما (GGUF - محلي/حافة)
تحميل نموذج واحد:
python training/scripts/serve_model.py ollama \
--gguf training/output/generic/unsloth.Q8_0.gguf \
--name granite-soc:latest
تحميل جميع المتخصصين لكل وكيل:
python training/scripts/serve_model.py ollama-all \
--output-dir training/output
ما يفعله serve_model.py ollama:
-
يُنشئ Modelfile باستخدام قالب دردشة Granite 4:
FROM /path/to/unsloth.Q8_0.ggufTEMPLATE """{{- if .System }}<|start_of_role|>system<|end_of_role|>{{ .System }}<|end_of_text|>{{- end }}<|start_of_role|>user<|end_of_role|>{{ .Prompt }}<|end_of_text|><|start_of_role|>assistant<|end_of_role|>{{ .Response }}<|end_of_text|>"""PARAMETER temperature 0.1PARAMETER top_p 0.95PARAMETER stop "<|end_of_text|>"PARAMETER stop "<|start_of_role|>" -
يتم تشغيل
ollama create <name> -f Modelfile -
يتم التحقق باستخدام
ollama list
سبب أهمية قالب الدردشة: لا يعرف Ollama تنسيق <|start_of_role|> الفريد للعبة Granite 4 افتراضيًا. يخبر TEMPLATE الخاص بـ Modelfile Ollama بكيفية تنسيق المحادثات متعددة الأدوار. وبدون ذلك، يتلقى النموذج مدخلات مشوهة وينتج عنه استجابات ضعيفة.
vLLM (FP16 - الإنتاج)
لخدمة الإنتاج عالي الإنتاجية:
# Start vLLM with the merged FP16 model
python training/scripts/serve_model.py vllm \
--model training/output/generic/merged_fp16
# Or via Docker Compose
docker compose -f docker-compose.training.yml up vllm
يُفضل vLLM للإنتاج للأسباب التالية:
- التجميع المستمر — يخدم طلبات متعددة في وقت واحد
- PagedAttention — إدارة فعالة لذاكرة وحدة معالجة الرسومات
- واجهة برمجة التطبيقات المتوافقة مع OpenAI — استبدال مباشر، نفس نقطة النهاية
/v1/chat/completions - إنتاجية أعلى — 10-100× طلبات أكثر في الثانية من Ollama
متى تستخدم كل الخلفية
| عامل | أولاما | vLLM |
|---|---|---|
| النشر | المحلية، الحافة، التنمية | الإنتاج، السحابة |
| شكل النموذج | GGUF (الكمية) | FP16 (الدقة الكاملة) |
| ** متطلبات وحدة معالجة الرسومات ** | اختياري (احتياطي لوحدة المعالجة المركزية) | مطلوب |
| ** الإنتاجية ** | منخفض (طلب واحد) | عالية (دفعة) |
| تعقيد الإعداد | بسيط (ollama create) | معتدل (تكوين وحدة معالجة الرسومات) |
| جودة | جيد (q8_0) إلى عظيم (f16) | مثالي (FP16) |
مقارنة النماذج
سير عمل التقييم الموصى به:
# 1. Evaluate the generic model
python training/scripts/evaluate_model.py --model ollama:granite-soc:latest > eval_generic.txt
# 2. Evaluate a per-agent specialist
python training/scripts/evaluate_model.py --model ollama:granite-soc-threat-hunter:latest > eval_specialist.txt
# 3. Compare
diff eval_generic.txt eval_specialist.txt
أو قم بالتقييم مقابل النموذج الأساسي (غير المضبوط):
# Pull base Granite 4
ollama pull granite4:8b
# Evaluate base
python training/scripts/evaluate_model.py --model ollama:granite4:8b > eval_base.txt
# Compare fine-tuned vs. base
diff eval_base.txt eval_generic.txt
التقييم عبر vLLM (متوافق مع OpenAI)
# Start serving first
docker compose -f docker-compose.training.yml up -d vllm
# Required for OpenAI SDK client
export GRANITE_VLLM_BASE_URL=http://localhost:8000/v1
export VLLM_API_KEY=aurora-local
# Evaluate through vLLM backend
python training/scripts/evaluate_model.py \
--model vllm:granite-soc \
--vllm-base-url "$GRANITE_VLLM_BASE_URL" \
--vllm-api-key "$VLLM_API_KEY"
مقارنة الخلفية التقييم
| الخلفية | بادئة المواصفات النموذجية | عميل النقل | وضع الدفق | أفضل حالة استخدام |
|---|---|---|---|---|
| أولاما | ollama:<tag> | httpx | عاجز | ضمان الجودة المحلي والتحقق من صحة الحافة |
| vLLM | vllm:<model> | openai SDK | عاجز | تقييم الإنتاجية الشبيهة بالإنتاج |
| نقطة تفتيش محلية | مسار نظام الملفات | اكشف عن الاستدلال المحلي | عاجز | التحقق من سلامة نقطة التفتيش دون اتصال |
دليل التفسير المتري
| متري | معنى | تفسير |
|---|---|---|
pass_rate | المعايير التي تم اجتيازها / الإجمالي | بوابة الجودة الأولية. تهدف إلى ≥ 0.70 قبل الطرح. |
keyword_hit_rate | عدد مرات ظهور الكلمات الرئيسية / الكلمات الرئيسية المتوقعة | إشارة تغطية المحتوى. تشير القيم المنخفضة إلى انجراف المجال. |
avg_response_time_s | يعني الكمون الانتهاء | إشارة الأداء الخلفية. قارن بين Ollama وvLLM لتخطيط السعة. |
response_length | عدد الأحرف لكل إخراج | يكتشف الاقتطاع أو الاستجابات المفرطة في الإسهاب. |
استكشاف الأخطاء وإصلاحها
درجات تقييم منخفضة
| أعراض | سبب | يصلح |
|---|---|---|
| جميع نتائج الكلمات الرئيسية < 0.3 | النموذج لا يتعلم | تحقق من فقدان التدريب - يجب أن ينخفض. حاول المزيد من العصور. |
| كلمات رئيسية جيدة، وبنية سيئة | يقوم النموذج بإخراج نص غير منسق | أضف أمثلة منظمة إلى بيانات التدريب |
| جيدة في بعض المجالات، وسيئة في مجالات أخرى | بيانات التدريب غير المتوازنة | تحقق من توزيع المجال في مجموعة البيانات |
| تختلف النتائج بشكل كبير بين الجولات | درجة الحرارة مرتفعة جداً | قم بتعيين temperature=0.1 للتقييم الحتمي |
فشل التصدير
| خطأ | سبب | يصلح |
|---|---|---|
CUDA out of memory during merge | يحتاج دمج FP16 إلى نموذج كامل في الذاكرة | استخدم جهازًا به المزيد من VRAM، أو قم بتصدير GGUF فقط |
GGUF file too large | باستخدام F16 الكمي | قم بالتبديل إلى q8_0 أو q4_k_m |
Ollama create fails | مشكلة في مسار ملف النموذج | استخدم المسار المطلق لملف GGUF |
الخطوات التالية
- مرجع التكوين — مرجع تكوين YAML الكامل
- تكامل LLM: تقديم الواجهات الخلفية — نظرة متعمقة على Ollama vs vLLM
- تكامل LLM: تبديل النماذج — تمكين النماذج المضبوطة بدقة في AuroraSOC