Update app.py
Browse files
app.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
| 1 |
import subprocess
|
| 2 |
import time
|
| 3 |
import requests
|
| 4 |
-
import json
|
| 5 |
import os
|
| 6 |
import gradio as gr
|
| 7 |
from huggingface_hub import hf_hub_download
|
|
@@ -13,6 +12,7 @@ MODEL_PATH = hf_hub_download(
|
|
| 13 |
repo_id="LiquidAI/LFM2.5-350M-GGUF",
|
| 14 |
filename="LFM2.5-350M-Q8_0.gguf"
|
| 15 |
)
|
|
|
|
| 16 |
print("Model downloaded:", MODEL_PATH)
|
| 17 |
|
| 18 |
# =========================
|
|
@@ -21,25 +21,51 @@ print("Model downloaded:", MODEL_PATH)
|
|
| 21 |
server = subprocess.Popen([
|
| 22 |
"./llama/llama-server",
|
| 23 |
"-m", MODEL_PATH,
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
"-
|
| 27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
"-ngl", "0",
|
|
|
|
| 29 |
"--host", "0.0.0.0",
|
| 30 |
-
"--port", "8080"
|
| 31 |
-
# avoids page-fault stalls on cold reads
|
| 32 |
])
|
| 33 |
|
| 34 |
-
|
| 35 |
-
|
|
|
|
|
|
|
| 36 |
|
| 37 |
# =========================
|
| 38 |
-
# 3.
|
| 39 |
# =========================
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
#### 1. الجرائم ضد الأشخاص (الاعتداءات، الجروح، التهديد، الخطف):
|
| 44 |
- الفعل: قيام الجاني بضرب الشاكي بواسطة عصى خشب��ة على مستوى الرأس، مسبباً له عجزاً عن العمل لمدة 20 يوماً.
|
| 45 |
الجريمة: جنحة الضرب والجرح العمدي باستعمال سلاح.
|
|
@@ -56,7 +82,7 @@ SYSTEM_PROMPT = """أنت مستشار وباحث قانوني أول، متخص
|
|
| 56 |
- الفعل: قيام أشخاص باختطاف طفل قاصر واحتجازه في مستودع لطلب فدية مالية من أهله.
|
| 57 |
الجريمة: جناية الاختطاف بدافع طلب فدية.
|
| 58 |
النص القانوني: المادة 293 bis من قانون العقوبات.
|
| 59 |
-
- الفعل: اتهام سليم لزميله بالسرقة أمام الش
|
| 60 |
الجريمة: جنحة الوشاية الكاذبة.
|
| 61 |
النص القانوني: المادة 300 من قانون العقوبات.
|
| 62 |
#### 2. الجرائم ضد الأموال (السرقات، النصب، خيانة الأمانة، التخريب):
|
|
@@ -106,62 +132,42 @@ SYSTEM_PROMPT = """أنت مستشار وباحث قانوني أول، متخص
|
|
| 106 |
---
|
| 107 |
قم بدراسة وتحليل الواقعة التالية بدقة متناهية، ثم استخرج مخرجاتك القانونية ملتزماً بالصياغة القانونية والهيكل الموحد المعتمد:"""
|
| 108 |
|
| 109 |
-
#
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
|
|
|
|
|
|
|
|
|
| 113 |
payload = {
|
| 114 |
"messages": [
|
| 115 |
-
{"role": "
|
| 116 |
-
|
| 117 |
-
],
|
| 118 |
-
"stream": True,
|
| 119 |
-
"temperature": 0.9, # low = more deterministic / accurate
|
| 120 |
-
"top_p": 0.9,
|
| 121 |
-
"max_tokens": 512, # legal output is short; cap prevents runaway gen
|
| 122 |
-
"repeat_penalty": 1.1,
|
| 123 |
}
|
| 124 |
|
| 125 |
try:
|
| 126 |
r = requests.post(
|
| 127 |
"http://127.0.0.1:8080/v1/chat/completions",
|
| 128 |
json=payload,
|
| 129 |
-
|
| 130 |
-
timeout=120
|
| 131 |
)
|
| 132 |
r.raise_for_status()
|
| 133 |
-
|
| 134 |
-
result = ""
|
| 135 |
-
for raw in r.iter_lines():
|
| 136 |
-
if not raw:
|
| 137 |
-
continue
|
| 138 |
-
line = raw if isinstance(raw, str) else raw.decode("utf-8")
|
| 139 |
-
if not line.startswith("data: "):
|
| 140 |
-
continue
|
| 141 |
-
data = line[6:]
|
| 142 |
-
if data.strip() == "[DONE]":
|
| 143 |
-
break
|
| 144 |
-
try:
|
| 145 |
-
chunk = json.loads(data)
|
| 146 |
-
delta = chunk["choices"][0]["delta"].get("content") or ""
|
| 147 |
-
result += delta
|
| 148 |
-
yield result # streams tokens live to Gradio
|
| 149 |
-
except (KeyError, json.JSONDecodeError):
|
| 150 |
-
continue
|
| 151 |
-
|
| 152 |
except Exception as e:
|
| 153 |
-
|
| 154 |
-
|
| 155 |
|
| 156 |
# =========================
|
| 157 |
-
#
|
| 158 |
# =========================
|
|
|
|
| 159 |
demo = gr.ChatInterface(
|
| 160 |
fn=chat,
|
| 161 |
title="مساعد تكييف الجرائم - قانون العقوبات الجزائري",
|
| 162 |
-
description="أدخل تفاصيل الواقعة أو الفعل، وسيقوم النظام بتحديد الوصف القانوني للجريمة والمادة المعاقب عليها."
|
| 163 |
-
|
| 164 |
)
|
| 165 |
|
| 166 |
if __name__ == "__main__":
|
| 167 |
-
demo.launch(
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import subprocess
|
| 2 |
import time
|
| 3 |
import requests
|
|
|
|
| 4 |
import os
|
| 5 |
import gradio as gr
|
| 6 |
from huggingface_hub import hf_hub_download
|
|
|
|
| 12 |
repo_id="LiquidAI/LFM2.5-350M-GGUF",
|
| 13 |
filename="LFM2.5-350M-Q8_0.gguf"
|
| 14 |
)
|
| 15 |
+
|
| 16 |
print("Model downloaded:", MODEL_PATH)
|
| 17 |
|
| 18 |
# =========================
|
|
|
|
| 21 |
server = subprocess.Popen([
|
| 22 |
"./llama/llama-server",
|
| 23 |
"-m", MODEL_PATH,
|
| 24 |
+
|
| 25 |
+
# smaller context to fit the 350M model memory footprint
|
| 26 |
+
"-c", "5024",
|
| 27 |
+
|
| 28 |
+
# use more CPU threads
|
| 29 |
+
"-t", "8",
|
| 30 |
+
|
| 31 |
+
# batch processing
|
| 32 |
+
"-b", "512",
|
| 33 |
+
|
| 34 |
+
# no GPU on free CPU spaces
|
| 35 |
"-ngl", "0",
|
| 36 |
+
|
| 37 |
"--host", "0.0.0.0",
|
| 38 |
+
"--port", "8080"
|
|
|
|
| 39 |
])
|
| 40 |
|
| 41 |
+
# Wait for the server to spin up
|
| 42 |
+
print("Starting llama-server, waiting 10 seconds...")
|
| 43 |
+
time.sleep(10)
|
| 44 |
+
|
| 45 |
|
| 46 |
# =========================
|
| 47 |
+
# 3. GRADIO CHAT FUNCTION
|
| 48 |
# =========================
|
| 49 |
+
def chat(user_fact, history):
|
| 50 |
+
# نظام التوجيه القانوني المكثف لتوفير حجم الذاكرة (Context Window)
|
| 51 |
+
system_prompt = """أنت مستشار وباحث قانوني أول، متخصص في المنظومة القضائية والتشريعية بالجمهورية الجزائرية الديمقراطية الشعبية. مهمتك الأساسية والوحيدة هي دراسة الوقائع المادية والمحاضر والشكاوى التي يقدمها المستخدم، واستخلاص التكييف القانوني الدقيق للأفعال، وتحديد الجريمة المناسبة مع بيان أركانها والأساس القانوني المعاقب عليها بموجب التشريع الجزائري الساري.
|
| 52 |
+
---
|
| 53 |
+
### أولاً: المنهجية القانونية الصارمة للتحليل:
|
| 54 |
+
عند استقبالك لأي واقعة أو محضر، يجب عليك اتباع الخطوات التحليلية التالية داخلياً قبل صياغة الإجابة:
|
| 55 |
+
1. **تصفية الوقائع:** استبعاد العناصر غير القانونية مثل الأسماء الشخصية، الألقاب، الأماكن، والتواريخ غير المؤثرة، والتركيز على السلوك المادي والأدوات المستعملة والنتائج المترتبة.
|
| 56 |
+
2. **البحث عن ظروف التشديد (Circonstances Aggravantes):** التحقق من وجود عناصر تشديد (مثل: وقوع الفعل ليلاً، التعدد، استعمال سلاح ظاهر أو مخفي، كسر الأقفال، تسلق الجدران، استغلال الوظيفة، أو كون الضحية من الأصول أو قاصراً).
|
| 57 |
+
3. **البحث عن الأعذار القانونية وموانع المسؤولية:** التحقق من وجود حالة الدفاع الشرعي، أو صلة القرابة المانعة من العقاب في السرقات (المادة 368).
|
| 58 |
+
4. **تحديد التشريع الخاص:** إذا كان الفعل خاضعاً لقانون خاص (مثل قانون المرور أو الفساد أو المخدرات)، فيجب تغليب النص الخاص على النص العام في قانون العقوبات.
|
| 59 |
+
---
|
| 60 |
+
### ثانياً: قواعد المخرجات الصارمة:
|
| 61 |
+
- يمنع منعاً باتاً كتابة أي أسماء حقيقية، أو ألقاب، أو مواقع جغرافية محددة في المخرجات.
|
| 62 |
+
- يجب الالتزام بالهيكل الموحد المذكور أدناه دون أي مقدمات ترحيبية أو تعليقات جانبية.
|
| 63 |
+
- صياغة الإجابة يجب أن تكون باللغة العربية الفصحى القانونية السليمة.
|
| 64 |
+
الهيكل الإلزامي للمخرجات:
|
| 65 |
+
الجريمة: [الوصف القانوني الدقيق للجريمة بذكر تكييفها وطبيعتها وظروفها]
|
| 66 |
+
النص القانوني: [المواد القانونية المعاقب عليها واسم القانون بدقة]
|
| 67 |
+
---
|
| 68 |
+
### ثالثاً: قاعدة البيانات المرجعية للجرائم (أمثلة توضيحية للتعلم):
|
| 69 |
#### 1. الجرائم ضد الأشخاص (الاعتداءات، الجروح، التهديد، الخطف):
|
| 70 |
- الفعل: قيام الجاني بضرب الشاكي بواسطة عصى خشب��ة على مستوى الرأس، مسبباً له عجزاً عن العمل لمدة 20 يوماً.
|
| 71 |
الجريمة: جنحة الضرب والجرح العمدي باستعمال سلاح.
|
|
|
|
| 82 |
- الفعل: قيام أشخاص باختطاف طفل قاصر واحتجازه في مستودع لطلب فدية مالية من أهله.
|
| 83 |
الجريمة: جناية الاختطاف بدافع طلب فدية.
|
| 84 |
النص القانوني: المادة 293 bis من قانون العقوبات.
|
| 85 |
+
- الفعل: اتهام سليم لزميله بالسرقة أمام الشرطة مع علمه التام ببراءته بهدف تشويه سمعته.
|
| 86 |
الجريمة: جنحة الوشاية الكاذبة.
|
| 87 |
النص القانوني: المادة 300 من قانون العقوبات.
|
| 88 |
#### 2. الجرائم ضد الأموال (السرقات، النصب، خيانة الأمانة، التخريب):
|
|
|
|
| 132 |
---
|
| 133 |
قم بدراسة وتحليل الواقعة التالية بدقة متناهية، ثم استخرج مخرجاتك القانونية ملتزماً بالصياغة القانونية والهيكل الموحد المعتمد:"""
|
| 134 |
|
| 135 |
+
# دمج التوجيهات مع الواقعة التي أدخلها المستخدم حالياً
|
| 136 |
+
full_prompt = (
|
| 137 |
+
f"{system_prompt}\n\n"
|
| 138 |
+
f"الفعل: {user_fact}\n"
|
| 139 |
+
f"الرد:"
|
| 140 |
+
)
|
| 141 |
+
|
| 142 |
payload = {
|
| 143 |
"messages": [
|
| 144 |
+
{"role": "user", "content": full_prompt}
|
| 145 |
+
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 146 |
}
|
| 147 |
|
| 148 |
try:
|
| 149 |
r = requests.post(
|
| 150 |
"http://127.0.0.1:8080/v1/chat/completions",
|
| 151 |
json=payload,
|
| 152 |
+
timeout=300
|
|
|
|
| 153 |
)
|
| 154 |
r.raise_for_status()
|
| 155 |
+
return r.json()["choices"][0]["message"]["content"].strip()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 156 |
except Exception as e:
|
| 157 |
+
return f"حدث خطأ أثناء الاتصال بالخادم الداخلي: {str(e)}"
|
|
|
|
| 158 |
|
| 159 |
# =========================
|
| 160 |
+
# 4. GRADIO UI
|
| 161 |
# =========================
|
| 162 |
+
# تم تهيئة واجهة المستخدم للتركيز على إدخال الوقائع واستخراج التكييف القانوني
|
| 163 |
demo = gr.ChatInterface(
|
| 164 |
fn=chat,
|
| 165 |
title="مساعد تكييف الجرائم - قانون العقوبات الجزائري",
|
| 166 |
+
description="أدخل تفاصيل الواقعة أو الفعل، وسيقوم النظام بتحديد الوصف القانوني للجريمة والمادة المعاقب عليها."
|
|
|
|
| 167 |
)
|
| 168 |
|
| 169 |
if __name__ == "__main__":
|
| 170 |
+
demo.launch(
|
| 171 |
+
server_name="0.0.0.0",
|
| 172 |
+
server_port=7860
|
| 173 |
+
)
|