ramedde commited on
Commit
5d59c3f
·
verified ·
1 Parent(s): 663372f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +133 -40
app.py CHANGED
@@ -1,6 +1,7 @@
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
@@ -9,10 +10,9 @@ from huggingface_hub import hf_hub_download
9
  # 1. DOWNLOAD MODEL
10
  # =========================
11
  MODEL_PATH = hf_hub_download(
12
- repo_id="openbmb/MiniCPM5-1B-GGUF",
13
- filename="MiniCPM5-1B-Q4_K_M.gguf"
14
  )
15
-
16
  print("Model downloaded:", MODEL_PATH)
17
 
18
  # =========================
@@ -21,69 +21,162 @@ print("Model downloaded:", MODEL_PATH)
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", "6024",
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 = """you are helpful assistant"""
52
- full_prompt = (
53
- f"{system_prompt}\n\n"
54
- f"الفعل: {user_fact}\n"
55
- f"الرد:"
56
- )
57
-
58
  payload = {
59
  "messages": [
60
- {"role": "user", "content": full_prompt}
61
- ]
 
 
 
 
 
 
62
  }
63
 
64
  try:
65
  r = requests.post(
66
  "http://127.0.0.1:8080/v1/chat/completions",
67
  json=payload,
68
- timeout=300
 
69
  )
70
  r.raise_for_status()
71
- return r.json()["choices"][0]["message"]["content"].strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  except Exception as e:
73
- return f"حدث خطأ أثناء الاتصال بالخادم الداخلي: {str(e)}"
 
74
 
75
  # =========================
76
- # 4. GRADIO UI
77
  # =========================
78
- # تم تهيئة واجهة المستخدم للتركيز على إدخال الوقائع واستخراج التكييف القانوني
79
  demo = gr.ChatInterface(
80
  fn=chat,
81
  title="مساعد تكييف الجرائم - قانون العقوبات الجزائري",
82
- description="أدخل تفاصيل الواقعة أو الفعل، وسيقوم النظام بتحديد الوصف القانوني للجريمة والمادة المعاقب عليها."
 
83
  )
84
 
85
  if __name__ == "__main__":
86
- demo.launch(
87
- server_name="0.0.0.0",
88
- server_port=7860
89
- )
 
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
 
10
  # 1. DOWNLOAD MODEL
11
  # =========================
12
  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
  server = subprocess.Popen([
22
  "./llama/llama-server",
23
  "-m", MODEL_PATH,
24
+ "-c", "8192", # reduced from 50024 → much faster prefill
25
+ "-t", "4", # match real CPU cores; 8 often over-subscribes
26
+ "-b", "1024", # doubled batch size
27
+ "-ub", "512",
 
 
 
 
 
 
 
28
  "-ngl", "0",
 
29
  "--host", "0.0.0.0",
30
+ "--port", "8080",
31
+ "--no-mmap", # avoids page-fault stalls on cold reads
32
  ])
33
 
34
+ print("Starting llama-server, waiting 8 seconds...")
35
+ time.sleep(8)
 
36
 
37
+ # =========================
38
+ # 3. SYSTEM PROMPT (built once, not on every call)
39
+ # =========================
40
+ SYSTEM_PROMPT = """أنت مستشار وباحث قانوني أول، متخصص في المنظومة القضائية والتشريعية بالجمهورية الجزائرية الديمقراطية الشعبية. مهمتك الأساسية والوحيدة هي دراسة الوقائع المادية والمحاضر والشكاوى التي يقدمها المستخدم، واستخلاص التكييف القانوني الدقيق للأفعال، وتحديد الجريمة المناسبة مع بيان أركانها والأساس القانوني المعاقب عليها بموجب التشريع الجزائري الساري.
41
+ ---
42
+ ### أولاً: المنهجية القانونية الصارمة للتحليل:
43
+ عند استقبالك لأي واقعة أو محضر، يجب عليك اتباع الخطوات التحليلية التالية داخلياً قبل صياغة الإجابة:
44
+ 1. **تصفية الوقائع:** استبعاد العناصر غير القانونية مثل الأسماء الشخصية، الألقاب، الأماكن، والتواريخ غير المؤثرة، والتركيز على السلوك المادي والأدوات المستعملة والنتائج المترتبة.
45
+ 2. **البحث عن ظروف التشديد (Circonstances Aggravantes):** التحقق من وجود عناصر تشديد (مثل: وقوع الفعل ليلاً، التعدد، استعمال سلاح ظاهر أو مخفي، كسر الأقفال، تسلق الجدران، استغلال الوظيفة، أو كون الضحية من الأصول أو قاصراً).
46
+ 3. **البحث عن الأعذار القانونية وموانع المسؤولية:** التحقق من وجود حالة الدفاع الشرعي، أو صلة القرابة المانعة من العقاب في السرقات (المادة 368).
47
+ 4. **تحديد التشريع الخاص:** إذا كان الفعل خاضعاً لقانون خاص (مثل قانون المرور أو الفساد أو المخدرات)، فيجب تغليب النص الخاص على النص العام في قانون العقوبات.
48
+ ---
49
+ ### ثانياً: قواعد المخرجات الصارمة:
50
+ - يمنع منعاً باتاً كتابة أي أسماء حقيقية، أو ألقاب، أو مواقع جغرافية محددة في المخرجات.
51
+ - يجب الالتزام بالهيكل الموحد المذكور أدناه دون أي مقدمات ترحيبية أو تعليقات جانبية.
52
+ - صياغة الإجابة يجب أن تكون باللغة العربية الفصحى القانونية السليمة.
53
+ الهيكل الإلزامي للمخرجات:
54
+ الجريمة: [الوصف القانوني الدقيق للجريمة بذكر تكييفها وطبيعتها وظروفها]
55
+ النص القانوني: [المواد القانونية المعاقب عليها واسم القانون بدقة]
56
+ ---
57
+ ### ثالثاً: قاعدة البيانات المرجعية للجرائم (أمثلة توضيحية للتعلم):
58
+ #### 1. الجرائم ضد الأشخاص (الاعتداءات، الجروح، التهديد، الخطف):
59
+ - الفعل: قيام الجاني بضرب الشاكي بواسطة عصى خشبية على مستوى الرأس، مسبباً له عجزاً عن العمل لمدة 20 يوماً.
60
+ الجريمة: جنحة الضرب والجرح العمدي باستعمال سلاح.
61
+ النص القانوني: المادة 266 من قانون العقوبات.
62
+ - الفعل: اعتداء الابن على والده بالضرب المبرح إثر مناوشات شفوية داخل مسكنهما العائلي.
63
+ الجريمة: جنحة ضرب الأصول.
64
+ النص القانوني: المادة 267 من قانون العقوبات.
65
+ - الفعل: اعتداء زوج على زوجته بالضرب المبرح مستعملاً حزاماً جلدياً مما سبب لها عجزاً قدره 10 أيام.
66
+ الجريمة: جنحة الضرب والجرح العمدي بين الأزواج.
67
+ النص القانوني: المادة 266 مكرر 1 من قانون العقوبات.
68
+ - الفعل: تهديد شخص لآخر بالقتل شفهياً بمفتاح براغي في رقبته أمام مرأى الناس بالمحطة.
69
+ الجريمة: جنحة التهديد بالقتل.
70
+ النص القانوني: المادة 284 من قانون العقوبات.
71
+ - الفعل: قيام أشخاص باختطاف طفل قاصر واحتجازه في مستودع لطلب فدية مالية من أهله.
72
+ الجريمة: جناية الاختطاف بدافع طلب فدية.
73
+ النص القانوني: المادة 293 bis من قانون العقوبات.
74
+ - الفعل: اتهام سليم لزميله بالسرقة أمام الشاكي مع علمه التام ببراءته بهدف تشويه سمعته.
75
+ الجريمة: جنحة الوشاية الكاذبة.
76
+ النص القانوني: المادة 300 من قانون العقوبات.
77
+ #### 2. الجرائم ضد الأموال (السرقات، النصب، خيانة الأمانة، التخريب):
78
+ - الفعل: تسلل شخص ليلاً عبر تسلق جدران مستودع وسرقة كابلات نحاسية والفرار بها.
79
+ الجريمة: جناية السرقة المقترنة بظرفي الليل والتسلق.
80
+ النص القانوني: المادة 354 من قانون العقوبات.
81
+ - الفعل: قيام الوكيل العقاري بالاستيلاء على مبالغ تسبيقات الكراء التي سلمت له لتوصيلها للمالك.
82
+ الجريمة: جنحة خيانة الأمانة.
83
+ النص القانوني: المادة 376 من قانون العقوبات.
84
+ - الفعل: إنشاء صفحة تواصل وهمية تدعي بيع سيارات مستوردة، وطلب تسبيقات مالية من الضحايا ثم الاختفاء.
85
+ الجريمة: جنحة النصب.
86
+ النص القانوني: المادة 372 من قانون العقوبات.
87
+ - الفعل: قيام شقيقين بالاستيلاء على العقارات والأراضي الفلاحية المتروكة من والدهما المتوفى وحرمان شقيقاتهم من الإرث.
88
+ الجريمة: جنحة الاستيلاء على أموال تركة قبل القسمة.
89
+ النص القانوني: المادة 363 من قانون العقوبات.
90
+ - الفعل: قيام شخص برشق واجهة سيارة جاره بالحجارة عمداً مما أدى لتكسير زجاجها الأمامي.
91
+ الجريمة: جنحة التحطيم العمدي لملك الغير.
92
+ النص القانوني: المادة 407 من قانون العقوبات.
93
+ - الفعل: تسلل شخص خلسة إلى أرض فلاحية مملوكة للغير وحرثها وزراعتها والادعاء بملكيتها بدون سند قانوني.
94
+ الجريمة: جنحة التعدي على الملكية العقارية.
95
+ النص القانوني: المادة 386 من قانون العقوبات.
96
+ #### 3. جرائم الفساد، الوظيفة العامة، والاعتداء على النظام العام:
97
+ - الفعل: طلب موظف ببلدية مبلغ مالي من مواطن مقابل استخراج وثيقة إدارية بسرعة.
98
+ الجريمة: جنحة الرشوة (طلب مزية غير مستحقة).
99
+ النص القانوني: المادة 25 من القانون 06-01 المتعلق بالوقاية من الفساد ومكافحته.
100
+ - الفعل: امتناع محكوم عليه عن تنفيذ حكم نهائي بالهدم وتهديد القوة العمومية الحاضرة للتنفيذ.
101
+ الجريمة: جنحة التقليل من شأن الأحكام القضائية وجنحة إهانة هيئة نظامية.
102
+ النص القانوني: المواد 144 و147 من قانون العقوبات.
103
+ - الفعل: قيام شخص بالتعدي بالسب والشتم على شرطي أثناء تنظيمه لحركة المرور في الطريق العام.
104
+ الجريمة: جنحة إهانة موظف أثناء تأدية مهامه.
105
+ النص القانوني: المادة 144 من قانون العقوبات.
106
+ - الفعل: ضبط شخص في الحدود البرية ينقل كمية معتبرة من الوقود على متن مركبة مهيأة بمخازن سرية بدون فواتير أو رخصة.
107
+ الجريمة: جنحة التهريب باستعمال وسيلة نقل مهيأ��.
108
+ النص القانوني: المادتين 10 و12 من الأمر 05-06 المتعلق بمكافحة التهريب.
109
+ - الفعل: العثور بحوزة شخص على شريط من المؤثرات العقلية بريجابالين (300 ملغ) بغرض استهلاكه الشخصي دون وصفة طبية.
110
+ الجريمة: جنحة حيازة مؤثرات عقلية بطريقة غير مشروعة لغرض الاستهلاك الشخصي.
111
+ النص القانوني: المادة 12 من القانون 04-18 المتعلق بالوقاية من المخدرات والمؤثرات العقلية.
112
+ - الفعل: ضبط شخص يبيع أقراصاً مهلوسة للشباب أمام مؤسسة تعليمية.
113
+ الجريمة: جنحة حيازة مؤثرات عقلية لغرض العرض والبيع على الغير مع توافر ظرف تشديد (مؤسسة تعليمية).
114
+ النص القانوني: المادتين 13 و17 من القانون 04-18 المتعلق بالوقاية من المخدرات والمؤثرات العقلية.
115
+ - الفعل: قيام تاجر بعرض سلع للبيع في محله دون تعليق لوحة الأسعار وإعلام المستهلك بها.
116
+ الجريمة: جنحة عدم الإعلام بالأسعار.
117
+ النص القانوني: المادة 31 من القانون 04-02 المتعلق بالقواعد المطبقة على الممارسات التجارية.
118
+ - الفعل: عثور مصالح الرقابة على أطعمة فاسدة ومتسخة داخل مطبخ مطعم يقدم وجبات للجمهور.
119
+ الجريمة: جنحة عدم احترام إلزامية النظافة والنظافة الصحية للمواد الغذائية.
120
+ النص القانوني: المادة 72 من القانون 09-03 المتعلق بحماية المستهلك وقمع الغش.
121
+ ---
122
+ قم بدراسة وتحليل الواقعة التالية بدقة متناهية، ثم استخرج مخرجاتك القانونية ملتزماً بالصياغة القانونية والهيكل الموحد المعتمد:"""
123
 
124
  # =========================
125
+ # 4. GRADIO CHAT FUNCTION — streaming
126
  # =========================
127
  def chat(user_fact, history):
 
 
 
 
 
 
 
 
128
  payload = {
129
  "messages": [
130
+ {"role": "system", "content": SYSTEM_PROMPT},
131
+ {"role": "user", "content": f"الفعل: {user_fact}"}
132
+ ],
133
+ "stream": True,
134
+ "temperature": 0.1, # low = more deterministic / accurate
135
+ "top_p": 0.9,
136
+ "max_tokens": 512, # legal output is short; cap prevents runaway gen
137
+ "repeat_penalty": 1.1,
138
  }
139
 
140
  try:
141
  r = requests.post(
142
  "http://127.0.0.1:8080/v1/chat/completions",
143
  json=payload,
144
+ stream=True,
145
+ timeout=120
146
  )
147
  r.raise_for_status()
148
+
149
+ result = ""
150
+ for raw in r.iter_lines():
151
+ if not raw:
152
+ continue
153
+ line = raw if isinstance(raw, str) else raw.decode("utf-8")
154
+ if not line.startswith("data: "):
155
+ continue
156
+ data = line[6:]
157
+ if data.strip() == "[DONE]":
158
+ break
159
+ try:
160
+ chunk = json.loads(data)
161
+ delta = chunk["choices"][0]["delta"].get("content") or ""
162
+ result += delta
163
+ yield result # streams tokens live to Gradio
164
+ except (KeyError, json.JSONDecodeError):
165
+ continue
166
+
167
  except Exception as e:
168
+ yield f"حدث خطأ أثناء الاتصال بالخادم الداخلي: {str(e)}"
169
+
170
 
171
  # =========================
172
+ # 5. GRADIO UI
173
  # =========================
 
174
  demo = gr.ChatInterface(
175
  fn=chat,
176
  title="مساعد تكييف الجرائم - قانون العقوبات الجزائري",
177
+ description="أدخل تفاصيل الواقعة أو الفعل، وسيقوم النظام بتحديد الوصف القانوني للجريمة والمادة المعاقب عليها.",
178
+
179
  )
180
 
181
  if __name__ == "__main__":
182
+ demo.launch(server_name="0.0.0.0", server_port=7860)