Spaces:
Sleeping
Sleeping
mayar-waleed commited on
Commit ·
c04c9cf
0
Parent(s):
Initial commit
Browse files- .gitignore +21 -0
- EVALUATION_README.md +153 -0
- EVALUATION_SETUP.md +173 -0
- README.md +232 -0
- app/__init__.py +0 -0
- data/Egyptian_Civil.json +0 -0
- data/Egyptian_Constitution_legalnature_only.json +0 -0
- data/Egyptian_Labour_Law.json +0 -0
- data/Egyptian_Personal Status Laws.json +0 -0
- data/Technology Crimes Law.json +787 -0
- data/قانون_الإجراءات_الجنائية.json +0 -0
- evaluation_results.json +9 -0
- main.py +30 -0
- models.py +26 -0
- rag.py +396 -0
- rag_test_questions_100.json +1380 -0
- rag_test_questions_10_mixed.json +172 -0
- rag_test_runner.py +270 -0
- requirements.txt +61 -0
- reranker/.gitattributes +36 -0
- reranker/README.md +118 -0
- reranker/config.json +34 -0
- reranker/sentencepiece.bpe.model +3 -0
- reranker/special_tokens_map.json +51 -0
- reranker/tokenizer.json +3 -0
- reranker/tokenizer_config.json +55 -0
.gitignore
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# secrets
|
| 2 |
+
.env
|
| 3 |
+
|
| 4 |
+
# environments
|
| 5 |
+
venv/
|
| 6 |
+
|
| 7 |
+
# vector DB
|
| 8 |
+
chroma_db/
|
| 9 |
+
|
| 10 |
+
# large ML artifacts
|
| 11 |
+
*.safetensors
|
| 12 |
+
*.whl
|
| 13 |
+
*.bin
|
| 14 |
+
*.sqlite3
|
| 15 |
+
|
| 16 |
+
# python
|
| 17 |
+
__pycache__/
|
| 18 |
+
*.pyc
|
| 19 |
+
|
| 20 |
+
# editor
|
| 21 |
+
.vscode/
|
EVALUATION_README.md
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# RAG Evaluation with Ragas
|
| 2 |
+
|
| 3 |
+
## 📊 Evaluation Metrics
|
| 4 |
+
|
| 5 |
+
This evaluation uses **Ragas** library to measure RAG system quality:
|
| 6 |
+
|
| 7 |
+
| Metric | Description | Range | Goal |
|
| 8 |
+
|--------|-------------|-------|------|
|
| 9 |
+
| **faithfulness** | Is the answer grounded in the context? | 0-1 | Higher |
|
| 10 |
+
| **answer_relevancy** | Does the answer relate to the question? | 0-1 | Higher |
|
| 11 |
+
| **context_precision** | How much retrieved context was relevant? | 0-1 | Higher |
|
| 12 |
+
| **context_recall** | Did we retrieve all needed information? | 0-1 | Higher |
|
| 13 |
+
| **context_relevancy** | Overall relevance of context to question | 0-1 | Higher |
|
| 14 |
+
|
| 15 |
+
## 🚀 How to Run
|
| 16 |
+
|
| 17 |
+
### 1. Prerequisites
|
| 18 |
+
|
| 19 |
+
Make sure you have:
|
| 20 |
+
- ✅ Ragas installed: `pip install ragas datasets`
|
| 21 |
+
- ✅ OpenAI API key set in `.env` file (Ragas uses it for evaluation)
|
| 22 |
+
- ✅ Your RAG system working (test with `streamlit run app_final.py`)
|
| 23 |
+
|
| 24 |
+
### 2. Prepare Test Dataset
|
| 25 |
+
|
| 26 |
+
Edit `test_dataset.json` with your test questions:
|
| 27 |
+
|
| 28 |
+
```json
|
| 29 |
+
[
|
| 30 |
+
{
|
| 31 |
+
"question": "Your question in Arabic",
|
| 32 |
+
"ground_truth": "Expected correct answer (optional but recommended)"
|
| 33 |
+
}
|
| 34 |
+
]
|
| 35 |
+
```
|
| 36 |
+
|
| 37 |
+
### 3. Run Evaluation
|
| 38 |
+
|
| 39 |
+
```bash
|
| 40 |
+
python evaluate_rag.py
|
| 41 |
+
```
|
| 42 |
+
|
| 43 |
+
### 4. Check Results
|
| 44 |
+
|
| 45 |
+
The script will generate:
|
| 46 |
+
- `evaluation_results.json` - Summary metrics
|
| 47 |
+
- `evaluation_detailed.json` - Full Q&A pairs with contexts
|
| 48 |
+
|
| 49 |
+
## 📈 Understanding Results
|
| 50 |
+
|
| 51 |
+
### Good Scores (Target)
|
| 52 |
+
- **faithfulness**: > 0.7 (answers stay within context)
|
| 53 |
+
- **answer_relevancy**: > 0.8 (answers address the question)
|
| 54 |
+
- **context_precision**: > 0.6 (low noise in retrieval)
|
| 55 |
+
- **context_recall**: > 0.7 (retrieved all needed info)
|
| 56 |
+
- **context_relevancy**: > 0.7 (context matches question)
|
| 57 |
+
|
| 58 |
+
### If Scores Are Low
|
| 59 |
+
|
| 60 |
+
**Low Faithfulness (<0.5)**
|
| 61 |
+
- LLM is hallucinating or adding external info
|
| 62 |
+
- Solution: Adjust prompt to be stricter about using only context
|
| 63 |
+
|
| 64 |
+
**Low Answer Relevancy (<0.6)**
|
| 65 |
+
- Answers don't match questions
|
| 66 |
+
- Solution: Check if retrieval is getting right documents
|
| 67 |
+
|
| 68 |
+
**Low Context Precision (<0.4)**
|
| 69 |
+
- Too much irrelevant context retrieved
|
| 70 |
+
- Solution: Tune retrieval k parameter, adjust reranker top_n
|
| 71 |
+
|
| 72 |
+
**Low Context Recall (<0.5)**
|
| 73 |
+
- Missing important information
|
| 74 |
+
- Solution: Increase k in retrievers, check if documents have the info
|
| 75 |
+
|
| 76 |
+
**Low Context Relevancy (<0.5)**
|
| 77 |
+
- Retrieved documents don't match question
|
| 78 |
+
- Solution: Check embeddings, tune hybrid search weights
|
| 79 |
+
|
| 80 |
+
## 🔧 Customization
|
| 81 |
+
|
| 82 |
+
### Add More Test Questions
|
| 83 |
+
|
| 84 |
+
Edit `test_dataset.json`:
|
| 85 |
+
```json
|
| 86 |
+
{
|
| 87 |
+
"question": "ما هي شروط الترشح للبرلمان؟",
|
| 88 |
+
"ground_truth": "يجب أن يكون مصرياً، متمتعاً بحقوقه المدنية والسياسية..."
|
| 89 |
+
}
|
| 90 |
+
```
|
| 91 |
+
|
| 92 |
+
### Change Metrics
|
| 93 |
+
|
| 94 |
+
Edit `evaluate_rag.py` and modify the metrics list:
|
| 95 |
+
```python
|
| 96 |
+
evaluation_results = evaluate(
|
| 97 |
+
dataset,
|
| 98 |
+
metrics=[
|
| 99 |
+
faithfulness,
|
| 100 |
+
answer_relevancy,
|
| 101 |
+
# Add or remove metrics here
|
| 102 |
+
],
|
| 103 |
+
)
|
| 104 |
+
```
|
| 105 |
+
|
| 106 |
+
### Use Different LLM for Evaluation
|
| 107 |
+
|
| 108 |
+
Ragas supports different LLMs. Edit the evaluation call:
|
| 109 |
+
```python
|
| 110 |
+
from ragas.llms import LangchainLLMWrapper
|
| 111 |
+
from langchain_groq import ChatGroq
|
| 112 |
+
|
| 113 |
+
# Use Groq instead of OpenAI for evaluation
|
| 114 |
+
evaluator_llm = LangchainLLMWrapper(ChatGroq(model="llama-3.1-70b-versatile"))
|
| 115 |
+
|
| 116 |
+
evaluation_results = evaluate(
|
| 117 |
+
dataset,
|
| 118 |
+
metrics=[...],
|
| 119 |
+
llm=evaluator_llm
|
| 120 |
+
)
|
| 121 |
+
```
|
| 122 |
+
|
| 123 |
+
## 📝 Notes
|
| 124 |
+
|
| 125 |
+
1. **OpenAI API Cost**: Ragas uses OpenAI API for evaluation (GPT-3.5/4). Each evaluation costs ~$0.01-0.10 depending on dataset size.
|
| 126 |
+
|
| 127 |
+
2. **Ground Truth**: While optional, providing ground_truth improves `context_recall` metric accuracy.
|
| 128 |
+
|
| 129 |
+
3. **Arabic Support**: Ragas works with Arabic text, but evaluation quality depends on the LLM used (GPT-4 is better for Arabic than GPT-3.5).
|
| 130 |
+
|
| 131 |
+
4. **Batch Size**: For large datasets (>50 questions), consider splitting into batches to avoid API rate limits.
|
| 132 |
+
|
| 133 |
+
## 🐛 Troubleshooting
|
| 134 |
+
|
| 135 |
+
**Error: "OpenAI API key not found"**
|
| 136 |
+
- Add `OPENAI_API_KEY=sk-...` to your `.env` file
|
| 137 |
+
|
| 138 |
+
**Error: "Rate limit exceeded"**
|
| 139 |
+
- Wait a few minutes or reduce test dataset size
|
| 140 |
+
|
| 141 |
+
**Error: "Import error"**
|
| 142 |
+
- Run: `pip install ragas datasets openai langchain-openai`
|
| 143 |
+
|
| 144 |
+
**Metrics return NaN or 0**
|
| 145 |
+
- Check if answers/contexts are empty
|
| 146 |
+
- Ensure ground_truth is provided for context_recall
|
| 147 |
+
- Try with a smaller dataset first (2-3 questions)
|
| 148 |
+
|
| 149 |
+
## 📚 Resources
|
| 150 |
+
|
| 151 |
+
- [Ragas Documentation](https://docs.ragas.io/)
|
| 152 |
+
- [Ragas GitHub](https://github.com/explodinggradients/ragas)
|
| 153 |
+
- [RAG Evaluation Best Practices](https://docs.ragas.io/en/latest/concepts/metrics/index.html)
|
EVALUATION_SETUP.md
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# RAG Evaluation Setup - Summary
|
| 2 |
+
|
| 3 |
+
## 📁 Files Created
|
| 4 |
+
|
| 5 |
+
1. **evaluate_rag.py** - Full evaluation script with detailed explanations
|
| 6 |
+
2. **quick_eval.py** - Simple evaluation script (faster to run)
|
| 7 |
+
3. **test_dataset.json** - Test questions and ground truth answers
|
| 8 |
+
4. **EVALUATION_README.md** - Complete documentation
|
| 9 |
+
|
| 10 |
+
## 🎯 Quick Start (3 Steps)
|
| 11 |
+
|
| 12 |
+
### Step 1: Add OpenAI API Key
|
| 13 |
+
Add to your `.env` file:
|
| 14 |
+
```
|
| 15 |
+
OPENAI_API_KEY=sk-your-key-here
|
| 16 |
+
```
|
| 17 |
+
|
| 18 |
+
### Step 2: Edit Test Questions (Optional)
|
| 19 |
+
Edit `test_dataset.json` to add/modify test questions
|
| 20 |
+
|
| 21 |
+
### Step 3: Run Evaluation
|
| 22 |
+
```bash
|
| 23 |
+
# Option A: Quick evaluation
|
| 24 |
+
python quick_eval.py
|
| 25 |
+
|
| 26 |
+
# Option B: Full evaluation with explanations
|
| 27 |
+
python evaluate_rag.py
|
| 28 |
+
```
|
| 29 |
+
|
| 30 |
+
## 📊 What Gets Evaluated
|
| 31 |
+
|
| 32 |
+
### The 6 Ragas Metrics:
|
| 33 |
+
|
| 34 |
+
1. **faithfulness** (0-1, higher better)
|
| 35 |
+
- Is answer grounded in context?
|
| 36 |
+
- Checks if model added external information
|
| 37 |
+
|
| 38 |
+
2. **answer_relevancy** (0-1, higher better)
|
| 39 |
+
- Does answer match the question?
|
| 40 |
+
- Checks if answer is on-topic
|
| 41 |
+
|
| 42 |
+
3. **context_precision** (0-1, higher better)
|
| 43 |
+
- How much retrieved context was useful?
|
| 44 |
+
- Measures retrieval signal-to-noise ratio
|
| 45 |
+
|
| 46 |
+
4. **context_recall** (0-1, higher better)
|
| 47 |
+
- Did we retrieve all needed info?
|
| 48 |
+
- Requires ground_truth to measure
|
| 49 |
+
|
| 50 |
+
5. **context_relevancy** (0-1, higher better)
|
| 51 |
+
- Overall context relevance to question
|
| 52 |
+
- Measures retrieval quality
|
| 53 |
+
|
| 54 |
+
6. **response_relevancy** (included in answer_relevancy)
|
| 55 |
+
- Similar to answer_relevancy
|
| 56 |
+
|
| 57 |
+
## 📈 Expected Scores
|
| 58 |
+
|
| 59 |
+
### Good Performance:
|
| 60 |
+
- faithfulness: > 0.7
|
| 61 |
+
- answer_relevancy: > 0.8
|
| 62 |
+
- context_precision: > 0.6
|
| 63 |
+
- context_recall: > 0.7
|
| 64 |
+
- context_relevancy: > 0.7
|
| 65 |
+
|
| 66 |
+
### If Scores Are Low:
|
| 67 |
+
|
| 68 |
+
**Low Faithfulness?**
|
| 69 |
+
→ Tighten prompt to avoid hallucinations
|
| 70 |
+
|
| 71 |
+
**Low Answer Relevancy?**
|
| 72 |
+
→ Check retrieval quality
|
| 73 |
+
|
| 74 |
+
**Low Context Precision?**
|
| 75 |
+
→ Reduce k in retrievers or increase reranker top_n
|
| 76 |
+
|
| 77 |
+
**Low Context Recall?**
|
| 78 |
+
→ Increase k in retrievers, check if info exists
|
| 79 |
+
|
| 80 |
+
**Low Context Relevancy?**
|
| 81 |
+
→ Adjust hybrid search beta weights
|
| 82 |
+
|
| 83 |
+
## 🔧 Tuning Your System
|
| 84 |
+
|
| 85 |
+
Based on evaluation results, you can tune:
|
| 86 |
+
|
| 87 |
+
1. **In app_final.py:**
|
| 88 |
+
- Line 172: `base_retriever k` (semantic search)
|
| 89 |
+
- Line 208: `bm25_retriever k` (keyword search)
|
| 90 |
+
- Line 260: `metadata_retriever k` (metadata filter)
|
| 91 |
+
- Line 335: `beta_semantic, beta_keyword, beta_metadata` (hybrid weights)
|
| 92 |
+
- Line 427: `compressor top_n` (reranker final count)
|
| 93 |
+
- Line 440: `temperature` (LLM creativity)
|
| 94 |
+
|
| 95 |
+
2. **Test Changes:**
|
| 96 |
+
```bash
|
| 97 |
+
# After tuning parameters
|
| 98 |
+
python quick_eval.py
|
| 99 |
+
# Compare new scores with previous results
|
| 100 |
+
```
|
| 101 |
+
|
| 102 |
+
## 💡 Tips
|
| 103 |
+
|
| 104 |
+
1. **Start Small**: Test with 3-5 questions first
|
| 105 |
+
2. **Add Ground Truth**: Improves context_recall accuracy
|
| 106 |
+
3. **Compare Before/After**: Save results before making changes
|
| 107 |
+
4. **Use GPT-4**: Set `OPENAI_MODEL=gpt-4` for better Arabic evaluation
|
| 108 |
+
|
| 109 |
+
## 📝 Example Workflow
|
| 110 |
+
|
| 111 |
+
```bash
|
| 112 |
+
# 1. Baseline evaluation
|
| 113 |
+
python quick_eval.py
|
| 114 |
+
# Save as: evaluation_baseline.json
|
| 115 |
+
|
| 116 |
+
# 2. Tune parameter (e.g., increase reranker top_n from 5 to 7)
|
| 117 |
+
# Edit app_final.py line 427: top_n=7
|
| 118 |
+
|
| 119 |
+
# 3. Re-evaluate
|
| 120 |
+
python quick_eval.py
|
| 121 |
+
# Save as: evaluation_tuned.json
|
| 122 |
+
|
| 123 |
+
# 4. Compare scores
|
| 124 |
+
# If improved → keep change
|
| 125 |
+
# If worse → revert and try different parameter
|
| 126 |
+
```
|
| 127 |
+
|
| 128 |
+
## 🐛 Common Issues
|
| 129 |
+
|
| 130 |
+
**"OpenAI API key not found"**
|
| 131 |
+
```bash
|
| 132 |
+
# Check .env file has:
|
| 133 |
+
OPENAI_API_KEY=sk-...
|
| 134 |
+
```
|
| 135 |
+
|
| 136 |
+
**"Rate limit exceeded"**
|
| 137 |
+
```bash
|
| 138 |
+
# Wait 1 minute and retry, or reduce test dataset size
|
| 139 |
+
```
|
| 140 |
+
|
| 141 |
+
**"Import ragas failed"**
|
| 142 |
+
```bash
|
| 143 |
+
pip install ragas datasets openai langchain-openai
|
| 144 |
+
```
|
| 145 |
+
|
| 146 |
+
**Scores all 0 or NaN**
|
| 147 |
+
```bash
|
| 148 |
+
# Check:
|
| 149 |
+
# 1. Answers are being generated (not empty)
|
| 150 |
+
# 2. Contexts are being retrieved
|
| 151 |
+
# 3. Ground truth is provided for context_recall
|
| 152 |
+
```
|
| 153 |
+
|
| 154 |
+
## 📚 Output Files
|
| 155 |
+
|
| 156 |
+
After running evaluation:
|
| 157 |
+
- `evaluation_results.json` - Summary metrics
|
| 158 |
+
- `evaluation_detailed.json` - Full Q&A with contexts
|
| 159 |
+
- Console output - Formatted metrics display
|
| 160 |
+
|
| 161 |
+
## 🎓 Next Steps
|
| 162 |
+
|
| 163 |
+
1. Run baseline evaluation
|
| 164 |
+
2. Identify lowest-scoring metric
|
| 165 |
+
3. Tune relevant parameters
|
| 166 |
+
4. Re-evaluate and compare
|
| 167 |
+
5. Repeat until satisfied
|
| 168 |
+
|
| 169 |
+
---
|
| 170 |
+
|
| 171 |
+
**Need Help?**
|
| 172 |
+
- Ragas Docs: https://docs.ragas.io/
|
| 173 |
+
- Example Notebooks: https://github.com/explodinggradients/ragas/tree/main/docs/examples
|
README.md
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ⚖️ Constitutional Legal Assistant - Egyptian Constitution Chatbot
|
| 2 |
+
|
| 3 |
+
An intelligent RAG-based chatbot for answering questions about the Egyptian Constitution in Arabic.
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## 📁 Project Structure
|
| 8 |
+
|
| 9 |
+
```
|
| 10 |
+
Chatbot_me/
|
| 11 |
+
├── app_final.py # Main Streamlit app (production)
|
| 12 |
+
├── app_final_pheonix.py # Streamlit app with Phoenix tracing
|
| 13 |
+
├── evaluate_rag.py # RAG evaluation with RAGAS metrics
|
| 14 |
+
├── evaluate.py # Full standalone evaluation script
|
| 15 |
+
├── requirements.txt # Python dependencies
|
| 16 |
+
├── .env # Environment variables (create this)
|
| 17 |
+
├── Egyptian_Constitution_legalnature_only.json # Constitution data
|
| 18 |
+
├── chroma_db/ # Vector database (auto-generated)
|
| 19 |
+
├── reranker/ # Arabic reranker model files
|
| 20 |
+
│ ├── model.safetensors
|
| 21 |
+
│ ├── config.json
|
| 22 |
+
│ └── ...
|
| 23 |
+
└── *.whl # Local wheel packages for Phoenix
|
| 24 |
+
```
|
| 25 |
+
|
| 26 |
+
---
|
| 27 |
+
|
| 28 |
+
## 🚀 Quick Start
|
| 29 |
+
|
| 30 |
+
### Step 1: Create Virtual Environment (Recommended)
|
| 31 |
+
|
| 32 |
+
```powershell
|
| 33 |
+
# Create virtual environment
|
| 34 |
+
python -m venv venv
|
| 35 |
+
|
| 36 |
+
# Activate it (Windows PowerShell)
|
| 37 |
+
.\venv\Scripts\Activate.ps1
|
| 38 |
+
|
| 39 |
+
# Or (Windows CMD)
|
| 40 |
+
.\venv\Scripts\activate.bat
|
| 41 |
+
```
|
| 42 |
+
|
| 43 |
+
### Step 2: Install Dependencies
|
| 44 |
+
|
| 45 |
+
```powershell
|
| 46 |
+
# Install all requirements
|
| 47 |
+
pip install -r requirements.txt
|
| 48 |
+
```
|
| 49 |
+
|
| 50 |
+
### Step 3: Install Local Wheel Packages (For Phoenix Tracing)
|
| 51 |
+
|
| 52 |
+
```powershell
|
| 53 |
+
# Install OpenInference instrumentation packages
|
| 54 |
+
pip install openinference_instrumentation_langchain-0.1.56-py3-none-any.whl
|
| 55 |
+
pip install openinference_instrumentation_openai-0.1.41-py3-none-any.whl
|
| 56 |
+
```
|
| 57 |
+
|
| 58 |
+
### Step 4: Create `.env` File
|
| 59 |
+
|
| 60 |
+
Create a `.env` file in the project root with:
|
| 61 |
+
|
| 62 |
+
```env
|
| 63 |
+
# Required: Groq API Key (get from https://console.groq.com)
|
| 64 |
+
GROQ_API_KEY=gsk_your_groq_api_key_here
|
| 65 |
+
|
| 66 |
+
# Optional: For Phoenix tracing
|
| 67 |
+
PHOENIX_OTLP_ENDPOINT=http://localhost:6006/v1/traces
|
| 68 |
+
PHOENIX_SERVICE_NAME=constitutional-assistant
|
| 69 |
+
```
|
| 70 |
+
|
| 71 |
+
---
|
| 72 |
+
|
| 73 |
+
## 🏃 Running the Applications
|
| 74 |
+
|
| 75 |
+
### 1. Run Main App (`app_final.py`)
|
| 76 |
+
|
| 77 |
+
The standard chatbot without tracing:
|
| 78 |
+
|
| 79 |
+
```powershell
|
| 80 |
+
streamlit run app_final.py
|
| 81 |
+
```
|
| 82 |
+
|
| 83 |
+
Then open: **http://localhost:8501**
|
| 84 |
+
|
| 85 |
+
---
|
| 86 |
+
|
| 87 |
+
### 2. Run App with Phoenix Tracing (`app_final_pheonix.py`)
|
| 88 |
+
|
| 89 |
+
This version includes observability/tracing with Phoenix.
|
| 90 |
+
|
| 91 |
+
#### Step A: Start Phoenix Server First
|
| 92 |
+
|
| 93 |
+
```powershell
|
| 94 |
+
# In a separate terminal
|
| 95 |
+
python -m phoenix.server.main serve
|
| 96 |
+
```
|
| 97 |
+
|
| 98 |
+
Phoenix UI will be at: **http://localhost:6006**
|
| 99 |
+
|
| 100 |
+
#### Step B: Run the App
|
| 101 |
+
|
| 102 |
+
```powershell
|
| 103 |
+
streamlit run app_final_pheonix.py
|
| 104 |
+
```
|
| 105 |
+
|
| 106 |
+
Then open:
|
| 107 |
+
- **App**: http://localhost:8501
|
| 108 |
+
- **Phoenix Traces**: http://localhost:6006
|
| 109 |
+
|
| 110 |
+
---
|
| 111 |
+
|
| 112 |
+
### 3. Run Evaluation (`evaluate.py`)
|
| 113 |
+
|
| 114 |
+
More comprehensive evaluation with external test dataset and rate limiting:
|
| 115 |
+
|
| 116 |
+
```powershell
|
| 117 |
+
# Basic run (uses test_dataset.json)
|
| 118 |
+
python evaluate.py
|
| 119 |
+
|
| 120 |
+
# With custom test file
|
| 121 |
+
python evaluate.py test_dataset_small.json
|
| 122 |
+
|
| 123 |
+
# With custom test and output files
|
| 124 |
+
python evaluate.py test_dataset_small.json my_results.json
|
| 125 |
+
```
|
| 126 |
+
|
| 127 |
+
**⚠️ Note:** This script has a **2-minute delay** between questions to avoid Groq API rate limits.
|
| 128 |
+
|
| 129 |
+
---
|
| 130 |
+
|
| 131 |
+
## 📊 Understanding RAGAS Metrics
|
| 132 |
+
|
| 133 |
+
| Metric | Description | Good Score |
|
| 134 |
+
|--------|-------------|------------|
|
| 135 |
+
| **faithfulness** | Is answer grounded in context? | > 0.7 |
|
| 136 |
+
| **answer_relevancy** | Does answer match the question? | > 0.8 |
|
| 137 |
+
| **context_precision** | How much context was useful? | > 0.6 |
|
| 138 |
+
| **context_recall** | Did we retrieve all needed info? | > 0.7 |
|
| 139 |
+
|
| 140 |
+
---
|
| 141 |
+
|
| 142 |
+
## 🔧 Troubleshooting
|
| 143 |
+
|
| 144 |
+
### "GROQ_API_KEY not found"
|
| 145 |
+
Make sure your `.env` file exists and contains:
|
| 146 |
+
```env
|
| 147 |
+
GROQ_API_KEY=gsk_your_key_here
|
| 148 |
+
```
|
| 149 |
+
|
| 150 |
+
### "Reranker path not found"
|
| 151 |
+
Ensure the `reranker/` folder exists with model files:
|
| 152 |
+
```
|
| 153 |
+
reranker/
|
| 154 |
+
├── model.safetensors
|
| 155 |
+
├── config.json
|
| 156 |
+
├── tokenizer.json
|
| 157 |
+
└── ...
|
| 158 |
+
```
|
| 159 |
+
|
| 160 |
+
### "Phoenix connection refused"
|
| 161 |
+
Start Phoenix server first:
|
| 162 |
+
```powershell
|
| 163 |
+
python -m phoenix.server.main serve
|
| 164 |
+
```
|
| 165 |
+
|
| 166 |
+
### Rate Limit Errors (Groq)
|
| 167 |
+
- Wait a few minutes and try again
|
| 168 |
+
- Use `test_dataset_small.json` for fewer questions
|
| 169 |
+
- The `evaluate.py` script has built-in 2-minute delays
|
| 170 |
+
|
| 171 |
+
### Import Errors
|
| 172 |
+
```powershell
|
| 173 |
+
# Reinstall all dependencies
|
| 174 |
+
pip install -r requirements.txt --force-reinstall
|
| 175 |
+
```
|
| 176 |
+
|
| 177 |
+
---
|
| 178 |
+
|
| 179 |
+
## 📝 API Keys Required
|
| 180 |
+
|
| 181 |
+
| Service | Purpose | Get Key From |
|
| 182 |
+
|---------|---------|--------------|
|
| 183 |
+
| **Groq** | LLM (Llama 3.1 8B) | https://console.groq.com |
|
| 184 |
+
| **HuggingFace** | Embeddings (auto-download) | No key needed |
|
| 185 |
+
|
| 186 |
+
---
|
| 187 |
+
|
| 188 |
+
## 🔄 How the System Works
|
| 189 |
+
|
| 190 |
+
```
|
| 191 |
+
User Question (Arabic)
|
| 192 |
+
↓
|
| 193 |
+
┌─────────────────────────────────┐
|
| 194 |
+
│ Hybrid Retrieval (RRF) │
|
| 195 |
+
│ ├── Semantic Search (50%) │
|
| 196 |
+
│ ├── BM25 Keyword (30%) │
|
| 197 |
+
│ └── Metadata Filter (20%) │
|
| 198 |
+
└─────────────────────────────────┘
|
| 199 |
+
↓
|
| 200 |
+
┌─────────────────────────────────┐
|
| 201 |
+
│ Cross-Reference Expansion │
|
| 202 |
+
│ (Fetch related articles) │
|
| 203 |
+
└─────────────────────────────────┘
|
| 204 |
+
↓
|
| 205 |
+
┌─────────────────────────────────┐
|
| 206 |
+
│ Arabic Reranker (ARM-V1) │
|
| 207 |
+
│ (Select top 5 most relevant) │
|
| 208 |
+
└─────────────────────────────────┘
|
| 209 |
+
↓
|
| 210 |
+
┌─────────────────────────────────┐
|
| 211 |
+
│ LLM (Llama 3.1 via Groq) │
|
| 212 |
+
│ (Generate Arabic answer) │
|
| 213 |
+
└─────────────────────────────────┘
|
| 214 |
+
↓
|
| 215 |
+
Final Answer
|
| 216 |
+
```
|
| 217 |
+
|
| 218 |
+
---
|
| 219 |
+
|
| 220 |
+
## 📞 Support
|
| 221 |
+
|
| 222 |
+
For issues, check:
|
| 223 |
+
1. `.env` file has correct API keys
|
| 224 |
+
2. All dependencies installed
|
| 225 |
+
3. `reranker/` folder exists with model files
|
| 226 |
+
4. Internet connection for API calls
|
| 227 |
+
|
| 228 |
+
---
|
| 229 |
+
|
| 230 |
+
## 📄 License
|
| 231 |
+
|
| 232 |
+
This project is for educational purposes - Egyptian Constitution Legal Assistant.
|
app/__init__.py
ADDED
|
File without changes
|
data/Egyptian_Civil.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/Egyptian_Constitution_legalnature_only.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/Egyptian_Labour_Law.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/Egyptian_Personal Status Laws.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/Technology Crimes Law.json
ADDED
|
@@ -0,0 +1,787 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{"law_key": "tech_crimes",
|
| 3 |
+
"law_name": "قانون مكافحة جرائم تقنية المعلومات",
|
| 4 |
+
"country": "مصر",
|
| 5 |
+
"data": [
|
| 6 |
+
{
|
| 7 |
+
"article_id": "EG-TECH-ART-001",
|
| 8 |
+
"article_number": "1",
|
| 9 |
+
"part (Bab)": "الأحكام العامة",
|
| 10 |
+
"chapter (Fasl)": "تعريفات",
|
| 11 |
+
"original_text": "فى تطبيق أحكام هذا القانون يُقصد بالألفاظ والعبارات التالية المعنى المبين قرين كل منها: الجهاز: الجهاز القومى لتنظيم الاتصالات. الوزير المختص: الوزير المعنى بشئون الاتصالات وتكنولوجيا المعلومات. البيانات والمعلومات الإلكترونية: كل ما يمكن إنشاؤه أو تخزينه أو معالجته أو تخليقه أو نقله أو مشاركته أو نسخه بواسطة تقنية المعلومات؛ كالأرقام والأكواد والشفرات والحروف والرموز والإشارات والصور والأصوات وما فى حكمها. بيانات شخصية: أى بيانات متعلقة بشخص طبيعى محدد أو يمكن تحديده بشكل مباشر أو غير مباشر عن طريق الربط بينها وبين بيانات أخرى. بيانات حكومية: بيانات متعلقة بالدولة أو أحد سلطاتها أو أجهزتها أو وحداتها أو الهيئات العامة أو الهيئات المستقلة والأجهزة الرقابية وغير اهت من الأشخاص الاعتبارية العامة، وما فى حكمها، والمتاحة على الشبكة المعلوماتية أو على أى نظام معلوماتى أو على حاسب أو ما فى حكمها. المعالجة الإلكترونية: أى عملية إلكترونية أو تقنية تتم كليًا أو جزئيًا لكتابة أو تجميع أو تسجيل أو حفظ أو تخزين أو دمج أو عرض أو إرسال أو استقبال أو تداول أو نشر أو محو أو تغيير أو تعديل أو استرجاع أو استنباط للبيانات والمعلومات الإلكترونية، وذلك باستخدام أى وسيط من الوسائط أو الحاسبات أو الأجهزة الأخرى الإلكترونية أو المغناطيسية أو الضوئية أو ما يُستحدث من تقنيات أو وسائط أخرى. تقنية المعلومات: أى وسيلة أو مجموعة وسائل مترابطة أو غير مترابطة تُستخدم لتخزين واسترجاع وترتيب وتنظيم ومعالجة وتطوير وتبادل المعلومات والبيانات، ويشمل ذلك كل ما يرتبط بالوسيلة أو الوسائل المستخدمة سلكيًا أو لاسلكيًا. مقدم الخدمة: أى شخص طبيعى أو اعتبارى يزود المستخدمين بخدمات تقنيات المعلومات والاتصالات، ويشمل ذلك من يقوم بمعالجة أو تخزين المعلومات بذاته أو من ينيب عنه فى أى من تلك الخدمات أو تقنيات المعلومات. المستخدم: كل شخص طبيعى أو اعتبارى يستعمل خدمات تقنيات المعلومات أو يستفيد منها بأى صورة كانت. البرنامج المعلوماتى: مجموعة الأوامر والتعليمات المعبر عنها بأى لغة أو رمز أو إشارة، والتي تتخذ أى شكل من الأشكال، ويمكن استخدامها بطريق مباشر أو غير مباشر فى حاسب آلى لأداء وظيفة أو تحقيق نتيجة سواء كانت هذه الأوامر والتعليمات فى شكلها الأصلى أو فى أى شكل آخر تظهر فيه من خلال حاسب آلى أو نظام معلوماتى. النظام المعلوماتى: مجموعة برامج وأدوات معدة لغرض إدارة ومعالجة البيانات والمعلومات أو تقديم خدمة معلوماتية. شبكة معلوماتية: مجموعة من الأجهزة أو نظم المعلومات مرتبطة معًا ويمكن تبادل المعلومات والاتصالات فيما بينها، ومن بينها الشبكات الخاصة والعامة وشبكات المعلومات الدولية والتطبيقات المستخدمة عليها. الموقع: مجال أو مكان افتراضى له عنوان محدد على شبكة معلوماتية يهدف إلى إتاحة البيانات والمعلومات للعامة أو الخاصة. مدير الموقع: كل شخص مسئول عن تنظيم أو إدارة أو متابعة أو الحفاظ على موقع أو أكثر على الشبكة المعلوماتية بما فى ذلك حقوق الوصول لمختلف المستخدمين وتنظيم صفحات الموقع أو تصميمه أو توليد محتواه أو المسئول عنه. الحساب الخاص: مجموعة من المعلومات الخاصة بشخص طبيعى أو اعتبارى له الحق دون غيره فى الدخول على الخدمات المتاحة أو استخدامها من خلال موقع أو نظام معلوماتى. البريد الإلكترونى: وسيلة لتبادل رسائل إلكترونية على عنوان محدد بين أكثر من شخص طبيعى أو اعتبارى عبر شبكة معلوماتية أو غيرها من وسائل الربط الإلكترونية من خلال أجهزة الحاسب الآلى وما فى حكمها. الاعتراض: مشاهدة البيانات أو المعلومات أو الحصول عليها بغرض التنصت أو التعطيل أو التخزين أو النسخ أو التسجيل أو تغيير المحتوى أو إساءة الاستخدام أو تعديل المسار أو إعادة التوجيه دون وجه حق ولأسباب غير مشروعة. الاختراق: الدخول غير المرخص به أو المخالف لأحكام الترخيص أو الدخول بأى طريقة غير مشروعة إلى نظام معلوماتى أو حاسب آلى أو شبكة معلوماتية وما فى حكمها. المحتوى: أى بيانات تؤدى بذاتها أو مجتمعة مع بيانات أو معلومات أخرى إلى تكوين معلومة أو تحديد توجه أو اتجاه أو تصور أو معنى أو الإشارة إلى بيانات أخرى. الدليل الرقمى: أى معلومات إلكترونية لها قوة أو قيمة ثبوتية مخزنة أو منقولة أو مستخرجة أو مأخوذة من أجهزة الحاسب أو الشبكات المعلوماتية وما فى حكمها، ويمكن تجميعها وتحليلها باستخدام أجهزة أو برامج أو تطبيقات تكنولوجية خاصة. الخبرة: كل عمل يتصل بتقديم الاستشارات أو الفحص أو المراجعة أو التقييم أو التحليل فى مجالات تقنية المعلومات. حركة الاتصال (بيانات المرور): بيانات ينتجها نظام معلوماتى تبين مصدر الاتصال ووجهته والجهة المرسل منها والمرسل إليها والطريق الذى سلكه وساعته وتاريخه وحجمه ومدته ونوع الخدمة. الحاسب: كل جهاز أو معدة تقنية تكون قادرة على التخزين وأداء عمليات منطقية أو حسابية، وتستخدم لتسجيل بيانات أو معلومات أو تخزينها أو تحويلها أو تخليقها أو ترتيبها أو معالجتها أو تطويرها أو تبادلها أو تحليلها أو الاتصالات. الدعامة الإلكترونية: أى وسيط مادى لحفظ وتداول البيانات والمعلومات الإلكترونية ومنها الأقراص المدمجة أو الأقراص الضوئية والذاكرة الإلكترونية أو ما فى حكمها. الأمن القومى: كل ما يتصل باستقلال واستقرار وأمن الوطن ووحدته وسلامة أراضيه، وما يتعلق بشئون رئاسة الجمهورية ومجلس الدفاع الوطنى ومجلس الأمن القومى ووزارة الدفاع والإنتاج الحربى ووزارة الداخلية والمخابرات العامة وهيئة الرقابة الإدارية والأجهزة التابعة لتلك الجهات. جهات الأمن القومى: رئاسة الجمهورية ووزارة الدفاع ووزارة الداخلية والمخابرات العامة وهيئة الرقابة الإدارية.",
|
| 12 |
+
"simplified_summary": "تحدد المادة التعريفات الأساسية في القانون مثل الجهاز والوزير المختص والبيانات الإلكترونية والبيانات الشخصية والحكومية، والمعالجة الإلكترونية وتقنية المعلومات، ومقدم الخدمة والمستخدم، والبرنامج والنظام والشبكة والموقع ومدير الموقع والحساب الخاص والبريد الإلكتروني، ومعاني الاعتراض والاختراق والمحتوى والدليل الرقمي والخبرة وبيانات المرور والحاسب والدعامة الإلكترونية، ومفاهيم الأمن القومي وجهاته.",
|
| 13 |
+
"keywords": [
|
| 14 |
+
"تعريفات",
|
| 15 |
+
"البيانات الإلكترونية",
|
| 16 |
+
"البيانات الشخصية",
|
| 17 |
+
"المعالجة الإلكترونية",
|
| 18 |
+
"تقنية المعلومات",
|
| 19 |
+
"مقدم الخدمة",
|
| 20 |
+
"الاختراق",
|
| 21 |
+
"الدليل الرقمي",
|
| 22 |
+
"بيانات المرور",
|
| 23 |
+
"الأمن القومي"
|
| 24 |
+
],
|
| 25 |
+
"cross_references": [],
|
| 26 |
+
"legal_nature": "تعريفات"
|
| 27 |
+
},
|
| 28 |
+
{
|
| 29 |
+
"article_id": "EG-TECH-ART-002",
|
| 30 |
+
"article_number": "2",
|
| 31 |
+
"part (Bab)": "الأحكام العامة",
|
| 32 |
+
"chapter (Fasl)": "التزامات وواجبات مقدم الخدمة",
|
| 33 |
+
"original_text": "أولًا- مع عدم الإخلال بأحكام هذا القانون وقانون تنظيم الاتصالات الصادر بالقانون رقم 10 لسنة 2003، يلتزم مقدمو الخدمة بما يأتي: 1- حفظ وتخزين سجل النظام المعلوماتى أو أى وسيلة لتقنية المعلومات لمدة مائة وثمانين يومًا متصلة، وتمثل البيانات الواجب حفظها وتخزينها فيما يأتي: (أ) البيانات التي تمكن من التعرف على مستخدم الخدمة. (ب) البيانات المتعلقة بمحتوى ومضمون النظام المعلوماتى المتعامل متى كانت تحت سيطرة مقدم الخدمة. (ج) البيانات المتعلقة بحركة الاتصال. (د) البيانات المتعلقة بالأجهزة الطرفية للاتصال. (هـ) أى بيانات أخرى يصدر بتحديدها قرار من مجلس إدارة الجهاز. 2- المحافظة على سرية البيانات التي تم حفظها وتخزينها، وعدم إفشائها أو الإفصاح عنها بغير أمر مسبب من إحدى الجهات القضائية المختصة، ويشمل ذلك البيانات الشخصية لأى من مستخدمى خدمته وأى بيانات أو معلومات متعلقة بالمواقع والحسابات الخاصة التى يدخل عليها هؤلاء المستخدمون أو الأشخاص والجهات التى يتواصلون معهم. 3- تأمين البيانات والمعلومات بما يحافظ على سريتها، وعدم اختراقها أو إتلافها. ثانيًا- مع عدم الإخلال بأحكام قانون حماية المستهلك، يجب على مقدم الخدمة أن يوفر لمستخدمى خدماته ولأى جهة حكومية مختصة، بالشكل والطريقة التى يمكن الوصول إليها بصورة ميسرة ومباشرة ومستمرة، البيانات والمعلومات الآتية: 1- اسم مقدم الخدمة وعنوانه. 2- معلومات الاتصال المتعلقة بمقدم الخدمة بما فى ذلك عنوان الاتصال الإلكترونى. 3- بيانات الترخيص لتحديد هوية مقدم الخدمة، وتحديد الجهة المختصة التى يخضع لإشرافها. 4- أى معلومات أخرى يقدر الجهاز أهميتها لحماية مستخدمى الخدمة، ويصدر بتحديدها قرار من الوزير المختص. ثالثًا- مع مراعاة حرمة الحياة الخاصة التى يكفلها الدستور، يلتزم مقدمو الخدمة، والوكلاء والموزعون التابعون لهم، أن يوفروا حال طلب جهات الأمن القومى ووفقًا لكافة احتياجاتها الإمكانيات الفنية التى تتيح لتلك الجهات ممارسة اختصاصاتها وفقًا للقانون. رابعًا- يلتزم مقدمو خدمات تقنية المعلومات ووكلاؤهم وموزعوهم التابعون لهم المـنوط بهم تسويق تلك الخدمات بالحصول على بيانات المستخدمين، ويُحظر على غيرهم القيام بذلك.",
|
| 34 |
+
"simplified_summary": "تُلزم المادة مقدمي الخدمة بحفظ سجلات وبيانات محددة لمدة 180 يومًا، والحفاظ على سريتها وتأمينها وعدم إفشائها إلا بأمر قضائي. كما تُلزمهم بتوفير بيانات تعريفية وترخيصية للمستخدمين والجهات المختصة، وتمكين جهات الأمن القومي من الإمكانيات الفنية وفق القانون، وقصر جمع بيانات المستخدمين على الجهات المسوّقة المعتمدة.",
|
| 35 |
+
"keywords": [
|
| 36 |
+
"مقدم الخدمة",
|
| 37 |
+
"حفظ البيانات",
|
| 38 |
+
"سرية البيانات",
|
| 39 |
+
"تأمين المعلومات",
|
| 40 |
+
"بيانات المرور",
|
| 41 |
+
"الترخيص",
|
| 42 |
+
"جهات الأمن القومي",
|
| 43 |
+
"حماية المستهلك"
|
| 44 |
+
],
|
| 45 |
+
"cross_references": [],
|
| 46 |
+
"legal_nature": "التزام/واجب"
|
| 47 |
+
},
|
| 48 |
+
{
|
| 49 |
+
"article_id": "EG-TECH-ART-003",
|
| 50 |
+
"article_number": "3",
|
| 51 |
+
"part (Bab)": "الأحكام العامة",
|
| 52 |
+
"chapter (Fasl)": "نطاق تطبيق القانون من حيث المكان",
|
| 53 |
+
"original_text": "مع عدم الإخلال بأحكام الباب الأول من الكتاب الأول من قانون العقوبات، تسرى أحكام هذا القانون على كل من ارتكب خارج جمهورية مصر العربية من غير المصريين جريمة من الجرائم المنصوص عليها فى هذا القانون، متى كان الفعل معاقبًا عليه فى الدو��ة التى وقع فيها تحت أى وصف قانونى، وذلك فى أى من الأحوال الآتية: 1- إذا ارتكبت الجريمة على متن أى وسيلة من وسائل النقل الجوى أو البرى أو المائى وكانت مسجلة لدى جمهورية مصر العربية أو تحمل علمها. 2- إذا كان المجنى عليه أو أحدهم مصريًا. 3- إذا تم الإعداد للجريمة أو التخطيط أو التوجيه أو الإشراف عليها أو تمويلها فى جمهورية مصر العربية. 4- إذا ارتكبت الجريمة بواسطة جماعة إجرامية منظمة تمارس أنشطة إجرامية فى أكثر من دولة من بينها جمهورية مصر العربية. 5- إذا كان من شأن الجريمة إلحاق ضرر بأى من مواطنى جمهورية مصر العربية أو المقيمين فيها أو بأمنها أو بأى من مصالحها فى الداخل أو الخارج. 6- إذا وُجد مرتكب جريمة فى جمهورية مصر العربية بعد ارتكابها ولم يتم تسليمه.",
|
| 54 |
+
"simplified_summary": "تُطبق أحكام القانون على جرائم تقنية المعلومات المرتكبة خارج مصر من غير المصريين متى كان الفعل مجرمًا بالدولة التي وقع فيها، وذلك في حالات محددة مثل ارتباط الجريمة بوسيلة نقل مصرية، أو وجود مجني عليه مصري، أو إعدادها أو تمويلها بمصر، أو ارتكابها من جماعة منظمة تضم مصر، أو إضرارها بمصالح أو أمن مصر، أو وجود مرتكبها داخل مصر دون تسليمه.",
|
| 55 |
+
"keywords": [
|
| 56 |
+
"نطاق التطبيق",
|
| 57 |
+
"الاختصاص",
|
| 58 |
+
"جرائم عابرة للحدود",
|
| 59 |
+
"النقل الجوي والبحري",
|
| 60 |
+
"المجني عليه المصري",
|
| 61 |
+
"الجماعة الإجرامية المنظمة"
|
| 62 |
+
],
|
| 63 |
+
"cross_references": [],
|
| 64 |
+
"legal_nature": "نطاق تطبيق/اختصاص"
|
| 65 |
+
},
|
| 66 |
+
{
|
| 67 |
+
"article_id": "EG-TECH-ART-004",
|
| 68 |
+
"article_number": "4",
|
| 69 |
+
"part (Bab)": "الأحكام العامة",
|
| 70 |
+
"chapter (Fasl)": "التعاون الدولي في مكافحة جرائم تقنية المعلومات",
|
| 71 |
+
"original_text": "تعمل السلطات المصرية المختصة على تيسير التعاون مع نظيرتها بالبلاد الأجنبية فى إطار الاتفاقيات الدولية والإقليمية والثنائية المصدق عليها، أو تطبيق مبدأ المعاملة بالمثل، بتبادل المعلومات بما من شأنه أن يكفل تفادى ارتكاب جرائم تقنية المعلومات، والمساعدة على التحقيق فيها وتتبع مرتكبيها. على أن يكون المركز الوطنى للاستعداد لطوارئ الحاسب والشبكات بالجهاز هو نقطة الاتصال الفنية المعتمدة فى هذا الشأن.",
|
| 72 |
+
"simplified_summary": "تلتزم السلطات المصرية بتيسير التعاون الدولي وتبادل المعلومات وفق الاتفاقيات أو المعاملة بالمثل لمنع جرائم تقنية المعلومات والمساعدة في التحقيق وتتبع الجناة، ويكون مركز الاستعداد لطوارئ الحاسب والشبكات بالجهاز نقطة الاتصال الفنية.",
|
| 73 |
+
"keywords": [
|
| 74 |
+
"التعاون الدولي",
|
| 75 |
+
"تبادل المعلومات",
|
| 76 |
+
"التحقيق",
|
| 77 |
+
"تتبع الجناة",
|
| 78 |
+
"مركز طوارئ الحاسب والشبكات"
|
| 79 |
+
],
|
| 80 |
+
"cross_references": [],
|
| 81 |
+
"legal_nature": "تعاون دولي"
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"article_id": "EG-TECH-ART-005",
|
| 85 |
+
"article_number": "5",
|
| 86 |
+
"part (Bab)": "الباب الثاني: الأحكام والقواعد الإجرائية",
|
| 87 |
+
"chapter (Fasl)": "مأمورو الضبط القضائي",
|
| 88 |
+
"original_text": "يجوز بقرار من وزير العدل بالاتفاق مع الوزير المختص منح صفة الضبطية القضائية للعاملين بالجهاز أو غيرهم ممن تحددهم جهات الأمن القومى، بالنسبة إلى الجرائم التى تقع بالمخالفة لأحكام هذا القانون والمتعلقة بأعمال وظائفهم.",
|
| 89 |
+
"simplified_summary": "يجوز لوزير العدل بالاتفاق مع الوزير المختص منح صفة الضبطية القضائية للعاملين بالجهاز أو لغيرهم ممن تحددهم جهات الأمن القومي، فيما يخص الجرائم المرتبطة بأعمال وظائفهم وفق هذا القانون.",
|
| 90 |
+
"keywords": [
|
| 91 |
+
"الضبطية القضائية",
|
| 92 |
+
"وزير العدل",
|
| 93 |
+
"جهات الأمن القومي",
|
| 94 |
+
"الجهاز"
|
| 95 |
+
],
|
| 96 |
+
"cross_references": [],
|
| 97 |
+
"legal_nature": "إجراء تنظيمي/إجرائي"
|
| 98 |
+
},
|
| 99 |
+
{
|
| 100 |
+
"article_id": "EG-TECH-ART-006",
|
| 101 |
+
"article_number": "6",
|
| 102 |
+
"part (Bab)": "الباب الثاني: الأحكام والقواعد الإجرائية",
|
| 103 |
+
"chapter (Fasl)": "الأوامر القضائية المؤقتة",
|
| 104 |
+
"original_text": "يجوز لجهة التحقيق المختصة، بحسب الأحوال، أن تصدر أمرًا مسببًا لمأمورى الضبط القضائى المختصين، لمدة لا تزيد على ثلاثين يومًا قابلة للتجديد لمرة واحدة، متى كان لذلك فائدة فى ظهور الحقيقة على ارتكاب جريمة معاقب عليها بمقتضى أحكام هذا القانون، بواحد أو أكثر مما يأتي: 1- ضبط أو سحب أو جمع أو التحفظ على البيانات والمعلومات أو أنظمة المعلومات، وتتبعها فى أى مكان أو نظام أو برنامج أو دعامة إلكترونية أو حاسب تكون موجودة فيه، ويتم تسليم أدلتها الرقمية لجهة إصدار الأمر على ألا يؤثر ذلك على استمرارية النظم وتقديم الخدمة إن كان لها مقتضى. 2- البحث والتفتيش والدخول والنفاذ إلى برامج الحاسب وقواعد البيانات وغيرها من نظم المعلومات والأجهزة والنظم المعلوماتية تحقيقًا لغرض الضبط. 3- أن تأمر مقدم الخدمة بتسليم ما لديه من بيانات أو معلومات تتعلق بنظام معلوماتى أو جهاز تقنى موجودة تحت سيطرته أو مخزنة لديه، وكذلك بيانات مستخدمى خدمته وحركة الاتصالات التى تمت على ذلك النظام أو الجهاز التقنى. وفى كل الأحوال، يجب أن يكون أمر جهة التحقيق المختصة مسببًا. ويكون استئناف الأوامر المتقدمة أمام المحكمة الجنائية المختصة منعقدة فى غرفة المشورة فى المواعيد ووفقًا للإجراءات المقررة بقانون الإجراءات الجنائية.",
|
| 105 |
+
"simplified_summary": "تجيز المادة لجهة التحقيق إصدار أوامر مؤقتة مسببـة لمدة تصل إلى 30 يومًا قابلة للتجديد مرة واحدة لضبط البيانات والأنظمة وتتبعها، والبحث والتفتيش والدخول إلى البرامج وقواعد البيانات، وإلزام مقدم الخدمة بتسليم البيانات وبيانات المستخدمين وحركة الاتصالات، مع إمكانية استئناف الأوامر أمام المحكمة المختصة.",
|
| 106 |
+
"keywords": [
|
| 107 |
+
"أوامر قضائية مؤقتة",
|
| 108 |
+
"الضبط والتحفظ",
|
| 109 |
+
"التفتيش والدخول",
|
| 110 |
+
"تسليم البيانات",
|
| 111 |
+
"حركة الاتصالات",
|
| 112 |
+
"استئناف الأوامر"
|
| 113 |
+
],
|
| 114 |
+
"cross_references": [],
|
| 115 |
+
"legal_nature": "إجراء قضائي"
|
| 116 |
+
},
|
| 117 |
+
{
|
| 118 |
+
"article_id": "EG-TECH-ART-007",
|
| 119 |
+
"article_number": "7",
|
| 120 |
+
"part (Bab)": "الباب الثاني: الأحكام والقواعد الإجرائية",
|
| 121 |
+
"chapter (Fasl)": "الإجراءات والقرارات في شأن طلبات حجب المواقع",
|
| 122 |
+
"original_text": "متى قامت أدلة على قيام موقع يُبث داخل الدولة أو خارجها بوضع أى عبارات أو أرقام أو صور أو أفلام أو أى مواد دعائية أو ما فى حكمها بما يُعد جريمة من الجرائم المنصوص عليها فى القانون، وتشكل تهديدًا للأمن القومى أو تعرض أمن البلاد أو اقتصادها القومى للخطر، جاز لجهة التحقيق المختصة أن تأمر بحجب الموقع أو المواقع محل البث كلما أمكن تحقيق ذلك فنيًا. وعلى جهة التحقيق عرض أمر الحجب على المحكمة المختصة منعقدة فى غرفة المشورة خلال أربع وعشرين ساعة مشفوعًا بمذكرة برأيها، وتصدر المحكمة قرارها مسببًا بالقبول أو الرفض خلال مدة لا تجاوز اثنتين وسبعين ساعة من وقت عرضها عليها. وفى حالة الاستعجال لوجود خطر حال أو وشيك الوقوع يجوز لجهات التحرى والضبط المختصة إبلاغ الجهاز ليقوم بإخطار مقدم الخدمة فورًا بالحجب المؤقت للموقع أو المحتوى أو المواقع أو الروابط المذكورة فى الفقرة الأولى وفقًا لأحكام هذه المادة، ويلتزم مقدم الخدمة بتنفيذ مضمون الإخطار فور وروده إليه. وعلى جهة التحرى والضبط التى قامت بالإبلاغ أن تحرر محضرًا تثبت فيه ما تم من إجراءات وفق أحكام الفقرة السابقة يُعرض على جهات التحقيق خلال ثمانٍ وأربعين ساعة من تاريخ الإبلاغ الذى وجهته للجهاز، وتتبع فى هذا المحضر ذات الإجراءات المبينة بالفقرة الثانية من هذه المادة، وتصدر المحكمة المختصة قرارها فى هذه الحالة إما بتأييد ما تم من إجراءات حجب أو بوقفه. فإذا لم يُعرض المحضر المشار إليه فى الفقرة السابقة فى الموعد المحدد، عُد الحجب الذى تم كأن لم يكن. ولمحكمة الموضوع أثناء نظر الدعوى أو بناءً على طلب جهة التحقيق أو الجهاز أو ذوى الشأن أن تأمر بإنهاء القرار الصادر بالحجب أو تعديل نطاقه. وفى جميع الأحوال يسقط القرار الصادر بالحجب بصدور أمر بألا وجه لإقامة الدعوى الجنائية أو بصدور حكم نهائى فيها بالبراءة.",
|
| 123 |
+
"simplified_summary": "تنظم المادة إجراءات حجب المواقع المرتبطة بجرائم تقنية المعلومات التي تهدد الأمن القومي، بما يشمل أمر الحجب القضائي وعرضه على المحكمة خلال مدد محددة، والحجب المؤقت في حالات الاستعجال مع تحرير محضر وعرضه على التحقيق، وإمكانية إنهاء الحجب أو تعديل نطاقه، وسقوط قرار الحجب بقرار عدم إقامة الدعوى أو حكم البراءة.",
|
| 124 |
+
"keywords": [
|
| 125 |
+
"حجب المواقع",
|
| 126 |
+
"الأمن القومي",
|
| 127 |
+
"الحجب المؤقت",
|
| 128 |
+
"غرفة المشورة",
|
| 129 |
+
"مقدم الخدمة",
|
| 130 |
+
"إجراءات الحجب"
|
| 131 |
+
],
|
| 132 |
+
"cross_references": [
|
| 133 |
+
"المادة 8"
|
| 134 |
+
],
|
| 135 |
+
"legal_nature": "إجراء قضائي"
|
| 136 |
+
},
|
| 137 |
+
{
|
| 138 |
+
"article_id": "EG-TECH-ART-008",
|
| 139 |
+
"article_number": "8",
|
| 140 |
+
"part (Bab)": "الباب الثاني: الأحكام والقواعد الإجرائية",
|
| 141 |
+
"chapter (Fasl)": "التظلم من قرارات حجب المواقع",
|
| 142 |
+
"original_text": "لكل من صدر ضده أمر قضائى بالحجب المنصوص عليه بالمادة (7) من هذا القانون، وللنيابة العامة ولجهة التحقيق المختصة ولكل ذى شأن أن يتظلم من الأمر أو من إجراءات تنفيذه أمام محكمة الجنايات المختصة، بعد انقضاء سبعة أيام من تاريخ صدور الأمر أو من تاريخ تنفيذه حسب الأحوال، فإذا رُفض تظلمه فله أن يتقدم بتظلم جديد كلما انقضت ثلاثة أشهر من تاريخ الحكم برفض التظلم. وفى جميع الأحوال يكون التظلم بتقرير يودع قلم كتاب محكمة الجنايات المختصة، وعلى رئيس المحكمة أن يحدد جلسة لنظر التظلم يُعلن بها المتظلم والجهاز وكل ذى شأن، وعلى المحكمة أن تفصل فى التظلم خلال مدة لا تجاوز سبعة أيام من تاريخ التقرير به.",
|
| 143 |
+
"simplified_summary": "تحدد المادة حق التظلم من أوامر الحجب أمام محكمة الجنايات المختصة بعد مرور سبعة أيام، مع إمكانية تجديد التظلم كل ثلاثة أشهر إذا رُفض، وإجراءات إيداع التظلم وتحديد جلسة والفصل فيه خلال سبعة أيام.",
|
| 144 |
+
"keywords": [
|
| 145 |
+
"التظلم",
|
| 146 |
+
"حجب المواقع",
|
| 147 |
+
"محكمة الجنايات",
|
| 148 |
+
"مواعيد التظلم"
|
| 149 |
+
],
|
| 150 |
+
"cross_references": [
|
| 151 |
+
"المادة 7"
|
| 152 |
+
],
|
| 153 |
+
"legal_nature": "إجراء قضائي"
|
| 154 |
+
},
|
| 155 |
+
{
|
| 156 |
+
"article_id": "EG-TECH-ART-009",
|
| 157 |
+
"article_number": "9",
|
| 158 |
+
"part (Bab)": "الباب الثاني: الأحكام والقواعد الإجرائية",
|
| 159 |
+
"chapter (Fasl)": "المنع من السفر",
|
| 160 |
+
"original_text": "يجوز للنائب العام أو من يفوضه من المحامين العامين الأولين بنيابات الاستئناف، ولجهات التحقيق المختصة، عند الضرورة أو عند وجود أدلة كافية على جدية الاتهام فى ارتكاب جريمة من الجرائم المنصوص عليها فى هذا القانون أو الشروع فى ارتكابها، أن يأمر بمنع المتهم من السفر خارج البلاد أو بوضع اسمه على قوائم ترقب الوصول، بأمر مسبب لمدة محددة. ولمن صدر ضده أمر المنع من السفر أن يتظلم من هذا الأمر أمام محكمة الجنايات المختصة خلال خمسة عشر يومًا من تاريخ علمه به، فإذا رُفض تظلمه فله أن يتقدم بتظلم جديد كلما انقضت ثلاثة أشهر من تاريخ الحكم برفض التظلم. ويكون التظلم بتقرير يودع قلم كتاب محكمة الجنايات المختصة، وعلى رئيس المحكمة أن يحدد جلسة لنظر التظلم تُعلن بها النيابة العامة والمتظلم، وعلى المحكمة أن تفصل فى التظلم خلال مدة لا تجاوز خمسة عشر يومًا من تاريخ التقرير به بحكم مسبب بعد سماع أقوال المتظلم والنيابة العامة وجهة التحقيق المختصة بحسب الأحوال، ولها فى سبيل ذلك أن تتخذ ما تراه من إجراءات أو تحقيقات تراها لزومًا فى هذا الشأن. ويجوز للنيابة العامة وجهات التحقيق المختصة فى كل وقت العدول عن الأمر الصادر بالمنع من السفر أو تعديله برفع الاسم من قوائم المنع أو ترقب الوصول لمدة محددة إذا دعت الضرورة لذلك. وفى جميع الأحوال، ينتهى المنع من السفر بمرور سنة من تاريخ صدور الأمر، أو بصدور قرار بألا وجه لإقامة الدعوى الجنائية أو بصدور قرار نهائى بالبراءة، أيهما أقرب.",
|
| 161 |
+
"simplified_summary": "تجيز المادة إصدار أمر مسبب بمنع السفر أو إدراج الاسم على قوائم ترقب الوصول عند الضرورة أو وجود أدلة كافية، مع حق التظلم خلال 15 يومًا وتجديده كل ثلاثة أشهر، والفصل القضائي خلال 15 يومًا، وإمكانية العدول أو التعديل، وانتهاء المنع بعد سنة أو بقرار عدم إقامة الدعوى أو حكم البراءة.",
|
| 162 |
+
"keywords": [
|
| 163 |
+
"المنع من السفر",
|
| 164 |
+
"ترقب الوصول",
|
| 165 |
+
"التظلم",
|
| 166 |
+
"النائب العام",
|
| 167 |
+
"محكمة الجنايات"
|
| 168 |
+
],
|
| 169 |
+
"cross_references": [],
|
| 170 |
+
"legal_nature": "إجراء قضائي"
|
| 171 |
+
},
|
| 172 |
+
{
|
| 173 |
+
"article_id": "EG-TECH-ART-010",
|
| 174 |
+
"article_number": "10",
|
| 175 |
+
"part (Bab)": "الباب الثاني: الأحكام والقواعد الإجرائية",
|
| 176 |
+
"chapter (Fasl)": "الخبراء",
|
| 177 |
+
"original_text": "يُنشأ بالجهاز سجلان لقيد الخبراء؛ يُقيد بأولهما الفنيون والتقنيون العاملون بالجهاز، ويقيد بالآخر الخبراء من الفنيين والتقنيين من غير العاملين به. وتطبق على الخبراء فى ممارسة عملهم وتحديد التزاماتهم وحقوقهم القواعد والأحكام الخاصة بقواعد تنظيم الخبرة أمام جهات القضاء. واستثناءً من تلك القواعد، تسرى على الخبراء المقيدين بالسجل الثانى القواعد والأحكام الخاصة بالمساءلة الإدارية والتأديبية الواردة بالقانون المنظم لعملهم إن وُجد. وتحدد اللائحة التنفيذية لهذا القانون قواعد وشروط وإجراءات القيد فى كل من السجلين.",
|
| 178 |
+
"simplified_summary": "تنشئ المادة سجلين للخبراء بالجهاز (للعاملين وغير العاملين)، وتحدد خضوعهم لقواعد تنظيم الخبرة أمام القضاء، مع تطبيق قواعد المساءلة الإدارية والتأديبية للخبراء غير العاملين وفق قانونهم، وتُحال تفاصيل القيد إلى اللائحة التنفيذية.",
|
| 179 |
+
"keywords": [
|
| 180 |
+
"الخبراء",
|
| 181 |
+
"سجلات الخبراء",
|
| 182 |
+
"تنظيم الخبرة",
|
| 183 |
+
"المساءلة التأديبية",
|
| 184 |
+
"اللائحة التنفيذية"
|
| 185 |
+
],
|
| 186 |
+
"cross_references": [],
|
| 187 |
+
"legal_nature": "تنظيم مهني"
|
| 188 |
+
},
|
| 189 |
+
{
|
| 190 |
+
"article_id": "EG-TECH-ART-011",
|
| 191 |
+
"article_number": "11",
|
| 192 |
+
"part (Bab)": "الباب الثاني: الأحكام والقواعد الإجرائية",
|
| 193 |
+
"chapter (Fasl)": "الأدلة الرقمية",
|
| 194 |
+
"original_text": "يكون للأدلة المستمدة أو المستخرجة من الأجهزة أو المعدات أو الوسائط الدعامة الإلكترونية، أو من النظام المعلوماتى أو من برامج الحاسب، أو من أى وسيلة لتقنية المعلومات ذات قيمة وحجية الأدلة الجنائية المادية فى الإثبات الجنائى متى توافرت بها الشروط الفنية الواردة باللائحة التنفيذية لهذا القانون.",
|
| 195 |
+
"simplified_summary": "تمنح المادة للأدلة الرقمية المستخرجة من الأنظمة والأجهزة والوسائط الإلكترونية حجية الأدلة المادية في الإثبات الجنائي متى توافرت الشروط الفنية المح��دة باللائحة التنفيذية.",
|
| 196 |
+
"keywords": [
|
| 197 |
+
"الأدلة الرقمية",
|
| 198 |
+
"حجية الإثبات",
|
| 199 |
+
"الإثبات الجنائي",
|
| 200 |
+
"اللائحة التنفيذية"
|
| 201 |
+
],
|
| 202 |
+
"cross_references": [],
|
| 203 |
+
"legal_nature": "قاعدة إثبات"
|
| 204 |
+
},
|
| 205 |
+
{
|
| 206 |
+
"article_id": "EG-TECH-ART-012",
|
| 207 |
+
"article_number": "12",
|
| 208 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 209 |
+
"chapter (Fasl)": "أحكام عامة للعقوبات",
|
| 210 |
+
"original_text": "مع عدم الإخلال بأية عقوبة أشد منصوص عليها فى قانون العقوبات أو أى قانون آخر، ومع مراعاة أحكام قانون الطفل الصادر بالقانون رقم 12 لسنة 1996، يُعاقب على الجرائم التالية بالعقوبات المبينة قرين كل جريمة.",
|
| 211 |
+
"simplified_summary": "تقرر المادة تطبيق العقوبات المقررة في هذا القانون دون الإخلال بأي عقوبات أشد في قوانين أخرى، مع مراعاة قانون الطفل، وتبين أن لكل جريمة عقوبتها المحددة لاحقًا.",
|
| 212 |
+
"keywords": [
|
| 213 |
+
"العقوبات",
|
| 214 |
+
"قانون العقوبات",
|
| 215 |
+
"قانون الطفل",
|
| 216 |
+
"أحكام عامة"
|
| 217 |
+
],
|
| 218 |
+
"cross_references": [],
|
| 219 |
+
"legal_nature": "حكم تمهيدي"
|
| 220 |
+
},
|
| 221 |
+
{
|
| 222 |
+
"article_id": "EG-TECH-ART-013",
|
| 223 |
+
"article_number": "13",
|
| 224 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 225 |
+
"chapter (Fasl)": "الفصل الأول: الاعتداء على سلامة الشبكات والأنظمة وخدمات الاتصالات وتقنية المعلومات",
|
| 226 |
+
"original_text": "يُعاقب بالحبس مدة لا تقل عن ثلاثة أشهر وبغرامة لا تقل عن عشرة آلاف جنيه ولا تجاوز خمسين ألف جنيه، أو بإحدى هاتين العقوبتين، كل من انتفع دون وجه حق عن طريق شبكة النظام المعلوماتى أو إحدى وسائل تقنية المعلومات، بخدمة اتصالات أو خدمات قنوات البث المسموع والمرئى.",
|
| 227 |
+
"simplified_summary": "تجرم المادة الانتفاع غير المشروع بخدمات الاتصالات أو البث عبر الشبكات أو وسائل تقنية المعلومات، وتحدد عقوبة الحبس والغرامة.",
|
| 228 |
+
"keywords": [
|
| 229 |
+
"الانتفاع دون وجه حق",
|
| 230 |
+
"خدمات الاتصالات",
|
| 231 |
+
"البث المسموع والمرئي",
|
| 232 |
+
"شبكة النظام المعلوماتي"
|
| 233 |
+
],
|
| 234 |
+
"cross_references": [],
|
| 235 |
+
"legal_nature": "تجريم وعقوبة"
|
| 236 |
+
},
|
| 237 |
+
{
|
| 238 |
+
"article_id": "EG-TECH-ART-014",
|
| 239 |
+
"article_number": "14",
|
| 240 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 241 |
+
"chapter (Fasl)": "الفصل الأول: الاعتداء على سلامة الشبكات والأنظمة وخدمات الاتصالات وتقنية المعلومات",
|
| 242 |
+
"original_text": "يُعاقب بالحبس مدة لا تقل عن سنة وبغرامة لا تقل عن خمسين ألف جنيه ولا تجاوز مائة ألف جنيه، أو بإحدى هاتين العقوبتين، كل من دخل عمدًا أو بخطأ غير عمدى وبقى دون وجه حق على موقع أو حساب خاص أو نظام معلوماتى محظور الدخول عليه. فإذا نتج عن ذلك الدخول إتلاف أو محو أو تغيير أو نسخ أو إعادة نشر للبيانات أو المعلومات الموجودة على ذلك الموقع أو الحساب الخاص أو النظام المعلوماتى، تكون العقوبة الحبس مدة لا تقل عن سنتين وغرامة لا تقل عن مائة ألف جنيه ولا تجاوز مائتى ألف جنيه، أو بإحدى هاتين العقوبتين.",
|
| 243 |
+
"simplified_summary": "تجرم المادة الدخول غير المشروع إلى موقع أو حساب أو نظام معلوماتي محظور، وتغلظ العقوبة إذا نتج عن الدخول إتلاف أو محو أو تغيير أو نسخ أو إعادة نشر للبيانات.",
|
| 244 |
+
"keywords": [
|
| 245 |
+
"الدخول غير المشروع",
|
| 246 |
+
"حساب خاص",
|
| 247 |
+
"نظام معلوماتي",
|
| 248 |
+
"إتلاف البيانات",
|
| 249 |
+
"تشديد العقوبة"
|
| 250 |
+
],
|
| 251 |
+
"cross_references": [],
|
| 252 |
+
"legal_nature": "تجريم وعقوبة"
|
| 253 |
+
},
|
| 254 |
+
{
|
| 255 |
+
"article_id": "EG-TECH-ART-015",
|
| 256 |
+
"article_number": "15",
|
| 257 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 258 |
+
"chapter (Fasl)": "الفصل الأول: الاعتداء على سلامة الشبكات والأنظمة وخدمات الاتصالات وتقنية المعلومات",
|
| 259 |
+
"original_text": "يُعاقب بالحبس مدة لا تقل عن ستة أشهر وبغرامة لا تقل عن ثلاثين ألف جنيه ولا تجاوز خمسين ألف جنيه، أو بإحدى هاتين العقوبتين، كل من دخل إلى موقع أو حساب خاص أو نظام معلوماتى مستخدمًا حقًا مخولًا له فتعدى حدود هذا الحق من حيث الزمان أو مستوى الدخول.",
|
| 260 |
+
"simplified_summary": "تجرم المادة تجاوز حدود الحق الممنوح في الدخول إلى موقع أو حساب أو نظام معلوماتي، سواء من حيث مدة الدخول أو مستوى الصلاحيات.",
|
| 261 |
+
"keywords": [
|
| 262 |
+
"تجاوز حدود الحق",
|
| 263 |
+
"صلاحيات الدخول",
|
| 264 |
+
"نظام معلوماتي",
|
| 265 |
+
"حساب خاص"
|
| 266 |
+
],
|
| 267 |
+
"cross_references": [],
|
| 268 |
+
"legal_nature": "تجريم وعقوبة"
|
| 269 |
+
},
|
| 270 |
+
{
|
| 271 |
+
"article_id": "EG-TECH-ART-016",
|
| 272 |
+
"article_number": "16",
|
| 273 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 274 |
+
"chapter (Fasl)": "الفصل الأول: الاعتداء على سلامة الشبكات والأنظمة وخدمات الاتصالات وتقنية المعلومات",
|
| 275 |
+
"original_text": "يُعاقب بالحبس مدة لا تقل عن سنة وبغرامة لا تقل عن خمسين ألف جنيه ولا تجاوز مائتى وخمسين ألف جنيه، أو بإحدى هاتين العقوبتين، كل من اعترض دون وجه حق أى معلومات أو بيانات أو كل ما هو متداول عن طريق شبكة معلوماتية أو أحد أجهزة الحاسب الآلى وما فى حكمها.",
|
| 276 |
+
"simplified_summary": "تجرم المادة الاعتراض غير المشروع للمعلومات أو البيانات المتداولة عبر الشبكات أو أجهزة الحاسب، وتحدد عقوبة الحبس والغرامة.",
|
| 277 |
+
"keywords": [
|
| 278 |
+
"الاعتراض غير المشروع",
|
| 279 |
+
"الشبكة المعلوماتية",
|
| 280 |
+
"البيانات المتداولة",
|
| 281 |
+
"الحاسب الآلي"
|
| 282 |
+
],
|
| 283 |
+
"cross_references": [],
|
| 284 |
+
"legal_nature": "تجريم وعقوبة"
|
| 285 |
+
},
|
| 286 |
+
{
|
| 287 |
+
"article_id": "EG-TECH-ART-017",
|
| 288 |
+
"article_number": "17",
|
| 289 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 290 |
+
"chapter (Fasl)": "الفصل الأول: الاعتداء على سلامة الشبكات والأنظمة وخدمات الاتصالات وتقنية المعلومات",
|
| 291 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن سنتين وبغرامة لا تقل عن مائة ألف جنيه ولا تجاوز مائة وخمسين ألف جنيه، أو بإحدى هاتين العقوبتين، كل من أتلف أو عطل أو عدل مسار أو ألغى كليًا أو جزئيًا عمدًا وبدون وجه حق البرامج والبيانات أو المعلومات المخزنة أو المعالجة أو المولدة أو المخلقة على أى نظام معلوماتى أو ما فى حكمه، أيًا كانت الوسيلة التى استخدمت فى الجريمة.",
|
| 292 |
+
"simplified_summary": "تجرم المادة الاعتداء على سلامة البيانات والبرامج عبر الإتلاف أو التعطيل أو تغيير المسار أو الإلغاء الكلي أو الجزئي دون وجه حق لأي نظام معلوماتي، وتحدد العقوبة.",
|
| 293 |
+
"keywords": [
|
| 294 |
+
"سلامة البيانات",
|
| 295 |
+
"إتلاف",
|
| 296 |
+
"تعطيل",
|
| 297 |
+
"تعديل المسار",
|
| 298 |
+
"نظام معلوماتي"
|
| 299 |
+
],
|
| 300 |
+
"cross_references": [],
|
| 301 |
+
"legal_nature": "تجريم وعقوبة"
|
| 302 |
+
},
|
| 303 |
+
{
|
| 304 |
+
"article_id": "EG-TECH-ART-018",
|
| 305 |
+
"article_number": "18",
|
| 306 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 307 |
+
"chapter (Fasl)": "الفصل الأول: الاعتداء على سلامة الشبكات والأنظمة وخدمات الاتصالات وتقنية المعلومات",
|
| 308 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن شهر وبغرامة لا تقل عن خمسين ألف جنيه ولا تجاوز مائة ألف جنيه، أو بإحدى هاتين العقوبتين، كل من أتلف أو عطل أو أبطأ أو اخترق بريدًا إلكترونيًا أو موقعًا أو حسابًا خاصًا بأحد الناس. فإذا وقعت الجريمة على بريد إلكتروني أو موقع أو حساب خاص بأحد الأشخاص الاعتبارية الخاصة، تكون العقوبة الحبس مدة لا تقل عن ستة أشهر وغرامة لا تقل عن مائة ألف جنيه ولا تجاوز مائتى ألف جنيه، أو بإحدى هاتين العقوبتين.",
|
| 309 |
+
"simplified_summary": "تجرم المادة الاعتداء على البريد الإلكتروني أو المواقع أو الحسابات الخاصة بالإتلاف أو التعطيل أو الاختراق، وتشدد العقوبة إذا تعلق الأمر بشخص اعتباري خاص.",
|
| 310 |
+
"keywords": [
|
| 311 |
+
"البريد الإلكتروني",
|
| 312 |
+
"الحسابات الخاصة",
|
| 313 |
+
"الاختراق",
|
| 314 |
+
"إتلاف",
|
| 315 |
+
"تعطيل"
|
| 316 |
+
],
|
| 317 |
+
"cross_references": [],
|
| 318 |
+
"legal_nature": "تجريم وعقوبة"
|
| 319 |
+
},
|
| 320 |
+
{
|
| 321 |
+
"article_id": "EG-TECH-ART-019",
|
| 322 |
+
"article_number": "19",
|
| 323 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 324 |
+
"chapter (Fasl)": "الفصل الأول: الاعتداء على سلامة الشبكات والأنظمة وخدمات الاتصالات وتقنية المعلومات",
|
| 325 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن ثلاثة أشهر وبغرامة لا تقل عن عشرين ألف جنيه ولا تجاوز مائة ألف جنيه، أو بإحدى هاتين العقوبتين، كل من أتلف أو عطل أو أبطأ أو شوّه أو أخفى أو غيّر تصميمات موقع خاص بشركة أو مؤسسة أو منشأة أو شخص طبيعى بغير وجه حق.",
|
| 326 |
+
"simplified_summary": "تجرم المادة الاعتداء على تصميمات المواقع الخاصة بالشركات أو المؤسسات أو الأفراد عبر الإتلاف أو التعطيل أو التشويه أو الإخفاء أو التغيير دون حق.",
|
| 327 |
+
"keywords": [
|
| 328 |
+
"تصميم المواقع",
|
| 329 |
+
"إتلاف",
|
| 330 |
+
"تشويه",
|
| 331 |
+
"تغيير",
|
| 332 |
+
"موقع خاص"
|
| 333 |
+
],
|
| 334 |
+
"cross_references": [],
|
| 335 |
+
"legal_nature": "تجريم وعقوبة"
|
| 336 |
+
},
|
| 337 |
+
{
|
| 338 |
+
"article_id": "EG-TECH-ART-020",
|
| 339 |
+
"article_number": "20",
|
| 340 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 341 |
+
"chapter (Fasl)": "الفصل الأول: الاعتداء على سلامة الشبكات والأنظمة وخدمات الاتصالات وتقنية المعلومات",
|
| 342 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن سنتين وبغرامة لا تقل عن خمسين ألف جنيه ولا تجاوز مائتى ألف جنيه، أو بإحدى هاتين العقوبتين، كل من دخل عمدًا أو بخطأ غير عمدى وبقى دون وجه حق أو تجاوز حدود الحق المخول له من حيث الزمان أو مستوى الدخول أو اخترق موقعًا أو بريدًا إلكترونيًا أو حسابًا خاصًا أو نظامًا معلوماتيًا يُدار بمعرفة أو لحساب الدولة أو أحد الأشخاص الاعتبارية العامة أو مملوكًا لها أو يخصها. فإذا كان الدخول بقصد الاعتراض أو الحصول دون وجه حق على بيانات أو معلومات حكومية، تكون العقوبة السجن والغرامة التى لا تقل عن مائة ألف جنيه ولا تجاوز خمسمائة ألف جنيه. وفى جميع الأحوال، إذا ترتب على أى من الأفعال السابقة إتلاف تلك البيانات أو المعلومات أو تشويهها أو تغييرها أو تصميمها أو نسخها أو تسجيلها أو تعديل مسارها أو إعادة نشرها أو إلغاؤها كليًا أو جزئيًا، بأى وسيلة كانت، تكون العقوبة السجن والغرامة التى لا تقل عن مليون جنيه ولا تجاوز خمسة ملايين جنيه.",
|
| 343 |
+
"simplified_summary": "تجرم المادة الدخول غير المشروع أو تجاوز الصلاحيات أو اختراق الأنظمة والمواقع الحكومية، وتشدد العقوبة عند قصد الاعتراض أو الحصول على بيانات حكومية، وتغلظها أكثر إذا ترتب على الفعل إتلاف أو تغيير أو نشر البيانات.",
|
| 344 |
+
"keywords": [
|
| 345 |
+
"أنظمة حكومية",
|
| 346 |
+
"اختراق",
|
| 347 |
+
"بيانات حكومية",
|
| 348 |
+
"تشديد العقوبة",
|
| 349 |
+
"السجن"
|
| 350 |
+
],
|
| 351 |
+
"cross_references": [],
|
| 352 |
+
"legal_nature": "تجريم وعقوبة"
|
| 353 |
+
},
|
| 354 |
+
{
|
| 355 |
+
"article_id": "EG-TECH-ART-021",
|
| 356 |
+
"article_number": "21",
|
| 357 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 358 |
+
"chapter (Fasl)": "الفصل الأول: الاعتداء على سلامة الشبكات والأنظمة وخدمات الاتصالات وتقنية المعلومات",
|
| 359 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن ستة أشهر وبغرامة لا تقل عن مائة ألف جنيه ولا تجاوز مائة وخمسين ألف جنيه، أو بإحدى هاتين العقوبتين، كل من تسبب متعمدًا فى إيقاف شبكة معلوماتية عن العمل أو تعطيلها أو الحد من كفاءة عملها أو التشويش عليها أو إعاقتها أو اعتراض عملها أو أجرى دون وجه حق معالجة إلكترونية للبيانات الخاصة بها. ويعاقب كل من تسبب بخطئه فى ذلك بالحبس مدة لا تقل عن ثلاثة أشهر وبغرامة لا تقل عن خمسين ألف جنيه ولا تجاوز مائتى ألف جنيه، أو بإحدى العقوبتين. فإذا وقعت الجريمة على شبكة معلوماتية تخص الد��لة أو أحد الأشخاص الاعتبارية العامة أو تمتلكها أو تُدار بمعرفتها تكون العقوبة السجن المشدد والغرامة لا تقل عن خمسمائة ألف جنيه ولا تجاوز مليون جنيه.",
|
| 360 |
+
"simplified_summary": "تجرم المادة تعطيل الشبكات المعلوماتية أو التشويش عليها أو معالجة بياناتها دون حق، بعقوبات مشددة للتعمد ومخففة للخطأ، وتغلظ العقوبة إذا كانت الشبكة تخص الدولة أو جهة عامة.",
|
| 361 |
+
"keywords": [
|
| 362 |
+
"تعطيل الشبكات",
|
| 363 |
+
"التشويش",
|
| 364 |
+
"معالجة البيانات",
|
| 365 |
+
"شبكة الدولة",
|
| 366 |
+
"السجن المشدد"
|
| 367 |
+
],
|
| 368 |
+
"cross_references": [],
|
| 369 |
+
"legal_nature": "تجريم وعقوبة"
|
| 370 |
+
},
|
| 371 |
+
{
|
| 372 |
+
"article_id": "EG-TECH-ART-022",
|
| 373 |
+
"article_number": "22",
|
| 374 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 375 |
+
"chapter (Fasl)": "الفصل الأول: الاعتداء على سلامة الشبكات والأنظمة وخدمات الاتصالات وتقنية المعلومات",
|
| 376 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن سنتين وبغرامة لا تقل عن ثلاثمائة ألف جنيه ولا تجاوز خمسمائة ألف جنيه، أو بإحدى هاتين العقوبتين، كل من حاز أو أحرز أو جلب أو باع أو أتاح أو صنع أو أنتج أو استورد أو صدر أو تداول بأى صورة من صور التداول أى أجهزة أو معدات أو أدوات أو برامج مصممة أو مطورة أو محورة أو أكواد مرور أو شفرات أو رموز أو أى بيانات مماثلة دون تصريح صريح من الجهاز أو مسوغ من الواقع أو القانون، وثبت أن ذلك السلوك كان بغرض استخدام أى منها فى ارتكاب أية جريمة من الجرائم المنصوص عليها فى هذا القانون أو لإخفاء آثارها أو أدلتها أو لتسهيل ذلك الاستخدام أو الإخفاء.",
|
| 377 |
+
"simplified_summary": "تجرم المادة حيازة أو تصنيع أو تداول أدوات وبرامج أو أكواد مرور أو شفرات دون تصريح، إذا كان الغرض استخدامها في ارتكاب جرائم تقنية المعلومات أو إخفاء آثارها أو تسهيل ذلك.",
|
| 378 |
+
"keywords": [
|
| 379 |
+
"أدوات الاختراق",
|
| 380 |
+
"الأكواد والشفرات",
|
| 381 |
+
"حيازة",
|
| 382 |
+
"تداول",
|
| 383 |
+
"إخفاء الأدلة"
|
| 384 |
+
],
|
| 385 |
+
"cross_references": [],
|
| 386 |
+
"legal_nature": "تجريم وعقوبة"
|
| 387 |
+
},
|
| 388 |
+
{
|
| 389 |
+
"article_id": "EG-TECH-ART-023",
|
| 390 |
+
"article_number": "23",
|
| 391 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 392 |
+
"chapter (Fasl)": "الفصل الثاني: الجرائم المرتكبة بواسطة أنظمة وتقنيات المعلومات",
|
| 393 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن ثلاثة أشهر وبغرامة لا تقل عن ثلاثين ألف جنيه ولا تجاوز خمسين ألف جنيه، أو بإحدى هاتين العقوبتين، كل من استخدم الشبكة المعلوماتية أو إحدى وسائل تقنية المعلومات فى الوصول دون وجه حق إلى أرقام أو بيانات أو بطاقات البنوك والخدمات أو غيرها من أدوات الدفع الإلكترونية. فإن قصد من ذلك استخدامها فى الحصول على أموال الغير أو ما تتيحه من خدمات، يعاقب بالحبس مدة لا تقل عن ستة أشهر وبغرامة لا تقل عن خمسين ألف جنيه ولا تجاوز مائة ألف جنيه، أو بإحدى هاتين العقوبتين. وتكون العقوبة الحبس مدة لا تقل عن سنة وبغرامة لا تقل عن مائة ألف جنيه ولا تجاوز مائتى ألف جنيه، أو بإحدى هاتين العقوبتين إذا توصل من ذلك إلى الاستيلاء لنفسه أو لغيره على تلك الخدمات أو أموال الغير.",
|
| 394 |
+
"simplified_summary": "تجرم المادة الوصول غير المشروع إلى بيانات بطاقات البنوك وأدوات الدفع الإلكتروني، وتغلظ العقوبة إذا كان الهدف استخدامها للحصول على أموال الغير أو إذا تحقق الاستيلاء فعليًا.",
|
| 395 |
+
"keywords": [
|
| 396 |
+
"بطاقات البنوك",
|
| 397 |
+
"أدوات الدفع الإلكتروني",
|
| 398 |
+
"الاحتيال",
|
| 399 |
+
"الاستيلاء",
|
| 400 |
+
"الوصول غير المشروع"
|
| 401 |
+
],
|
| 402 |
+
"cross_references": [],
|
| 403 |
+
"legal_nature": "تجريم وعقوبة"
|
| 404 |
+
},
|
| 405 |
+
{
|
| 406 |
+
"article_id": "EG-TECH-ART-024",
|
| 407 |
+
"article_number": "24",
|
| 408 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 409 |
+
"chapter (Fasl)": "ال��صل الثاني: الجرائم المرتكبة بواسطة أنظمة وتقنيات المعلومات",
|
| 410 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن ثلاثة أشهر وبغرامة لا تقل عن عشرة آلاف جنيه ولا تجاوز ثلاثين ألف جنيه، أو بإحدى العقوبتين، كل من اصطنع بريدًا إلكترونيًا أو موقعًا أو حسابًا خاصًا ونسبه زورًا إلى شخص طبيعى أو اعتبارى. فإذا استخدم الجانى البريد أو الموقع أو الحساب الخاص المصطنع فى أمر يسىء إلى من نُسب إليه، تكون العقوبة الحبس الذى لا تقل مدته عن سنة والغرامة لا تقل عن خمسين ألف جنيه ولا تجاوز مائتى ألف جنيه، أو بإحدى هاتين العقوبتين. وإذا وقعت الجريمة على أحد الأشخاص الاعتبارية العامة تكون العقوبة السجن والغرامة التى لا تقل عن مائة ألف جنيه ولا تزيد على ثلاثمائة ألف جنيه.",
|
| 411 |
+
"simplified_summary": "تجرم المادة اصطنـاع بريد أو موقع أو حساب ونسبته زورًا للغير، وتشدد العقوبة إذا استُخدم للإساءة، وتغلظ أكثر إذا كان الضحية جهة اعتبارية عامة.",
|
| 412 |
+
"keywords": [
|
| 413 |
+
"اصطناع حسابات",
|
| 414 |
+
"انتحال الهوية",
|
| 415 |
+
"الإساءة",
|
| 416 |
+
"الجهات العامة"
|
| 417 |
+
],
|
| 418 |
+
"cross_references": [],
|
| 419 |
+
"legal_nature": "تجريم وعقوبة"
|
| 420 |
+
},
|
| 421 |
+
{
|
| 422 |
+
"article_id": "EG-TECH-ART-025",
|
| 423 |
+
"article_number": "25",
|
| 424 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 425 |
+
"chapter (Fasl)": "الفصل الثالث: الجرائم المتعلقة بالاعتداء على حرمة الحياة الخاصة والمحتوى المعلوماتى غير المشروع",
|
| 426 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن ستة أشهر وبغرامة لا تقل عن خمسين ألف جنيه ولا تجاوز مائة ألف جنيه، أو بإحدى هاتين العقوبتين، كل من اعتدى على أى من المبادئ أو القيم الأسرية فى المجتمع المصرى أو انتهك حرمة الحياة الخاصة، أو أرسل بكثافة العديد من الرسائل الإلكترونية لشخص معين دون موافقته، أو منح بيانات شخصية إلى نظام أو موقع إلكترونى للترويج للسلع أو الخدمات دون موافقته، أو نشر عن طريق الشبكة المعلوماتية أو إحدى وسائل تقنية المعلومات معلومات أو أخبارًا أو صورًا وما فى حكمها تنتهك خصوصية أى شخص دون رضاه سواء كانت المعلومات المنشورة صحيحة أو غير صحيحة.",
|
| 427 |
+
"simplified_summary": "تجرم المادة الاعتداء على القيم الأسرية أو الخصوصية عبر الرسائل الكثيفة دون موافقة، أو تسليم بيانات للترويج دون موافقة، أو نشر محتوى ينتهك الخصوصية سواء كان صحيحًا أو غير صحيح.",
|
| 428 |
+
"keywords": [
|
| 429 |
+
"الخصوصية",
|
| 430 |
+
"الرسائل الكثيفة",
|
| 431 |
+
"البيانات الشخصية",
|
| 432 |
+
"النشر الإلكتروني",
|
| 433 |
+
"القيم الأسرية"
|
| 434 |
+
],
|
| 435 |
+
"cross_references": [],
|
| 436 |
+
"legal_nature": "تجريم وعقوبة"
|
| 437 |
+
},
|
| 438 |
+
{
|
| 439 |
+
"article_id": "EG-TECH-ART-026",
|
| 440 |
+
"article_number": "26",
|
| 441 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 442 |
+
"chapter (Fasl)": "الفصل الثالث: الجرائم المتعلقة بالاعتداء على حرمة الحياة الخاصة والمحتوى المعلوماتى غير المشروع",
|
| 443 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن سنتين ولا تجاوز خمس سنوات وبغرامة لا تقل عن مائة ألف جنيه ولا تجاوز ثلاثمائة ألف جنيه، أو بإحدى هاتين العقوبتين، كل من تعمد استعمال برنامج معلوماتى أو تقنية معلوماتية فى معالجة معطيات شخصية للغير لربطها بمحتوى مناف للآداب العامة أو لإظهارها بطريقة من شأنها المساس باعتباره أو شرفه.",
|
| 444 |
+
"simplified_summary": "تجرم المادة إساءة استخدام برامج أو تقنيات لمعالجة بيانات شخصية وربطها بمحتوى منافٍ للآداب أو المساس بالشرف أو الاعتبار.",
|
| 445 |
+
"keywords": [
|
| 446 |
+
"البيانات الشخصية",
|
| 447 |
+
"المعالجة",
|
| 448 |
+
"المساس بالشرف",
|
| 449 |
+
"الآداب العامة"
|
| 450 |
+
],
|
| 451 |
+
"cross_references": [],
|
| 452 |
+
"legal_nature": "تجريم وعقوبة"
|
| 453 |
+
},
|
| 454 |
+
{
|
| 455 |
+
"article_id": "EG-TECH-ART-027",
|
| 456 |
+
"article_number": "27",
|
| 457 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 458 |
+
"chapter (Fasl)": "الفصل الرابع: الجرائم المرتكبة من مدير الموقع",
|
| 459 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن سنتين وبغرامة لا تقل عن مائة ألف جنيه ولا تزيد على ثلاثمائة ألف جنيه، أو بإحدى هاتين العقوبتين، كل من أنشأ أو أدار أو استخدم موقعًا أو حسابًا خاصًا على شبكة معلوماتية يهدف إلى ارتكاب أو تسهيل ارتكاب جريمة معاقب عليها قانونًا، وذلك فى غير الأحوال المنصوص عليها فى هذا القانون.",
|
| 460 |
+
"simplified_summary": "تجرم المادة إنشاء أو إدارة أو استخدام موقع أو حساب بهدف ارتكاب جريمة أو تسهيلها، مع تحديد عقوبة الحبس والغرامة.",
|
| 461 |
+
"keywords": [
|
| 462 |
+
"مدير الموقع",
|
| 463 |
+
"تسهيل الجريمة",
|
| 464 |
+
"موقع معلوماتي",
|
| 465 |
+
"حساب خاص"
|
| 466 |
+
],
|
| 467 |
+
"cross_references": [],
|
| 468 |
+
"legal_nature": "تجريم وعقوبة"
|
| 469 |
+
},
|
| 470 |
+
{
|
| 471 |
+
"article_id": "EG-TECH-ART-028",
|
| 472 |
+
"article_number": "28",
|
| 473 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 474 |
+
"chapter (Fasl)": "الفصل الرابع: الجرائم المرتكبة من مدير الموقع",
|
| 475 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن ستة أشهر وبغرامة لا تقل عن عشرين ألف جنيه ولا تجاوز مائتى ألف جنيه، أو بإحدى هاتين العقوبتين، كل مسئول عن إدارة موقع أو حساب خاص أو بريد إلكترونى أو نظام معلوماتى إذا أخفى أو عبث بالأدلة الرقمية لإحدى الجرائم المنصوص عليها فى هذا القانون والتى وقعت على موقع أو حساب أو بريد إلكترونى بقصد إعاقة عمل الجهات الرسمية المختصة.",
|
| 476 |
+
"simplified_summary": "تجرم المادة إخفاء أو العبث بالأدلة الرقمية من قبل مدير موقع أو حساب أو بريد إلكتروني بقصد إعاقة عمل الجهات الرسمية.",
|
| 477 |
+
"keywords": [
|
| 478 |
+
"الأدلة الرقمية",
|
| 479 |
+
"إعاقة الجهات الرسمية",
|
| 480 |
+
"مدير الموقع",
|
| 481 |
+
"إخفاء الأدلة"
|
| 482 |
+
],
|
| 483 |
+
"cross_references": [],
|
| 484 |
+
"legal_nature": "تجريم وعقوبة"
|
| 485 |
+
},
|
| 486 |
+
{
|
| 487 |
+
"article_id": "EG-TECH-ART-029",
|
| 488 |
+
"article_number": "29",
|
| 489 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 490 |
+
"chapter (Fasl)": "الفصل الرابع: الجرائم المرتكبة من مدير الموقع",
|
| 491 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن سنة وبغرامة لا تقل عن عشرين ألف جنيه ولا تجاوز مائتى ألف جنيه، أو بإحدى هاتين العقوبتين، كل مسئول عن إدارة الموقع أو الحساب الخاص أو البريد الإلكترونى أو النظام المعلوماتى عرض أىًّا منهم لإحدى الجرائم المنصوص عليها فى هذا القانون. ويعاقب بالحبس مدة لا تقل عن ستة أشهر وبغرامة لا تقل عن عشرة آلاف جنيه ولا تجاوز مائة ألف جنيه، أو بإحدى هاتين العقوبتين، كل مسئول عن إدارة الموقع أو الحساب الخاص أو البريد الإلكترونى أو النظام المعلوماتى تسبب بإهماله فى تعرض أىٍّ منهم لإحدى الجرائم المنصوص عليها فى هذا القانون وكان ذلك بعدم اتخاذ التدابير والاحتياطات التأمينية الواردة فى اللائحة التنفيذية لهذا القانون.",
|
| 492 |
+
"simplified_summary": "تجرم المادة مسؤولية مدير الموقع أو الحساب أو البريد الإلكتروني عن تعريضها للجرائم المنصوص عليها، وتقرر عقوبة أخف في حالة الإهمال لعدم اتخاذ التدابير التأمينية.",
|
| 493 |
+
"keywords": [
|
| 494 |
+
"مسؤولية مدير الموقع",
|
| 495 |
+
"الإهمال",
|
| 496 |
+
"التدابير التأمينية",
|
| 497 |
+
"تعريض الموقع للجريمة"
|
| 498 |
+
],
|
| 499 |
+
"cross_references": [],
|
| 500 |
+
"legal_nature": "تجريم وعقوبة"
|
| 501 |
+
},
|
| 502 |
+
{
|
| 503 |
+
"article_id": "EG-TECH-ART-030",
|
| 504 |
+
"article_number": "30",
|
| 505 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 506 |
+
"chapter (Fasl)": "الفصل الخامس: المسؤولية الجنائية لمقدمي الخدمة",
|
| 507 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن سنة وبغرامة لا تقل عن خمسمائة ألف جنيه ولا تجاوز مليون جنيه، أو بإحدى هاتين العقوبتين، كل مقدم خدمة امتنع عن تنفيذ القرار الصادر من المحكمة الجنائية المختصة بحجب أحد المواقع أو الروابط أو المحتوى المشار إليه فى الفقرة الأولى من المادة (7) من هذا القانون. فإذا ترتب على الامتناع عن تنفيذ القرار الصادر من المحكمة وفاة شخص أو أكثر، أو الإضرار بالأمن القومى، تكون العقوبة السجن المشدد والغرامة التى لا تقل عن ثلاثة ملايين جنيه ولا تجاوز عشرين مليون جنيه، وتقضى المحكمة فضلًا عن ذلك بإلغاء ترخيص مزاولة النشاط.",
|
| 508 |
+
"simplified_summary": "تقرر المادة مسؤولية مقدم الخدمة عن الامتناع عن تنفيذ قرار حجب صادر من المحكمة، مع تشديد العقوبة إلى السجن المشدد والغرامة الكبيرة وإلغاء الترخيص إذا ترتب على الامتناع وفاة أو ضرر بالأمن القومي.",
|
| 509 |
+
"keywords": [
|
| 510 |
+
"مقدم الخدمة",
|
| 511 |
+
"تنفيذ قرار الحجب",
|
| 512 |
+
"الأمن القومي",
|
| 513 |
+
"إلغاء الترخيص",
|
| 514 |
+
"السجن المشدد"
|
| 515 |
+
],
|
| 516 |
+
"cross_references": [
|
| 517 |
+
"المادة 7"
|
| 518 |
+
],
|
| 519 |
+
"legal_nature": "تجريم وعقوبة"
|
| 520 |
+
},
|
| 521 |
+
{
|
| 522 |
+
"article_id": "EG-TECH-ART-031",
|
| 523 |
+
"article_number": "31",
|
| 524 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 525 |
+
"chapter (Fasl)": "الفصل الخامس: المسؤولية الجنائية لمقدمي الخدمة",
|
| 526 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن سنة وبغرامة لا تقل عن خمسة آلاف جنيه ولا تجاوز عشرين ألف جنيه، أو بإحدى هاتين العقوبتين، كل مقدم خدمة خالف الأحكام الواردة بالبند (2) من الفقرة أولًا من المادة (2) من هذا القانون، وتتعدد عقوبة الغرامة بتعدد المجنى عليهم من مستخدمى الخدمة.",
|
| 527 |
+
"simplified_summary": "تقرر المادة عقوبة مخالفة مقدم الخدمة لواجب السرية وعدم الإفشاء المنصوص عليه بالمادة (2/أولًا/2)، مع تعدد الغرامة بتعدد المجني عليهم.",
|
| 528 |
+
"keywords": [
|
| 529 |
+
"مقدم الخدمة",
|
| 530 |
+
"سرية البيانات",
|
| 531 |
+
"المادة 2",
|
| 532 |
+
"تعدد الغرامة"
|
| 533 |
+
],
|
| 534 |
+
"cross_references": [
|
| 535 |
+
"المادة 2"
|
| 536 |
+
],
|
| 537 |
+
"legal_nature": "تجريم وعقوبة"
|
| 538 |
+
},
|
| 539 |
+
{
|
| 540 |
+
"article_id": "EG-TECH-ART-032",
|
| 541 |
+
"article_number": "32",
|
| 542 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 543 |
+
"chapter (Fasl)": "الفصل الخامس: المسؤولية الجنائية لمقدمي الخدمة",
|
| 544 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن ستة أشهر وبغرامة لا تقل عن عشرين ألف جنيه ولا تجاوز مائة ألف جنيه، أو بإحدى هاتين العقوبتين، كل مقدم خدمة امتنع عن تنفيذ القرار الصادر من جهة التحقيق المختصة بتسليم ما لديه من البيانات أو المعلومات المشار إليها فى المادة (6) من هذا القانون.",
|
| 545 |
+
"simplified_summary": "تقرر المادة عقوبة امتناع مقدم الخدمة عن تسليم البيانات والمعلومات المطلوبة بقرار من جهة التحقيق وفق المادة (6).",
|
| 546 |
+
"keywords": [
|
| 547 |
+
"مقدم الخدمة",
|
| 548 |
+
"تسليم البيانات",
|
| 549 |
+
"جهة التحقيق",
|
| 550 |
+
"المادة 6"
|
| 551 |
+
],
|
| 552 |
+
"cross_references": [
|
| 553 |
+
"المادة 6"
|
| 554 |
+
],
|
| 555 |
+
"legal_nature": "تجريم وعقوبة"
|
| 556 |
+
},
|
| 557 |
+
{
|
| 558 |
+
"article_id": "EG-TECH-ART-033",
|
| 559 |
+
"article_number": "33",
|
| 560 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 561 |
+
"chapter (Fasl)": "الفصل الخامس: المسؤولية الجنائية لمقدمي الخدمة",
|
| 562 |
+
"original_text": "1- يعاقب بغرامة لا تقل عن خمسة ملايين جنيه ولا تجاوز عشرة ملايين جنيه، كل مقدم خدمة أخل بأى من التزاماته المنصوص عليها فى البند (1) من المادة (2) من هذا القانون، وتضاعف عقوبة الغرامة فى حالة العود، وللمحكمة أن تقضى بإلغاء الترخيص. 2- ويعاقب بغرامة لا تقل عن عشرين ألف جنيه ولا تجاوز مائتى ألف جنيه، كل مقدم خدمة خالف أحكام الفقرة (ثانيًا) و(رابعًا) من المادة (2) من هذا القانون. ويعاقب بالحبس مدة لا تقل عن ثلاثة أشهر وبالغرامة التى لا تقل عن مائتى ألف جنيه ولا تجاوز مليون جنيه، كل مقدم خدمة خالف أحكام الفقرة (ثالثًا) من المادة (2) م�� هذا القانون.",
|
| 563 |
+
"simplified_summary": "تحدد المادة جزاءات مالية جسيمة لإخلال مقدم الخدمة بالتزامات حفظ السجلات المنصوص عليها بالمادة (2/أولًا/1)، مع مضاعفة الغرامة وإمكانية إلغاء الترخيص، وغرامات لمخالفة الفقرتين (ثانيًا) و(رابعًا)، وعقوبة حبس وغرامة لمخالفة الفقرة (ثالثًا).",
|
| 564 |
+
"keywords": [
|
| 565 |
+
"مقدم الخدمة",
|
| 566 |
+
"التزامات الحفظ",
|
| 567 |
+
"إلغاء الترخيص",
|
| 568 |
+
"غرامات",
|
| 569 |
+
"المادة 2"
|
| 570 |
+
],
|
| 571 |
+
"cross_references": [
|
| 572 |
+
"المادة 2"
|
| 573 |
+
],
|
| 574 |
+
"legal_nature": "تجريم وعقوبة"
|
| 575 |
+
},
|
| 576 |
+
{
|
| 577 |
+
"article_id": "EG-TECH-ART-034",
|
| 578 |
+
"article_number": "34",
|
| 579 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 580 |
+
"chapter (Fasl)": "الفصل السادس: الظروف المشددة في الجريمة",
|
| 581 |
+
"original_text": "إذا وقعت أى جريمة من الجرائم المنصوص عليها فى هذا القانون بغرض الإخلال بالنظام العام أو تعريض سلامة المجتمع وأمنه للخطر أو الإضرار بالأمن القومى للبلاد أو بمركزها الاقتصادى أو منع أو عرقلة ممارسة السلطات العامة لأعمالها أو تعطيل أحكام الدستور أو القوانين أو اللوائح أو الإضرار بالوحدة الوطنية والسلام الاجتماعى تكون العقوبة السجن المشدد.",
|
| 582 |
+
"simplified_summary": "تقرر المادة ظرفًا مشددًا يُغلّظ العقوبة إلى السجن المشدد إذا استهدفت الجريمة الإخلال بالنظام العام أو أمن المجتمع أو الأمن القومي أو تعطيل السلطات أو الدستور أو القوانين أو الإضرار بالوحدة الوطنية.",
|
| 583 |
+
"keywords": [
|
| 584 |
+
"ظروف مشددة",
|
| 585 |
+
"الأمن القومي",
|
| 586 |
+
"النظام العام",
|
| 587 |
+
"الوحدة الوطنية",
|
| 588 |
+
"السجن المشدد"
|
| 589 |
+
],
|
| 590 |
+
"cross_references": [],
|
| 591 |
+
"legal_nature": "ظرف مشدد"
|
| 592 |
+
},
|
| 593 |
+
{
|
| 594 |
+
"article_id": "EG-TECH-ART-035",
|
| 595 |
+
"article_number": "35",
|
| 596 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 597 |
+
"chapter (Fasl)": "الفصل السابع: المسؤولية الجنائية للشخص الاعتباري",
|
| 598 |
+
"original_text": "يعاقب بالحبس مدة لا تقل عن ثلاثة أشهر وبغرامة لا تقل عن ثلاثين ألف جنيه ولا تزيد على مائة ألف جنيه، أو بإحدى هاتين العقوبتين، كل مسئول عن الإدارة الفعلية لشخص اعتبارى إذا تعرض الموقع أو الحساب الخاص أو البريد الإلكترونى أو النظام المعلوماتى المخصص للكيان الذى يديره إلى جريمة من الجرائم المنصوص عليها فى هذا القانون، ولم يبلغ بذلك الجهات المختصة وقت علمه بالجريمة.",
|
| 599 |
+
"simplified_summary": "تقرر المادة مسؤولية المدير الفعلي للشخص الاعتباري إذا تعرضت أنظمته أو حساباته لجريمة ولم يبلغ الجهات المختصة عند العلم بها.",
|
| 600 |
+
"keywords": [
|
| 601 |
+
"الشخص الاعتباري",
|
| 602 |
+
"مسؤول الإدارة الفعلية",
|
| 603 |
+
"الإبلاغ",
|
| 604 |
+
"جريمة معلوماتية"
|
| 605 |
+
],
|
| 606 |
+
"cross_references": [],
|
| 607 |
+
"legal_nature": "تجريم وعقوبة"
|
| 608 |
+
},
|
| 609 |
+
{
|
| 610 |
+
"article_id": "EG-TECH-ART-036",
|
| 611 |
+
"article_number": "36",
|
| 612 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 613 |
+
"chapter (Fasl)": "الفصل السابع: المسؤولية الجنائية للشخص الاعتباري",
|
| 614 |
+
"original_text": "فى الأحوال التى ترتكب فيها أى من الجرائم المنصوص عليها فى هذا القانون باسم ولحساب الشخص الاعتبارى، يعاقب المسئول عن الإدارة الفعلية إذا ثبت علمه بالجريمة أو سهل ارتكابها تحقيقًا لمصلحة له أو لغيره بذات عقوبة الفاعل الأصلى. وللمحكمة أن تقضى بإيقاف ترخيص ممارسة الشخص الاعتبارى للنشاط مدة لا تزيد على سنة، ولها فى حالة العود أن تحكم بإلغاء الترخيص أو حل الشخص الاعتبارى بحسب الأحوال، ويتم نشر الحكم فى جريدتين يوميتين واسعتي الانتشار على نفقة الشخص الاعتبارى.",
|
| 615 |
+
"simplified_summary": "تقرر المادة مساءلة المدير الفعلي للشخص الاعتباري بعقوبة الفاعل الأصلي إذا علم بالجريمة أو سهّلها، مع جواز وقف الترخيص أو إلغائه أو حل الكيان عند العود، ونشر الحكم.",
|
| 616 |
+
"keywords": [
|
| 617 |
+
"الشخص الاعتباري",
|
| 618 |
+
"المسؤولية الجنائية",
|
| 619 |
+
"إيقاف الترخيص",
|
| 620 |
+
"حل الكيان",
|
| 621 |
+
"نشر الحكم"
|
| 622 |
+
],
|
| 623 |
+
"cross_references": [],
|
| 624 |
+
"legal_nature": "تجريم وعقوبة"
|
| 625 |
+
},
|
| 626 |
+
{
|
| 627 |
+
"article_id": "EG-TECH-ART-037",
|
| 628 |
+
"article_number": "37",
|
| 629 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 630 |
+
"chapter (Fasl)": "الفصل السابع: المسؤولية الجنائية للشخص الاعتباري",
|
| 631 |
+
"original_text": "فى تطبيق أحكام هذا القانون، لا يترتب على تقرير مسؤولية الإدارة الفعلية للشخص الاعتبارى استبعاد المسؤولية الجنائية للأشخاص الطبيعيين الفاعلين الأصليين أو الشركاء عن ذات الوقائع التى تقوم بها الجريمة.",
|
| 632 |
+
"simplified_summary": "تقرر المادة أن مسؤولية الشخص الاعتباري لا تعفي الفاعلين الأصليين أو الشركاء من المسؤولية الجنائية عن نفس الواقعة.",
|
| 633 |
+
"keywords": [
|
| 634 |
+
"الشخص الاعتباري",
|
| 635 |
+
"عدم الإعفاء",
|
| 636 |
+
"المسؤولية الجنائية",
|
| 637 |
+
"الفاعلون الأصليون"
|
| 638 |
+
],
|
| 639 |
+
"cross_references": [],
|
| 640 |
+
"legal_nature": "حكم توضيحي"
|
| 641 |
+
},
|
| 642 |
+
{
|
| 643 |
+
"article_id": "EG-TECH-ART-038",
|
| 644 |
+
"article_number": "38",
|
| 645 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 646 |
+
"chapter (Fasl)": "الفصل الثامن: العقوبات التبعية",
|
| 647 |
+
"original_text": "مع عدم الإخلال بحقوق الغير حسنى النية، على المحكمة فى حالة الحكم بالإدانة فى أى جريمة من الجرائم المنصوص عليها فى هذا القانون أن تقضى بمصادرة الأدوات والآلات والمعدات والأجهزة مما لا يجوز حيازته قانونًا أو غيرها مما يكون قد استخدم فى ارتكاب الجريمة أو سهّل أو ساهم فى ارتكابها. وفى الحالات التى يتعين لمزاولة النشاط فيها الحصول على ترخيص من إحدى الجهات الحكومية، وكان الشخص الاعتبارى المدان بأى جريمة منصوص عليها فى هذا القانون لم يحصل على الترخيص فيحكم فضلًا عن العقوبات المقررة بالإغلاق.",
|
| 648 |
+
"simplified_summary": "تقرر المادة المصادرة الإلزامية للأدوات المستخدمة في الجريمة، وتضيف عقوبة الإغلاق إذا كان النشاط يستلزم ترخيصًا ولم يحصل عليه الشخص الاعتباري المدان.",
|
| 649 |
+
"keywords": [
|
| 650 |
+
"المصادرة",
|
| 651 |
+
"العقوبات التبعية",
|
| 652 |
+
"الإغلاق",
|
| 653 |
+
"الترخيص"
|
| 654 |
+
],
|
| 655 |
+
"cross_references": [],
|
| 656 |
+
"legal_nature": "عقوبة تبعية"
|
| 657 |
+
},
|
| 658 |
+
{
|
| 659 |
+
"article_id": "EG-TECH-ART-039",
|
| 660 |
+
"article_number": "39",
|
| 661 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 662 |
+
"chapter (Fasl)": "الفصل الثامن: العقوبات التبعية",
|
| 663 |
+
"original_text": "للمحكمة إذا قضت بالإدانة على أحد الموظفين العموميين لارتكابه جريمة من الجرائم المنصوص عليها فى هذا القانون، وأثناء وبسبب أدائه لوظيفته، أن تقضى بعزله مؤقتًا من وظيفته، إلا فى الحالات المشار إليها فى المادة (34) من هذا القانون فيكون العزل العزل.",
|
| 664 |
+
"simplified_summary": "تجيز المادة عزل الموظف العام مؤقتًا عند الإدانة بجرائم هذا القانون أثناء وبسبب الوظيفة، مع الإحالة لحالات المادة (34) التي يترتب عليها العزل.",
|
| 665 |
+
"keywords": [
|
| 666 |
+
"عزل الموظف العام",
|
| 667 |
+
"العقوبات التبعية",
|
| 668 |
+
"المادة 34"
|
| 669 |
+
],
|
| 670 |
+
"cross_references": [
|
| 671 |
+
"المادة 34"
|
| 672 |
+
],
|
| 673 |
+
"legal_nature": "عقوبة تبعية"
|
| 674 |
+
},
|
| 675 |
+
{
|
| 676 |
+
"article_id": "EG-TECH-ART-040",
|
| 677 |
+
"article_number": "40",
|
| 678 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 679 |
+
"chapter (Fasl)": "الفصل التاسع: الشروع والإعفاء من العقوبة",
|
| 680 |
+
"original_text": "يعاقب كل من شرع فى ارتكاب الجرائم المنصوص عليها بالقانون بما لا يجاوز نصف الحد الأقصى للعقوبة المقررة للجريمة.",
|
| 681 |
+
"simplified_summary": "تقرر المادة عقوبة الشروع بما لا يجاوز نصف الحد الأقصى للعقوبة المقررة للجريمة.",
|
| 682 |
+
"keywords": [
|
| 683 |
+
"الشروع",
|
| 684 |
+
"نصف الحد الأقصى",
|
| 685 |
+
"العقوبة"
|
| 686 |
+
],
|
| 687 |
+
"cross_references": [],
|
| 688 |
+
"legal_nature": "حكم عام"
|
| 689 |
+
},
|
| 690 |
+
{
|
| 691 |
+
"article_id": "EG-TECH-ART-041",
|
| 692 |
+
"article_number": "41",
|
| 693 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 694 |
+
"chapter (Fasl)": "الفصل التاسع: الشروع والإعفاء من العقوبة",
|
| 695 |
+
"original_text": "يُعفى من العقوبات المقررة للجرائم المنصوص عليها فى هذا القانون، كل من بادر من الجناة أو الشركاء إلى إبلاغ السلطات القضائية أو السلطات العامة بما يعلمه عنها قبل البدء فى تنفيذ الجريمة وقبل كشفها. ويجوز للمحكمة الإعفاء من العقوبة أو التخفيف منها إذا حصل الإبلاغ بعد كشف الجريمة وقبل التصرف فى التحقيق فيها، إذا مكن الجانى أو الشريك فى أثناء التحقيق السلطات المختصة من القبض على مرتكبى الجريمة الآخرين، أو على ضبط الأموال موضوع الجريمة، أو أعان أثناء البحث والتحقيق على كشف الحقيقة فيها، أو على القبض على مرتكبى جريمة أخرى مماثلة لهذا النوع والخطورة. ولا يخل حكم هذه المادة بوجوب الحكم برد المال المتحصل من الجرائم المنصوص عليها بالقانون.",
|
| 696 |
+
"simplified_summary": "تقرر المادة الإعفاء أو التخفيف من العقوبة لمن يبادر بالإبلاغ قبل تنفيذ الجريمة أو قبل كشفها، وتجيز الإعفاء بعد الكشف إذا ساعد في القبض على الجناة أو ضبط الأموال أو كشف الحقيقة، مع وجوب رد المال المتحصل.",
|
| 697 |
+
"keywords": [
|
| 698 |
+
"الإعفاء من العقوبة",
|
| 699 |
+
"الإبلاغ",
|
| 700 |
+
"ضبط الأموال",
|
| 701 |
+
"كشف الحقيقة"
|
| 702 |
+
],
|
| 703 |
+
"cross_references": [],
|
| 704 |
+
"legal_nature": "إعفاء/تخفيف"
|
| 705 |
+
},
|
| 706 |
+
{
|
| 707 |
+
"article_id": "EG-TECH-ART-042",
|
| 708 |
+
"article_number": "42",
|
| 709 |
+
"part (Bab)": "الباب الثالث: الجرائم والعقوبات",
|
| 710 |
+
"chapter (Fasl)": "الفصل التاسع: الشروع والإعفاء من العقوبة",
|
| 711 |
+
"original_text": "قبل صيرورة الحكم باتًا، وفى أية حالة كانت عليها الدعوى الجنائية، يجوز للمتهم إثبات الصلح مع المجنى عليه أو وكيله الخاص أو خلفه العام أمام النيابة العامة أو المحكمة المختصة بحسب الأحوال وذلك فى الجنح المنصوص عليها فى المواد (14، 15، 16، 17، 18، 19، 23، 26، 28، 30، 31) من هذا القانون. ولا يُنتج إقرار المجنى عليه بالصلح المنصوص عليه بالفقرة السابقة أثره إلا باعتماده من الجهاز بالنسبة للجنح المنصوص عليها بالمواد (14، 17، 18، 23) من هذا القانون. كما لا يُقبل التصالح إلا من خلال الجهاز بخصوص الجنح المنصوص عليها بالمادتين (29، 35) من هذا القانون. ولا يسقط حق المتهم فى التصالح برفع الدعوى الجنائية إلى المحكمة المختصة إذا دفع ثلث الحد الأقصى للغرامة المقررة للجريمة أو قيمة الحد الأدنى أيهما أكثر، قبل صدور حكم نهائى فى الموضوع. وفى جميع الأحوال، يجب على المتهم الذى يرغب فى التصالح أن يسدد قبل رفع الدعوى الجنائية مبلغًا يعادل ضعف الحد الأقصى للغرامة المقررة للجريمة، ويكون السداد إلى خزينة المحكمة المختصة أو النيابة العامة بحسب الأحوال. ويترتب على الصلح انقضاء الدعوى الجنائية، ولا أثر للصلح على حقوق المضرور من الجريمة أو على الدعوى المدنية.",
|
| 712 |
+
"simplified_summary": "تنظم المادة نظام الصلح في بعض الجنح، ومواعيده وشروطه واعتماده من الجهاز في حالات معينة، واشتراط السداد قبل رفع الدعوى، مع أثر الصلح بانقضاء الدعوى الجنائية دون المساس بالحقوق المدنية.",
|
| 713 |
+
"keywords": [
|
| 714 |
+
"الصلح",
|
| 715 |
+
"الجنح",
|
| 716 |
+
"اعتماد الجهاز",
|
| 717 |
+
"انقضاء الدعوى",
|
| 718 |
+
"السداد"
|
| 719 |
+
],
|
| 720 |
+
"cross_references": [
|
| 721 |
+
"المادة 14",
|
| 722 |
+
"المادة 15",
|
| 723 |
+
"المادة 16",
|
| 724 |
+
"المادة 17",
|
| 725 |
+
"المادة 18",
|
| 726 |
+
"المادة 19",
|
| 727 |
+
"المادة 23",
|
| 728 |
+
"المادة 26",
|
| 729 |
+
"المادة 28",
|
| 730 |
+
"المادة 29",
|
| 731 |
+
"المادة 30",
|
| 732 |
+
"المادة 31",
|
| 733 |
+
"المادة 35"
|
| 734 |
+
],
|
| 735 |
+
"legal_nature": "إجراء/صلح"
|
| 736 |
+
},
|
| 737 |
+
{
|
| 738 |
+
"article_id": "EG-TECH-ART-043",
|
| 739 |
+
"article_number": "43",
|
| 740 |
+
"part (Bab)": "الباب الرابع: أحكام انتقالية وختامية",
|
| 741 |
+
"chapter (Fasl)": "غير محدد",
|
| 742 |
+
"original_text": "يلتزم مقدمو الخدمة والمخاطبون بأحكام القانون والتزاماته باتخاذ الإجراءات اللازمة لتقنين أوضاعهم خلال سنة من تاريخ العمل بهذا القانون.",
|
| 743 |
+
"simplified_summary": "تلزم المادة مقدمي الخدمة والمخاطبين بالقانون بتقنين أوضاعهم خلال سنة من تاريخ العمل به.",
|
| 744 |
+
"keywords": [
|
| 745 |
+
"أحكام انتقالية",
|
| 746 |
+
"تقنين الأوضاع",
|
| 747 |
+
"مقدمو الخدمة"
|
| 748 |
+
],
|
| 749 |
+
"cross_references": [],
|
| 750 |
+
"legal_nature": "حكم انتقالي"
|
| 751 |
+
},
|
| 752 |
+
{
|
| 753 |
+
"article_id": "EG-TECH-ART-044",
|
| 754 |
+
"article_number": "44",
|
| 755 |
+
"part (Bab)": "الباب الرابع: أحكام انتقالية وختامية",
|
| 756 |
+
"chapter (Fasl)": "غير محدد",
|
| 757 |
+
"original_text": "يُصدر السيد رئيس مجلس الوزراء اللائحة التنفيذية لهذا القانون خلال ثلاثة أشهر من تاريخ العمل به.",
|
| 758 |
+
"simplified_summary": "تُلزم المادة رئيس مجلس الوزراء بإصدار اللائحة التنفيذية خلال ثلاثة أشهر من تاريخ العمل بالقانون.",
|
| 759 |
+
"keywords": [
|
| 760 |
+
"اللائحة التنفيذية",
|
| 761 |
+
"رئيس مجلس الوزراء",
|
| 762 |
+
"مهلة ثلاثة أشهر"
|
| 763 |
+
],
|
| 764 |
+
"cross_references": [],
|
| 765 |
+
"legal_nature": "حكم ختامي"
|
| 766 |
+
},
|
| 767 |
+
{
|
| 768 |
+
"article_id": "EG-TECH-ART-045",
|
| 769 |
+
"article_number": "45",
|
| 770 |
+
"part (Bab)": "الباب الرابع: أحكام انتقالية وختامية",
|
| 771 |
+
"chapter (Fasl)": "غير محدد",
|
| 772 |
+
"original_text": "يُنشر هذا القانون فى الجريدة الرسمية، ويُعمل به من اليوم التالى لتاريخ نشره. ويُبصم هذا القانون بخاتم الدولة، ويُنفذ كقانون من قوانينها. صدر برئاسة الجمهورية فى 14 ذى الحجة 1439 هـ (الموافق 20 أغسطس 2018 م).",
|
| 773 |
+
"simplified_summary": "تنص المادة على نشر القانون والعمل به من اليوم التالي للنشر، وتذكر تاريخ صدوره وتوقيعه بخاتم الدولة.",
|
| 774 |
+
"keywords": [
|
| 775 |
+
"النشر",
|
| 776 |
+
"بدء العمل بالقانون",
|
| 777 |
+
"تاريخ الإصدار",
|
| 778 |
+
"الجريدة الرسمية"
|
| 779 |
+
],
|
| 780 |
+
"cross_references": [],
|
| 781 |
+
"legal_nature": "حكم ختامي"
|
| 782 |
+
}
|
| 783 |
+
]
|
| 784 |
+
}
|
| 785 |
+
|
| 786 |
+
|
| 787 |
+
]
|
data/قانون_الإجراءات_الجنائية.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
evaluation_results.json
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"metrics": {
|
| 3 |
+
"faithfulness": 0.8375,
|
| 4 |
+
"answer_relevancy": 0.4021723436510297,
|
| 5 |
+
"context_precision": 0.9999999999583333,
|
| 6 |
+
"context_recall": NaN },
|
| 7 |
+
"test_samples": 2,
|
| 8 |
+
"test_file": "test_dataset.json"
|
| 9 |
+
}
|
main.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import FastAPI,HTTPException
|
| 2 |
+
from fastapi.middleware.cors import CORSMiddleware
|
| 3 |
+
from models import AskRequest, AskResponse, SourceItem
|
| 4 |
+
from rag import ask
|
| 5 |
+
import traceback
|
| 6 |
+
|
| 7 |
+
app = FastAPI(title="Legal Assistant API")
|
| 8 |
+
|
| 9 |
+
# If you have a frontend on another port/domain
|
| 10 |
+
app.add_middleware(
|
| 11 |
+
CORSMiddleware,
|
| 12 |
+
allow_origins=["*"], # change to your frontend domain later
|
| 13 |
+
allow_credentials=True,
|
| 14 |
+
allow_methods=["*"],
|
| 15 |
+
allow_headers=["*"],
|
| 16 |
+
)
|
| 17 |
+
|
| 18 |
+
@app.get("/health")
|
| 19 |
+
def health():
|
| 20 |
+
return {"status": "ok"}
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
@app.post("/ask", response_model=AskResponse)
|
| 25 |
+
def ask_endpoint(payload: AskRequest):
|
| 26 |
+
try:
|
| 27 |
+
return ask(payload.question)
|
| 28 |
+
except Exception as e:
|
| 29 |
+
traceback.print_exc()
|
| 30 |
+
raise HTTPException(status_code=500, detail=str(e))
|
models.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pydantic import BaseModel
|
| 2 |
+
from typing import List, Optional, Dict, Any
|
| 3 |
+
|
| 4 |
+
class AskRequest(BaseModel):
|
| 5 |
+
question: str
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
class SourceItem(BaseModel):
|
| 9 |
+
article_number: Optional[str] = None
|
| 10 |
+
legal_nature: Optional[str] = None
|
| 11 |
+
keywords: Optional[str] = None
|
| 12 |
+
content: Optional[str] = None
|
| 13 |
+
metadata: Optional[Dict[str, Any]] = None
|
| 14 |
+
|
| 15 |
+
class ArticleItem(BaseModel):
|
| 16 |
+
law_key: Optional[str] = None
|
| 17 |
+
law_name: Optional[str] = None
|
| 18 |
+
article_number: Optional[str] = None
|
| 19 |
+
original_text: Optional[str] = None
|
| 20 |
+
simplified_summary: Optional[str] = None
|
| 21 |
+
legal_nature: Optional[str] = None
|
| 22 |
+
|
| 23 |
+
class AskResponse(BaseModel):
|
| 24 |
+
answer: Optional[str] = None
|
| 25 |
+
articles: Optional[List[ArticleItem]] = None
|
| 26 |
+
sources: List[SourceItem] = []
|
rag.py
ADDED
|
@@ -0,0 +1,396 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
import os
|
| 3 |
+
import re
|
| 4 |
+
import json
|
| 5 |
+
import logging
|
| 6 |
+
import warnings
|
| 7 |
+
from typing import Any, Dict, List, Tuple, Optional
|
| 8 |
+
|
| 9 |
+
from dotenv import load_dotenv
|
| 10 |
+
|
| 11 |
+
from langchain_core.documents import Document
|
| 12 |
+
from langchain_chroma import Chroma
|
| 13 |
+
from langchain_huggingface import HuggingFaceEmbeddings
|
| 14 |
+
|
| 15 |
+
from langchain_classic.retrievers.document_compressors import CrossEncoderReranker
|
| 16 |
+
from langchain_classic.retrievers import ContextualCompressionRetriever
|
| 17 |
+
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
|
| 18 |
+
|
| 19 |
+
from langchain_groq import ChatGroq
|
| 20 |
+
from langchain_core.prompts import ChatPromptTemplate
|
| 21 |
+
from langchain_core.output_parsers import StrOutputParser
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
# ----------------------------
|
| 25 |
+
# Global config
|
| 26 |
+
# ----------------------------
|
| 27 |
+
os.environ["TRANSFORMERS_NO_PROGRESS_BAR"] = "1"
|
| 28 |
+
warnings.filterwarnings("ignore")
|
| 29 |
+
|
| 30 |
+
logging.basicConfig(level=logging.INFO)
|
| 31 |
+
logger = logging.getLogger(__name__)
|
| 32 |
+
|
| 33 |
+
load_dotenv()
|
| 34 |
+
|
| 35 |
+
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
| 36 |
+
DATA_DIR = os.path.join(BASE_DIR, "data")
|
| 37 |
+
CHROMA_DIR = os.path.join(BASE_DIR, "chroma_db")
|
| 38 |
+
RERANKER_DIR = os.path.join(BASE_DIR, "reranker")
|
| 39 |
+
|
| 40 |
+
_qa_chain = None
|
| 41 |
+
_retriever = None
|
| 42 |
+
_vectorstore = None # keep a handle
|
| 43 |
+
_doc_store = None # article lookup store
|
| 44 |
+
|
| 45 |
+
|
| 46 |
+
# ----------------------------
|
| 47 |
+
# Helpers
|
| 48 |
+
# ----------------------------
|
| 49 |
+
def detect_law_key(question: str) -> Optional[str]:
|
| 50 |
+
q = (question or "").lower()
|
| 51 |
+
if "الدستور" in q:
|
| 52 |
+
return "egyptian_constitution"
|
| 53 |
+
if "الإجراءات الجنائية" in q:
|
| 54 |
+
return "criminal_law"
|
| 55 |
+
if "تقنية المعلومات" in q or "جرائم تقنية" in q:
|
| 56 |
+
return "tech_crimes"
|
| 57 |
+
if "قانون العمل" in q:
|
| 58 |
+
return "Egyptian_Labour_Law"
|
| 59 |
+
if "الأحوال الشخصية" in q:
|
| 60 |
+
return "personal_status"
|
| 61 |
+
if "القانون المدني" in q:
|
| 62 |
+
return "civil_law"
|
| 63 |
+
return None
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
def extract_article_number(question: str) -> Optional[str]:
|
| 67 |
+
"""Extracts the number from: المادة 1 / مادة رقم 1 / نص المادة 1 ..."""
|
| 68 |
+
if not question:
|
| 69 |
+
return None
|
| 70 |
+
m = re.search(r"(?:المادة|مادة)\s*(?:رقم\s*)?(\d+)", question)
|
| 71 |
+
return m.group(1) if m else None
|
| 72 |
+
|
| 73 |
+
|
| 74 |
+
def is_article_request(question: str) -> bool:
|
| 75 |
+
"""Heuristic: user wants the article text itself (not a general Q&A)."""
|
| 76 |
+
q = (question or "").strip()
|
| 77 |
+
triggers = ["نص", "اعرض", "اذكر", "مضمون", "ما مضمون", "ما هو مضمون", "ما نص"]
|
| 78 |
+
return (("المادة" in q) or ("مادة" in q)) and any(t in q for t in triggers)
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
def _load_json_folder(folder_path: str) -> List[dict]:
|
| 82 |
+
all_items: List[dict] = []
|
| 83 |
+
|
| 84 |
+
for filename in os.listdir(folder_path):
|
| 85 |
+
if not filename.lower().endswith(".json"):
|
| 86 |
+
continue
|
| 87 |
+
|
| 88 |
+
file_path = os.path.join(folder_path, filename)
|
| 89 |
+
with open(file_path, "r", encoding="utf-8") as f:
|
| 90 |
+
root = json.load(f)
|
| 91 |
+
|
| 92 |
+
# CASE 1: dict root
|
| 93 |
+
if isinstance(root, dict):
|
| 94 |
+
# accept law_key or law_id
|
| 95 |
+
law_key = root.get("law_key") or root.get("law_id")
|
| 96 |
+
law_name = root.get("law_name")
|
| 97 |
+
data = root.get("data", [])
|
| 98 |
+
|
| 99 |
+
if not law_key or not isinstance(data, list):
|
| 100 |
+
raise ValueError(f"{filename} missing law_key/law_id or data[]")
|
| 101 |
+
|
| 102 |
+
for item in data:
|
| 103 |
+
item["_law_key"] = law_key
|
| 104 |
+
item["_law_name"] = law_name
|
| 105 |
+
all_items.append(item)
|
| 106 |
+
|
| 107 |
+
# CASE 2: list root
|
| 108 |
+
elif isinstance(root, list):
|
| 109 |
+
inferred = os.path.splitext(filename)[0]
|
| 110 |
+
law_key = inferred
|
| 111 |
+
law_name = inferred
|
| 112 |
+
|
| 113 |
+
for item in root:
|
| 114 |
+
if not isinstance(item, dict):
|
| 115 |
+
continue
|
| 116 |
+
item["_law_key"] = law_key
|
| 117 |
+
item["_law_name"] = law_name
|
| 118 |
+
all_items.append(item)
|
| 119 |
+
else:
|
| 120 |
+
raise ValueError(f"{filename} root must be dict or list, got {type(root)}")
|
| 121 |
+
|
| 122 |
+
return all_items
|
| 123 |
+
|
| 124 |
+
|
| 125 |
+
# ----------------------------
|
| 126 |
+
# Chunking
|
| 127 |
+
# ----------------------------
|
| 128 |
+
def _split_text(text: str, chunk_size: int = 1200, overlap: int = 150) -> List[str]:
|
| 129 |
+
"""
|
| 130 |
+
Simple character-based chunking with overlap.
|
| 131 |
+
- chunk_size/overlap in characters
|
| 132 |
+
- keeps Arabic text safe
|
| 133 |
+
"""
|
| 134 |
+
text = (text or "").strip()
|
| 135 |
+
if not text:
|
| 136 |
+
return []
|
| 137 |
+
|
| 138 |
+
chunks = []
|
| 139 |
+
start = 0
|
| 140 |
+
n = len(text)
|
| 141 |
+
|
| 142 |
+
while start < n:
|
| 143 |
+
end = min(n, start + chunk_size)
|
| 144 |
+
|
| 145 |
+
# try to cut at a nicer boundary
|
| 146 |
+
boundary = max(text.rfind("\n", start, end), text.rfind("۔", start, end), text.rfind(".", start, end))
|
| 147 |
+
if boundary != -1 and boundary > start + int(chunk_size * 0.6):
|
| 148 |
+
end = boundary + 1
|
| 149 |
+
|
| 150 |
+
chunk = text[start:end].strip()
|
| 151 |
+
if chunk:
|
| 152 |
+
chunks.append(chunk)
|
| 153 |
+
|
| 154 |
+
if end == n:
|
| 155 |
+
break
|
| 156 |
+
start = max(0, end - overlap)
|
| 157 |
+
|
| 158 |
+
return chunks
|
| 159 |
+
|
| 160 |
+
|
| 161 |
+
def _build_documents(data: List[dict]) -> Tuple[List[Document], Dict[Tuple[str, str], Dict[str, Any]]]:
|
| 162 |
+
"""
|
| 163 |
+
Returns:
|
| 164 |
+
- chunked documents for vector search
|
| 165 |
+
- article store for exact article retrieval (law_key, article_number) -> article dict
|
| 166 |
+
"""
|
| 167 |
+
# unique articles
|
| 168 |
+
unique: Dict[str, dict] = {}
|
| 169 |
+
for item in data:
|
| 170 |
+
key = str(item.get("article_id") or item.get("article_number"))
|
| 171 |
+
unique[key] = item
|
| 172 |
+
|
| 173 |
+
chunk_docs: List[Document] = []
|
| 174 |
+
article_store: Dict[Tuple[str, str], Dict[str, Any]] = {}
|
| 175 |
+
|
| 176 |
+
for item in unique.values():
|
| 177 |
+
law_key = item["_law_key"]
|
| 178 |
+
law_name = item["_law_name"]
|
| 179 |
+
article_number = str(item.get("article_number", "")).strip()
|
| 180 |
+
|
| 181 |
+
original_text = item.get("original_text") or ""
|
| 182 |
+
simplified = item.get("simplified_summary") or ""
|
| 183 |
+
|
| 184 |
+
# store for exact retrieval (no LLM)
|
| 185 |
+
article_store[(law_key, article_number)] = {
|
| 186 |
+
"law_key": law_key,
|
| 187 |
+
"law_name": law_name,
|
| 188 |
+
"article_id": item.get("article_id"),
|
| 189 |
+
"article_number": article_number,
|
| 190 |
+
"original_text": original_text,
|
| 191 |
+
"simplified_summary": simplified,
|
| 192 |
+
"legal_nature": item.get("legal_nature", ""),
|
| 193 |
+
"keywords": item.get("keywords", []),
|
| 194 |
+
"part": item.get("part (Bab)") or item.get("part", ""),
|
| 195 |
+
"chapter": item.get("chapter (Fasl)") or item.get("chapter", ""),
|
| 196 |
+
"cross_references": item.get("cross_references", []),
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
# chunk the original text for better retrieval
|
| 200 |
+
chunks = _split_text(original_text, chunk_size=1200, overlap=150)
|
| 201 |
+
|
| 202 |
+
for i, ch in enumerate(chunks):
|
| 203 |
+
page_content = f"""[قانون: {law_name} | مادة: {article_number} | جزء: {i+1}/{len(chunks)}]
|
| 204 |
+
{ch}""".strip()
|
| 205 |
+
|
| 206 |
+
metadata = {
|
| 207 |
+
"law_key": law_key,
|
| 208 |
+
"law_name": law_name,
|
| 209 |
+
"article_id": item.get("article_id"),
|
| 210 |
+
"article_number": article_number,
|
| 211 |
+
"chunk_id": i,
|
| 212 |
+
"chunk_total": len(chunks),
|
| 213 |
+
"legal_nature": item.get("legal_nature", ""),
|
| 214 |
+
"keywords": ", ".join(item.get("keywords", [])),
|
| 215 |
+
"part": item.get("part (Bab)") or item.get("part", ""),
|
| 216 |
+
"chapter": item.get("chapter (Fasl)") or item.get("chapter", ""),
|
| 217 |
+
"cross_references": ", ".join([str(ref) for ref in item.get("cross_references", [])]),
|
| 218 |
+
# store short summary in metadata to help LLM answer
|
| 219 |
+
"simplified_summary": simplified,
|
| 220 |
+
}
|
| 221 |
+
|
| 222 |
+
chunk_docs.append(Document(page_content=page_content, metadata=metadata))
|
| 223 |
+
|
| 224 |
+
logger.info("Loaded %d articles, created %d chunks", len(unique), len(chunk_docs))
|
| 225 |
+
return chunk_docs, article_store
|
| 226 |
+
|
| 227 |
+
|
| 228 |
+
def _docs_to_context(docs: List[Document]) -> str:
|
| 229 |
+
parts = []
|
| 230 |
+
for d in docs:
|
| 231 |
+
num = d.metadata.get("article_number", "")
|
| 232 |
+
ck = d.metadata.get("chunk_id", 0)
|
| 233 |
+
parts.append(f"[المادة {num} | مقطع {ck}]\n{d.page_content.strip()}")
|
| 234 |
+
return "\n\n---\n\n".join(parts)
|
| 235 |
+
|
| 236 |
+
|
| 237 |
+
# ----------------------------
|
| 238 |
+
# Main initializer
|
| 239 |
+
# ----------------------------
|
| 240 |
+
def initialize_rag_pipeline():
|
| 241 |
+
global _retriever, _vectorstore, _doc_store
|
| 242 |
+
|
| 243 |
+
if not os.path.exists(DATA_DIR):
|
| 244 |
+
raise FileNotFoundError(f"Data folder not found: {DATA_DIR}")
|
| 245 |
+
if not os.path.exists(RERANKER_DIR):
|
| 246 |
+
raise FileNotFoundError(f"Reranker folder not found: {RERANKER_DIR}")
|
| 247 |
+
|
| 248 |
+
data = _load_json_folder(DATA_DIR)
|
| 249 |
+
docs, article_store = _build_documents(data)
|
| 250 |
+
|
| 251 |
+
_doc_store = article_store
|
| 252 |
+
|
| 253 |
+
embeddings = HuggingFaceEmbeddings(
|
| 254 |
+
model_name="Omartificial-Intelligence-Space/GATE-AraBert-v1",
|
| 255 |
+
model_kwargs={"trust_remote_code": True},
|
| 256 |
+
)
|
| 257 |
+
|
| 258 |
+
# load or build chroma
|
| 259 |
+
if os.path.exists(CHROMA_DIR) and os.listdir(CHROMA_DIR):
|
| 260 |
+
_vectorstore = Chroma(
|
| 261 |
+
persist_directory=CHROMA_DIR,
|
| 262 |
+
embedding_function=embeddings,
|
| 263 |
+
)
|
| 264 |
+
else:
|
| 265 |
+
_vectorstore = Chroma.from_documents(
|
| 266 |
+
docs, embeddings, persist_directory=CHROMA_DIR
|
| 267 |
+
)
|
| 268 |
+
|
| 269 |
+
# Retriever created dynamically per question (law-filtered)
|
| 270 |
+
def make_retriever(question: str):
|
| 271 |
+
law_key = detect_law_key(question)
|
| 272 |
+
search_kwargs = {"k": 20}
|
| 273 |
+
if law_key:
|
| 274 |
+
search_kwargs["filter"] = {"law_key": law_key}
|
| 275 |
+
|
| 276 |
+
base = _vectorstore.as_retriever(search_kwargs=search_kwargs)
|
| 277 |
+
|
| 278 |
+
cross_encoder = HuggingFaceCrossEncoder(model_name=RERANKER_DIR)
|
| 279 |
+
compressor = CrossEncoderReranker(model=cross_encoder, top_n=6)
|
| 280 |
+
|
| 281 |
+
return ContextualCompressionRetriever(
|
| 282 |
+
base_retriever=base,
|
| 283 |
+
base_compressor=compressor
|
| 284 |
+
)
|
| 285 |
+
|
| 286 |
+
_retriever = make_retriever
|
| 287 |
+
|
| 288 |
+
llm = ChatGroq(
|
| 289 |
+
groq_api_key=os.getenv("GROQ_API_KEY"),
|
| 290 |
+
model_name="llama-3.1-8b-instant",
|
| 291 |
+
temperature=0.2,
|
| 292 |
+
model_kwargs={"top_p": 0.9},
|
| 293 |
+
)
|
| 294 |
+
|
| 295 |
+
system_instructions = """
|
| 296 |
+
أنت مساعد قانوني مصري.
|
| 297 |
+
التزم بالنص الموجود في "السياق التشريعي المتاح" فقط.
|
| 298 |
+
- لا تضف أرقاماً/تعداداً/معلومات غير موجودة في السياق.
|
| 299 |
+
- إذا لم تجد إجابة في السياق قل: "لا يوجد في السياق نص كافٍ للإجابة".
|
| 300 |
+
""".strip()
|
| 301 |
+
|
| 302 |
+
prompt = ChatPromptTemplate.from_messages([
|
| 303 |
+
("system", system_instructions),
|
| 304 |
+
("system", "السياق التشريعي المتاح:\n{context}"),
|
| 305 |
+
("human", "سؤال المستفيد:\n{input}"),
|
| 306 |
+
])
|
| 307 |
+
|
| 308 |
+
qa_chain = prompt | llm | StrOutputParser()
|
| 309 |
+
logger.info("RAG pipeline initialized successfully.")
|
| 310 |
+
return qa_chain
|
| 311 |
+
|
| 312 |
+
|
| 313 |
+
# ----------------------------
|
| 314 |
+
# Public API
|
| 315 |
+
# ----------------------------
|
| 316 |
+
def get_chain():
|
| 317 |
+
global _qa_chain
|
| 318 |
+
if _qa_chain is None:
|
| 319 |
+
_qa_chain = initialize_rag_pipeline()
|
| 320 |
+
return _qa_chain
|
| 321 |
+
|
| 322 |
+
|
| 323 |
+
def ask(question: str) -> Dict[str, Any]:
|
| 324 |
+
"""
|
| 325 |
+
Returns a dict that matches your AskResponse:
|
| 326 |
+
{
|
| 327 |
+
"answer": str|None,
|
| 328 |
+
"articles": list|None,
|
| 329 |
+
"sources": [...]
|
| 330 |
+
}
|
| 331 |
+
"""
|
| 332 |
+
chain = get_chain()
|
| 333 |
+
retriever_factory = _retriever
|
| 334 |
+
|
| 335 |
+
# Always retrieve chunks for context + sources
|
| 336 |
+
retriever = retriever_factory(question)
|
| 337 |
+
docs = retriever.invoke(question) or []
|
| 338 |
+
|
| 339 |
+
# Build sources from retrieved chunks (dedupe by (law_key, article_number))
|
| 340 |
+
sources = []
|
| 341 |
+
seen = set()
|
| 342 |
+
for d in docs:
|
| 343 |
+
md = d.metadata
|
| 344 |
+
num = md.get("article_number")
|
| 345 |
+
key = (md.get("law_key"), num)
|
| 346 |
+
if key in seen:
|
| 347 |
+
continue
|
| 348 |
+
seen.add(key)
|
| 349 |
+
|
| 350 |
+
sources.append({
|
| 351 |
+
"article_number": num,
|
| 352 |
+
"legal_nature": md.get("legal_nature"),
|
| 353 |
+
"keywords": md.get("keywords"),
|
| 354 |
+
"content": d.page_content[:2000],
|
| 355 |
+
"metadata": md,
|
| 356 |
+
})
|
| 357 |
+
|
| 358 |
+
# ✅ ARTICLE MODE: return exact original_text from store, not LLM
|
| 359 |
+
# ✅ ARTICLE MODE: return exact original_text from JSON store (no LLM)
|
| 360 |
+
target_num = extract_article_number(question)
|
| 361 |
+
law_key = detect_law_key(question)
|
| 362 |
+
|
| 363 |
+
if target_num and law_key and is_article_request(question):
|
| 364 |
+
article = _doc_store.get((law_key, str(target_num)))
|
| 365 |
+
if article:
|
| 366 |
+
original_text = article.get("original_text", "").strip()
|
| 367 |
+
|
| 368 |
+
return {
|
| 369 |
+
"answer": original_text, # ✅ THIS is the key change
|
| 370 |
+
"articles": [{
|
| 371 |
+
"law_key": article.get("law_key"),
|
| 372 |
+
"law_name": article.get("law_name"),
|
| 373 |
+
"article_number": article.get("article_number"),
|
| 374 |
+
"original_text": original_text,
|
| 375 |
+
"simplified_summary": article.get("simplified_summary"),
|
| 376 |
+
"legal_nature": article.get("legal_nature"),
|
| 377 |
+
}],
|
| 378 |
+
"sources": sources
|
| 379 |
+
}
|
| 380 |
+
|
| 381 |
+
return {
|
| 382 |
+
"answer": "لم أجد نص المادة المطلوبة ضمن البيانات المتاحة حالياً.",
|
| 383 |
+
"articles": None,
|
| 384 |
+
"sources": sources
|
| 385 |
+
}
|
| 386 |
+
|
| 387 |
+
|
| 388 |
+
# ✅ NORMAL Q&A MODE (LLM grounded by context chunks)
|
| 389 |
+
context_text = _docs_to_context(docs)
|
| 390 |
+
answer = chain.invoke({"context": context_text, "input": question})
|
| 391 |
+
|
| 392 |
+
return {
|
| 393 |
+
"answer": answer,
|
| 394 |
+
"articles": None,
|
| 395 |
+
"sources": sources
|
| 396 |
+
}
|
rag_test_questions_100.json
ADDED
|
@@ -0,0 +1,1380 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_version": "1.0",
|
| 3 |
+
"dataset_version": "2026-02-03",
|
| 4 |
+
"created_at": "2026-02-03T19:15:30.097990+00:00",
|
| 5 |
+
"description": "Benchmark set for Egyptian legal RAG assistant: constitutional Qs + multi-law retrieval + procedural gating.",
|
| 6 |
+
"laws_in_scope": [
|
| 7 |
+
{
|
| 8 |
+
"key": "constitution",
|
| 9 |
+
"path": "/mnt/data/Egyptian_Constitution_legalnature_only.json"
|
| 10 |
+
},
|
| 11 |
+
{
|
| 12 |
+
"key": "criminal_procedure",
|
| 13 |
+
"path": "/mnt/data/قانون_الإجراءات_الجنائية.json"
|
| 14 |
+
},
|
| 15 |
+
{
|
| 16 |
+
"key": "tech_crimes",
|
| 17 |
+
"path": "/mnt/data/Technology Crimes Law.json"
|
| 18 |
+
},
|
| 19 |
+
{
|
| 20 |
+
"key": "labor",
|
| 21 |
+
"path": "/mnt/data/Egyptian_Labour_Law.json"
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"key": "personal_status",
|
| 25 |
+
"path": "/mnt/data/Egyptian_Personal Status Laws.json"
|
| 26 |
+
},
|
| 27 |
+
{
|
| 28 |
+
"key": "civil",
|
| 29 |
+
"path": "/mnt/data/Egyptian_Civil.json"
|
| 30 |
+
}
|
| 31 |
+
],
|
| 32 |
+
"defaults": {
|
| 33 |
+
"k": 15,
|
| 34 |
+
"rerank_top_n": 5,
|
| 35 |
+
"recall_k": 5,
|
| 36 |
+
"pass_rule": "pass if recall@k>=1 for questions with expected articles; else pass if answer startswith expected_answer_prefix (if provided)."
|
| 37 |
+
},
|
| 38 |
+
"cases": [
|
| 39 |
+
{
|
| 40 |
+
"id": "Q001",
|
| 41 |
+
"category": "constitutional",
|
| 42 |
+
"question": "ما مضمون المادة 1 من الدستور المصري؟",
|
| 43 |
+
"expected": {
|
| 44 |
+
"law": "constitution",
|
| 45 |
+
"expected_article_numbers": [
|
| 46 |
+
"1"
|
| 47 |
+
],
|
| 48 |
+
"must_cite_articles": true,
|
| 49 |
+
"answer_should_not_add_external_info": true
|
| 50 |
+
},
|
| 51 |
+
"notes": "جمهورية مصر العربية دولة ذات سيادة، موحدة لا تقبل التجزئة، نظامها جمهوري ديمقراطي يقوم على المواطنة وسيادة القانون. الشعب المصري جزء من الأمة العربية والعالم الإسلامي والقارة الأفريقية."
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"id": "Q002",
|
| 55 |
+
"category": "constitutional",
|
| 56 |
+
"question": "ما مضمون المادة 2 من الدستور المصري؟",
|
| 57 |
+
"expected": {
|
| 58 |
+
"law": "constitution",
|
| 59 |
+
"expected_article_numbers": [
|
| 60 |
+
"2"
|
| 61 |
+
],
|
| 62 |
+
"must_cite_articles": true,
|
| 63 |
+
"answer_should_not_add_external_info": true
|
| 64 |
+
},
|
| 65 |
+
"notes": "الإسلام دين الدولة، واللغة العربية لغتها الرسمية، ومبادئ الشريعة الإسلامية هي المصدر الرئيسي للتشريع."
|
| 66 |
+
},
|
| 67 |
+
{
|
| 68 |
+
"id": "Q003",
|
| 69 |
+
"category": "constitutional",
|
| 70 |
+
"question": "ما مضمون المادة 3 من الدستور المصري؟",
|
| 71 |
+
"expected": {
|
| 72 |
+
"law": "constitution",
|
| 73 |
+
"expected_article_numbers": [
|
| 74 |
+
"3"
|
| 75 |
+
],
|
| 76 |
+
"must_cite_articles": true,
|
| 77 |
+
"answer_should_not_add_external_info": true
|
| 78 |
+
},
|
| 79 |
+
"notes": "مبادئ شرائع المسيحيين واليهود هي المصدر الرئيسي لتشريعات أحوالهم الشخصية وشئونهم الدينية واختيار قياداتهم."
|
| 80 |
+
},
|
| 81 |
+
{
|
| 82 |
+
"id": "Q004",
|
| 83 |
+
"category": "constitutional",
|
| 84 |
+
"question": "ما مضمون المادة 4 من الدستور المصري؟",
|
| 85 |
+
"expected": {
|
| 86 |
+
"law": "constitution",
|
| 87 |
+
"expected_article_numbers": [
|
| 88 |
+
"4"
|
| 89 |
+
],
|
| 90 |
+
"must_cite_articles": true,
|
| 91 |
+
"answer_should_not_add_external_info": true
|
| 92 |
+
},
|
| 93 |
+
"notes": "السيادة للشعب وحده وهو مصدر السلطات، ويصون الوحدة الوطنية القائمة على المساواة والعدل وتكافؤ الفرص."
|
| 94 |
+
},
|
| 95 |
+
{
|
| 96 |
+
"id": "Q005",
|
| 97 |
+
"category": "constitutional",
|
| 98 |
+
"question": "ما مضمون المادة 5 من الدستور المصري؟",
|
| 99 |
+
"expected": {
|
| 100 |
+
"law": "constitution",
|
| 101 |
+
"expected_article_numbers": [
|
| 102 |
+
"5"
|
| 103 |
+
],
|
| 104 |
+
"must_cite_articles": true,
|
| 105 |
+
"answer_should_not_add_external_info": true
|
| 106 |
+
},
|
| 107 |
+
"notes": "يقوم النظام السياسي على التعددية السياسية والحزبية، والتداول السلمي للسلطة، والفصل بين السلطات، واحترام حقوق الإنسان."
|
| 108 |
+
},
|
| 109 |
+
{
|
| 110 |
+
"id": "Q006",
|
| 111 |
+
"category": "constitutional",
|
| 112 |
+
"question": "ما مضمون المادة 6 من الدستور المصري؟",
|
| 113 |
+
"expected": {
|
| 114 |
+
"law": "constitution",
|
| 115 |
+
"expected_article_numbers": [
|
| 116 |
+
"6"
|
| 117 |
+
],
|
| 118 |
+
"must_cite_articles": true,
|
| 119 |
+
"answer_should_not_add_external_info": true
|
| 120 |
+
},
|
| 121 |
+
"notes": "الجنسية حق لكل من يولد لأب مصري أو أم مصرية، ويكفل القانون الاعتراف القانوني به ومنحه أوراقاً رسمية، ويحدد شروط اكتساب الجنسية."
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"id": "Q007",
|
| 125 |
+
"category": "constitutional",
|
| 126 |
+
"question": "ما مضمون المادة 7 من الدستور المصري؟",
|
| 127 |
+
"expected": {
|
| 128 |
+
"law": "constitution",
|
| 129 |
+
"expected_article_numbers": [
|
| 130 |
+
"7"
|
| 131 |
+
],
|
| 132 |
+
"must_cite_articles": true,
|
| 133 |
+
"answer_should_not_add_external_info": true
|
| 134 |
+
},
|
| 135 |
+
"notes": "الأزهر الشريف هيئة مستقلة وهو المرجع الأساسي في العلوم الدينية. تلتزم الدولة بتمويله، وشيخ الأزهر مستقل ولا يمكن عزله."
|
| 136 |
+
},
|
| 137 |
+
{
|
| 138 |
+
"id": "Q008",
|
| 139 |
+
"category": "constitutional",
|
| 140 |
+
"question": "ما مضمون المادة 8 من الدستور المصري؟",
|
| 141 |
+
"expected": {
|
| 142 |
+
"law": "constitution",
|
| 143 |
+
"expected_article_numbers": [
|
| 144 |
+
"8"
|
| 145 |
+
],
|
| 146 |
+
"must_cite_articles": true,
|
| 147 |
+
"answer_should_not_add_external_info": true
|
| 148 |
+
},
|
| 149 |
+
"notes": "يقوم المجتمع على التضامن الاجتماعي، وتلتزم الدولة بتحقيق العدالة الاجتماعية والتكافل لضمان حياة كريمة للمواطنين."
|
| 150 |
+
},
|
| 151 |
+
{
|
| 152 |
+
"id": "Q009",
|
| 153 |
+
"category": "constitutional",
|
| 154 |
+
"question": "ما مضمون المادة 9 من الدستور المصري؟",
|
| 155 |
+
"expected": {
|
| 156 |
+
"law": "constitution",
|
| 157 |
+
"expected_article_numbers": [
|
| 158 |
+
"9"
|
| 159 |
+
],
|
| 160 |
+
"must_cite_articles": true,
|
| 161 |
+
"answer_should_not_add_external_info": true
|
| 162 |
+
},
|
| 163 |
+
"notes": "تلتزم الدولة بتحقيق تكافؤ الفرص بين جميع المواطنين بلا تمييز."
|
| 164 |
+
},
|
| 165 |
+
{
|
| 166 |
+
"id": "Q010",
|
| 167 |
+
"category": "constitutional",
|
| 168 |
+
"question": "ما مضمون المادة 10 من الدستور المصري؟",
|
| 169 |
+
"expected": {
|
| 170 |
+
"law": "constitution",
|
| 171 |
+
"expected_article_numbers": [
|
| 172 |
+
"10"
|
| 173 |
+
],
|
| 174 |
+
"must_cite_articles": true,
|
| 175 |
+
"answer_should_not_add_external_info": true
|
| 176 |
+
},
|
| 177 |
+
"notes": "الأسرة هي أساس المجتمع وتقوم على الدين والأخلاق والوطنية، وتعمل الدولة على حمايتها واستقرارها."
|
| 178 |
+
},
|
| 179 |
+
{
|
| 180 |
+
"id": "Q011",
|
| 181 |
+
"category": "constitutional",
|
| 182 |
+
"question": "ما مضمون المادة 11 من الدستور المصري؟",
|
| 183 |
+
"expected": {
|
| 184 |
+
"law": "constitution",
|
| 185 |
+
"expected_article_numbers": [
|
| 186 |
+
"11"
|
| 187 |
+
],
|
| 188 |
+
"must_cite_articles": true,
|
| 189 |
+
"answer_should_not_add_external_info": true
|
| 190 |
+
},
|
| 191 |
+
"notes": "تكفل الدولة المساواة بين الرجل والمرأة في كافة الحقوق، وتضمن تمثيلها في المجالس النيابية وتوليها الوظائف العامة والقضائية، وتحميها من العنف وتوفر الرعاية للفئات الأكثر احتياجاً."
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"id": "Q012",
|
| 195 |
+
"category": "constitutional",
|
| 196 |
+
"question": "ما مضمون المادة 12 من الدستور المصري؟",
|
| 197 |
+
"expected": {
|
| 198 |
+
"law": "constitution",
|
| 199 |
+
"expected_article_numbers": [
|
| 200 |
+
"12"
|
| 201 |
+
],
|
| 202 |
+
"must_cite_articles": true,
|
| 203 |
+
"answer_should_not_add_external_info": true
|
| 204 |
+
},
|
| 205 |
+
"notes": "العمل حق وواجب تكفله الدولة. يُمنع العمل الجبري إلا بقانون ولخدمة عامة وبمقابل عادل."
|
| 206 |
+
},
|
| 207 |
+
{
|
| 208 |
+
"id": "Q013",
|
| 209 |
+
"category": "constitutional",
|
| 210 |
+
"question": "ما مضمون المادة 13 من الدستور المصري؟",
|
| 211 |
+
"expected": {
|
| 212 |
+
"law": "constitution",
|
| 213 |
+
"expected_article_numbers": [
|
| 214 |
+
"13"
|
| 215 |
+
],
|
| 216 |
+
"must_cite_articles": true,
|
| 217 |
+
"answer_should_not_add_external_info": true
|
| 218 |
+
},
|
| 219 |
+
"notes": "تحافظ الدولة على حقوق العمال وتضمن علاقات عمل متوازنة والتفاوض الجماعي، وتحميهم من المخاطر والفصل التعسفي."
|
| 220 |
+
},
|
| 221 |
+
{
|
| 222 |
+
"id": "Q014",
|
| 223 |
+
"category": "constitutional",
|
| 224 |
+
"question": "ما مضمون المادة 14 من الدستور المصري؟",
|
| 225 |
+
"expected": {
|
| 226 |
+
"law": "constitution",
|
| 227 |
+
"expected_article_numbers": [
|
| 228 |
+
"14"
|
| 229 |
+
],
|
| 230 |
+
"must_cite_articles": true,
|
| 231 |
+
"answer_should_not_add_external_info": true
|
| 232 |
+
},
|
| 233 |
+
"notes": "الوظائف العامة حق للمواطنين بناءً على الكفاءة، وهي تكليف لخدمة الشعب. تحمي الدولة الموظفين ولا يجوز فصلهم إلا تأديبياً أو بالقانون."
|
| 234 |
+
},
|
| 235 |
+
{
|
| 236 |
+
"id": "Q015",
|
| 237 |
+
"category": "constitutional",
|
| 238 |
+
"question": "ما مضمون المادة 15 من الدستور المصري؟",
|
| 239 |
+
"expected": {
|
| 240 |
+
"law": "constitution",
|
| 241 |
+
"expected_article_numbers": [
|
| 242 |
+
"15"
|
| 243 |
+
],
|
| 244 |
+
"must_cite_articles": true,
|
| 245 |
+
"answer_should_not_add_external_info": true
|
| 246 |
+
},
|
| 247 |
+
"notes": "الإضراب السلمي هو حق ينظمه القانون."
|
| 248 |
+
},
|
| 249 |
+
{
|
| 250 |
+
"id": "Q016",
|
| 251 |
+
"category": "constitutional",
|
| 252 |
+
"question": "ما مضمون المادة 16 من الدستور المصري؟",
|
| 253 |
+
"expected": {
|
| 254 |
+
"law": "constitution",
|
| 255 |
+
"expected_article_numbers": [
|
| 256 |
+
"16"
|
| 257 |
+
],
|
| 258 |
+
"must_cite_articles": true,
|
| 259 |
+
"answer_should_not_add_external_info": true
|
| 260 |
+
},
|
| 261 |
+
"notes": "تلتزم الدولة بتكريم ورعاية شهداء الوطن ومصابي الثورة والعمليات الأمنية وأسرهم، وتوفير فرص عمل لهم، وتشجع المجتمع المدني على المساهمة."
|
| 262 |
+
},
|
| 263 |
+
{
|
| 264 |
+
"id": "Q017",
|
| 265 |
+
"category": "constitutional",
|
| 266 |
+
"question": "ما مضمون المادة 17 من الدستور المصري؟",
|
| 267 |
+
"expected": {
|
| 268 |
+
"law": "constitution",
|
| 269 |
+
"expected_article_numbers": [
|
| 270 |
+
"17"
|
| 271 |
+
],
|
| 272 |
+
"must_cite_articles": true,
|
| 273 |
+
"answer_should_not_add_external_info": true
|
| 274 |
+
},
|
| 275 |
+
"notes": "تكفل الدولة التأمين والضمان الاجتماعي للمواطنين لضمان حياة كريمة، خاصة للفئات الضعيفة. أموال التأمينات خاصة ومحمية وتدار بواسطة هيئة مستقلة."
|
| 276 |
+
},
|
| 277 |
+
{
|
| 278 |
+
"id": "Q018",
|
| 279 |
+
"category": "constitutional",
|
| 280 |
+
"question": "ما مضمون المادة 18 من الدستور المصري؟",
|
| 281 |
+
"expected": {
|
| 282 |
+
"law": "constitution",
|
| 283 |
+
"expected_article_numbers": [
|
| 284 |
+
"18"
|
| 285 |
+
],
|
| 286 |
+
"must_cite_articles": true,
|
| 287 |
+
"answer_should_not_add_external_info": true
|
| 288 |
+
},
|
| 289 |
+
"notes": "لكل مواطن الحق في الصحة والرعاية المتكاملة. تلتزم الدولة بتخصيص نسبة من الإنفاق للصحة وإقامة تأمين صحي شامل، وتجرم الامتناع عن علاج الطوارئ."
|
| 290 |
+
},
|
| 291 |
+
{
|
| 292 |
+
"id": "Q019",
|
| 293 |
+
"category": "constitutional",
|
| 294 |
+
"question": "ما مضمون المادة 19 من الدستور المصري؟",
|
| 295 |
+
"expected": {
|
| 296 |
+
"law": "constitution",
|
| 297 |
+
"expected_article_numbers": [
|
| 298 |
+
"19"
|
| 299 |
+
],
|
| 300 |
+
"must_cite_articles": true,
|
| 301 |
+
"answer_should_not_add_external_info": true
|
| 302 |
+
},
|
| 303 |
+
"notes": "التعليم حق لكل مواطن وإلزامي حتى الثانوية ومجاني في مؤسسات الدولة. تلتزم الدولة بتخصيص نسبة من الإنفاق للتعليم ومراقبة جودته."
|
| 304 |
+
},
|
| 305 |
+
{
|
| 306 |
+
"id": "Q020",
|
| 307 |
+
"category": "constitutional",
|
| 308 |
+
"question": "ما مضمون المادة 20 من الدستور المصري؟",
|
| 309 |
+
"expected": {
|
| 310 |
+
"law": "constitution",
|
| 311 |
+
"expected_article_numbers": [
|
| 312 |
+
"20"
|
| 313 |
+
],
|
| 314 |
+
"must_cite_articles": true,
|
| 315 |
+
"answer_should_not_add_external_info": true
|
| 316 |
+
},
|
| 317 |
+
"notes": "تلتزم الدولة بتشجيع وتطوير التعليم الفني والتقني والتدريب المهني وفق معايير الجودة واحتياجات السوق."
|
| 318 |
+
},
|
| 319 |
+
{
|
| 320 |
+
"id": "Q021",
|
| 321 |
+
"category": "constitutional",
|
| 322 |
+
"question": "ما مضمون المادة 21 من الدستور المصري؟",
|
| 323 |
+
"expected": {
|
| 324 |
+
"law": "constitution",
|
| 325 |
+
"expected_article_numbers": [
|
| 326 |
+
"21"
|
| 327 |
+
],
|
| 328 |
+
"must_cite_articles": true,
|
| 329 |
+
"answer_should_not_add_external_info": true
|
| 330 |
+
},
|
| 331 |
+
"notes": "تكفل الدولة استقلال الجامعات ومجانية التعليم الجامعي الحكومي وتخصيص نسبة من الإنفاق له. تشجع الجامعات الأهلية وتراقب جودة التعليم الخاص والأهلي."
|
| 332 |
+
},
|
| 333 |
+
{
|
| 334 |
+
"id": "Q022",
|
| 335 |
+
"category": "constitutional",
|
| 336 |
+
"question": "ما مضمون المادة 22 من الدستور المصري؟",
|
| 337 |
+
"expected": {
|
| 338 |
+
"law": "constitution",
|
| 339 |
+
"expected_article_numbers": [
|
| 340 |
+
"22"
|
| 341 |
+
],
|
| 342 |
+
"must_cite_articles": true,
|
| 343 |
+
"answer_should_not_add_external_info": true
|
| 344 |
+
},
|
| 345 |
+
"notes": "المعلمون هم ركيزة التعليم، وتكفل الدولة تنمية مهاراتهم ورعاية حقوقهم لضمان جودة التعليم."
|
| 346 |
+
},
|
| 347 |
+
{
|
| 348 |
+
"id": "Q023",
|
| 349 |
+
"category": "constitutional",
|
| 350 |
+
"question": "ما مضمون المادة 23 من الدستور المصري؟",
|
| 351 |
+
"expected": {
|
| 352 |
+
"law": "constitution",
|
| 353 |
+
"expected_article_numbers": [
|
| 354 |
+
"23"
|
| 355 |
+
],
|
| 356 |
+
"must_cite_articles": true,
|
| 357 |
+
"answer_should_not_add_external_info": true
|
| 358 |
+
},
|
| 359 |
+
"notes": "تكفل الدولة حرية البحث العلمي وتدعم الباحثين، وتخصص له نسبة من الإنفاق الحكومي، وتشجع مساهمة القطاع الخاص والمصريين بالخارج."
|
| 360 |
+
},
|
| 361 |
+
{
|
| 362 |
+
"id": "Q024",
|
| 363 |
+
"category": "constitutional",
|
| 364 |
+
"question": "ما مضمون ا��مادة 24 من الدستور المصري؟",
|
| 365 |
+
"expected": {
|
| 366 |
+
"law": "constitution",
|
| 367 |
+
"expected_article_numbers": [
|
| 368 |
+
"24"
|
| 369 |
+
],
|
| 370 |
+
"must_cite_articles": true,
|
| 371 |
+
"answer_should_not_add_external_info": true
|
| 372 |
+
},
|
| 373 |
+
"notes": "اللغة العربية والدين والتاريخ مواد أساسية في التعليم قبل الجامعي. تدرس الجامعات حقوق الإنسان والأخلاق المهنية."
|
| 374 |
+
},
|
| 375 |
+
{
|
| 376 |
+
"id": "Q025",
|
| 377 |
+
"category": "constitutional",
|
| 378 |
+
"question": "ما مضمون المادة 25 من الدستور المصري؟",
|
| 379 |
+
"expected": {
|
| 380 |
+
"law": "constitution",
|
| 381 |
+
"expected_article_numbers": [
|
| 382 |
+
"25"
|
| 383 |
+
],
|
| 384 |
+
"must_cite_articles": true,
|
| 385 |
+
"answer_should_not_add_external_info": true
|
| 386 |
+
},
|
| 387 |
+
"notes": "تلتزم الدولة بالقضاء على الأمية الهجائية والرقمية وفق خطة زمنية وبمشاركة المجتمع المدني."
|
| 388 |
+
},
|
| 389 |
+
{
|
| 390 |
+
"id": "Q026",
|
| 391 |
+
"category": "constitutional",
|
| 392 |
+
"question": "ما مضمون المادة 26 من الدستور المصري؟",
|
| 393 |
+
"expected": {
|
| 394 |
+
"law": "constitution",
|
| 395 |
+
"expected_article_numbers": [
|
| 396 |
+
"26"
|
| 397 |
+
],
|
| 398 |
+
"must_cite_articles": true,
|
| 399 |
+
"answer_should_not_add_external_info": true
|
| 400 |
+
},
|
| 401 |
+
"notes": "يحظر إنشاء الرتب المدنية."
|
| 402 |
+
},
|
| 403 |
+
{
|
| 404 |
+
"id": "Q027",
|
| 405 |
+
"category": "constitutional",
|
| 406 |
+
"question": "ما مضمون المادة 27 من الدستور المصري؟",
|
| 407 |
+
"expected": {
|
| 408 |
+
"law": "constitution",
|
| 409 |
+
"expected_article_numbers": [
|
| 410 |
+
"27"
|
| 411 |
+
],
|
| 412 |
+
"must_cite_articles": true,
|
| 413 |
+
"answer_should_not_add_external_info": true
|
| 414 |
+
},
|
| 415 |
+
"notes": "يهدف النظام الاقتصادي لتحقيق الرخاء والتنمية المستدامة والعدالة الاجتماعية. يلتزم بالشفافية والتنافسية ومنع الاحتكار وحماية المستهلك والعمال، وضمان حد أدنى للأجور."
|
| 416 |
+
},
|
| 417 |
+
{
|
| 418 |
+
"id": "Q028",
|
| 419 |
+
"category": "constitutional",
|
| 420 |
+
"question": "ما مضمون المادة 28 من الدستور المصري؟",
|
| 421 |
+
"expected": {
|
| 422 |
+
"law": "constitution",
|
| 423 |
+
"expected_article_numbers": [
|
| 424 |
+
"28"
|
| 425 |
+
],
|
| 426 |
+
"must_cite_articles": true,
|
| 427 |
+
"answer_should_not_add_external_info": true
|
| 428 |
+
},
|
| 429 |
+
"notes": "تلتزم الدولة بحماية الأنشطة الاقتصادية وزيادة تنافسيتها وتشجيع الاستثمار والإنتاج والتصدير. تهتم بالمشروعات الصغيرة وتنظيم القطاع غير الرسمي."
|
| 430 |
+
},
|
| 431 |
+
{
|
| 432 |
+
"id": "Q029",
|
| 433 |
+
"category": "constitutional",
|
| 434 |
+
"question": "ما مضمون المادة 29 من الدستور المصري؟",
|
| 435 |
+
"expected": {
|
| 436 |
+
"law": "constitution",
|
| 437 |
+
"expected_article_numbers": [
|
| 438 |
+
"29"
|
| 439 |
+
],
|
| 440 |
+
"must_cite_articles": true,
|
| 441 |
+
"answer_should_not_add_external_info": true
|
| 442 |
+
},
|
| 443 |
+
"notes": "الزراعة أساس الاقتصاد. تلتزم الدولة بحماية الأراضي الزراعية وتنمية الريف والإنتاج الزراعي والحيواني، وشراء المحاصيل بأسعار عادلة، ودعم صغار الفلاحين."
|
| 444 |
+
},
|
| 445 |
+
{
|
| 446 |
+
"id": "Q030",
|
| 447 |
+
"category": "constitutional",
|
| 448 |
+
"question": "ما مضمون المادة 30 من الدستور المصري؟",
|
| 449 |
+
"expected": {
|
| 450 |
+
"law": "constitution",
|
| 451 |
+
"expected_article_numbers": [
|
| 452 |
+
"30"
|
| 453 |
+
],
|
| 454 |
+
"must_cite_articles": true,
|
| 455 |
+
"answer_should_not_add_external_info": true
|
| 456 |
+
},
|
| 457 |
+
"notes": "تلتزم الدولة بحماية الثروة السمكية ودعم الصيادين مع الحفاظ على البيئة."
|
| 458 |
+
},
|
| 459 |
+
{
|
| 460 |
+
"id": "Q031",
|
| 461 |
+
"category": "constitutional",
|
| 462 |
+
"question": "ما مضمون المادة 31 من الدستور المصري؟",
|
| 463 |
+
"expected": {
|
| 464 |
+
"law": "constitution",
|
| 465 |
+
"expected_article_numbers": [
|
| 466 |
+
"31"
|
| 467 |
+
],
|
| 468 |
+
"must_cite_articles": true,
|
| 469 |
+
"answer_should_not_add_external_info": true
|
| 470 |
+
},
|
| 471 |
+
"notes": "أمن الفضاء المعلوماتي جزء من الأمن القومي والاقتصادي، وتلتزم الدولة بحمايته."
|
| 472 |
+
},
|
| 473 |
+
{
|
| 474 |
+
"id": "Q032",
|
| 475 |
+
"category": "constitutional",
|
| 476 |
+
"question": "ما مضمون المادة 32 من الدستور المصري؟",
|
| 477 |
+
"expected": {
|
| 478 |
+
"law": "constitution",
|
| 479 |
+
"expected_article_numbers": [
|
| 480 |
+
"32"
|
| 481 |
+
],
|
| 482 |
+
"must_cite_articles": true,
|
| 483 |
+
"answer_should_not_add_external_info": true
|
| 484 |
+
},
|
| 485 |
+
"notes": "الموارد الطبيعية ملك للشعب ويجب الحفاظ عليها واستغلالها بحكمة. تشجع الدولة الطاقة المتجددة وتصنيع المواد الأولية. يحدد القانون شروط استغلال الموارد والمرافق العامة."
|
| 486 |
+
},
|
| 487 |
+
{
|
| 488 |
+
"id": "Q033",
|
| 489 |
+
"category": "constitutional",
|
| 490 |
+
"question": "ما مضمون المادة 33 من الدستور المصري؟",
|
| 491 |
+
"expected": {
|
| 492 |
+
"law": "constitution",
|
| 493 |
+
"expected_article_numbers": [
|
| 494 |
+
"33"
|
| 495 |
+
],
|
| 496 |
+
"must_cite_articles": true,
|
| 497 |
+
"answer_should_not_add_external_info": true
|
| 498 |
+
},
|
| 499 |
+
"notes": "تحمي الدولة جميع أنواع الملكية: العامة والخاصة والتعاونية."
|
| 500 |
+
},
|
| 501 |
+
{
|
| 502 |
+
"id": "Q034",
|
| 503 |
+
"category": "constitutional",
|
| 504 |
+
"question": "ما مضمون المادة 34 من الدستور المصري؟",
|
| 505 |
+
"expected": {
|
| 506 |
+
"law": "constitution",
|
| 507 |
+
"expected_article_numbers": [
|
| 508 |
+
"34"
|
| 509 |
+
],
|
| 510 |
+
"must_cite_articles": true,
|
| 511 |
+
"answer_should_not_add_external_info": true
|
| 512 |
+
},
|
| 513 |
+
"notes": "للملكية العامة حرمة ويجب حمايتها ولا يجوز المساس بها."
|
| 514 |
+
},
|
| 515 |
+
{
|
| 516 |
+
"id": "Q035",
|
| 517 |
+
"category": "constitutional",
|
| 518 |
+
"question": "ما مضمون المادة 35 من الدستور المصري؟",
|
| 519 |
+
"expected": {
|
| 520 |
+
"law": "constitution",
|
| 521 |
+
"expected_article_numbers": [
|
| 522 |
+
"35"
|
| 523 |
+
],
|
| 524 |
+
"must_cite_articles": true,
|
| 525 |
+
"answer_should_not_add_external_info": true
|
| 526 |
+
},
|
| 527 |
+
"notes": "الملكية الخاصة والإرث مصونان. لا تُفرض الحراسة أو تُنزع الملكية إلا بالقانون وحكم قضائي وللمنفعة العامة مقابل تعويض عادل."
|
| 528 |
+
},
|
| 529 |
+
{
|
| 530 |
+
"id": "Q036",
|
| 531 |
+
"category": "constitutional",
|
| 532 |
+
"question": "ما مضمون المادة 36 من الدستور المصري؟",
|
| 533 |
+
"expected": {
|
| 534 |
+
"law": "constitution",
|
| 535 |
+
"expected_article_numbers": [
|
| 536 |
+
"36"
|
| 537 |
+
],
|
| 538 |
+
"must_cite_articles": true,
|
| 539 |
+
"answer_should_not_add_external_info": true
|
| 540 |
+
},
|
| 541 |
+
"notes": "تحفز الدولة القطاع الخاص للمشاركة في المسؤولية الاجتماعية."
|
| 542 |
+
},
|
| 543 |
+
{
|
| 544 |
+
"id": "Q037",
|
| 545 |
+
"category": "constitutional",
|
| 546 |
+
"question": "ما مضمون المادة 37 من الدستور المصري؟",
|
| 547 |
+
"expected": {
|
| 548 |
+
"law": "constitution",
|
| 549 |
+
"expected_article_numbers": [
|
| 550 |
+
"37"
|
| 551 |
+
],
|
| 552 |
+
"must_cite_articles": true,
|
| 553 |
+
"answer_should_not_add_external_info": true
|
| 554 |
+
},
|
| 555 |
+
"notes": "الملكية التعاونية مصونة وتدعم الدولة التعاونيات وتضمن استقلالها، ولا تحل إلا بحكم قضائي."
|
| 556 |
+
},
|
| 557 |
+
{
|
| 558 |
+
"id": "Q038",
|
| 559 |
+
"category": "constitutional",
|
| 560 |
+
"question": "ما مضمون المادة 38 من الدستور المصري؟",
|
| 561 |
+
"expected": {
|
| 562 |
+
"law": "constitution",
|
| 563 |
+
"expected_article_numbers": [
|
| 564 |
+
"38"
|
| 565 |
+
],
|
| 566 |
+
"must_cite_articles": true,
|
| 567 |
+
"answer_should_not_add_external_info": true
|
| 568 |
+
},
|
| 569 |
+
"notes": "النظام الضريبي يهدف لتنمية الموارد والعدالة. الضرائب لا تُفرض إلا بقانون وتكون تصاعدية. الدولة تلتزم بتطوير النظام الضريبي، والتهرب الضريبي جريمة."
|
| 570 |
+
},
|
| 571 |
+
{
|
| 572 |
+
"id": "Q039",
|
| 573 |
+
"category": "constitutional",
|
| 574 |
+
"question": "ما مضمون المادة 39 من الدستور المصري؟",
|
| 575 |
+
"expected": {
|
| 576 |
+
"law": "constitution",
|
| 577 |
+
"expected_article_numbers": [
|
| 578 |
+
"39"
|
| 579 |
+
],
|
| 580 |
+
"must_cite_articles": true,
|
| 581 |
+
"answer_should_not_add_external_info": true
|
| 582 |
+
},
|
| 583 |
+
"notes": "الادخار واجب وطني تحميه وتشجعه الدولة."
|
| 584 |
+
},
|
| 585 |
+
{
|
| 586 |
+
"id": "Q040",
|
| 587 |
+
"category": "constitutional",
|
| 588 |
+
"question": "ما مضمون المادة 40 من الدستور المصري؟",
|
| 589 |
+
"expected": {
|
| 590 |
+
"law": "constitution",
|
| 591 |
+
"expected_article_numbers": [
|
| 592 |
+
"40"
|
| 593 |
+
],
|
| 594 |
+
"must_cite_articles": true,
|
| 595 |
+
"answer_should_not_add_external_info": true
|
| 596 |
+
},
|
| 597 |
+
"notes": "المصادرة العامة للأموال ممنوعة، والخاصة لا تجوز إلا بحكم قضائي."
|
| 598 |
+
},
|
| 599 |
+
{
|
| 600 |
+
"id": "Q041",
|
| 601 |
+
"category": "criminal_procedure",
|
| 602 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 1؟",
|
| 603 |
+
"expected": {
|
| 604 |
+
"law": "criminal_procedure",
|
| 605 |
+
"expected_article_numbers": [
|
| 606 |
+
"1"
|
| 607 |
+
],
|
| 608 |
+
"must_cite_articles": true
|
| 609 |
+
},
|
| 610 |
+
"notes": "النيابة العامة هي الجهة الوحيدة المختصة برفع الدعوى الجنائية ومباشرتها، ولا يجوز تركها أو وقفها إلا وفقاً للقانون."
|
| 611 |
+
},
|
| 612 |
+
{
|
| 613 |
+
"id": "Q042",
|
| 614 |
+
"category": "criminal_procedure",
|
| 615 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 2؟",
|
| 616 |
+
"expected": {
|
| 617 |
+
"law": "criminal_procedure",
|
| 618 |
+
"expected_article_numbers": [
|
| 619 |
+
"2"
|
| 620 |
+
],
|
| 621 |
+
"must_cite_articles": true
|
| 622 |
+
},
|
| 623 |
+
"notes": "النائب العام أو أعضاء النيابة العامة يباشرون الدعوى الجنائية، ويجوز تعيين آخرين لأداء هذه الوظيفة وفقاً للقانون."
|
| 624 |
+
},
|
| 625 |
+
{
|
| 626 |
+
"id": "Q043",
|
| 627 |
+
"category": "criminal_procedure",
|
| 628 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 3؟",
|
| 629 |
+
"expected": {
|
| 630 |
+
"law": "criminal_procedure",
|
| 631 |
+
"expected_article_numbers": [
|
| 632 |
+
"3"
|
| 633 |
+
],
|
| 634 |
+
"must_cite_articles": true
|
| 635 |
+
},
|
| 636 |
+
"notes": "في جرائم معينة (مثل السب والقذف والزنا) لا ترفع الدعوى الجنائية إلا بشكوى من المجني عليه أو وكيله خلال ثلاثة أشهر من علمه بالجريمة."
|
| 637 |
+
},
|
| 638 |
+
{
|
| 639 |
+
"id": "Q044",
|
| 640 |
+
"category": "criminal_procedure",
|
| 641 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 4؟",
|
| 642 |
+
"expected": {
|
| 643 |
+
"law": "criminal_procedure",
|
| 644 |
+
"expected_article_numbers": [
|
| 645 |
+
"4"
|
| 646 |
+
],
|
| 647 |
+
"must_cite_articles": true
|
| 648 |
+
},
|
| 649 |
+
"notes": "شكوى أحد المجني عليهم تكفي لتحريك الدعوى، والشكوى ضد متهم واحد تعتبر شكوى ضد جميع المتهمين."
|
| 650 |
+
},
|
| 651 |
+
{
|
| 652 |
+
"id": "Q045",
|
| 653 |
+
"category": "criminal_procedure",
|
| 654 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 5؟",
|
| 655 |
+
"expected": {
|
| 656 |
+
"law": "criminal_procedure",
|
| 657 |
+
"expected_article_numbers": [
|
| 658 |
+
"5"
|
| 659 |
+
],
|
| 660 |
+
"must_cite_articles": true
|
| 661 |
+
},
|
| 662 |
+
"notes": "إذا كان المجني عليه قاصراً (أقل من 15 سنة) أو مصاباً بعاهة عقلية، يقدم الشكوى من له الولاية عليه."
|
| 663 |
+
},
|
| 664 |
+
{
|
| 665 |
+
"id": "Q046",
|
| 666 |
+
"category": "criminal_procedure",
|
| 667 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 6؟",
|
| 668 |
+
"expected": {
|
| 669 |
+
"law": "criminal_procedure",
|
| 670 |
+
"expected_article_numbers": [
|
| 671 |
+
"6"
|
| 672 |
+
],
|
| 673 |
+
"must_cite_articles": true
|
| 674 |
+
},
|
| 675 |
+
"notes": "إذا تعارضت مصلحة المجني عليه مع مصلحة ممثله أو لم يكن له ممثل، تنوب عنه النيابة العامة في تقديم الشكوى."
|
| 676 |
+
},
|
| 677 |
+
{
|
| 678 |
+
"id": "Q047",
|
| 679 |
+
"category": "criminal_procedure",
|
| 680 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 7؟",
|
| 681 |
+
"expected": {
|
| 682 |
+
"law": "criminal_procedure",
|
| 683 |
+
"expected_article_numbers": [
|
| 684 |
+
"7"
|
| 685 |
+
],
|
| 686 |
+
"must_cite_articles": true
|
| 687 |
+
},
|
| 688 |
+
"notes": "وفاة المجني عليه تنهي حقه في الشكوى، لكن إذا قدمت الشكوى قبل الوفاة تستمر الدعوى."
|
| 689 |
+
},
|
| 690 |
+
{
|
| 691 |
+
"id": "Q048",
|
| 692 |
+
"category": "criminal_procedure",
|
| 693 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 8؟",
|
| 694 |
+
"expected": {
|
| 695 |
+
"law": "criminal_procedure",
|
| 696 |
+
"expected_article_numbers": [
|
| 697 |
+
"8"
|
| 698 |
+
],
|
| 699 |
+
"must_cite_articles": true
|
| 700 |
+
},
|
| 701 |
+
"notes": "في بعض الجرائم (المواد 181 و182 عقوبات) يشترط طلب كتابي من وزير العدل لرفع الدعوى الجنائية."
|
| 702 |
+
},
|
| 703 |
+
{
|
| 704 |
+
"id": "Q049",
|
| 705 |
+
"category": "criminal_procedure",
|
| 706 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 8 مكرر؟",
|
| 707 |
+
"expected": {
|
| 708 |
+
"law": "criminal_procedure",
|
| 709 |
+
"expected_article_numbers": [
|
| 710 |
+
"8 مكرر"
|
| 711 |
+
],
|
| 712 |
+
"must_cite_articles": true
|
| 713 |
+
},
|
| 714 |
+
"notes": "جرائم المادة 116 مكرراً (أ) من قانون العقوبات لا ترفع إلا من النائب العام أو المحامي العام."
|
| 715 |
+
},
|
| 716 |
+
{
|
| 717 |
+
"id": "Q050",
|
| 718 |
+
"category": "criminal_procedure",
|
| 719 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 9؟",
|
| 720 |
+
"expected": {
|
| 721 |
+
"law": "criminal_procedure",
|
| 722 |
+
"expected_article_numbers": [
|
| 723 |
+
"9"
|
| 724 |
+
],
|
| 725 |
+
"must_cite_articles": true
|
| 726 |
+
},
|
| 727 |
+
"notes": "جرائم الإهانة (المادة 184 عقوبات) تتطلب طلباً من الهيئة المجني عليها، وبشكل عام لا يجوز ��لتحقيق في جرائم الشكوى إلا بعد تقديمها."
|
| 728 |
+
},
|
| 729 |
+
{
|
| 730 |
+
"id": "Q051",
|
| 731 |
+
"category": "criminal_procedure",
|
| 732 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 10؟",
|
| 733 |
+
"expected": {
|
| 734 |
+
"law": "criminal_procedure",
|
| 735 |
+
"expected_article_numbers": [
|
| 736 |
+
"10"
|
| 737 |
+
],
|
| 738 |
+
"must_cite_articles": true
|
| 739 |
+
},
|
| 740 |
+
"notes": "يجوز للشاكي التنازل عن الشكوى قبل صدور حكم نهائي وتنقضي الدعوى بالتنازل. التنازل لأحد المتهمين يمتد للباقين. لا ينتقل حق التنازل للورثة إلا في دعوى الزنا."
|
| 741 |
+
},
|
| 742 |
+
{
|
| 743 |
+
"id": "Q052",
|
| 744 |
+
"category": "criminal_procedure",
|
| 745 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 11؟",
|
| 746 |
+
"expected": {
|
| 747 |
+
"law": "criminal_procedure",
|
| 748 |
+
"expected_article_numbers": [
|
| 749 |
+
"11"
|
| 750 |
+
],
|
| 751 |
+
"must_cite_articles": true
|
| 752 |
+
},
|
| 753 |
+
"notes": "لمحكمة الجنايات إقامة الدعوى على متهمين آخرين أو وقائع مرتبطة وإحالتها للنيابة للتحقيق، ويجوز ندب أحد أعضائها للتحقيق مع تطبيق أحكام قاضي التحقيق عليه."
|
| 754 |
+
},
|
| 755 |
+
{
|
| 756 |
+
"id": "Q053",
|
| 757 |
+
"category": "criminal_procedure",
|
| 758 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 12؟",
|
| 759 |
+
"expected": {
|
| 760 |
+
"law": "criminal_procedure",
|
| 761 |
+
"expected_article_numbers": [
|
| 762 |
+
"12"
|
| 763 |
+
],
|
| 764 |
+
"must_cite_articles": true
|
| 765 |
+
},
|
| 766 |
+
"notes": "لمحكمة النقض عند نظر الموضوع للمرة الثانية حق إقامة الدعوى كمحكمة الجنايات، ولا يشترك من قرر الإقامة في نظر الطعن الثاني."
|
| 767 |
+
},
|
| 768 |
+
{
|
| 769 |
+
"id": "Q054",
|
| 770 |
+
"category": "criminal_procedure",
|
| 771 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 13؟",
|
| 772 |
+
"expected": {
|
| 773 |
+
"law": "criminal_procedure",
|
| 774 |
+
"expected_article_numbers": [
|
| 775 |
+
"13"
|
| 776 |
+
],
|
| 777 |
+
"must_cite_articles": true
|
| 778 |
+
},
|
| 779 |
+
"notes": "لمحكمة الجنايات أو النقض إقامة الدعوى على من يخل بأوامرها أو يؤثر في قضائها أو الشهود أثناء نظر الدعوى."
|
| 780 |
+
},
|
| 781 |
+
{
|
| 782 |
+
"id": "Q055",
|
| 783 |
+
"category": "criminal_procedure",
|
| 784 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 14؟",
|
| 785 |
+
"expected": {
|
| 786 |
+
"law": "criminal_procedure",
|
| 787 |
+
"expected_article_numbers": [
|
| 788 |
+
"14"
|
| 789 |
+
],
|
| 790 |
+
"must_cite_articles": true
|
| 791 |
+
},
|
| 792 |
+
"notes": "وفاة المتهم تنهي الدعوى الجنائية، لكن يجوز الحكم بالمصادرة إذا حدثت الوفاة أثناء نظر الدعوى."
|
| 793 |
+
},
|
| 794 |
+
{
|
| 795 |
+
"id": "Q056",
|
| 796 |
+
"category": "criminal_procedure",
|
| 797 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 15؟",
|
| 798 |
+
"expected": {
|
| 799 |
+
"law": "criminal_procedure",
|
| 800 |
+
"expected_article_numbers": [
|
| 801 |
+
"15"
|
| 802 |
+
],
|
| 803 |
+
"must_cite_articles": true
|
| 804 |
+
},
|
| 805 |
+
"notes": "تنقضي الدعوى الجنائية بالتقادم: 10 سنوات للجنايات، 3 سنوات للجنح، سنة للمخالفات. بعض الجرائم الخطيرة (التعذيب، الاعتداء على الحرية) لا تسقط بالتقادم."
|
| 806 |
+
},
|
| 807 |
+
{
|
| 808 |
+
"id": "Q057",
|
| 809 |
+
"category": "criminal_procedure",
|
| 810 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 16؟",
|
| 811 |
+
"expected": {
|
| 812 |
+
"law": "criminal_procedure",
|
| 813 |
+
"expected_article_numbers": [
|
| 814 |
+
"16"
|
| 815 |
+
],
|
| 816 |
+
"must_cite_articles": true
|
| 817 |
+
},
|
| 818 |
+
"notes": "مدة التقادم في الدعوى الجنائية لا تتوقف لأي سبب."
|
| 819 |
+
},
|
| 820 |
+
{
|
| 821 |
+
"id": "Q058",
|
| 822 |
+
"category": "criminal_procedure",
|
| 823 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 17؟",
|
| 824 |
+
"expected": {
|
| 825 |
+
"law": "criminal_procedure",
|
| 826 |
+
"expected_article_numbers": [
|
| 827 |
+
"17"
|
| 828 |
+
],
|
| 829 |
+
"must_cite_articles": true
|
| 830 |
+
},
|
| 831 |
+
"notes": "تنقطع مدة التقادم بإجراءات التحقيق أو الاتهام أو المحاكمة أو الأمر الجنائي، وتبدأ من جديد من يوم الانقطاع."
|
| 832 |
+
},
|
| 833 |
+
{
|
| 834 |
+
"id": "Q059",
|
| 835 |
+
"category": "criminal_procedure",
|
| 836 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 18؟",
|
| 837 |
+
"expected": {
|
| 838 |
+
"law": "criminal_procedure",
|
| 839 |
+
"expected_article_numbers": [
|
| 840 |
+
"18"
|
| 841 |
+
],
|
| 842 |
+
"must_cite_articles": true
|
| 843 |
+
},
|
| 844 |
+
"notes": "انقطاع مدة التقادم لأحد المتهمين يمتد أثره للباقين ما لم تتخذ ضدهم إجراءات مستقلة."
|
| 845 |
+
},
|
| 846 |
+
{
|
| 847 |
+
"id": "Q060",
|
| 848 |
+
"category": "criminal_procedure",
|
| 849 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 18 مكرر؟",
|
| 850 |
+
"expected": {
|
| 851 |
+
"law": "criminal_procedure",
|
| 852 |
+
"expected_article_numbers": [
|
| 853 |
+
"18 مكرر"
|
| 854 |
+
],
|
| 855 |
+
"must_cite_articles": true
|
| 856 |
+
},
|
| 857 |
+
"notes": "يجوز التصالح في المخالفات والجنح البسيطة بدفع ثلث الغرامة قبل رفع الدعوى أو ثلثيها بعد رفعها، وتنقضي الدعوى الجنائية بالتصالح."
|
| 858 |
+
},
|
| 859 |
+
{
|
| 860 |
+
"id": "Q061",
|
| 861 |
+
"category": "criminal_procedure",
|
| 862 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 18 مكرر (أ)؟",
|
| 863 |
+
"expected": {
|
| 864 |
+
"law": "criminal_procedure",
|
| 865 |
+
"expected_article_numbers": [
|
| 866 |
+
"18 مكرر (أ)"
|
| 867 |
+
],
|
| 868 |
+
"must_cite_articles": true
|
| 869 |
+
},
|
| 870 |
+
"notes": "يجوز للمجني عليه أو ورثته الصلح مع المتهم في جرائم معينة (الضرب، السرقة البسيطة، إتلاف المال) وتنقضي الدعوى بالصلح حتى بعد الحكم البات."
|
| 871 |
+
},
|
| 872 |
+
{
|
| 873 |
+
"id": "Q062",
|
| 874 |
+
"category": "criminal_procedure",
|
| 875 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 19؟",
|
| 876 |
+
"expected": {
|
| 877 |
+
"law": "criminal_procedure",
|
| 878 |
+
"expected_article_numbers": [
|
| 879 |
+
"19"
|
| 880 |
+
],
|
| 881 |
+
"must_cite_articles": true
|
| 882 |
+
},
|
| 883 |
+
"notes": "مادة ملغاة."
|
| 884 |
+
},
|
| 885 |
+
{
|
| 886 |
+
"id": "Q063",
|
| 887 |
+
"category": "criminal_procedure",
|
| 888 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 20؟",
|
| 889 |
+
"expected": {
|
| 890 |
+
"law": "criminal_procedure",
|
| 891 |
+
"expected_article_numbers": [
|
| 892 |
+
"20"
|
| 893 |
+
],
|
| 894 |
+
"must_cite_articles": true
|
| 895 |
+
},
|
| 896 |
+
"notes": "مادة ملغاة."
|
| 897 |
+
},
|
| 898 |
+
{
|
| 899 |
+
"id": "Q064",
|
| 900 |
+
"category": "criminal_procedure",
|
| 901 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 21؟",
|
| 902 |
+
"expected": {
|
| 903 |
+
"law": "criminal_procedure",
|
| 904 |
+
"expected_article_numbers": [
|
| 905 |
+
"21"
|
| 906 |
+
],
|
| 907 |
+
"must_cite_articles": true
|
| 908 |
+
},
|
| 909 |
+
"notes": "مأمورو الضبط القضائي يبحثون عن الجرائم ومرتكبيها ويجمعون الاستدلالات اللازمة للتحقيق."
|
| 910 |
+
},
|
| 911 |
+
{
|
| 912 |
+
"id": "Q065",
|
| 913 |
+
"category": "criminal_procedure",
|
| 914 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 22؟",
|
| 915 |
+
"expected": {
|
| 916 |
+
"law": "criminal_procedure",
|
| 917 |
+
"expected_article_numbers": [
|
| 918 |
+
"22"
|
| 919 |
+
],
|
| 920 |
+
"must_cite_articles": true
|
| 921 |
+
},
|
| 922 |
+
"notes": "مأمورو الضبط القضائي يتبعون النائب العام ويخضعون لإشرافه، وله طلب محاسبتهم تأديبياً وجنائياً."
|
| 923 |
+
},
|
| 924 |
+
{
|
| 925 |
+
"id": "Q066",
|
| 926 |
+
"category": "tech_crimes",
|
| 927 |
+
"question": "ما الذي تنظمه المادة 1 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 928 |
+
"expected": {
|
| 929 |
+
"law": "tech_crimes",
|
| 930 |
+
"expected_article_numbers": [
|
| 931 |
+
"1"
|
| 932 |
+
],
|
| 933 |
+
"must_cite_articles": true
|
| 934 |
+
},
|
| 935 |
+
"notes": "تحدد المادة التعريفات الأساسية في القانون مثل الجهاز والوزير المختص والبيانات الإلكترونية والبيانات الشخصية والحكومية، والمعالجة الإلكترونية وتقنية المعلومات، ومقدم الخدمة والمستخدم، والبرنامج والنظام"
|
| 936 |
+
},
|
| 937 |
+
{
|
| 938 |
+
"id": "Q067",
|
| 939 |
+
"category": "tech_crimes",
|
| 940 |
+
"question": "ما الذي تنظمه المادة 2 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 941 |
+
"expected": {
|
| 942 |
+
"law": "tech_crimes",
|
| 943 |
+
"expected_article_numbers": [
|
| 944 |
+
"2"
|
| 945 |
+
],
|
| 946 |
+
"must_cite_articles": true
|
| 947 |
+
},
|
| 948 |
+
"notes": "تُلزم المادة مقدمي الخدمة بحفظ سجلات وبيانات محددة لمدة 180 يومًا، والحفاظ على سريتها وتأمينها وعدم إفشائها إلا بأمر قضائي. كما تُلزمهم بتوفير بيانات تعريفية وترخيصية للمستخدمين والجهات المختصة، وتمكي"
|
| 949 |
+
},
|
| 950 |
+
{
|
| 951 |
+
"id": "Q068",
|
| 952 |
+
"category": "tech_crimes",
|
| 953 |
+
"question": "ما ا��ذي تنظمه المادة 3 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 954 |
+
"expected": {
|
| 955 |
+
"law": "tech_crimes",
|
| 956 |
+
"expected_article_numbers": [
|
| 957 |
+
"3"
|
| 958 |
+
],
|
| 959 |
+
"must_cite_articles": true
|
| 960 |
+
},
|
| 961 |
+
"notes": "تُطبق أحكام القانون على جرائم تقنية المعلومات المرتكبة خارج مصر من غير المصريين متى كان الفعل مجرمًا بالدولة التي وقع فيها، وذلك في حالات محددة مثل ارتباط الجريمة بوسيلة نقل مصرية، أو وجود مجني عليه م"
|
| 962 |
+
},
|
| 963 |
+
{
|
| 964 |
+
"id": "Q069",
|
| 965 |
+
"category": "tech_crimes",
|
| 966 |
+
"question": "ما الذي تنظمه المادة 4 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 967 |
+
"expected": {
|
| 968 |
+
"law": "tech_crimes",
|
| 969 |
+
"expected_article_numbers": [
|
| 970 |
+
"4"
|
| 971 |
+
],
|
| 972 |
+
"must_cite_articles": true
|
| 973 |
+
},
|
| 974 |
+
"notes": "تلتزم السلطات المصرية بتيسير التعاون الدولي وتبادل المعلومات وفق الاتفاقيات أو المعاملة بالمثل لمنع جرائم تقنية المعلومات والمساعدة في التحقيق وتتبع الجناة، ويكون مركز الاستعداد لطوارئ الحاسب والشبكات"
|
| 975 |
+
},
|
| 976 |
+
{
|
| 977 |
+
"id": "Q070",
|
| 978 |
+
"category": "tech_crimes",
|
| 979 |
+
"question": "ما الذي تنظمه المادة 5 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 980 |
+
"expected": {
|
| 981 |
+
"law": "tech_crimes",
|
| 982 |
+
"expected_article_numbers": [
|
| 983 |
+
"5"
|
| 984 |
+
],
|
| 985 |
+
"must_cite_articles": true
|
| 986 |
+
},
|
| 987 |
+
"notes": "يجوز لوزير العدل بالاتفاق مع الوزير المختص منح صفة الضبطية القضائية للعاملين بالجهاز أو لغيرهم ممن تحددهم جهات الأمن القومي، فيما يخص الجرائم المرتبطة بأعمال وظائفهم وفق هذا القانون."
|
| 988 |
+
},
|
| 989 |
+
{
|
| 990 |
+
"id": "Q071",
|
| 991 |
+
"category": "tech_crimes",
|
| 992 |
+
"question": "ما الذي تنظمه المادة 6 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 993 |
+
"expected": {
|
| 994 |
+
"law": "tech_crimes",
|
| 995 |
+
"expected_article_numbers": [
|
| 996 |
+
"6"
|
| 997 |
+
],
|
| 998 |
+
"must_cite_articles": true
|
| 999 |
+
},
|
| 1000 |
+
"notes": "تجيز المادة لجهة التحقيق إصدار أوامر مؤقتة مسببـة لمدة تصل إلى 30 يومًا قابلة للتجديد مرة واحدة لضبط البيانات والأنظمة وتتبعها، والبحث والتفتيش والدخول إلى البرامج وقواعد البيانات، وإلزام مقدم الخدمة "
|
| 1001 |
+
},
|
| 1002 |
+
{
|
| 1003 |
+
"id": "Q072",
|
| 1004 |
+
"category": "tech_crimes",
|
| 1005 |
+
"question": "ما الذي تنظمه المادة 7 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 1006 |
+
"expected": {
|
| 1007 |
+
"law": "tech_crimes",
|
| 1008 |
+
"expected_article_numbers": [
|
| 1009 |
+
"7"
|
| 1010 |
+
],
|
| 1011 |
+
"must_cite_articles": true
|
| 1012 |
+
},
|
| 1013 |
+
"notes": "تنظم المادة إجراءات حجب المواقع المرتبطة بجرائم تقنية المعلومات التي تهدد الأمن القومي، بما يشمل أمر الحجب القضائي وعرضه على المحكمة خلال مدد محددة، والحجب المؤقت في حالات الاستعجال مع تحرير محضر وعرض"
|
| 1014 |
+
},
|
| 1015 |
+
{
|
| 1016 |
+
"id": "Q073",
|
| 1017 |
+
"category": "tech_crimes",
|
| 1018 |
+
"question": "ما الذي تنظمه المادة 8 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 1019 |
+
"expected": {
|
| 1020 |
+
"law": "tech_crimes",
|
| 1021 |
+
"expected_article_numbers": [
|
| 1022 |
+
"8"
|
| 1023 |
+
],
|
| 1024 |
+
"must_cite_articles": true
|
| 1025 |
+
},
|
| 1026 |
+
"notes": "تحدد المادة حق التظلم من أوامر الحجب أمام محكمة الجنايات المختصة بعد مرور سبعة أيام، مع إمكانية تجديد التظلم كل ثلاثة أشهر إذا رُفض، وإجراءات إيداع التظلم وتحديد جلسة والفصل فيه خلال سبعة أيام."
|
| 1027 |
+
},
|
| 1028 |
+
{
|
| 1029 |
+
"id": "Q074",
|
| 1030 |
+
"category": "tech_crimes",
|
| 1031 |
+
"question": "ما الذي تنظمه المادة 9 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 1032 |
+
"expected": {
|
| 1033 |
+
"law": "tech_crimes",
|
| 1034 |
+
"expected_article_numbers": [
|
| 1035 |
+
"9"
|
| 1036 |
+
],
|
| 1037 |
+
"must_cite_articles": true
|
| 1038 |
+
},
|
| 1039 |
+
"notes": "تجيز المادة إصدار أمر مسبب بمنع السفر أو إدراج الاسم على قوائم ترقب الوصول عند الضرورة أو وجود أدلة كافية، مع حق التظلم خلال 15 يومًا وتجديده كل ثلاثة أشهر، والفصل القضائي خلال 15 يومًا، وإمكانية العد"
|
| 1040 |
+
},
|
| 1041 |
+
{
|
| 1042 |
+
"id": "Q075",
|
| 1043 |
+
"category": "tech_crimes",
|
| 1044 |
+
"question": "ما الذي تنظمه المادة 10 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 1045 |
+
"expected": {
|
| 1046 |
+
"law": "tech_crimes",
|
| 1047 |
+
"expected_article_numbers": [
|
| 1048 |
+
"10"
|
| 1049 |
+
],
|
| 1050 |
+
"must_cite_articles": true
|
| 1051 |
+
},
|
| 1052 |
+
"notes": "تنشئ المادة سجلين للخبراء بالجهاز (للعاملين وغير العاملين)، وتحدد خضوعهم لقواعد تنظيم الخبرة أمام القضاء، مع تطبيق قواعد المساءلة الإدارية والتأديبية للخبراء غير العاملين وفق قانونهم، وتُحال تفاصيل ال"
|
| 1053 |
+
},
|
| 1054 |
+
{
|
| 1055 |
+
"id": "Q076",
|
| 1056 |
+
"category": "labor",
|
| 1057 |
+
"question": "ما مضمون المادة 1 في قانون العمل المصري (قانون العمل)؟",
|
| 1058 |
+
"expected": {
|
| 1059 |
+
"law": "labor",
|
| 1060 |
+
"expected_article_numbers": [
|
| 1061 |
+
"1"
|
| 1062 |
+
],
|
| 1063 |
+
"must_cite_articles": true
|
| 1064 |
+
},
|
| 1065 |
+
"notes": "تعريفات شاملة لـ 38 مصطلحاً أساسياً في قانون العمل تشمل: تعريف العامل وصاحب العمل والمتدرج، تفصيل شامل لمكونات الأجر (الأساسي والمتغير بما في ذلك العمولة والعلاوات والمنح والمكافآت والبدلات ونصيب الأر"
|
| 1066 |
+
},
|
| 1067 |
+
{
|
| 1068 |
+
"id": "Q077",
|
| 1069 |
+
"category": "labor",
|
| 1070 |
+
"question": "ما مضمون المادة 2 في قانون العمل المصري (قانون العمل)؟",
|
| 1071 |
+
"expected": {
|
| 1072 |
+
"law": "labor",
|
| 1073 |
+
"expected_article_numbers": [
|
| 1074 |
+
"2"
|
| 1075 |
+
],
|
| 1076 |
+
"must_cite_articles": true
|
| 1077 |
+
},
|
| 1078 |
+
"notes": "تحديد السنة بـ365 يوماً والشهر بـ30 يوماً لأغراض تطبيق القانون، ما لم يتفق الطرفان على خلاف ذلك."
|
| 1079 |
+
},
|
| 1080 |
+
{
|
| 1081 |
+
"id": "Q078",
|
| 1082 |
+
"category": "labor",
|
| 1083 |
+
"question": "ما مضمون المادة 3 في قانون العمل المصري (قانون العمل)؟",
|
| 1084 |
+
"expected": {
|
| 1085 |
+
"law": "labor",
|
| 1086 |
+
"expected_article_numbers": [
|
| 1087 |
+
"3"
|
| 1088 |
+
],
|
| 1089 |
+
"must_cite_articles": true
|
| 1090 |
+
},
|
| 1091 |
+
"notes": "قانون العمل رقم 14 لسنة 2025 هو القانون العام المنظم لجميع علاقات العمل في مصر."
|
| 1092 |
+
},
|
| 1093 |
+
{
|
| 1094 |
+
"id": "Q079",
|
| 1095 |
+
"category": "labor",
|
| 1096 |
+
"question": "ما مضمون المادة 4 في قانون العمل المصري (قانون العمل)؟",
|
| 1097 |
+
"expected": {
|
| 1098 |
+
"law": "labor",
|
| 1099 |
+
"expected_article_numbers": [
|
| 1100 |
+
"4"
|
| 1101 |
+
],
|
| 1102 |
+
"must_cite_articles": true
|
| 1103 |
+
},
|
| 1104 |
+
"notes": "حظر السخرة والعمل الجبري والتحرش والتنمر والعنف بكافة أشكاله (اللفظي والجسدي والنفسي) ضد العمال، مع تحديد جزاءات تأديبية في لوائح المنشأة."
|
| 1105 |
+
},
|
| 1106 |
+
{
|
| 1107 |
+
"id": "Q080",
|
| 1108 |
+
"category": "labor",
|
| 1109 |
+
"question": "ما مضمون المادة 5 في قانون العمل المصري (قانون العمل)؟",
|
| 1110 |
+
"expected": {
|
| 1111 |
+
"law": "labor",
|
| 1112 |
+
"expected_article_numbers": [
|
| 1113 |
+
"5"
|
| 1114 |
+
],
|
| 1115 |
+
"must_cite_articles": true
|
| 1116 |
+
},
|
| 1117 |
+
"notes": "حظر التمييز في العمل لأي سبب، مع استثناء المزايا المقررة قانوناً للمرأة والطفل وذوي الإعاقة والأقزام بالقدر اللازم لحمايتهم ودمجهم."
|
| 1118 |
+
},
|
| 1119 |
+
{
|
| 1120 |
+
"id": "Q081",
|
| 1121 |
+
"category": "labor",
|
| 1122 |
+
"question": "ما مضمون المادة 6 في قانون العمل المصري (قانون العمل)؟",
|
| 1123 |
+
"expected": {
|
| 1124 |
+
"law": "labor",
|
| 1125 |
+
"expected_article_numbers": [
|
| 1126 |
+
"6"
|
| 1127 |
+
],
|
| 1128 |
+
"must_cite_articles": true
|
| 1129 |
+
},
|
| 1130 |
+
"notes": "بطلان أي شرط ينتقص من حقوق العامل، مع استمرار الشروط الأفضل حتى في حالة تغيير ملكية المنشأة."
|
| 1131 |
+
},
|
| 1132 |
+
{
|
| 1133 |
+
"id": "Q082",
|
| 1134 |
+
"category": "labor",
|
| 1135 |
+
"question": "ما مضمون المادة 7 في قانون العمل المصري (قانون العمل)؟",
|
| 1136 |
+
"expected": {
|
| 1137 |
+
"law": "labor",
|
| 1138 |
+
"expected_article_numbers": [
|
| 1139 |
+
"7"
|
| 1140 |
+
],
|
| 1141 |
+
"must_cite_articles": true
|
| 1142 |
+
},
|
| 1143 |
+
"notes": "إعفاء العمال من الرسوم القضائية والدمغة مع النفاذ المعجل وعدم اشتراط محامٍ."
|
| 1144 |
+
},
|
| 1145 |
+
{
|
| 1146 |
+
"id": "Q083",
|
| 1147 |
+
"category": "labor",
|
| 1148 |
+
"question": "ما مضمون المادة 8 في قانون العمل المصري (قانون العمل)؟",
|
| 1149 |
+
"expected": {
|
| 1150 |
+
"law": "labor",
|
| 1151 |
+
"expected_article_numbers": [
|
| 1152 |
+
"8"
|
| 1153 |
+
],
|
| 1154 |
+
"must_cite_articles": true
|
| 1155 |
+
},
|
| 1156 |
+
"notes": "امتياز حقوق العمال على جميع أموال صاحب العمل قبل أي ديون أخرى بما فيها ديون الخزانة العامة."
|
| 1157 |
+
},
|
| 1158 |
+
{
|
| 1159 |
+
"id": "Q084",
|
| 1160 |
+
"category": "labor",
|
| 1161 |
+
"question": "ما مضمون المادة 9 في قانون العمل المصري (قانون العمل)؟",
|
| 1162 |
+
"expected": {
|
| 1163 |
+
"law": "labor",
|
| 1164 |
+
"expected_article_numbers": [
|
| 1165 |
+
"9"
|
| 1166 |
+
],
|
| 1167 |
+
"must_cite_articles": true
|
| 1168 |
+
},
|
| 1169 |
+
"notes": "حماية حقوق العمال في حالة التصفية أو الإفلاس مع إشراف الجهة الإدارية المختصة."
|
| 1170 |
+
},
|
| 1171 |
+
{
|
| 1172 |
+
"id": "Q085",
|
| 1173 |
+
"category": "labor",
|
| 1174 |
+
"question": "ما مضمون المادة 10 في قانون العمل المصري (قانون العمل)؟",
|
| 1175 |
+
"expected": {
|
| 1176 |
+
"law": "labor",
|
| 1177 |
+
"expected_article_numbers": [
|
| 1178 |
+
"10"
|
| 1179 |
+
],
|
| 1180 |
+
"must_cite_articles": true
|
| 1181 |
+
},
|
| 1182 |
+
"notes": "المسؤولية التضامنية لأصحاب العمل المتعددين والوكلاء المفوضين."
|
| 1183 |
+
},
|
| 1184 |
+
{
|
| 1185 |
+
"id": "Q086",
|
| 1186 |
+
"category": "labor",
|
| 1187 |
+
"question": "ما مضمون المادة 11 في قانون العمل المصري (قانون العمل)؟",
|
| 1188 |
+
"expected": {
|
| 1189 |
+
"law": "labor",
|
| 1190 |
+
"expected_article_numbers": [
|
| 1191 |
+
"11"
|
| 1192 |
+
],
|
| 1193 |
+
"must_cite_articles": true
|
| 1194 |
+
},
|
| 1195 |
+
"notes": "استمرار عقود العمل رغم انتقال ملكية المنشأة بأي طريق."
|
| 1196 |
+
},
|
| 1197 |
+
{
|
| 1198 |
+
"id": "Q087",
|
| 1199 |
+
"category": "labor",
|
| 1200 |
+
"question": "ما مضمون المادة 12 في قانون العمل المصري (قانون العمل)؟",
|
| 1201 |
+
"expected": {
|
| 1202 |
+
"law": "labor",
|
| 1203 |
+
"expected_article_numbers": [
|
| 1204 |
+
"12"
|
| 1205 |
+
],
|
| 1206 |
+
"must_cite_articles": true
|
| 1207 |
+
},
|
| 1208 |
+
"notes": "علاوة سنوية لا تقل عن 3% من الأجر التأميني مع إمكانية التخفيض بموافقة المجلس القومي للأجور."
|
| 1209 |
+
},
|
| 1210 |
+
{
|
| 1211 |
+
"id": "Q088",
|
| 1212 |
+
"category": "labor",
|
| 1213 |
+
"question": "ما مضمون المادة 13 في قانون العمل المصري (قانون العمل)؟",
|
| 1214 |
+
"expected": {
|
| 1215 |
+
"law": "labor",
|
| 1216 |
+
"expected_article_numbers": [
|
| 1217 |
+
"13"
|
| 1218 |
+
],
|
| 1219 |
+
"must_cite_articles": true
|
| 1220 |
+
},
|
| 1221 |
+
"notes": "تحديد اختصاصات الجهة الإدارية المختصة بقرار من الوزير."
|
| 1222 |
+
},
|
| 1223 |
+
{
|
| 1224 |
+
"id": "Q089",
|
| 1225 |
+
"category": "labor",
|
| 1226 |
+
"question": "ما مضمون المادة 14 في قانون العمل المصري (قانون العمل)؟",
|
| 1227 |
+
"expected": {
|
| 1228 |
+
"law": "labor",
|
| 1229 |
+
"expected_article_numbers": [
|
| 1230 |
+
"14"
|
| 1231 |
+
],
|
| 1232 |
+
"must_cite_articles": true
|
| 1233 |
+
},
|
| 1234 |
+
"notes": "توزيع حصيلة الغرامات: ثلث للوزارة للخدمات والتدريب، والباقي للخزانة العامة."
|
| 1235 |
+
},
|
| 1236 |
+
{
|
| 1237 |
+
"id": "Q090",
|
| 1238 |
+
"category": "labor",
|
| 1239 |
+
"question": "ما مضمون المادة 15 في قانون العمل المصري (قانون العمل)؟",
|
| 1240 |
+
"expected": {
|
| 1241 |
+
"law": "labor",
|
| 1242 |
+
"expected_article_numbers": [
|
| 1243 |
+
"15"
|
| 1244 |
+
],
|
| 1245 |
+
"must_cite_articles": true
|
| 1246 |
+
},
|
| 1247 |
+
"notes": "تحصيل الرسوم والخدمات وفقاً لقانون وسائل الدفع غير النقدي."
|
| 1248 |
+
},
|
| 1249 |
+
{
|
| 1250 |
+
"id": "Q091",
|
| 1251 |
+
"category": "personal_status",
|
| 1252 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 1؟",
|
| 1253 |
+
"expected": {
|
| 1254 |
+
"law": "personal_status",
|
| 1255 |
+
"expected_article_numbers": [
|
| 1256 |
+
"1"
|
| 1257 |
+
],
|
| 1258 |
+
"must_cite_articles": true
|
| 1259 |
+
},
|
| 1260 |
+
"notes": "تجب النفقة للزوجة من تاريخ العقد الصحيح وتشمل الغذاء والكسوة والمسكن والعلاج. لا تجب النفقة إذا ارتدت أو امتنعت عن تسليم نفسها أو خرجت بدون إذن. نفقة الزوجة دين على الزوج ولها امتياز على أمواله."
|
| 1261 |
+
},
|
| 1262 |
+
{
|
| 1263 |
+
"id": "Q092",
|
| 1264 |
+
"category": "personal_status",
|
| 1265 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 2؟",
|
| 1266 |
+
"expected": {
|
| 1267 |
+
"law": "personal_status",
|
| 1268 |
+
"expected_article_numbers": [
|
| 1269 |
+
"2"
|
| 1270 |
+
],
|
| 1271 |
+
"must_cite_articles": true
|
| 1272 |
+
},
|
| 1273 |
+
"notes": "نفقة المطلقة التي تستحقها تعتبر ديناً من تاريخ الطلاق."
|
| 1274 |
+
},
|
| 1275 |
+
{
|
| 1276 |
+
"id": "Q093",
|
| 1277 |
+
"category": "personal_status",
|
| 1278 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 3؟",
|
| 1279 |
+
"expected": {
|
| 1280 |
+
"law": "personal_status",
|
| 1281 |
+
"expected_article_numbers": [
|
| 1282 |
+
"3"
|
| 1283 |
+
],
|
| 1284 |
+
"must_cite_articles": true
|
| 1285 |
+
},
|
| 1286 |
+
"notes": "مادة ملغاة."
|
| 1287 |
+
},
|
| 1288 |
+
{
|
| 1289 |
+
"id": "Q094",
|
| 1290 |
+
"category": "personal_status",
|
| 1291 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 4؟",
|
| 1292 |
+
"expected": {
|
| 1293 |
+
"law": "personal_status",
|
| 1294 |
+
"expected_article_numbers": [
|
| 1295 |
+
"4"
|
| 1296 |
+
],
|
| 1297 |
+
"must_cite_articles": true
|
| 1298 |
+
},
|
| 1299 |
+
"notes": "إذا امتنع الزوج عن الإنفاق وله مال ظاهر نفذ الحكم في ماله. وإن لم يكن له مال وأصر على عدم الإنفاق طلق عليه القاضي. وإن ادعى العجز وأثبته أمهله شهراً."
|
| 1300 |
+
},
|
| 1301 |
+
{
|
| 1302 |
+
"id": "Q095",
|
| 1303 |
+
"category": "personal_status",
|
| 1304 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 5؟",
|
| 1305 |
+
"expected": {
|
| 1306 |
+
"law": "personal_status",
|
| 1307 |
+
"expected_article_numbers": [
|
| 1308 |
+
"5"
|
| 1309 |
+
],
|
| 1310 |
+
"must_cite_articles": true
|
| 1311 |
+
},
|
| 1312 |
+
"notes": "إذا كان الزوج غائباً غيبة قريبة وله مال نفذ الحكم في ماله، وإن لم يكن له مال أعذر إليه القاضي. وإن كان بعيد الغيبة أو مفقوداً ولا مال له طلق عليه القاضي. وتسري الأحكام على المحبوس المعسر."
|
| 1313 |
+
},
|
| 1314 |
+
{
|
| 1315 |
+
"id": "Q096",
|
| 1316 |
+
"category": "personal_status",
|
| 1317 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 6؟",
|
| 1318 |
+
"expected": {
|
| 1319 |
+
"law": "personal_status",
|
| 1320 |
+
"expected_article_numbers": [
|
| 1321 |
+
"6"
|
| 1322 |
+
],
|
| 1323 |
+
"must_cite_articles": true
|
| 1324 |
+
},
|
| 1325 |
+
"notes": "التطليق لعدم الإنفاق يقع رجعياً، وللزوج مراجعة زوجته إذا ثبت يساره واستعد للإنفاق أثناء العدة."
|
| 1326 |
+
},
|
| 1327 |
+
{
|
| 1328 |
+
"id": "Q097",
|
| 1329 |
+
"category": "personal_status",
|
| 1330 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 7؟",
|
| 1331 |
+
"expected": {
|
| 1332 |
+
"law": "personal_status",
|
| 1333 |
+
"expected_article_numbers": [
|
| 1334 |
+
"7"
|
| 1335 |
+
],
|
| 1336 |
+
"must_cite_articles": true
|
| 1337 |
+
},
|
| 1338 |
+
"notes": "مادة ملغاة."
|
| 1339 |
+
},
|
| 1340 |
+
{
|
| 1341 |
+
"id": "Q098",
|
| 1342 |
+
"category": "personal_status",
|
| 1343 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 8؟",
|
| 1344 |
+
"expected": {
|
| 1345 |
+
"law": "personal_status",
|
| 1346 |
+
"expected_article_numbers": [
|
| 1347 |
+
"8"
|
| 1348 |
+
],
|
| 1349 |
+
"must_cite_articles": true
|
| 1350 |
+
},
|
| 1351 |
+
"notes": "إذا ظهر المفقود حياً فزوجته له، إلا إذا تمتع بها الثاني دون علم بحياة الأول فتكون للثاني ما لم يكن عقده في عدة وفاة الأول."
|
| 1352 |
+
},
|
| 1353 |
+
{
|
| 1354 |
+
"id": "Q099",
|
| 1355 |
+
"category": "personal_status",
|
| 1356 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 9؟",
|
| 1357 |
+
"expected": {
|
| 1358 |
+
"law": "personal_status",
|
| 1359 |
+
"expected_article_numbers": [
|
| 1360 |
+
"9"
|
| 1361 |
+
],
|
| 1362 |
+
"must_cite_articles": true
|
| 1363 |
+
},
|
| 1364 |
+
"notes": "للزوجة طلب التفريق إذا وجدت بزوجها عيباً مستحكماً كالجنون أو الجذام أو البرص، سواء كان قبل العقد أو بعده، ما لم تكن عالمة به أو رضيت به."
|
| 1365 |
+
},
|
| 1366 |
+
{
|
| 1367 |
+
"id": "Q100",
|
| 1368 |
+
"category": "personal_status",
|
| 1369 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 10؟",
|
| 1370 |
+
"expected": {
|
| 1371 |
+
"law": "personal_status",
|
| 1372 |
+
"expected_article_numbers": [
|
| 1373 |
+
"10"
|
| 1374 |
+
],
|
| 1375 |
+
"must_cite_articles": true
|
| 1376 |
+
},
|
| 1377 |
+
"notes": "الفرقة بسبب العيب تعتبر طلاقاً بائناً."
|
| 1378 |
+
}
|
| 1379 |
+
]
|
| 1380 |
+
}
|
rag_test_questions_10_mixed.json
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_version": "1.0",
|
| 3 |
+
"dataset_version": "2026-02-03-mixed10",
|
| 4 |
+
"created_at": "2026-02-03T19:15:30.097990+00:00",
|
| 5 |
+
"description": "Benchmark set for Egyptian legal RAG assistant: constitutional Qs + multi-law retrieval + procedural gating. (Mixed 10-case smoke test across 5 categories)",
|
| 6 |
+
"laws_in_scope": [
|
| 7 |
+
{
|
| 8 |
+
"key": "constitution",
|
| 9 |
+
"path": "/mnt/data/Egyptian_Constitution_legalnature_only.json"
|
| 10 |
+
},
|
| 11 |
+
{
|
| 12 |
+
"key": "criminal_procedure",
|
| 13 |
+
"path": "/mnt/data/قانون_الإجراءات_الجنائية.json"
|
| 14 |
+
},
|
| 15 |
+
{
|
| 16 |
+
"key": "tech_crimes",
|
| 17 |
+
"path": "/mnt/data/Technology Crimes Law.json"
|
| 18 |
+
},
|
| 19 |
+
{
|
| 20 |
+
"key": "labor",
|
| 21 |
+
"path": "/mnt/data/Egyptian_Labour_Law.json"
|
| 22 |
+
},
|
| 23 |
+
{
|
| 24 |
+
"key": "personal_status",
|
| 25 |
+
"path": "/mnt/data/Egyptian_Personal Status Laws.json"
|
| 26 |
+
},
|
| 27 |
+
{
|
| 28 |
+
"key": "civil",
|
| 29 |
+
"path": "/mnt/data/Egyptian_Civil.json"
|
| 30 |
+
}
|
| 31 |
+
],
|
| 32 |
+
"defaults": {
|
| 33 |
+
"k": 15,
|
| 34 |
+
"rerank_top_n": 5,
|
| 35 |
+
"recall_k": 5,
|
| 36 |
+
"pass_rule": "pass if recall@k>=1 for questions with expected articles; else pass if answer startswith expected_answer_prefix (if provided)."
|
| 37 |
+
},
|
| 38 |
+
"cases": [
|
| 39 |
+
{
|
| 40 |
+
"id": "Q001",
|
| 41 |
+
"category": "constitutional",
|
| 42 |
+
"question": "ما مضمون المادة 1 من الدستور المصري؟",
|
| 43 |
+
"expected": {
|
| 44 |
+
"law": "constitution",
|
| 45 |
+
"expected_article_numbers": [
|
| 46 |
+
"1"
|
| 47 |
+
],
|
| 48 |
+
"must_cite_articles": true,
|
| 49 |
+
"answer_should_not_add_external_info": true
|
| 50 |
+
},
|
| 51 |
+
"notes": "جمهورية مصر العربية دولة ذات سيادة، موحدة لا تقبل التجزئة، نظامها جمهوري ديمقراطي يقوم على المواطنة وسيادة القانون. الشعب المصري جزء من الأمة العربية والعالم الإسلامي والقارة الأفريقية."
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"id": "Q002",
|
| 55 |
+
"category": "constitutional",
|
| 56 |
+
"question": "ما مضمون المادة 2 من الدستور المصري؟",
|
| 57 |
+
"expected": {
|
| 58 |
+
"law": "constitution",
|
| 59 |
+
"expected_article_numbers": [
|
| 60 |
+
"2"
|
| 61 |
+
],
|
| 62 |
+
"must_cite_articles": true,
|
| 63 |
+
"answer_should_not_add_external_info": true
|
| 64 |
+
},
|
| 65 |
+
"notes": "الإسلام دين الدولة، واللغة العربية لغتها الرسمية، ومبادئ الشريعة الإسلامية هي المصدر الرئيسي للتشريع."
|
| 66 |
+
},
|
| 67 |
+
{
|
| 68 |
+
"id": "Q041",
|
| 69 |
+
"category": "criminal_procedure",
|
| 70 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 1؟",
|
| 71 |
+
"expected": {
|
| 72 |
+
"law": "criminal_procedure",
|
| 73 |
+
"expected_article_numbers": [
|
| 74 |
+
"1"
|
| 75 |
+
],
|
| 76 |
+
"must_cite_articles": true
|
| 77 |
+
},
|
| 78 |
+
"notes": "النيابة العامة هي الجهة الوحيدة المختصة برفع الدعوى الجنائية ومباشرتها، ولا يجوز تركها أو وقفها إلا وفقاً للقانون."
|
| 79 |
+
},
|
| 80 |
+
{
|
| 81 |
+
"id": "Q042",
|
| 82 |
+
"category": "criminal_procedure",
|
| 83 |
+
"question": "وفقاً لقانون الإجراءات الجنائية، ماذا تقرر المادة 2؟",
|
| 84 |
+
"expected": {
|
| 85 |
+
"law": "criminal_procedure",
|
| 86 |
+
"expected_article_numbers": [
|
| 87 |
+
"2"
|
| 88 |
+
],
|
| 89 |
+
"must_cite_articles": true
|
| 90 |
+
},
|
| 91 |
+
"notes": "النائب العام أو أعضاء النيابة العامة يباشرون الدعوى الجنائية، ويجوز تعيين آخرين لأداء هذه الوظيفة وفقاً للقانون."
|
| 92 |
+
},
|
| 93 |
+
{
|
| 94 |
+
"id": "Q066",
|
| 95 |
+
"category": "tech_crimes",
|
| 96 |
+
"question": "ما الذي تنظمه المادة 1 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 97 |
+
"expected": {
|
| 98 |
+
"law": "tech_crimes",
|
| 99 |
+
"expected_article_numbers": [
|
| 100 |
+
"1"
|
| 101 |
+
],
|
| 102 |
+
"must_cite_articles": true
|
| 103 |
+
},
|
| 104 |
+
"notes": "تحدد المادة التعريفات الأساسية في القانون مثل الجهاز والوزير المختص والبيانات الإلكترونية والبيانات الشخصية والحكومية، والمعالجة الإلكترونية وتقنية المعلومات، ومقدم الخدمة والمستخدم، والبرنامج والنظام"
|
| 105 |
+
},
|
| 106 |
+
{
|
| 107 |
+
"id": "Q067",
|
| 108 |
+
"category": "tech_crimes",
|
| 109 |
+
"question": "ما الذي تنظمه المادة 2 في قانون مكافحة جرائم تقنية المعلومات؟",
|
| 110 |
+
"expected": {
|
| 111 |
+
"law": "tech_crimes",
|
| 112 |
+
"expected_article_numbers": [
|
| 113 |
+
"2"
|
| 114 |
+
],
|
| 115 |
+
"must_cite_articles": true
|
| 116 |
+
},
|
| 117 |
+
"notes": "تُلزم المادة مقدمي الخدمة بحفظ سجلات وبيانات محددة لمدة 180 يومًا، والحفاظ على سريتها وتأمينها وعدم إفشائها إلا بأمر قضائي. كما تُلزم��م بتوفير بيانات تعريفية وترخيصية للمستخدمين والجهات المختصة، وتمكي"
|
| 118 |
+
},
|
| 119 |
+
{
|
| 120 |
+
"id": "Q076",
|
| 121 |
+
"category": "labor",
|
| 122 |
+
"question": "ما مضمون المادة 1 في قانون العمل المصري (قانون العمل)؟",
|
| 123 |
+
"expected": {
|
| 124 |
+
"law": "labor",
|
| 125 |
+
"expected_article_numbers": [
|
| 126 |
+
"1"
|
| 127 |
+
],
|
| 128 |
+
"must_cite_articles": true
|
| 129 |
+
},
|
| 130 |
+
"notes": "تعريفات شاملة لـ 38 مصطلحاً أساسياً في قانون العمل تشمل: تعريف العامل وصاحب العمل والمتدرج، تفصيل شامل لمكونات الأجر (الأساسي والمتغير بما في ذلك العمولة والعلاوات والمنح والمكافآت والبدلات ونصيب الأر"
|
| 131 |
+
},
|
| 132 |
+
{
|
| 133 |
+
"id": "Q077",
|
| 134 |
+
"category": "labor",
|
| 135 |
+
"question": "ما مضمون المادة 2 في قانون العمل المصري (قانون العمل)؟",
|
| 136 |
+
"expected": {
|
| 137 |
+
"law": "labor",
|
| 138 |
+
"expected_article_numbers": [
|
| 139 |
+
"2"
|
| 140 |
+
],
|
| 141 |
+
"must_cite_articles": true
|
| 142 |
+
},
|
| 143 |
+
"notes": "تحديد السنة بـ365 يوماً والشهر بـ30 يوماً لأغراض تطبيق القانون، ما لم يتفق الطرفان على خلاف ذلك."
|
| 144 |
+
},
|
| 145 |
+
{
|
| 146 |
+
"id": "Q091",
|
| 147 |
+
"category": "personal_status",
|
| 148 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 1؟",
|
| 149 |
+
"expected": {
|
| 150 |
+
"law": "personal_status",
|
| 151 |
+
"expected_article_numbers": [
|
| 152 |
+
"1"
|
| 153 |
+
],
|
| 154 |
+
"must_cite_articles": true
|
| 155 |
+
},
|
| 156 |
+
"notes": "تجب النفقة للزوجة من تاريخ العقد الصحيح وتشمل الغذاء والكسوة والمسكن والعلاج. لا تجب النفقة إذا ارتدت أو امتنعت عن تسليم نفسها أو خرجت بدون إذن. نفقة الزوجة دين على الزوج ولها امتياز على أمواله."
|
| 157 |
+
},
|
| 158 |
+
{
|
| 159 |
+
"id": "Q092",
|
| 160 |
+
"category": "personal_status",
|
| 161 |
+
"question": "في القانون رقم 25 لسنة 1920، ماذا تقرر المادة 2؟",
|
| 162 |
+
"expected": {
|
| 163 |
+
"law": "personal_status",
|
| 164 |
+
"expected_article_numbers": [
|
| 165 |
+
"2"
|
| 166 |
+
],
|
| 167 |
+
"must_cite_articles": true
|
| 168 |
+
},
|
| 169 |
+
"notes": "نفقة المطلقة التي تستحقها تعتبر ديناً من تاريخ الطلاق."
|
| 170 |
+
}
|
| 171 |
+
]
|
| 172 |
+
}
|
rag_test_runner.py
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
RAG Test Runner (metrics + CSV)
|
| 5 |
+
--------------------------------
|
| 6 |
+
Runs a JSON test set against either:
|
| 7 |
+
1) a local Python module exposing `ask(question) -> (answer: str, sources: list[dict])`, OR
|
| 8 |
+
2) an HTTP endpoint that returns JSON {"answer": "...", "sources": [...]}
|
| 9 |
+
|
| 10 |
+
Outputs:
|
| 11 |
+
- summary metrics to stdout
|
| 12 |
+
- a CSV report with per-case results (pass/fail + recall@k + rank)
|
| 13 |
+
"""
|
| 14 |
+
from __future__ import annotations
|
| 15 |
+
|
| 16 |
+
import argparse
|
| 17 |
+
import csv
|
| 18 |
+
import importlib
|
| 19 |
+
import json
|
| 20 |
+
import re
|
| 21 |
+
from dataclasses import dataclass
|
| 22 |
+
from datetime import datetime
|
| 23 |
+
from typing import Any, Dict, List, Optional, Tuple
|
| 24 |
+
|
| 25 |
+
try:
|
| 26 |
+
import requests # optional for --mode http
|
| 27 |
+
except Exception: # pragma: no cover
|
| 28 |
+
requests = None # type: ignore
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
@dataclass
|
| 32 |
+
class CaseResult:
|
| 33 |
+
case_id: str
|
| 34 |
+
category: str
|
| 35 |
+
question: str
|
| 36 |
+
expected_articles: List[str]
|
| 37 |
+
got_articles: List[str]
|
| 38 |
+
recall_at_k: float
|
| 39 |
+
rank: Optional[int]
|
| 40 |
+
passed: bool
|
| 41 |
+
fail_reason: Optional[str]
|
| 42 |
+
answer_snippet: str
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def normalize_article_number(x: Any) -> Optional[str]:
|
| 46 |
+
if x is None:
|
| 47 |
+
return None
|
| 48 |
+
s = str(x).strip()
|
| 49 |
+
s = re.sub(r"\s+", " ", s)
|
| 50 |
+
return s or None
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
def extract_articles(sources: Any, key: str) -> List[str]:
|
| 54 |
+
out: List[str] = []
|
| 55 |
+
if not sources:
|
| 56 |
+
return out
|
| 57 |
+
if isinstance(sources, dict):
|
| 58 |
+
sources = [sources]
|
| 59 |
+
if not isinstance(sources, list):
|
| 60 |
+
return out
|
| 61 |
+
|
| 62 |
+
for s in sources:
|
| 63 |
+
if not isinstance(s, dict):
|
| 64 |
+
continue
|
| 65 |
+
val = s.get(key)
|
| 66 |
+
num = normalize_article_number(val)
|
| 67 |
+
if num:
|
| 68 |
+
out.append(num)
|
| 69 |
+
return out
|
| 70 |
+
|
| 71 |
+
|
| 72 |
+
def recall_and_rank(expected: List[str], retrieved: List[str], k: int) -> Tuple[float, Optional[int]]:
|
| 73 |
+
if not expected:
|
| 74 |
+
return 0.0, None
|
| 75 |
+
topk = retrieved[:k]
|
| 76 |
+
exp_set = set(expected)
|
| 77 |
+
for i, a in enumerate(topk, start=1):
|
| 78 |
+
if a in exp_set:
|
| 79 |
+
return 1.0, i
|
| 80 |
+
return 0.0, None
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
def run_local(module_name: str, question: str) -> Tuple[str, Any]:
|
| 84 |
+
mod = importlib.import_module(module_name)
|
| 85 |
+
if not hasattr(mod, "ask"):
|
| 86 |
+
raise AttributeError(f"Module '{module_name}' must expose ask(question) -> (answer, sources)")
|
| 87 |
+
answer, sources = mod.ask(question)
|
| 88 |
+
return str(answer), sources
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
def run_http(url: str, question: str, timeout: float = 60.0) -> Tuple[str, Any]:
|
| 92 |
+
if requests is None:
|
| 93 |
+
raise RuntimeError("requests is not installed. Install it or use --mode local.")
|
| 94 |
+
resp = requests.post(url, json={"question": question}, timeout=timeout)
|
| 95 |
+
resp.raise_for_status()
|
| 96 |
+
data = resp.json()
|
| 97 |
+
return str(data.get("answer", "")), data.get("sources", [])
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
def evaluate_case(
|
| 101 |
+
case: Dict[str, Any],
|
| 102 |
+
mode: str,
|
| 103 |
+
module_name: str,
|
| 104 |
+
url: str,
|
| 105 |
+
k: int,
|
| 106 |
+
source_article_key: str,
|
| 107 |
+
) -> CaseResult:
|
| 108 |
+
case_id = str(case.get("id", ""))
|
| 109 |
+
category = str(case.get("category", ""))
|
| 110 |
+
question = str(case.get("question", "")).strip()
|
| 111 |
+
|
| 112 |
+
expected = case.get("expected", {}) or {}
|
| 113 |
+
expected_articles = [normalize_article_number(x) for x in (expected.get("expected_article_numbers") or [])]
|
| 114 |
+
expected_articles = [x for x in expected_articles if x]
|
| 115 |
+
expected_prefix = expected.get("expected_answer_prefix")
|
| 116 |
+
|
| 117 |
+
# Run model
|
| 118 |
+
if mode == "local":
|
| 119 |
+
answer, sources = run_local(module_name, question)
|
| 120 |
+
else:
|
| 121 |
+
answer, sources = run_http(url, question)
|
| 122 |
+
|
| 123 |
+
got_articles = extract_articles(sources, source_article_key)
|
| 124 |
+
|
| 125 |
+
r_at_k, rank = recall_and_rank(expected_articles, got_articles, k)
|
| 126 |
+
|
| 127 |
+
# Pass/fail logic
|
| 128 |
+
passed = True
|
| 129 |
+
fail_reason = None
|
| 130 |
+
|
| 131 |
+
if expected_articles:
|
| 132 |
+
if r_at_k < 1.0:
|
| 133 |
+
passed = False
|
| 134 |
+
fail_reason = f"missed expected articles in top-{k}"
|
| 135 |
+
else:
|
| 136 |
+
# No expected articles => check prefix if provided (procedural general gating)
|
| 137 |
+
if expected_prefix:
|
| 138 |
+
if not answer.strip().startswith(str(expected_prefix).strip()):
|
| 139 |
+
passed = False
|
| 140 |
+
fail_reason = "answer did not follow expected procedural prefix"
|
| 141 |
+
|
| 142 |
+
snippet = answer.strip().replace("\n", " ")
|
| 143 |
+
if len(snippet) > 220:
|
| 144 |
+
snippet = snippet[:220] + "…"
|
| 145 |
+
|
| 146 |
+
return CaseResult(
|
| 147 |
+
case_id=case_id,
|
| 148 |
+
category=category,
|
| 149 |
+
question=question,
|
| 150 |
+
expected_articles=expected_articles,
|
| 151 |
+
got_articles=got_articles[:k],
|
| 152 |
+
recall_at_k=r_at_k,
|
| 153 |
+
rank=rank,
|
| 154 |
+
passed=passed,
|
| 155 |
+
fail_reason=fail_reason,
|
| 156 |
+
answer_snippet=snippet,
|
| 157 |
+
)
|
| 158 |
+
|
| 159 |
+
|
| 160 |
+
def main() -> int:
|
| 161 |
+
ap = argparse.ArgumentParser()
|
| 162 |
+
ap.add_argument("--suite", required=True, help="Path to JSON test suite")
|
| 163 |
+
ap.add_argument("--mode", choices=["local", "http"], default="local")
|
| 164 |
+
ap.add_argument("--module", default="rag", help="Python module name for local mode (default: rag)")
|
| 165 |
+
ap.add_argument("--url", default="http://127.0.0.1:8000/ask", help="HTTP endpoint for http mode")
|
| 166 |
+
ap.add_argument("--k", type=int, default=5, help="k for recall@k (default: 5)")
|
| 167 |
+
ap.add_argument("--out", default="rag_test_report.csv", help="Output CSV file path")
|
| 168 |
+
ap.add_argument(
|
| 169 |
+
"--source-article-key",
|
| 170 |
+
default="article_number",
|
| 171 |
+
help="Key used inside each source dict for the article number (default: article_number)",
|
| 172 |
+
)
|
| 173 |
+
args = ap.parse_args()
|
| 174 |
+
|
| 175 |
+
with open(args.suite, "r", encoding="utf-8") as f:
|
| 176 |
+
suite = json.load(f)
|
| 177 |
+
|
| 178 |
+
cases = suite.get("cases") if isinstance(suite, dict) else None
|
| 179 |
+
if not isinstance(cases, list):
|
| 180 |
+
raise ValueError("Invalid suite format: expected {'cases': [...]}")
|
| 181 |
+
|
| 182 |
+
results: List[CaseResult] = []
|
| 183 |
+
|
| 184 |
+
for case in cases:
|
| 185 |
+
if not isinstance(case, dict):
|
| 186 |
+
continue
|
| 187 |
+
|
| 188 |
+
try:
|
| 189 |
+
res = evaluate_case(case, args.mode, args.module, args.url, args.k, args.source_article_key)
|
| 190 |
+
results.append(res) # ✅ FIX: append success results
|
| 191 |
+
except Exception as e:
|
| 192 |
+
cid = str(case.get("id", ""))
|
| 193 |
+
results.append(
|
| 194 |
+
CaseResult(
|
| 195 |
+
case_id=cid,
|
| 196 |
+
category=str(case.get("category", "")),
|
| 197 |
+
question=str(case.get("question", "")),
|
| 198 |
+
expected_articles=[
|
| 199 |
+
str(x)
|
| 200 |
+
for x in (case.get("expected", {}) or {}).get("expected_article_numbers", [])
|
| 201 |
+
],
|
| 202 |
+
got_articles=[],
|
| 203 |
+
recall_at_k=0.0,
|
| 204 |
+
rank=None,
|
| 205 |
+
passed=False,
|
| 206 |
+
fail_reason=f"runner error: {e}",
|
| 207 |
+
answer_snippet="",
|
| 208 |
+
)
|
| 209 |
+
)
|
| 210 |
+
|
| 211 |
+
# Aggregate metrics
|
| 212 |
+
total = len(results)
|
| 213 |
+
passed_cnt = sum(1 for r in results if r.passed)
|
| 214 |
+
pass_rate = (passed_cnt / total) if total else 0.0
|
| 215 |
+
|
| 216 |
+
with_expected = [r for r in results if r.expected_articles]
|
| 217 |
+
avg_recall = (sum(r.recall_at_k for r in with_expected) / len(with_expected)) if with_expected else 0.0
|
| 218 |
+
|
| 219 |
+
# MRR on cases with expected
|
| 220 |
+
rr_vals = [(1.0 / r.rank) for r in with_expected if r.rank]
|
| 221 |
+
mrr = (sum(rr_vals) / len(with_expected)) if with_expected else 0.0
|
| 222 |
+
|
| 223 |
+
# Write CSV
|
| 224 |
+
fieldnames = [
|
| 225 |
+
"id",
|
| 226 |
+
"category",
|
| 227 |
+
"question",
|
| 228 |
+
"expected_articles",
|
| 229 |
+
"retrieved_topk_articles",
|
| 230 |
+
"recall_at_k",
|
| 231 |
+
"rank",
|
| 232 |
+
"passed",
|
| 233 |
+
"fail_reason",
|
| 234 |
+
"answer_snippet",
|
| 235 |
+
]
|
| 236 |
+
with open(args.out, "w", encoding="utf-8-sig", newline="") as f:
|
| 237 |
+
w = csv.DictWriter(f, fieldnames=fieldnames)
|
| 238 |
+
w.writeheader()
|
| 239 |
+
for r in results:
|
| 240 |
+
w.writerow(
|
| 241 |
+
{
|
| 242 |
+
"id": r.case_id,
|
| 243 |
+
"category": r.category,
|
| 244 |
+
"question": r.question,
|
| 245 |
+
"expected_articles": "|".join(r.expected_articles),
|
| 246 |
+
"retrieved_topk_articles": "|".join(r.got_articles),
|
| 247 |
+
"recall_at_k": f"{r.recall_at_k:.3f}",
|
| 248 |
+
"rank": "" if r.rank is None else r.rank,
|
| 249 |
+
"passed": "PASS" if r.passed else "FAIL",
|
| 250 |
+
"fail_reason": r.fail_reason or "",
|
| 251 |
+
"answer_snippet": r.answer_snippet,
|
| 252 |
+
}
|
| 253 |
+
)
|
| 254 |
+
|
| 255 |
+
print("=== RAG Test Summary ===")
|
| 256 |
+
print(f"Timestamp: {datetime.utcnow().isoformat()}Z")
|
| 257 |
+
print(f"Suite: {args.suite}")
|
| 258 |
+
print(f"Mode: {args.mode}")
|
| 259 |
+
print(f"k: {args.k}")
|
| 260 |
+
print(f"Total cases: {total}")
|
| 261 |
+
print(f"Passed: {passed_cnt} ({pass_rate*100:.1f}%)")
|
| 262 |
+
print(f"Avg recall@{args.k} (cases with expected): {avg_recall:.3f}")
|
| 263 |
+
print(f"MRR (cases with expected): {mrr:.3f}")
|
| 264 |
+
print(f"CSV report: {args.out}")
|
| 265 |
+
|
| 266 |
+
return 0 if passed_cnt == total else 1
|
| 267 |
+
|
| 268 |
+
|
| 269 |
+
if __name__ == "__main__":
|
| 270 |
+
raise SystemExit(main())
|
requirements.txt
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ===========================================
|
| 2 |
+
# Constitutional Legal Assistant - Requirements
|
| 3 |
+
# ===========================================
|
| 4 |
+
|
| 5 |
+
# Core Python
|
| 6 |
+
python-dotenv>=1.0.0
|
| 7 |
+
|
| 8 |
+
# Streamlit UI
|
| 9 |
+
streamlit>=1.28.0
|
| 10 |
+
|
| 11 |
+
# LangChain Core
|
| 12 |
+
langchain>=0.2.0
|
| 13 |
+
langchain-core>=0.2.0
|
| 14 |
+
langchain-text-splitters>=0.2.0
|
| 15 |
+
langchain-community>=0.2.0
|
| 16 |
+
langchain-classic>=0.0.1
|
| 17 |
+
|
| 18 |
+
# Vector Store
|
| 19 |
+
langchain-chroma>=0.1.0
|
| 20 |
+
chromadb>=0.4.0
|
| 21 |
+
|
| 22 |
+
# Embeddings & Reranker
|
| 23 |
+
langchain-huggingface>=0.0.3
|
| 24 |
+
sentence-transformers>=2.2.0
|
| 25 |
+
transformers>=4.35.0
|
| 26 |
+
torch>=2.0.0
|
| 27 |
+
|
| 28 |
+
# LLM Provider (Groq)
|
| 29 |
+
langchain-groq>=0.1.0
|
| 30 |
+
|
| 31 |
+
# BM25 Keyword Search
|
| 32 |
+
rank-bm25>=0.2.2
|
| 33 |
+
|
| 34 |
+
# Numerical
|
| 35 |
+
numpy>=1.24.0
|
| 36 |
+
|
| 37 |
+
# ===========================================
|
| 38 |
+
# EVALUATION (RAGAS)
|
| 39 |
+
# ===========================================
|
| 40 |
+
ragas>=0.1.0
|
| 41 |
+
datasets>=2.14.0
|
| 42 |
+
|
| 43 |
+
# ===========================================
|
| 44 |
+
# PHOENIX OBSERVABILITY (Optional)
|
| 45 |
+
# ===========================================
|
| 46 |
+
# For app_final_pheonix.py tracing
|
| 47 |
+
opentelemetry-api>=1.20.0
|
| 48 |
+
opentelemetry-sdk>=1.20.0
|
| 49 |
+
opentelemetry-exporter-otlp-proto-http>=1.20.0
|
| 50 |
+
arize-phoenix>=4.0.0
|
| 51 |
+
|
| 52 |
+
# ===========================================
|
| 53 |
+
# LOCAL WHEEL PACKAGES (Install Separately)
|
| 54 |
+
# ===========================================
|
| 55 |
+
# Install these manually with:
|
| 56 |
+
# pip install openinference_instrumentation_langchain-0.1.56-py3-none-any.whl
|
| 57 |
+
# pip install openinference_instrumentation_openai-0.1.41-py3-none-any.whl
|
| 58 |
+
fastapi
|
| 59 |
+
uvicorn[standard]
|
| 60 |
+
requests
|
| 61 |
+
|
reranker/.gitattributes
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
reranker/README.md
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: apache-2.0
|
| 3 |
+
language:
|
| 4 |
+
- ar
|
| 5 |
+
pipeline_tag: text-ranking
|
| 6 |
+
tags:
|
| 7 |
+
- transformers
|
| 8 |
+
- sentence-transformers
|
| 9 |
+
- text-embeddings-inference
|
| 10 |
+
library_name: sentence-transformers
|
| 11 |
+
---
|
| 12 |
+
|
| 13 |
+
# Introducing ARM-V1 | Arabic Reranker Model (Version 1)
|
| 14 |
+
|
| 15 |
+
**For more info please refer to this blog: [ARM | Arabic Reranker Model](www.omarai.me).**
|
| 16 |
+
|
| 17 |
+
✨ This model is designed specifically for Arabic language reranking tasks, optimized to handle queries and passages with precision.
|
| 18 |
+
|
| 19 |
+
✨ Unlike embedding models, which generate vector representations, this reranker directly evaluates the similarity between a question and a document, outputting a relevance score.
|
| 20 |
+
|
| 21 |
+
✨ Trained on a combination of positive and hard negative query-passage pairs, it excels in identifying the most relevant results.
|
| 22 |
+
|
| 23 |
+
✨ The output score can be transformed into a [0, 1] range using a sigmoid function, providing a clear and interpretable measure of relevance.
|
| 24 |
+
|
| 25 |
+
## Arabic RAG Pipeline
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+

|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
## Usage
|
| 33 |
+
### Using sentence-transformers
|
| 34 |
+
|
| 35 |
+
```
|
| 36 |
+
pip install sentence-transformers
|
| 37 |
+
```
|
| 38 |
+
```python
|
| 39 |
+
from sentence_transformers import CrossEncoder
|
| 40 |
+
|
| 41 |
+
# Load the cross-encoder model
|
| 42 |
+
|
| 43 |
+
# Define a query and a set of candidates with varying degrees of relevance
|
| 44 |
+
query = "تطبيقات الذكاء الاصطناعي تُستخدم في مختلف المجالات لتحسين الكفاءة."
|
| 45 |
+
|
| 46 |
+
# Candidates with varying relevance to the query
|
| 47 |
+
candidates = [
|
| 48 |
+
"الذكاء الاصطناعي يساهم في تحسين الإنتاجية في الصناعات المختلفة.", # Highly relevant
|
| 49 |
+
"نماذج التعلم الآلي يمكنها التعرف على الأنماط في مجموعات البيانات الكبيرة.", # Moderately relevant
|
| 50 |
+
"الذكاء الاصطناعي يساعد الأطباء في تحليل الصور الطبية بشكل أفضل.", # Somewhat relevant
|
| 51 |
+
"تستخدم الحيوانات التمويه كوسيلة للهروب من الحيوانات المفترسة.", # Irrelevant
|
| 52 |
+
]
|
| 53 |
+
|
| 54 |
+
# Create pairs of (query, candidate) for each candidate
|
| 55 |
+
query_candidate_pairs = [(query, candidate) for candidate in candidates]
|
| 56 |
+
|
| 57 |
+
# Get relevance scores from the model
|
| 58 |
+
scores = model.predict(query_candidate_pairs)
|
| 59 |
+
|
| 60 |
+
# Combine candidates with their scores and sort them by score in descending order (higher score = higher relevance)
|
| 61 |
+
ranked_candidates = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)
|
| 62 |
+
|
| 63 |
+
# Output the ranked candidates with their scores
|
| 64 |
+
print("Ranked candidates based on relevance to the query:")
|
| 65 |
+
for i, (candidate, score) in enumerate(ranked_candidates, 1):
|
| 66 |
+
print(f"Rank {i}:")
|
| 67 |
+
print(f"Candidate: {candidate}")
|
| 68 |
+
print(f"Score: {score}\n")
|
| 69 |
+
```
|
| 70 |
+
## Evaluation
|
| 71 |
+
### Dataset
|
| 72 |
+
|
| 73 |
+
Size: 3000 samples.
|
| 74 |
+
|
| 75 |
+
### Structure:
|
| 76 |
+
🔸 Query: A string representing the user's question.
|
| 77 |
+
|
| 78 |
+
🔸 Candidate Document: A candidate passage to answer the query.
|
| 79 |
+
|
| 80 |
+
🔸 Relevance Label: Binary label (1 for relevant, 0 for irrelevant).
|
| 81 |
+
|
| 82 |
+
### Evaluation Process
|
| 83 |
+
|
| 84 |
+
🔸 Query Grouping: Queries are grouped to evaluate the model's ability to rank candidate documents correctly for each query.
|
| 85 |
+
|
| 86 |
+
🔸 Model Prediction: Each model predicts relevance scores for all candidate documents corresponding to a query.
|
| 87 |
+
|
| 88 |
+
🔸 Metrics Calculation: Metrics are computed to measure how well the model ranks relevant documents higher than irrelevant ones.
|
| 89 |
+
|
| 90 |
+
| Model | MRR | MAP | nDCG@10 |
|
| 91 |
+
|-------------------------------------------|------------------|------------------|------------------|
|
| 92 |
+
| cross-encoder/ms-marco-MiniLM-L-6-v2 | 0.631 | 0.6313| 0.725 |
|
| 93 |
+
| cross-encoder/ms-marco-MiniLM-L-12-v2 | 0.664 | 0.664 | 0.750 |
|
| 94 |
+
| BAAI/bge-reranker-v2-m3 | 0.902 | 0.902 | 0.927 |
|
| 95 |
+
| Omartificial-Intelligence-Space/ARA-Reranker-V1 | **0.934** | **0.9335** | **0.951** |
|
| 96 |
+
|
| 97 |
+
|
| 98 |
+
|
| 99 |
+
## <span style="color:blue">Acknowledgments</span>
|
| 100 |
+
|
| 101 |
+
The author would like to thank Prince Sultan University for their invaluable support in this project. Their contributions and resources have been instrumental in the development and fine-tuning of these models.
|
| 102 |
+
|
| 103 |
+
|
| 104 |
+
```markdown
|
| 105 |
+
## Citation
|
| 106 |
+
|
| 107 |
+
If you use the GATE, please cite it as follows:
|
| 108 |
+
|
| 109 |
+
@misc{nacar2025ARM,
|
| 110 |
+
title={ARM, Arabic Reranker Model},
|
| 111 |
+
author={Omer Nacar},
|
| 112 |
+
year={2025},
|
| 113 |
+
url={https://huggingface.co/Omartificial-Intelligence-Space/ARA-Reranker-V1},
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
|
| 117 |
+
|
| 118 |
+
|
reranker/config.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"_name_or_path": "BAAI/bge-reranker-v2-m3",
|
| 3 |
+
"architectures": [
|
| 4 |
+
"XLMRobertaForSequenceClassification"
|
| 5 |
+
],
|
| 6 |
+
"attention_probs_dropout_prob": 0.1,
|
| 7 |
+
"bos_token_id": 0,
|
| 8 |
+
"classifier_dropout": null,
|
| 9 |
+
"eos_token_id": 2,
|
| 10 |
+
"hidden_act": "gelu",
|
| 11 |
+
"hidden_dropout_prob": 0.1,
|
| 12 |
+
"hidden_size": 1024,
|
| 13 |
+
"id2label": {
|
| 14 |
+
"0": "LABEL_0"
|
| 15 |
+
},
|
| 16 |
+
"initializer_range": 0.02,
|
| 17 |
+
"intermediate_size": 4096,
|
| 18 |
+
"label2id": {
|
| 19 |
+
"LABEL_0": 0
|
| 20 |
+
},
|
| 21 |
+
"layer_norm_eps": 1e-05,
|
| 22 |
+
"max_position_embeddings": 8194,
|
| 23 |
+
"model_type": "xlm-roberta",
|
| 24 |
+
"num_attention_heads": 16,
|
| 25 |
+
"num_hidden_layers": 24,
|
| 26 |
+
"output_past": true,
|
| 27 |
+
"pad_token_id": 1,
|
| 28 |
+
"position_embedding_type": "absolute",
|
| 29 |
+
"torch_dtype": "float32",
|
| 30 |
+
"transformers_version": "4.43.1",
|
| 31 |
+
"type_vocab_size": 1,
|
| 32 |
+
"use_cache": true,
|
| 33 |
+
"vocab_size": 250002
|
| 34 |
+
}
|
reranker/sentencepiece.bpe.model
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:cfc8146abe2a0488e9e2a0c56de7952f7c11ab059eca145a0a727afce0db2865
|
| 3 |
+
size 5069051
|
reranker/special_tokens_map.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"bos_token": {
|
| 3 |
+
"content": "<s>",
|
| 4 |
+
"lstrip": false,
|
| 5 |
+
"normalized": false,
|
| 6 |
+
"rstrip": false,
|
| 7 |
+
"single_word": false
|
| 8 |
+
},
|
| 9 |
+
"cls_token": {
|
| 10 |
+
"content": "<s>",
|
| 11 |
+
"lstrip": false,
|
| 12 |
+
"normalized": false,
|
| 13 |
+
"rstrip": false,
|
| 14 |
+
"single_word": false
|
| 15 |
+
},
|
| 16 |
+
"eos_token": {
|
| 17 |
+
"content": "</s>",
|
| 18 |
+
"lstrip": false,
|
| 19 |
+
"normalized": false,
|
| 20 |
+
"rstrip": false,
|
| 21 |
+
"single_word": false
|
| 22 |
+
},
|
| 23 |
+
"mask_token": {
|
| 24 |
+
"content": "<mask>",
|
| 25 |
+
"lstrip": true,
|
| 26 |
+
"normalized": false,
|
| 27 |
+
"rstrip": false,
|
| 28 |
+
"single_word": false
|
| 29 |
+
},
|
| 30 |
+
"pad_token": {
|
| 31 |
+
"content": "<pad>",
|
| 32 |
+
"lstrip": false,
|
| 33 |
+
"normalized": false,
|
| 34 |
+
"rstrip": false,
|
| 35 |
+
"single_word": false
|
| 36 |
+
},
|
| 37 |
+
"sep_token": {
|
| 38 |
+
"content": "</s>",
|
| 39 |
+
"lstrip": false,
|
| 40 |
+
"normalized": false,
|
| 41 |
+
"rstrip": false,
|
| 42 |
+
"single_word": false
|
| 43 |
+
},
|
| 44 |
+
"unk_token": {
|
| 45 |
+
"content": "<unk>",
|
| 46 |
+
"lstrip": false,
|
| 47 |
+
"normalized": false,
|
| 48 |
+
"rstrip": false,
|
| 49 |
+
"single_word": false
|
| 50 |
+
}
|
| 51 |
+
}
|
reranker/tokenizer.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:cf44dabfaa82b1276a7af64a2ea2c76c047d560cf7bfb5711d6135382372c93d
|
| 3 |
+
size 17083153
|
reranker/tokenizer_config.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"added_tokens_decoder": {
|
| 3 |
+
"0": {
|
| 4 |
+
"content": "<s>",
|
| 5 |
+
"lstrip": false,
|
| 6 |
+
"normalized": false,
|
| 7 |
+
"rstrip": false,
|
| 8 |
+
"single_word": false,
|
| 9 |
+
"special": true
|
| 10 |
+
},
|
| 11 |
+
"1": {
|
| 12 |
+
"content": "<pad>",
|
| 13 |
+
"lstrip": false,
|
| 14 |
+
"normalized": false,
|
| 15 |
+
"rstrip": false,
|
| 16 |
+
"single_word": false,
|
| 17 |
+
"special": true
|
| 18 |
+
},
|
| 19 |
+
"2": {
|
| 20 |
+
"content": "</s>",
|
| 21 |
+
"lstrip": false,
|
| 22 |
+
"normalized": false,
|
| 23 |
+
"rstrip": false,
|
| 24 |
+
"single_word": false,
|
| 25 |
+
"special": true
|
| 26 |
+
},
|
| 27 |
+
"3": {
|
| 28 |
+
"content": "<unk>",
|
| 29 |
+
"lstrip": false,
|
| 30 |
+
"normalized": false,
|
| 31 |
+
"rstrip": false,
|
| 32 |
+
"single_word": false,
|
| 33 |
+
"special": true
|
| 34 |
+
},
|
| 35 |
+
"250001": {
|
| 36 |
+
"content": "<mask>",
|
| 37 |
+
"lstrip": true,
|
| 38 |
+
"normalized": false,
|
| 39 |
+
"rstrip": false,
|
| 40 |
+
"single_word": false,
|
| 41 |
+
"special": true
|
| 42 |
+
}
|
| 43 |
+
},
|
| 44 |
+
"bos_token": "<s>",
|
| 45 |
+
"clean_up_tokenization_spaces": true,
|
| 46 |
+
"cls_token": "<s>",
|
| 47 |
+
"eos_token": "</s>",
|
| 48 |
+
"mask_token": "<mask>",
|
| 49 |
+
"model_max_length": 8192,
|
| 50 |
+
"pad_token": "<pad>",
|
| 51 |
+
"sep_token": "</s>",
|
| 52 |
+
"sp_model_kwargs": {},
|
| 53 |
+
"tokenizer_class": "XLMRobertaTokenizer",
|
| 54 |
+
"unk_token": "<unk>"
|
| 55 |
+
}
|