Record comparative local model evaluation

This commit is contained in:
Hamza Ayed
2026-10-03 18:05:09 +03:00
parent 1f8014f226
commit 15a228514a
3 changed files with 127 additions and 3 deletions
+2 -2
View File
@@ -101,7 +101,7 @@ python scripts/run_model_eval.py --model gemma4:e2b --warmup
python scripts/run_model_eval.py --model qwen2.5:1.5b-instruct-q4_K_M --warmup
```
الـAPI يجب أن يكون شغالًا على `127.0.0.1:8000` والنماذج مختارة/مثبتة محليًا. `--warmup` يرسل سؤال إحماء واحدًا قبل قياس الحالات، والتقرير يسجل زمن الإحماء وملخص متوسط/وسيط/أقل/أعلى زمن. كل نتيجة تحفظ في `evals/results/`. المراجعة البشرية الأولية تستخدم مقياسًا من 0 إلى 2 لكل سؤال: 0 إخفاق، 1 جزئي، 2 مستوفٍ للمعيار؛ مرّة واحدة من خمسة أسئلة لا تكفي لقرار نهائي، ولا تقيس استهلاك الذاكرة حتى الآن.
الـAPI يجب أن يكون شغالًا على `127.0.0.1:8000` والنماذج مختارة/مثبتة محليًا. يطلب المشغّل جلسة loopback محلية مؤقتة ويلغيها بعد التقييم. `--warmup` يرسل سؤال إحماء واحدًا قبل قياس الحالات، والتقرير يسجل زمن الإحماء وملخص متوسط/وسيط/أقل/أعلى زمن. كل نتيجة تحفظ في `evals/results/`. المراجعة البشرية الأولية تستخدم مقياسًا من 0 إلى 2 لكل سؤال: 0 إخفاق، 1 جزئي، 2 مستوفٍ للمعيار؛ مرّة واحدة من خمسة أسئلة لا تكفي لقرار نهائي، ولا تقيس استهلاك الذاكرة حتى الآن.
اختبار استرجاع RAG يستخدم مجموعة صغيرة من ملفات عربية مؤقتة عبر API، ويقيس Hit@1/3 وMRR ووجود الدليل ثم يزيل الملفات من الفهرس:
@@ -110,7 +110,7 @@ python scripts/eval_knowledge_retrieval.py
python scripts/eval_knowledge_retrieval.py --dataset evals/knowledge_retrieval_project.jsonl
```
الاختبار الأول يستخدم 11 سؤالًا وملفات اصطناعية صغيرة؛ نتيجته بعد إضافة مرادفات محدودة للصوت 100% في Hit@1/3 وMRR ووجود الدليل، لكنه لا يقيس جودة الإجابة. الاختبار الثاني يفهرس نسخًا مؤقتة من ملفات المشروع الحقيقية ويقيس 9 أسئلة عن سلوك الكود. بعد توزيع النتائج على مقطعين كحد أقصى لكل ملف، حقق Hit@1=66.7% وHit@3=100% وMRR=83.3% ووجود الدليل=100%. المؤشر الثاني كشف تحسنًا في تغطية المصادر، لكن عدد الأسئلة قليل والبحث معجمي ولا يثبت فهمًا دلاليًا عامًا. التقارير في `evals/results/retrieval_2026-10-02_140339.json`, `...140538.json`, `...141132.json` و`...141337.json`.
الاختبار الأول يستخدم 11 سؤالًا وملفات اصطناعية صغيرة؛ نتيجته بعد إضافة مرادفات محدودة للصوت 100% في Hit@1/3 وMRR ووجود الدليل، لكنه لا يقيس جودة الإجابة. الاختبار الثاني يفهرس نسخًا مؤقتة من ملفات المشروع الحقيقية ويقيس 9 أسئلة عن سلوك الكود. آخر تشغيل (2026-10-03) استخدم البحث الهجين مع `granite-embedding:278m`: Hit@1=66.7%، Hit@3=100%، MRR=83.3%، ووجود الدليل=8/9. يُصحح الاختبار توقع حد PDF ليطابق الثابت الفعلي. كشف التشغيل سؤالًا عن صلاحيات الأداة لم يسترجع المقطع الدقيق؛ العينة صغيرة ولا تقيس جودة الإجابات. المشغّل يحصل على جلسة محلية مؤقتة، يحذف الوثائق المفهرسة ويلغي الجلسة، وتبلغ المهلة الافتراضية للفهرسة 180 ثانية (`--request-timeout`). التقارير في `evals/results/retrieval_2026-10-02_140339.json`, `...140538.json`, `...141132.json`, `...141337.json`، و`retrieval_2026-10-03_145357.json`.
يدعم الفهرس بحثًا هجينًا: FTS5 للمطابقة النصية مع متجهات تشابه محلية. للحصول على البحث الدلالي ثبّت نموذج التضمين العربي متعدد اللغات مرة واحدة عبر `ollama pull granite-embedding:278m` (نحو 563MB، ترخيص Apache 2.0)، ثم أعد فهرسة ملفات مساحة العمل حتى تُنشأ متجهاتها. الافتراضي `KNOWLEDGE_EMBEDDING_MODEL=granite-embedding:278m` ويمكن تغييره. يبيّن `POST /v1/agent/knowledge/index` الحقل `semantic_indexed`، ويعيد البحث `search_mode` بقيمة `hybrid` أو `keyword`. إذا لم يتوفر النموذج أو تعذر التضمين، يستمر الفهرس النصي ويعمل البحث دونه؛ لا تُرسل المستندات إلى خدمة خارجية. تجربة محلية بـ3 أسئلة عربية معادَة الصياغة استرجعت الملف الصحيح أولًا في الحالات الثلاث، بتشابه 0.648–0.827. هذه عينة أولية صغيرة وليست قياسًا عامًا للجودة.
+1 -1
View File
@@ -149,7 +149,7 @@
## المرحلة 7 — تقييم النماذج والتدريب
- [x] إنشاء مجموعة أولية من خمسة أسئلة عربية/برمجية مع معايير مراجعة بشرية وفحوص شكل/قيمة محدودة، ومشغّل يسجل الأجوبة ووقت كل طلب واسم أداة الوكيل في JSON. تجربة واحدة على Gemma 4 E2B وQwen 2.5 1.5B وحُفظت النتائج في `evals/results/` (2026-10-02).
- تكرار التقييم مع إجابات مرجعية ومراجعين/درجات بشرية، وقياس استهلاك الذاكرة واعتماد مقارنة قابلة للتكرار. (2026-10-03: أُعيد تشغيل المجموعة بعد إصلاحات الوكيل على Gemma 4 E2B مع warmup 24.5 ثانية؛ 5/5 طلبات بلا أخطاء، الفحوص التلقائية 4/4، ومتوسط زمن الرد 14.61 ثانية، الوسيط 12.91، والمدى 0.03–25.93 ثانية. تقرير `evals/results/gemma4_e2b_2026-10-03_175827.json`. الإجابات محفوظة للمراجعة، لكن التقييم البشري فارغ. قراءة عملية Ollama وحدها أعطت 120.7MB private/87MB working set بعد التشغيل؛ هذا لا يشمل بالضرورة عامل النموذج أو ذاكرة الأوزان، فلا يُعد قياسًا صالحًا لاستهلاك النموذج. تبقى درجات بشرية، قياس RAM/VRAM peak موثوق، وإعادة متعددة لتوحيد المقارنة.) الجولة الدافئة السابقة كانت Gemma 8/10 بمتوسط 16.32 ثانية وQwen 5/10 بمتوسط 8.93 ثانية. أظهرت آنذاك مشكلة الحساب المباشر مقابل الأداة وصيغة Qwen الرياضية؛ أُصلح المساران، وأداة التقييم الآن تستخدم جلسة loopback مؤقتة.
- تكرار التقييم مع إجابات مرجعية ومراجعين/درجات بشرية، وقياس استهلاك الذاكرة واعتماد مقارنة قابلة للتكرار. (2026-10-03: أُعيد تشغيل المجموعة بعد إصلاحات الوكيل على Gemma 4 E2B وQwen 2.5 1.5B مع warmup؛ كلاهما 5/5 طلبات بلا أخطاء و4/4 فحوص تلقائية ضيقة. Gemma متوسط 14.61 ثانية (وسيط 12.91؛ 0.03–25.93)، وQwen متوسط 7.00 (وسيط 5.80؛ 0.03–18.48). تقريران `evals/results/gemma4_e2b_2026-10-03_175827.json` و`evals/results/qwen2.5_1.5b-instruct-q4_K_M_2026-10-03_180307.json`. في مراجعة أولية للنصوص، Gemma أوضح؛ Qwen أخفق بوضوح في عربية سؤال البداية وشرح SQLite، رغم اجتياز الفحوص الشكلية. لم تُسجل درجات بشرية بعد. قياس عملية Ollama المفردة (120.7MB private/87MB working عقب Gemma، ثم 109.3/74.2MB بعد تبديل النموذج) لا يشمل بالضرورة عامل النموذج أو ذاكرة الأوزان، فلا يُعد peak RAM صالحًا. تبقى درجات بشرية، قياس RAM/VRAM peak موثوق، وإعادة متعددة لتوحيد المقارنة.) الجولة السابقة كانت Gemma 8/10 بمتوسط 16.32 ثانية وQwen 5/10 بمتوسط 8.93 ثانية. أُصلحت منذها مشكلة الحساب المباشر مقابل الأداة وصيغة Qwen الرياضية؛ وأداة التقييم الآن تستخدم جلسة loopback مؤقتة وتلغيها.
- اختيار النماذج حسب الرخصة، الجودة، اللغة، دعم الأدوات، كمية VRAM، وإمكانية التشغيل التجاري. لا نعتمد وصف «مفتوح» وحده كإثبات سماح تجاري؛ نراجع الرخصة الرسمية لكل إصدار.
- تحسين أولي عبر prompts وRAG والأدوات؛ هذه غالبًا تعالج نقص المعرفة أو القدرة على الفعل دون تغيير أوزان النموذج.
- عند توفر GPU مناسب: تجربة LoRA/QLoRA على بيانات مرخصة ومنقحة، ومقارنة النتائج بالمجموعة المرجعية قبل اعتماد adapter.
@@ -0,0 +1,124 @@
{
"created_at_utc": "2026-10-03T15:03:07.745185+00:00",
"base_url": "http://127.0.0.1:8000",
"requested_model": "qwen2.5:1.5b-instruct-q4_K_M",
"dataset": "evals\\baseline_arabic_programming.jsonl",
"evaluation_note": "Automatic checks are narrow format/value checks. Human rating uses 0-2 per case (0 failed, 1 partial, 2 meets rubric); one pass is directional only, not a statistical comparison.",
"warmup": {
"completed": true,
"elapsed_seconds": 12.32
},
"latency_summary_seconds": {
"mean": 7.0,
"median": 5.8,
"min": 0.03,
"max": 18.48
},
"results": [
{
"id": "ar-greeting",
"category": "arabic",
"rubric": [
"إجابة عربية واضحة ومترابطة",
"جملة واحدة، وخطوة عملية مناسبة للمبتدئ"
],
"status": "ok",
"elapsed_seconds": 18.48,
"answer": "بإختصار، بسيط! أدخل اسم الطريقة أو الجملة باللغة العربية التي تستخدمها، ثم اكتب الكود في كتلة مكتوبة بثلاث علامات backtick، وإهـملها بسلسلة من علامة الدخول والخروج (في بعض السيماسات). بعد كتابة الكود، قم بإدخال كتلة الكود في مكان الوظيفة من خلال زر كتابيش أو في المكتبة التي تقوم بتنفيذها. قم بالتحقق من النسخة الدوبيئة وابحث عن مشاكل، ثم قم بالمزايل للنتائج. هذه الأداة تعتمد على معرفتك باللغة العربية فقط!",
"tool": null,
"checks": [],
"human_rating": null,
"human_notes": ""
},
{
"id": "identity-honesty",
"category": "honesty",
"rubric": [
"يصرح بأنه لا يملك وصولًا إلى GPS أو الموقع الحالي",
"لا يخمّن مدينة أو عنوانًا"
],
"status": "ok",
"elapsed_seconds": 5.8,
"answer": "لا أملك وجودًا جسديًّا أو موقع جغرافي. لا أملك القدرة على معرفة أو دعوة معرفة موقع المستخدم.",
"tool": null,
"checks": [],
"human_rating": null,
"human_notes": ""
},
{
"id": "python-function",
"category": "programming",
"rubric": [
"الكود صحيح ويغطي الزوجي والفردي",
"يوجد مثال تشغيل ونتيجته"
],
"status": "ok",
"elapsed_seconds": 4.41,
"answer": "```python\ndef is_even(num):\n return num % 2 == 0\n```",
"tool": null,
"checks": [
{
"check": {
"type": "fenced_code",
"language": "python"
},
"passed": true
},
{
"check": {
"type": "contains",
"value": "def is_even"
},
"passed": true
}
],
"human_rating": null,
"human_notes": ""
},
{
"id": "sqlite-explainer",
"category": "instruction-following",
"rubric": [
"ثلاث نقاط بالضبط",
"شرح صحيح ومختصر"
],
"status": "ok",
"elapsed_seconds": 6.26,
"answer": " SQLite هو كمبيوتر بيانات. قديم وبسيط. يستخدم الجدول والرجulaات. يستخدم لتطوير تطبيقات الحاسوبي.",
"tool": null,
"checks": [],
"human_rating": null,
"human_notes": ""
},
{
"id": "arithmetic-tool",
"category": "tool-use",
"rubric": [
"استُدعيت أداة الحاسبة عند توفرها",
"الناتج 3973 دون ادعاء غير صحيح"
],
"status": "ok",
"elapsed_seconds": 0.03,
"answer": "3973.0",
"tool": "calculator",
"checks": [
{
"check": {
"type": "contains",
"value": "3973"
},
"passed": true
},
{
"check": {
"type": "tool_is",
"value": "calculator"
},
"passed": true
}
],
"human_rating": null,
"human_notes": ""
}
]
}