Continue roadmap: local TLS and agent review preparation
This commit is contained in:
@@ -0,0 +1,263 @@
|
||||
# مراجعة بشرية لإجابات SovereignAI
|
||||
|
||||
هذه ورقة تقييم يدوي؛ لا تُحتسب درجات الاسترجاع تلقائيًا على أنها صحة للإجابة. الحالات تأتي من مجموعات صغيرة ذات ملفات fixture للمشروع ودليل PDF طويل ومستند PDF ممسوح. راجع السؤال والإجابة والملف المشار إليه قبل تسجيل الدرجة.
|
||||
|
||||
## سلم التقييم
|
||||
|
||||
- **0 — خاطئة:** تناقض المصدر أو تختلق معلومة أساسية.
|
||||
- **1 — ضعيفة:** معظمها غير صحيح أو بلا سند كافٍ.
|
||||
- **2 — جزئية:** الفكرة الأساسية صحيحة لكن فيها نقص أو التباس مهم.
|
||||
- **3 — جيدة:** صحيحة ومسنودة مع نقص طفيف.
|
||||
- **4 — ممتازة:** صحيحة ومكتملة ومسنودة وواضحة.
|
||||
|
||||
سجّل الدرجة بعد التحقق من المصدر، واكتب أي خطأ واقعي أو نقص مهم في الملاحظات. اتركها فارغة إن لم تراجع الحالة. هذه المراجعة البشرية مستقلة عن مقاييس ترتيب المقاطع، لكنها تظل على fixtures ولا تمثل كل استخدام واقعي.
|
||||
|
||||
## الحالات
|
||||
|
||||
### 1. `conversation-storage-ar`
|
||||
|
||||
- السؤال: أين تحفظ المحادثات؟
|
||||
- ملف مرجعي متوقع: `storage.md`
|
||||
- الملفات التي ذكرها الوكيل: storage.md, routing.md, workspace.md, images.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> المحادثات تحفظ في قاعدة SQLite المحلية كي تبقى متاحة بعد إغلاق التطبيق أو تحديث الصفحة. (storage.md، المقطع 0)
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 2. `image-model-ar`
|
||||
|
||||
- السؤال: ما النموذج الذي يعالج الصور تلقائيًا؟
|
||||
- ملف مرجعي متوقع: `images.md`
|
||||
- الملفات التي ذكرها الوكيل: images.md, timeout.md, routing.md, pdf.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> الصور المرفقة تحول تلقائيًا إلى نموذج Ministral 3:3b المحلي لتحليل الصورة واستخراج النص منها. (images.md، المقطع 0)
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 3. `preview-safety-ar`
|
||||
|
||||
- السؤال: كيف نحمي معاينة الملف قبل الموافقة؟
|
||||
- ملف مرجعي متوقع: `preview.md`
|
||||
- الملفات التي ذكرها الوكيل: preview.md, storage.md, pdf.md, workspace.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> المقطع الذي يجيب على سؤالك هو:
|
||||
> "تُربط معاينة الملف ببصمة SHA256، ويجب أن يوافق المستخدم قبل تطبيق التغيير على مساحة العمل." (preview.md، المقطع 0)
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 4. `pdf-extraction-ar`
|
||||
|
||||
- السؤال: كيف نستخرج النص من صفحات PDF؟
|
||||
- ملف مرجعي متوقع: `pdf.md`
|
||||
- الملفات التي ذكرها الوكيل: pdf.md, images.md, audio.md, search.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> يستخرج `pypdf` النص الرقمي من صفحات PDF محليًا، ويحافظ على رقم الصفحة ضمن المقتطف المرسل للنموذج. (pdf.md، المقطع 0)
|
||||
> حدود ما استطعت قراءته: تم استخراج الإجابة من المقتطفات المتاحة في فهرس المعرفة المحلي.
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 5. `voice-transcription-ar`
|
||||
|
||||
- السؤال: أي خدمة تفرغ التسجيلات الصوتية؟
|
||||
- ملف مرجعي متوقع: `audio.md`
|
||||
- الملفات التي ذكرها الوكيل: audio.md, pdf.md, workspace.md, storage.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> المقطع الذي يجيب على السؤال هو:
|
||||
> "يرسل مسار الصوت التسجيل إلى Groq باستخدام Whisper للتفريغ، ثم يعود النص إلى واجهة المحادثة." من الملف audio.md، المقطع 0.
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 6. `workspace-boundary-ar`
|
||||
|
||||
- السؤال: كيف نحمي مساحة العمل من قراءة الملفات المخفية؟
|
||||
- ملف مرجعي متوقع: `workspace.md`
|
||||
- الملفات التي ذكرها الوكيل: workspace.md, preview.md, pdf.md, images.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> يستطيع قارئ مساحة العمل رفض المسارات خارج الجذر، ويستثني مجلد `.git` والملفات المخفية وبيئات البناء. (workspace.md، المقطع 0)
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 7. `web-search-en`
|
||||
|
||||
- السؤال: Which provider searches multiple web sources?
|
||||
- ملف مرجعي متوقع: `search.md`
|
||||
- الملفات التي ذكرها الوكيل: search.md, routing.md, timeout.md, images.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> المقطع الذي يجيب على سؤالك هو:
|
||||
> "The experimental multi-source web search adapter queries DuckDuckGo and returns source URLs with the summary." من الملف search.md، المقطع 0.
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 8. `database-version-en`
|
||||
|
||||
- السؤال: How are old conversation answers migrated?
|
||||
- ملف مرجعي متوقع: `migration.md`
|
||||
- الملفات التي ذكرها الوكيل: migration.md, storage.md, images.md, routing.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> لم يتم العثور على مقطع مباشر يجيب على سؤال "How are old conversation answers migrated?" في فهرس المعرفة المحلي.
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 9. `model-routing-ar`
|
||||
|
||||
- السؤال: ما الحقول التي يعيدها API بعد تحويل الصور: requested_model وauto_routed؟
|
||||
- ملف مرجعي متوقع: `routing.md`
|
||||
- الملفات التي ذكرها الوكيل: routing.md, images.md, storage.md, timeout.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> المقاطع المسترجعة من فهرس المعرفة المحلي لا تحتوي على معلومات مباشرة تحدد الحقول التي يعيدها الـ API بعد تحويل الصور بناءً على `requested_model` و`auto_routed`.
|
||||
>
|
||||
> حدود ما استطعت قراءته: المقاطع المسترجعة.
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 10. `api-timeout-ar`
|
||||
|
||||
- السؤال: كيف يعرض API انتهاء مهلة النموذج؟
|
||||
- ملف مرجعي متوقع: `timeout.md`
|
||||
- الملفات التي ذكرها الوكيل: routing.md, timeout.md, storage.md, search.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> المقطع الذي يجيب على السؤال هو:
|
||||
> "عند انتهاء مهلة النموذج المحلي، يرجع FastAPI حالة HTTP 504 مع رسالة عربية موحدة ومعرّف الطلب." من الملف timeout.md المقطع 0.
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 11. `skill-permissions-en`
|
||||
|
||||
- السؤال: How does the server restrict tools for a selected skill?
|
||||
- ملف مرجعي متوقع: `skills.md`
|
||||
- الملفات التي ذكرها الوكيل: skills.md, migration.md, workspace.md, preview.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_project_agent_fresh_api_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> "Each local agent skill declares an allowed_tools set. The server filters the advertised tools and rejects any model call outside that set." (skills.md، المقطع 0)
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 12. `long-guide-deep-approval-en`
|
||||
|
||||
- السؤال: What must happen before a proposed production change can be saved?
|
||||
- ملف مرجعي متوقع: `long_technical_guide.md`
|
||||
- الملفات التي ذكرها الوكيل: long_technical_guide.md, archive_retention_policy.pdf
|
||||
- تقرير التشغيل: `evals/results/retrieval_long_pdf_agent_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> للحفظ أي تغيير مقترح في مساحة العمل، يجب أن تحدث مراجعة من مرحلتين: أولاً، يقوم المستخدم بمراجعة الفرق المقترح بالكامل، ثم يتحقق الخادم من تجزئة الملف الأصلية ويتلقى تأكيدًا صريحًا قبل الكتابة. لا يمكن لأي إجابة من النموذج أو استدعاء الأداة وحده أن يحقق مرحلة المراجعة.
|
||||
>
|
||||
> المصدر: long_technical_guide.md · المقطع 17
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 13. `pdf-archive-page-limit-en`
|
||||
|
||||
- السؤال: What is the maximum number of pages accepted when indexing one PDF?
|
||||
- ملف مرجعي متوقع: `archive_retention_policy.pdf`
|
||||
- الملفات التي ذكرها الوكيل: archive_retention_policy.pdf, long_technical_guide.md
|
||||
- تقرير التشغيل: `evals/results/retrieval_long_pdf_agent_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> الحد الأقصى لعدد الصفحات المقبولة عند فهرسة ملف PDF واحد هو 30 صفحة.
|
||||
> المصدر: archive_retention_policy.pdf · المقطع 0
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
|
||||
### 14. `scanned-pdf-ocr-deadline-en`
|
||||
|
||||
- السؤال: What calendar date ends the archive restoration approval window?
|
||||
- ملف مرجعي متوقع: `scanned_approval_notice.pdf`
|
||||
- الملفات التي ذكرها الوكيل: scanned_approval_notice.pdf
|
||||
- تقرير التشغيل: `evals/results/retrieval_scanned_pdf_agent_2026-10-03.json`
|
||||
|
||||
**إجابة الوكيل:**
|
||||
|
||||
> تنتهي فترة موافقة استعادة الأرشيف في 17 أكتوبر 2026. (scanned_approval_notice.pdf · المقطع 0)
|
||||
|
||||
**بعد مراجعة الملف المرجعي:**
|
||||
|
||||
- الدرجة (0–4): ___
|
||||
- هل كل ادعاء أساسي مسنود؟ نعم / جزئيًا / لا
|
||||
- ملاحظات أو تصحيح: ___
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"http_status": 200,
|
||||
"result": "يمنع البرنامج أداة خارج أذونات المهارات النشطة عن طريق التحقق مما إذا كان اسم الأداة موجودًا في قائمة الأدوات المسموح بها ضمن المهارة المحددة.\n\n\"if selected_skill is not None and tool_name not in selected_skill.allowed_tools: raise HTTPException(status_code=422, detail=\"Tool is not allowed by active skill\")\" (guard_fixture.py، المقطع 0)",
|
||||
"steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"files": [
|
||||
"guard_fixture.py"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"created_at_utc": "2026-10-03T17:16:19.416417+00:00",
|
||||
"base_url": "http://127.0.0.1:8131",
|
||||
"dataset": "evals\\knowledge_retrieval_project.jsonl",
|
||||
"indexing": {
|
||||
"semantic_indexed_documents": 1,
|
||||
"documents": 1,
|
||||
"embedding_models": [
|
||||
"granite-embedding:278m"
|
||||
]
|
||||
},
|
||||
"metrics": {
|
||||
"cases": 1,
|
||||
"hit_at_1": 1.0,
|
||||
"hit_at_3": 1.0,
|
||||
"mean_reciprocal_rank": 1.0,
|
||||
"evidence_rate": 1.0
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"id": "project-skill-tool-filter",
|
||||
"query": "How is a tool call blocked when it is outside the selected skill permissions?",
|
||||
"expected_document": "fixture_main.py",
|
||||
"expected_evidence": "tool_name not in selected_skill.allowed_tools",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
102,
|
||||
99,
|
||||
100,
|
||||
79,
|
||||
85,
|
||||
84,
|
||||
98
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على معلومات حول كيفية حظر استدعاء الأداة عندما يكون خارج أذونات المهارات المحددة.\n\nالمقاطع المسترجعة لا تتضمن إجابة مباشرة على هذا السؤال.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
}
|
||||
],
|
||||
"note": "Small deterministic fixture set. Retrieval metrics cover source ranking and evidence presence, not general RAG quality. Optional agent answers are retained for human review and are not auto-scored."
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"task": "Search the indexed knowledge base and answer: How is a tool call blocked when it is outside the selected skill permissions?",
|
||||
"tool": "search_knowledge",
|
||||
"model": "gemma4:e2b",
|
||||
"steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"files": [
|
||||
"app/main.py"
|
||||
],
|
||||
"result": "المقطع الذي يشرح كيف يتم حظر استدعاء الأداة عندما يكون خارج أذونات المهارة المحددة هو:\n\"if selected_skill is not None and tool_name not in selected_skill.allowed_tools:\n raise HTTPException(\n status_code=422,\n detail=\"الأداة التي طلبها النموذج غير مسموحة ضمن المهارة النشطة.\",\n )\"\nفي الملف `app/main.py`، المقطع 101."
|
||||
}
|
||||
@@ -0,0 +1,308 @@
|
||||
{
|
||||
"created_at_utc": "2026-10-03T17:57:35.348769+00:00",
|
||||
"base_url": "http://127.0.0.1:8131",
|
||||
"dataset": "evals\\knowledge_retrieval_project.jsonl",
|
||||
"indexing": {
|
||||
"semantic_indexed_documents": 4,
|
||||
"documents": 4,
|
||||
"embedding_models": [
|
||||
"granite-embedding:278m"
|
||||
]
|
||||
},
|
||||
"metrics": {
|
||||
"cases": 9,
|
||||
"hit_at_1": 0.8888888888888888,
|
||||
"hit_at_3": 1.0,
|
||||
"mean_reciprocal_rank": 0.9444444444444444,
|
||||
"evidence_rate": 1.0
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"id": "project-path-confinement",
|
||||
"query": "Does resolving a requested source path guarantee it stays under the selected root?",
|
||||
"expected_document": "fixture_workspace.py",
|
||||
"expected_evidence": "relative_to(root)",
|
||||
"rank": 2,
|
||||
"top_paths": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
5,
|
||||
1,
|
||||
19,
|
||||
6,
|
||||
10
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لا يتوفر دليل مباشر للإجابة على سؤالك.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-preview-stale-file",
|
||||
"query": "How does applying an approved preview detect that the original file changed after review?",
|
||||
"expected_document": "fixture_workspace.py",
|
||||
"expected_evidence": "expected_hash",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
13,
|
||||
12,
|
||||
15,
|
||||
11,
|
||||
14
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المعلومات المتوفرة غير كافية للإجابة على سؤالك.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-index-stale-source",
|
||||
"query": "Which file hash is compared with the stored content hash before returning a search result?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "actual_hash == row[\"content_hash\"]",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
17,
|
||||
11
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على دليل مباشر في المقاطع المسترجعة للإجابة على سؤالك.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-chunk-overlap",
|
||||
"query": "What are the configured chunk size and overlap for local knowledge indexing?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "CHUNK_OVERLAP = 120",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
3,
|
||||
0,
|
||||
7,
|
||||
16
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المقطع الذي يوضح حجم الكتلة والتداخل للت فهرسة المحلية هو:\n\"CHUNK_SIZE = 1000\nCHUNK_OVERLAP = 120\" من `fixture_knowledge.py` المقطع 0.\n\nلم يتم ذكر أي معلومات إضافية حول التكوين الأخرى.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-arabic-audio-variants",
|
||||
"query": "كيف يربط فهرس المعرفة بين تعابير عربية مختلفة عند البحث عن تفريغ التسجيل؟",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "QUERY_SYNONYMS",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
1,
|
||||
0,
|
||||
14
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المعلومات المسترجعة من فهرس المعرفة لا توفر تفاصيل حول كيفية ربط فهرس المعرفة بين التعابير العربية المختلفة عند البحث عن تفريغ التسجيل.\n\nالمقتطف المسترجع هو:\n\"فريغ\", \"للتفريغ\", \"transcription\"),\n\"يفرغ\": (\"تفريغ\", \"التفريغ\", \"للتفريغ\", \"transcription\"),\n\"التسجيلات\": (\"التسجيل\", \"التسجيلات\"),\n\"الصوتية\": (\"الصوت\", \"الصوتية\", \"audio\"),\n\"permission\": (\"allowed_tools\", \"tool_name\"),\n\"permissions\": (\"allowed_tools\", \"tool_name\"),\n\"صلاحية\": (\"allowed_tools\", \"tool_name\", \"مسموح\"),\n\"صلاحيات\": (\"allowed_tools\", \"tool_name\", \"مسموح\"),\n\nلم يتم العثور على دليل مباشر يجيب على كيفية ربط فهرس المعرفة بين التعابير العربية المختلفة عند البحث عن تفريغ التسجيل.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-pdf-page-bound",
|
||||
"query": "What is the maximum number of PDF pages accepted during local extraction?",
|
||||
"expected_document": "fixture_pdf.py",
|
||||
"expected_evidence": "MAX_PDF_PAGES = 30",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
5,
|
||||
4
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "أنا آسف، لم أتمكن من العثور على معلومات محددة حول الحد الأقصى لعدد صفحات PDF المقبولة أثناء الاستخراج المحلي من المقاطع المسترجعة.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-pdf-empty-scan",
|
||||
"query": "ما الذي يحدث إذا رفع المستخدم ملف PDF ممسوحًا ولا يحتوي نصًا قابلًا للاستخراج؟",
|
||||
"expected_document": "fixture_pdf.py",
|
||||
"expected_evidence": "لا يحتوي PDF على نص قابل للاستخراج",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
1,
|
||||
9
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "أنا نموذج لغوي كبير، ووفقًا للمعلومات المتوفرة لدي من المقتطفات المسترجعة، لا يوجد دليل مباشر يوضح بالتفصيل ما يحدث إذا رفع المستخدم ملف PDF ممسوحًا ولا يحتوي على نص قابل للاستخراج.\n\nالمقتطفات المسترجعة تذكر إمكانية معالجة ملفات PDF (مثل: \"إذا لم تظهر السنة فاكتب أنها غير مذكورة. أجب بالعربية المنظمة.\") وبعض الإجراءات المتعلقة بقراءة الصفحات المرفقة، لكنها لا تقدم إجابة مباشرة على سيناريو الملفات الممسوحة التي لا تحتوي على نص.\n\n**لذا، لا يمكنني الإجابة على سؤالك بناءً على الأدلة المتاحة.**",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-skill-tool-filter",
|
||||
"query": "How is a tool call blocked when it is outside the selected skill permissions?",
|
||||
"expected_document": "fixture_main.py",
|
||||
"expected_evidence": "tool_name not in selected_skill.allowed_tools",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
101,
|
||||
103,
|
||||
100,
|
||||
90,
|
||||
11,
|
||||
83
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على دليل مباشر حول كيفية حظر استدعاء الأداة عندما يكون خارج أذونات المهارة المحددة.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-agent-index-limits",
|
||||
"query": "What file count and total size limits apply when indexing local knowledge?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "MAX_TOTAL_CHARS = 2_000_000",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المعلومات المتاحة تصف قيودًا على تحليل الملفات والصور المرفوعة، ولكنها لا تذكر بشكل مباشر قيود عدد الملفات أو الحجم الإجمالي عند فهرسة المعرفة المحلية.\n\nالمقاطع المسترجعة:\nلا يوجد دليل مباشر يوضح حدود عدد الملفات وحجمها الإجمالي عند فهرسة المعرفة المحلية.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
}
|
||||
],
|
||||
"note": "Small deterministic fixture set. Retrieval metrics cover source ranking and evidence presence, not general RAG quality. Optional agent answers are retained for human review and are not auto-scored."
|
||||
}
|
||||
@@ -0,0 +1,407 @@
|
||||
{
|
||||
"created_at_utc": "2026-10-03T19:08:14.238708+00:00",
|
||||
"base_url": "http://127.0.0.1:8000",
|
||||
"dataset": "evals\\knowledge_retrieval.jsonl",
|
||||
"indexing": {
|
||||
"semantic_indexed_documents": 11,
|
||||
"documents": 11,
|
||||
"embedding_models": [
|
||||
"granite-embedding:278m"
|
||||
]
|
||||
},
|
||||
"metrics": {
|
||||
"cases": 11,
|
||||
"hit_at_1": 1.0,
|
||||
"hit_at_3": 1.0,
|
||||
"mean_reciprocal_rank": 1.0,
|
||||
"evidence_rate": 1.0
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"id": "conversation-storage-ar",
|
||||
"query": "أين تحفظ المحادثات؟",
|
||||
"expected_document": "storage.md",
|
||||
"expected_evidence": "SQLite",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"storage.md",
|
||||
"workspace.md",
|
||||
"preview.md",
|
||||
"images.md",
|
||||
"audio.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المحادثات تحفظ في قاعدة SQLite المحلية كي تبقى متاحة بعد إغلاق التطبيق أو تحديث الصفحة. (storage.md، المقطع 0)",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"storage.md",
|
||||
"routing.md",
|
||||
"workspace.md",
|
||||
"images.md",
|
||||
"preview.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "image-model-ar",
|
||||
"query": "ما النموذج الذي يعالج الصور تلقائيًا؟",
|
||||
"expected_document": "images.md",
|
||||
"expected_evidence": "Ministral 3:3b",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"images.md",
|
||||
"routing.md",
|
||||
"timeout.md",
|
||||
"workspace.md",
|
||||
"pdf.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المصدر: images.md، المقطع 0\nالصور المرفقة تحول تلقائيًا إلى نموذج Ministral 3:3b المحلي لتحليل الصورة واستخراج النص منها.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"images.md",
|
||||
"timeout.md",
|
||||
"routing.md",
|
||||
"pdf.md",
|
||||
"storage.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "preview-safety-ar",
|
||||
"query": "كيف نحمي معاينة الملف قبل الموافقة؟",
|
||||
"expected_document": "preview.md",
|
||||
"expected_evidence": "SHA256",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"preview.md",
|
||||
"workspace.md",
|
||||
"pdf.md",
|
||||
"storage.md",
|
||||
"routing.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المصدر: preview.md، المقطع 0\nنُربط معاينة الملف ببصمة SHA256، ويجب أن يوافق المستخدم قبل تطبيق التغيير على مساحة العمل.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"preview.md",
|
||||
"storage.md",
|
||||
"pdf.md",
|
||||
"workspace.md",
|
||||
"routing.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "pdf-extraction-ar",
|
||||
"query": "كيف نستخرج النص من صفحات PDF؟",
|
||||
"expected_document": "pdf.md",
|
||||
"expected_evidence": "pypdf",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"pdf.md",
|
||||
"images.md",
|
||||
"audio.md",
|
||||
"workspace.md",
|
||||
"search.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المصدر: pdf.md، المقطع 0\nيستخرج pypdf النص الرقمي من صفحات PDF محليًا، ويحافظ على رقم الصفحة ضمن المقتطف المرسل للنموذج.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"pdf.md",
|
||||
"images.md",
|
||||
"audio.md",
|
||||
"search.md",
|
||||
"routing.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "voice-transcription-ar",
|
||||
"query": "أي خدمة تفرغ التسجيلات الصوتية؟",
|
||||
"expected_document": "audio.md",
|
||||
"expected_evidence": "Groq",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"audio.md",
|
||||
"workspace.md",
|
||||
"skills.md",
|
||||
"pdf.md",
|
||||
"preview.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المصدر: audio.md، المقطع 0\nيرسل مسار الصوت التسجيل إلى Groq باستخدام Whisper للتفريغ، ثم يعود النص إلى واجهة المحادثة.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"audio.md",
|
||||
"pdf.md",
|
||||
"workspace.md",
|
||||
"storage.md",
|
||||
"images.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "workspace-boundary-ar",
|
||||
"query": "كيف نحمي مساحة العمل من قراءة الملفات المخفية؟",
|
||||
"expected_document": "workspace.md",
|
||||
"expected_evidence": ".git",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"workspace.md",
|
||||
"preview.md",
|
||||
"pdf.md",
|
||||
"images.md",
|
||||
"skills.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "يستطيع قارئ مساحة العمل رفض المسارات خارج الجذر، ويستثني مجلد `.git` والملفات المخفية وبيئات البناء.\\nالملف: workspace.md، المقطع: 0",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"workspace.md",
|
||||
"preview.md",
|
||||
"pdf.md",
|
||||
"images.md",
|
||||
"storage.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "web-search-en",
|
||||
"query": "Which provider searches multiple web sources?",
|
||||
"expected_document": "search.md",
|
||||
"expected_evidence": "DuckDuckGo",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"search.md",
|
||||
"skills.md",
|
||||
"routing.md",
|
||||
"timeout.md",
|
||||
"workspace.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "الملف: search.md، المقطع: 0\nThe experimental multi-source web search adapter queries DuckDuckGo and returns source URLs with the summary.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"search.md",
|
||||
"routing.md",
|
||||
"timeout.md",
|
||||
"images.md",
|
||||
"pdf.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "database-version-en",
|
||||
"query": "How are old conversation answers migrated?",
|
||||
"expected_document": "migration.md",
|
||||
"expected_evidence": "selected_version",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"migration.md",
|
||||
"storage.md",
|
||||
"images.md",
|
||||
"audio.md",
|
||||
"preview.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المعلومات حول كيفية ترحيل إجابات المحادثات القديمة غير متوفرة في المقاطع المسترجعة.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"migration.md",
|
||||
"storage.md",
|
||||
"images.md",
|
||||
"routing.md",
|
||||
"audio.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "model-routing-ar",
|
||||
"query": "ما الحقول التي يعيدها API بعد تحويل الصور: requested_model وauto_routed؟",
|
||||
"expected_document": "routing.md",
|
||||
"expected_evidence": "auto_routed",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"routing.md",
|
||||
"images.md",
|
||||
"storage.md",
|
||||
"timeout.md",
|
||||
"skills.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "الحقول التي يعيدها API بعد تحويل الصور هي `requested_model` و`auto_routed`.\nالمصدر: routing.md، المقطع 0",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"routing.md",
|
||||
"images.md",
|
||||
"storage.md",
|
||||
"timeout.md",
|
||||
"search.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "api-timeout-ar",
|
||||
"query": "كيف يعرض API انتهاء مهلة النموذج؟",
|
||||
"expected_document": "timeout.md",
|
||||
"expected_evidence": "504",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"timeout.md",
|
||||
"routing.md",
|
||||
"skills.md",
|
||||
"images.md",
|
||||
"storage.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المصدر: timeout.md، المقطع 0\n\nعند انتهاء مهلة النموذج المحلي، يرجع FastAPI حالة HTTP 504 مع رسالة عربية موحدة ومعرّف الطلب.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"routing.md",
|
||||
"timeout.md",
|
||||
"storage.md",
|
||||
"search.md",
|
||||
"images.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "skill-permissions-en",
|
||||
"query": "How does the server restrict tools for a selected skill?",
|
||||
"expected_document": "skills.md",
|
||||
"expected_evidence": "allowed_tools",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"skills.md",
|
||||
"migration.md",
|
||||
"workspace.md",
|
||||
"preview.md",
|
||||
"storage.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المصدر: skills.md، المقطع 0\nالخادم يقوم بتصفية الأدوات المُعلن عنها ويرفض أي استدعاء للنموذج خارج تلك المجموعة.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"skills.md",
|
||||
"migration.md",
|
||||
"workspace.md",
|
||||
"preview.md",
|
||||
"storage.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
}
|
||||
],
|
||||
"note": "Small deterministic fixture set. Retrieval metrics cover source ranking and evidence presence, not general RAG quality. Optional agent answers are retained for human review and are not auto-scored."
|
||||
}
|
||||
@@ -0,0 +1,429 @@
|
||||
{
|
||||
"created_at_utc": "2026-10-03T19:21:56.487927+00:00",
|
||||
"base_url": "http://127.0.0.1:8000",
|
||||
"dataset": "evals\\knowledge_retrieval.jsonl",
|
||||
"indexing": {
|
||||
"semantic_indexed_documents": 11,
|
||||
"documents": 11,
|
||||
"embedding_models": [
|
||||
"granite-embedding:278m"
|
||||
]
|
||||
},
|
||||
"metrics": {
|
||||
"cases": 11,
|
||||
"hit_at_1": 1.0,
|
||||
"hit_at_3": 1.0,
|
||||
"mean_reciprocal_rank": 1.0,
|
||||
"evidence_rate": 1.0
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"id": "conversation-storage-ar",
|
||||
"query": "أين تحفظ المحادثات؟",
|
||||
"expected_document": "storage.md",
|
||||
"expected_evidence": "SQLite",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"storage.md",
|
||||
"workspace.md",
|
||||
"preview.md",
|
||||
"images.md",
|
||||
"audio.md",
|
||||
"routing.md",
|
||||
"skills.md",
|
||||
"timeout.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المحادثات تحفظ في قاعدة SQLite المحلية كي تبقى متاحة بعد إغلاق التطبيق أو تحديث الصفحة. (storage.md، المقطع 0)",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"storage.md",
|
||||
"routing.md",
|
||||
"workspace.md",
|
||||
"images.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "image-model-ar",
|
||||
"query": "ما النموذج الذي يعالج الصور تلقائيًا؟",
|
||||
"expected_document": "images.md",
|
||||
"expected_evidence": "Ministral 3:3b",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"images.md",
|
||||
"timeout.md",
|
||||
"routing.md",
|
||||
"workspace.md",
|
||||
"pdf.md",
|
||||
"preview.md",
|
||||
"skills.md",
|
||||
"search.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "الصور المرفقة تحول تلقائيًا إلى نموذج Ministral 3:3b المحلي لتحليل الصورة واستخراج النص منها. (images.md، المقطع 0)",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"images.md",
|
||||
"timeout.md",
|
||||
"routing.md",
|
||||
"pdf.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "preview-safety-ar",
|
||||
"query": "كيف نحمي معاينة الملف قبل الموافقة؟",
|
||||
"expected_document": "preview.md",
|
||||
"expected_evidence": "SHA256",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"preview.md",
|
||||
"workspace.md",
|
||||
"pdf.md",
|
||||
"storage.md",
|
||||
"routing.md",
|
||||
"timeout.md",
|
||||
"images.md",
|
||||
"skills.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المقطع الذي يجيب على سؤالك هو:\n\"تُربط معاينة الملف ببصمة SHA256، ويجب أن يوافق المستخدم قبل تطبيق التغيير على مساحة العمل.\" (preview.md، المقطع 0)",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"preview.md",
|
||||
"storage.md",
|
||||
"pdf.md",
|
||||
"workspace.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "pdf-extraction-ar",
|
||||
"query": "كيف نستخرج النص من صفحات PDF؟",
|
||||
"expected_document": "pdf.md",
|
||||
"expected_evidence": "pypdf",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"pdf.md",
|
||||
"images.md",
|
||||
"audio.md",
|
||||
"workspace.md",
|
||||
"search.md",
|
||||
"preview.md",
|
||||
"routing.md",
|
||||
"timeout.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "يستخرج `pypdf` النص الرقمي من صفحات PDF محليًا، ويحافظ على رقم الصفحة ضمن المقتطف المرسل للنموذج. (pdf.md، المقطع 0)\nحدود ما استطعت قراءته: تم استخراج الإجابة من المقتطفات المتاحة في فهرس المعرفة المحلي.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"pdf.md",
|
||||
"images.md",
|
||||
"audio.md",
|
||||
"search.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "voice-transcription-ar",
|
||||
"query": "أي خدمة تفرغ التسجيلات الصوتية؟",
|
||||
"expected_document": "audio.md",
|
||||
"expected_evidence": "Groq",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"audio.md",
|
||||
"workspace.md",
|
||||
"skills.md",
|
||||
"pdf.md",
|
||||
"preview.md",
|
||||
"images.md",
|
||||
"search.md",
|
||||
"storage.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المقطع الذي يجيب على السؤال هو:\n\"يرسل مسار الصوت التسجيل إلى Groq باستخدام Whisper للتفريغ، ثم يعود النص إلى واجهة المحادثة.\" من الملف audio.md، المقطع 0.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"audio.md",
|
||||
"pdf.md",
|
||||
"workspace.md",
|
||||
"storage.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "workspace-boundary-ar",
|
||||
"query": "كيف نحمي مساحة العمل من قراءة الملفات المخفية؟",
|
||||
"expected_document": "workspace.md",
|
||||
"expected_evidence": ".git",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"workspace.md",
|
||||
"preview.md",
|
||||
"pdf.md",
|
||||
"images.md",
|
||||
"skills.md",
|
||||
"storage.md",
|
||||
"audio.md",
|
||||
"timeout.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "يستطيع قارئ مساحة العمل رفض المسارات خارج الجذر، ويستثني مجلد `.git` والملفات المخفية وبيئات البناء. (workspace.md، المقطع 0)",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"workspace.md",
|
||||
"preview.md",
|
||||
"pdf.md",
|
||||
"images.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "web-search-en",
|
||||
"query": "Which provider searches multiple web sources?",
|
||||
"expected_document": "search.md",
|
||||
"expected_evidence": "DuckDuckGo",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"search.md",
|
||||
"skills.md",
|
||||
"routing.md",
|
||||
"timeout.md",
|
||||
"workspace.md",
|
||||
"images.md",
|
||||
"pdf.md",
|
||||
"audio.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المقطع الذي يجيب على سؤالك هو:\n\"The experimental multi-source web search adapter queries DuckDuckGo and returns source URLs with the summary.\" من الملف search.md، المقطع 0.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"search.md",
|
||||
"routing.md",
|
||||
"timeout.md",
|
||||
"images.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "database-version-en",
|
||||
"query": "How are old conversation answers migrated?",
|
||||
"expected_document": "migration.md",
|
||||
"expected_evidence": "selected_version",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"migration.md",
|
||||
"storage.md",
|
||||
"images.md",
|
||||
"audio.md",
|
||||
"preview.md",
|
||||
"workspace.md",
|
||||
"timeout.md",
|
||||
"skills.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على مقطع مباشر يجيب على سؤال \"How are old conversation answers migrated?\" في فهرس المعرفة المحلي.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"migration.md",
|
||||
"storage.md",
|
||||
"images.md",
|
||||
"routing.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "model-routing-ar",
|
||||
"query": "ما الحقول التي يعيدها API بعد تحويل الصور: requested_model وauto_routed؟",
|
||||
"expected_document": "routing.md",
|
||||
"expected_evidence": "auto_routed",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"routing.md",
|
||||
"images.md",
|
||||
"storage.md",
|
||||
"timeout.md",
|
||||
"skills.md",
|
||||
"preview.md",
|
||||
"search.md",
|
||||
"migration.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المقاطع المسترجعة من فهرس المعرفة المحلي لا تحتوي على معلومات مباشرة تحدد الحقول التي يعيدها الـ API بعد تحويل الصور بناءً على `requested_model` و`auto_routed`.\n\nحدود ما استطعت قراءته: المقاطع المسترجعة.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"routing.md",
|
||||
"images.md",
|
||||
"storage.md",
|
||||
"timeout.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "api-timeout-ar",
|
||||
"query": "كيف يعرض API انتهاء مهلة النموذج؟",
|
||||
"expected_document": "timeout.md",
|
||||
"expected_evidence": "504",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"timeout.md",
|
||||
"routing.md",
|
||||
"skills.md",
|
||||
"images.md",
|
||||
"storage.md",
|
||||
"preview.md",
|
||||
"audio.md",
|
||||
"search.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المقطع الذي يجيب على السؤال هو:\n\"عند انتهاء مهلة النموذج المحلي، يرجع FastAPI حالة HTTP 504 مع رسالة عربية موحدة ومعرّف الطلب.\" من الملف timeout.md المقطع 0.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"routing.md",
|
||||
"timeout.md",
|
||||
"storage.md",
|
||||
"search.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "skill-permissions-en",
|
||||
"query": "How does the server restrict tools for a selected skill?",
|
||||
"expected_document": "skills.md",
|
||||
"expected_evidence": "allowed_tools",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"skills.md",
|
||||
"migration.md",
|
||||
"workspace.md",
|
||||
"preview.md",
|
||||
"storage.md",
|
||||
"routing.md",
|
||||
"timeout.md",
|
||||
"images.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "\"Each local agent skill declares an allowed_tools set. The server filters the advertised tools and rejects any model call outside that set.\" (skills.md، المقطع 0)",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"skills.md",
|
||||
"migration.md",
|
||||
"workspace.md",
|
||||
"preview.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
}
|
||||
],
|
||||
"note": "Small deterministic fixture set. Retrieval metrics cover source ranking and evidence presence, not general RAG quality. Optional agent answers are retained for human review and are not auto-scored."
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"created_at_utc": "2026-10-03T19:15:28.686421+00:00",
|
||||
"base_url": "http://127.0.0.1:8000",
|
||||
"dataset": "evals\\knowledge_retrieval.jsonl",
|
||||
"indexing": {
|
||||
"semantic_indexed_documents": 1,
|
||||
"documents": 1,
|
||||
"embedding_models": [
|
||||
"granite-embedding:278m"
|
||||
]
|
||||
},
|
||||
"metrics": {
|
||||
"cases": 1,
|
||||
"hit_at_1": 1.0,
|
||||
"hit_at_3": 1.0,
|
||||
"mean_reciprocal_rank": 1.0,
|
||||
"evidence_rate": 1.0
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"id": "database-version-en",
|
||||
"query": "How are old conversation answers migrated?",
|
||||
"expected_document": "migration.md",
|
||||
"expected_evidence": "selected_version",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"migration.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "تم ترحيل الإجابات القديمة عن طريق إضافة `selected_version` إلى الرسائل القديمة والحفاظ على إصدارات إجابات المساعد المحفوظة. (migration.md، المقطع 0)",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"migration.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
}
|
||||
],
|
||||
"note": "Small deterministic fixture set. Retrieval metrics cover source ranking and evidence presence, not general RAG quality. Optional agent answers are retained for human review and are not auto-scored."
|
||||
}
|
||||
+309
@@ -0,0 +1,309 @@
|
||||
{
|
||||
"created_at_utc": "2026-10-03T18:16:30.234439+00:00",
|
||||
"base_url": "http://127.0.0.1:8131",
|
||||
"dataset": "evals\\knowledge_retrieval_project.jsonl",
|
||||
"indexing": {
|
||||
"semantic_indexed_documents": 4,
|
||||
"documents": 4,
|
||||
"embedding_models": [
|
||||
"granite-embedding:278m"
|
||||
]
|
||||
},
|
||||
"metrics": {
|
||||
"cases": 9,
|
||||
"hit_at_1": 0.8888888888888888,
|
||||
"hit_at_3": 1.0,
|
||||
"mean_reciprocal_rank": 0.9444444444444444,
|
||||
"evidence_rate": 1.0
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"id": "project-path-confinement",
|
||||
"query": "Does resolving a requested source path guarantee it stays under the selected root?",
|
||||
"expected_document": "fixture_workspace.py",
|
||||
"expected_evidence": "relative_to(root)",
|
||||
"rank": 2,
|
||||
"top_paths": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
5,
|
||||
1,
|
||||
19,
|
||||
6,
|
||||
10
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على مقطع مباشر في فهرس المعرفة المحلي يجيب بشكل صريح على سؤالك: \"Does resolving a requested source path guarantee it stays under the selected root?\"\n\nلقد تم استرجاع المقاطع التالية من الفهرس المحلي، ولكن لا يوجد دليل مباشر يوضح الإجابة المطلوبة:\n* `fixture_main.py · المقطع 96`\n* `fixture_main.py · المقطع 90`\n* `fixture_main.py · المقطع 92`\n* `fixture_main.py · المقطع 91`",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-preview-stale-file",
|
||||
"query": "How does applying an approved preview detect that the original file changed after review?",
|
||||
"expected_document": "fixture_workspace.py",
|
||||
"expected_evidence": "expected_hash",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
13,
|
||||
12,
|
||||
15,
|
||||
11,
|
||||
14
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على مقطع محدد في فهرس المعرفة المحلي يجيب مباشرة على السؤال حول كيفية اكتشاف تطبيق المعاينة المعتمدة لتغيير الملف الأصلي بعد المراجعة.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-index-stale-source",
|
||||
"query": "Which file hash is compared with the stored content hash before returning a search result?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "actual_hash == row[\"content_hash\"]",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
17,
|
||||
11
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "\"لا يوجد دليل مباشر في المقاطع المسترجعة للإجابة على السؤال.\"",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-chunk-overlap",
|
||||
"query": "What are the configured chunk size and overlap for local knowledge indexing?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "CHUNK_OVERLAP = 120",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
3,
|
||||
0,
|
||||
7,
|
||||
16
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المقطع الذي يجيب على السؤال هو:\n\"CHUNK_SIZE = 1000\nCHUNK_OVERLAP = 120\"\nالملف: fixture_knowledge.py، المقطع 0",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-arabic-audio-variants",
|
||||
"query": "كيف يربط فهرس المعرفة بين تعابير عربية مختلفة عند البحث عن تفريغ التسجيل؟",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "QUERY_SYNONYMS",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
1,
|
||||
0,
|
||||
14
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم أتمكن من العثور على مقاطع محددة في فهرس المعرفة المحلي تجيب مباشرة عن كيفية ربط فهرس المعرفة بين التعابير العربية المختلفة عند البحث عن تفريغ التسجيل.\n\nالمقاطع المسترجعة لا تحتوي على معلومات مباشرة حول آلية ربط تعابير البحث في فهرس المعرفة.\n\nحدود قراءتي: لم أجد دليلاً مباشراً في المقاطع المسترجعة.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-pdf-page-bound",
|
||||
"query": "What is the maximum number of PDF pages accepted during local extraction?",
|
||||
"expected_document": "fixture_pdf.py",
|
||||
"expected_evidence": "MAX_PDF_PAGES = 30",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
5,
|
||||
4
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "إليك الإجابة بناءً على المقاطع المسترجعة:\n\nلا يوجد مقطع مباشر يحدد الحد الأقصى لعدد صفحات PDF المقبولة أثناء الاستخراج المحلي. ومع ذلك، هناك مرجع في `fixture_pdf.py` يشير إلى وجود حد أقصى لعدد الصفحات:\n\n\"if len(reader.pages) > max_pages:\n raise PdfDocumentError(413, f\"الحد الأقصى {max_pages} صفحة لكل PDF: {name}.\")\" `fixture_pdf.py` المقطع 2\n\nهذا يشير إلى أن هناك متغيرًا يسمى `max_pages` يُستخدم لتحديد الحد الأقصى للصفحات. ومع ذلك، لا يحدد النص ما هي القيمة الافتراضية أو الحد الأقصى الإجمالي المسموح به بشكل صريح للسؤال.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-pdf-empty-scan",
|
||||
"query": "ما الذي يحدث إذا رفع المستخدم ملف PDF ممسوحًا ولا يحتوي نصًا قابلًا للاستخراج؟",
|
||||
"expected_document": "fixture_pdf.py",
|
||||
"expected_evidence": "لا يحتوي PDF على نص قابل للاستخراج",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
1,
|
||||
9
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لا تتوفر معلومات مباشرة في المقاطع المسترجعة للإجابة على السؤال بشكل مباشر حول ما يحدث عند رفع ملف PDF ممسوح ولا يحتوي على نص قابل للاستخراج.\n\nالمقطع الذي يشير إلى حالة عدم وجود نص قابل للاستخراج هو:\n`fixture_pdf.py · المقطع 1`:\n\"إذا لم يحتوي PDF على نص قابل للاستخراج؛ قد تكون صفحاته صورًا ممسوحة: {name}.\"\n\nبناءً على هذا المقتطف، إذا لم يحتوي ملف PDF على نص قابل للاستخراج، فقد تكون صفحاته صورًا ممسوحة.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_pdf.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-skill-tool-filter",
|
||||
"query": "How is a tool call blocked when it is outside the selected skill permissions?",
|
||||
"expected_document": "fixture_main.py",
|
||||
"expected_evidence": "tool_name not in selected_skill.allowed_tools",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
101,
|
||||
103,
|
||||
100,
|
||||
90,
|
||||
11,
|
||||
83
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على أي مقطع مباشر يجيب على السؤال.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-agent-index-limits",
|
||||
"query": "What file count and total size limits apply when indexing local knowledge?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "MAX_TOTAL_CHARS = 2_000_000",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على مقاطع محددة في فهرس المعرفة المحلي تجيب مباشرة على سؤال \"What file count and total size limits apply when indexing local knowledge?\".",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
}
|
||||
],
|
||||
"note": "Small deterministic fixture set. Retrieval metrics cover source ranking and evidence presence, not general RAG quality. Optional agent answers are retained for human review and are not auto-scored."
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"created_at_utc": "2026-10-03T19:23:22.039710+00:00",
|
||||
"base_url": "http://127.0.0.1:8000",
|
||||
"dataset": "evals\\knowledge_retrieval.jsonl",
|
||||
"indexing": {
|
||||
"semantic_indexed_documents": 1,
|
||||
"documents": 1,
|
||||
"embedding_models": [
|
||||
"granite-embedding:278m"
|
||||
]
|
||||
},
|
||||
"metrics": {
|
||||
"cases": 1,
|
||||
"hit_at_1": 1.0,
|
||||
"hit_at_3": 1.0,
|
||||
"mean_reciprocal_rank": 1.0,
|
||||
"evidence_rate": 1.0
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"id": "model-routing-ar",
|
||||
"query": "ما الحقول التي يعيدها API بعد تحويل الصور: requested_model وauto_routed؟",
|
||||
"expected_document": "routing.md",
|
||||
"expected_evidence": "auto_routed",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"routing.md"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المقطع الذي يجيب على سؤالك هو:\n\"عند وصول صورة مع نموذج نصي، يختار API نموذج الرؤية المحلي المثبت ويعيد requested_model وmodel وauto_routed.\" (routing.md، المقطع 0)",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"routing.md"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
}
|
||||
],
|
||||
"note": "Small deterministic fixture set. Retrieval metrics cover source ranking and evidence presence, not general RAG quality. Optional agent answers are retained for human review and are not auto-scored."
|
||||
}
|
||||
@@ -0,0 +1,299 @@
|
||||
{
|
||||
"created_at_utc": "2026-10-03T16:56:05.641170+00:00",
|
||||
"base_url": "http://127.0.0.1:8000",
|
||||
"dataset": "evals\\knowledge_retrieval_project.jsonl",
|
||||
"indexing": {
|
||||
"semantic_indexed_documents": 4,
|
||||
"documents": 4,
|
||||
"embedding_models": [
|
||||
"granite-embedding:278m"
|
||||
]
|
||||
},
|
||||
"metrics": {
|
||||
"cases": 9,
|
||||
"hit_at_1": 0.6666666666666666,
|
||||
"hit_at_3": 1.0,
|
||||
"mean_reciprocal_rank": 0.8148148148148148,
|
||||
"evidence_rate": 0.6666666666666666
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"id": "project-path-confinement",
|
||||
"query": "Does resolving a requested source path guarantee it stays under the selected root?",
|
||||
"expected_document": "fixture_workspace.py",
|
||||
"expected_evidence": "relative_to(root)",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
5,
|
||||
19,
|
||||
1
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على أي مقتطفات في قاعدة المعرفة تشير إلى ما إذا كان حل مسار مصدر مطلوب يضمن بقاءه تحت الجذر المحدد.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-preview-stale-file",
|
||||
"query": "How does applying an approved preview detect that the original file changed after review?",
|
||||
"expected_document": "fixture_workspace.py",
|
||||
"expected_evidence": "expected_hash",
|
||||
"rank": 2,
|
||||
"top_paths": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
11,
|
||||
13,
|
||||
12,
|
||||
14
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "للاكتشاف ما إذا كان الملف الأصلي قد تغير بعد المراجعة عند تطبيق المعاينة المعتمدة، يتم التحقق مما إذا كان المسار المستهدف لا يزال دون تغيير.\n\nالمصدر: fixture_workspace.py · المقطع 13:\nيتم تخزين المعاينات في `_pending_changes` مع تضمين `expected_hash` (تجزئة SHA256 للمحتوى الأصلي)، والذي يتم مقارنته ضمنيًا (على الرغم من أن النص لا يوضح عملية المقارنة النهائية) عند تطبيق التغيير أو التحقق منه.\n\nيتم تطبيق التغيير باستخدام الدالة `apply_change_preview`، والتي تتحقق من صلاحية المعاينة بناءً على:\n```python\nif proposal is None or float(proposal[\"expires_at\"]) <= time.time():\n _pending_changes.pop(token, None)\n raise Value\n```\nهذا يضمن أن المعاينة لا تزال سارية المفعول (لم تنتهِ صلاحيتها).\n\nبالإضافة إلى ذلك، يتم تضمين معلومات التغيير مثل `path`، و `operation`، و `content`، و `expected_hash`، و `expires_at` في المعاينة.\n\nالمصدر: fixture_workspace.py · المقطع 13:\n```python\n \"expected_hash\": hashlib.sha256(original).hexdigest(),\n```",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-index-stale-source",
|
||||
"query": "Which file hash is compared with the stored content hash before returning a search result?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "actual_hash == row[\"content_hash\"]",
|
||||
"rank": 3,
|
||||
"top_paths": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
11
|
||||
],
|
||||
"evidence_found": false,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لا توجد معلومات ملموسة في المقاطع المسترجعة حول أي ملف تجري مقارنة لتجزئة (hash) مع تجزئة المحتوى المخزنة قبل إرجاع نتيجة بحث.\n\nالمصدر: fixture_main.py · المقطع 11",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-chunk-overlap",
|
||||
"query": "What are the configured chunk size and overlap for local knowledge indexing?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "CHUNK_OVERLAP = 120",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
3,
|
||||
0,
|
||||
16
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "المقطع يحدد حجم القطعة والتداخل عبر الدالة `_chunks` في ملف `fixture_knowledge.py`.\n\n* **حجم القطعة (CHUNK\\_SIZE):** 1000\n* **التداخل (CHUNK\\_OVERLAP):** 120\n\nالمصدر: fixture\\_knowledge.py · المقطع 15",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-arabic-audio-variants",
|
||||
"query": "كيف يربط فهرس المعرفة بين تعابير عربية مختلفة عند البحث عن تفريغ التسجيل؟",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "QUERY_SYNONYMS",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
1,
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على أي معلومات تربط بين فهرس المعرفة وتعابير عربية مختلفة عند البحث عن تفريغ التسجيل.\n\nالمقاطع المسترجعة لا تحتوي على إجابة مباشرة لهذا السؤال.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-pdf-page-bound",
|
||||
"query": "What is the maximum number of PDF pages accepted during local extraction?",
|
||||
"expected_document": "fixture_pdf.py",
|
||||
"expected_evidence": "MAX_PDF_PAGES = 30",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
2,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم العثور على معلومة محددة حول الحد الأقصى لعدد صفحات PDF المقبولة أثناء الاستخراج المحلي.\n\nالمقاطع المسترجعة تشير إلى وجود حد أقصى للصفحات عند قراءة ملف PDFات:\n* في `fixture_pdf.py` المقطع 2، هناك فحص للحد الأقصى للصفحات: `if len(reader.pages) > max_pages: raise PdfDocumentError(413, f\"الحد الأقصى {max_pages} صفحة لكل PDF: {name}.\")`، مما يعني أن الحد الأقصى للصفحات يعتمد على المتغير `max_pages`، ولم يتم تحديد قيمته.\n* في `fixture_pdf.py` المقطع 1، الدالة `extract_pdf_pages_text` تستخدم المعامل `max_pages`، ولكن لا يوجد تعريف لقيمة افتراضية له في هذا المقطع.\n\nبالإضافة إلى ذلك، تشير مقاطع أخرى إلى حدود أخرى مثل \"الحد الأقصى 8 ميغابايت لكل PDF\" و \"حد الفهرسة 2 ميغابايت لكل طلب\" في `fixture_main.py` المقطع 43.\n\nبناءً على ما تم استرجاعه، لا يمكنني تحديد العدد الأقصى لصفحات PDF المقبولة بشكل قاطع.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-pdf-empty-scan",
|
||||
"query": "ما الذي يحدث إذا رفع المستخدم ملف PDF ممسوحًا ولا يحتوي نصًا قابلًا للاستخراج؟",
|
||||
"expected_document": "fixture_pdf.py",
|
||||
"expected_evidence": "لا يحتوي PDF على نص قابل للاستخراج",
|
||||
"rank": 2,
|
||||
"top_paths": [
|
||||
"fixture_main.py",
|
||||
"fixture_pdf.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
9
|
||||
],
|
||||
"evidence_found": false,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم توفير معلومات مباشرة في المقاطع المسترجعة حول ما يحدث إذا تم رفع ملف PDF ممسوحًا ولا يحتوي على نص قابل للاستخراج. ومع ذلك، يُشير المقطع من `fixture_pdf.py` إلى سيناريو يتعلق بعدم وجود نص قابل للاستخراج:\n\n\"لا يحتوي PDF على نص قابل للاستخراج؛ قد تكون صفحاته صورًا ممسوحة: {name}.\" (المقطع 1 من `fixture_pdf.py`)\n\nهذا يشير إلى أن النظام قد يواجه مشكلة إذا لم يتمكن من استخراج نص من ملف PDF (قد يكون ممسوحًا)، حيث يتم رفع استثناء `PdfDocumentError` برمز الخطأ 415.\n\n**مسار المصدر:** `fixture_pdf.py`، المقطع 1.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_pdf.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-skill-tool-filter",
|
||||
"query": "How is a tool call blocked when it is outside the selected skill permissions?",
|
||||
"expected_document": "fixture_main.py",
|
||||
"expected_evidence": "tool_name not in selected_skill.allowed_tools",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
102,
|
||||
11,
|
||||
99
|
||||
],
|
||||
"evidence_found": false,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لم يتم توفير معلومات حول كيفية حظر استدعاء الأداة عندما يكون خارج أذونات المهارة المحددة.",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
},
|
||||
{
|
||||
"id": "project-agent-index-limits",
|
||||
"query": "What file count and total size limits apply when indexing local knowledge?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "MAX_TOTAL_CHARS = 2_000_000",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid",
|
||||
"agent_answer": "لقد تم تحديد حدود للفهرسة بناءً على الأدوات المتاحة:\n\n* **حدود تحليل الملفات:**\n * الأداة `analyze_uploaded_code` تسمح بـ `max_files` قدره **3** و `max_total_bytes` قدره **524288** بايت (من `fixture_main.py · المقطع 28`).\n * الأداة `analyze_image` تسمح بـ `max_files` قدره **3** و `max_total_bytes` قدره **16777216** بايت (من `fixture_main.py · المقطع 26`).\n\n* **حدود قراءة الملفات (في سياق مساحة العمل):**\n * يتم رفض قراءة الملفات إذا كان حجمها أكبر من الحد المسموح به للقراءة (256 كيلوبايت) (من `fixture_workspace.py · المقطع 7`).\n\n* **حدود الفهرسة العامة:**\n * المعلومات حول الحد الأقصى لعدد الملفات الإجمالي وحجمه المحجوز عند فهرسة المعرفة المحلي غير محددة بشكل مباشر في المقاطع المسترجعة.\n\nالمصدر: fixture_main.py · المقطع 28، fixture_main.py · المقطع 26، fixture_workspace.py · المقطع 7",
|
||||
"agent_tool": "search_knowledge",
|
||||
"agent_files": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"agent_steps": [
|
||||
{
|
||||
"tool": "search_knowledge",
|
||||
"status": "completed"
|
||||
}
|
||||
],
|
||||
"human_rating": null
|
||||
}
|
||||
],
|
||||
"note": "Small deterministic fixture set. Retrieval metrics cover source ranking and evidence presence, not general RAG quality. Optional agent answers are retained for human review and are not auto-scored."
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
{
|
||||
"created_at_utc": "2026-10-03T17:02:59.944699+00:00",
|
||||
"base_url": "http://127.0.0.1:8131",
|
||||
"dataset": "evals\\knowledge_retrieval_project.jsonl",
|
||||
"indexing": {
|
||||
"semantic_indexed_documents": 4,
|
||||
"documents": 4,
|
||||
"embedding_models": [
|
||||
"granite-embedding:278m"
|
||||
]
|
||||
},
|
||||
"metrics": {
|
||||
"cases": 9,
|
||||
"hit_at_1": 0.8888888888888888,
|
||||
"hit_at_3": 1.0,
|
||||
"mean_reciprocal_rank": 0.9444444444444444,
|
||||
"evidence_rate": 0.8888888888888888
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"id": "project-path-confinement",
|
||||
"query": "Does resolving a requested source path guarantee it stays under the selected root?",
|
||||
"expected_document": "fixture_workspace.py",
|
||||
"expected_evidence": "relative_to(root)",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
5,
|
||||
19,
|
||||
1,
|
||||
6,
|
||||
10
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-preview-stale-file",
|
||||
"query": "How does applying an approved preview detect that the original file changed after review?",
|
||||
"expected_document": "fixture_workspace.py",
|
||||
"expected_evidence": "expected_hash",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
13,
|
||||
15,
|
||||
12,
|
||||
11,
|
||||
14
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-index-stale-source",
|
||||
"query": "Which file hash is compared with the stored content hash before returning a search result?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "actual_hash == row[\"content_hash\"]",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
17,
|
||||
11
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-chunk-overlap",
|
||||
"query": "What are the configured chunk size and overlap for local knowledge indexing?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "CHUNK_OVERLAP = 120",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
3,
|
||||
0,
|
||||
16
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-arabic-audio-variants",
|
||||
"query": "كيف يربط فهرس المعرفة بين تعابير عربية مختلفة عند البحث عن تفريغ التسجيل؟",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "QUERY_SYNONYMS",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
1,
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-pdf-page-bound",
|
||||
"query": "What is the maximum number of PDF pages accepted during local extraction?",
|
||||
"expected_document": "fixture_pdf.py",
|
||||
"expected_evidence": "MAX_PDF_PAGES = 30",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
4,
|
||||
5,
|
||||
6
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-pdf-empty-scan",
|
||||
"query": "ما الذي يحدث إذا رفع المستخدم ملف PDF ممسوحًا ولا يحتوي نصًا قابلًا للاستخراج؟",
|
||||
"expected_document": "fixture_pdf.py",
|
||||
"expected_evidence": "لا يحتوي PDF على نص قابل للاستخراج",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
1,
|
||||
9,
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-skill-tool-filter",
|
||||
"query": "How is a tool call blocked when it is outside the selected skill permissions?",
|
||||
"expected_document": "fixture_main.py",
|
||||
"expected_evidence": "tool_name not in selected_skill.allowed_tools",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
85,
|
||||
79,
|
||||
99,
|
||||
102,
|
||||
84,
|
||||
80,
|
||||
98
|
||||
],
|
||||
"evidence_found": false,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-agent-index-limits",
|
||||
"query": "What file count and total size limits apply when indexing local knowledge?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "MAX_TOTAL_CHARS = 2_000_000",
|
||||
"rank": 2,
|
||||
"top_paths": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
}
|
||||
],
|
||||
"note": "Small deterministic fixture set. Retrieval metrics cover source ranking and evidence presence, not general RAG quality. Optional agent answers are retained for human review and are not auto-scored."
|
||||
}
|
||||
+196
@@ -0,0 +1,196 @@
|
||||
{
|
||||
"created_at_utc": "2026-10-03T17:12:10.145801+00:00",
|
||||
"base_url": "http://127.0.0.1:8131",
|
||||
"dataset": "evals\\knowledge_retrieval_project.jsonl",
|
||||
"indexing": {
|
||||
"semantic_indexed_documents": 4,
|
||||
"documents": 4,
|
||||
"embedding_models": [
|
||||
"granite-embedding:278m"
|
||||
]
|
||||
},
|
||||
"metrics": {
|
||||
"cases": 9,
|
||||
"hit_at_1": 0.8888888888888888,
|
||||
"hit_at_3": 1.0,
|
||||
"mean_reciprocal_rank": 0.9444444444444444,
|
||||
"evidence_rate": 1.0
|
||||
},
|
||||
"results": [
|
||||
{
|
||||
"id": "project-path-confinement",
|
||||
"query": "Does resolving a requested source path guarantee it stays under the selected root?",
|
||||
"expected_document": "fixture_workspace.py",
|
||||
"expected_evidence": "relative_to(root)",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
5,
|
||||
19,
|
||||
1,
|
||||
6,
|
||||
10
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-preview-stale-file",
|
||||
"query": "How does applying an approved preview detect that the original file changed after review?",
|
||||
"expected_document": "fixture_workspace.py",
|
||||
"expected_evidence": "expected_hash",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
13,
|
||||
15,
|
||||
12,
|
||||
11,
|
||||
14
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-index-stale-source",
|
||||
"query": "Which file hash is compared with the stored content hash before returning a search result?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "actual_hash == row[\"content_hash\"]",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_workspace.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
17,
|
||||
11
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-chunk-overlap",
|
||||
"query": "What are the configured chunk size and overlap for local knowledge indexing?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "CHUNK_OVERLAP = 120",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
3,
|
||||
0,
|
||||
7,
|
||||
16
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-arabic-audio-variants",
|
||||
"query": "كيف يربط فهرس المعرفة بين تعابير عربية مختلفة عند البحث عن تفريغ التسجيل؟",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "QUERY_SYNONYMS",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
1,
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-pdf-page-bound",
|
||||
"query": "What is the maximum number of PDF pages accepted during local extraction?",
|
||||
"expected_document": "fixture_pdf.py",
|
||||
"expected_evidence": "MAX_PDF_PAGES = 30",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
4,
|
||||
5,
|
||||
6
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-pdf-empty-scan",
|
||||
"query": "ما الذي يحدث إذا رفع المستخدم ملف PDF ممسوحًا ولا يحتوي نصًا قابلًا للاستخراج؟",
|
||||
"expected_document": "fixture_pdf.py",
|
||||
"expected_evidence": "لا يحتوي PDF على نص قابل للاستخراج",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_pdf.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
1,
|
||||
9,
|
||||
0
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-skill-tool-filter",
|
||||
"query": "How is a tool call blocked when it is outside the selected skill permissions?",
|
||||
"expected_document": "fixture_main.py",
|
||||
"expected_evidence": "tool_name not in selected_skill.allowed_tools",
|
||||
"rank": 1,
|
||||
"top_paths": [
|
||||
"fixture_main.py",
|
||||
"fixture_workspace.py",
|
||||
"fixture_knowledge.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
102,
|
||||
85,
|
||||
99,
|
||||
100,
|
||||
79,
|
||||
98
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
},
|
||||
{
|
||||
"id": "project-agent-index-limits",
|
||||
"query": "What file count and total size limits apply when indexing local knowledge?",
|
||||
"expected_document": "fixture_knowledge.py",
|
||||
"expected_evidence": "MAX_TOTAL_CHARS = 2_000_000",
|
||||
"rank": 2,
|
||||
"top_paths": [
|
||||
"fixture_workspace.py",
|
||||
"fixture_knowledge.py",
|
||||
"fixture_main.py"
|
||||
],
|
||||
"expected_document_chunks": [
|
||||
0,
|
||||
3
|
||||
],
|
||||
"evidence_found": true,
|
||||
"search_mode": "hybrid"
|
||||
}
|
||||
],
|
||||
"note": "Small deterministic fixture set. Retrieval metrics cover source ranking and evidence presence, not general RAG quality. Optional agent answers are retained for human review and are not auto-scored."
|
||||
}
|
||||
Reference in New Issue
Block a user