ramedde commited on
Commit
3af9e55
·
verified ·
1 Parent(s): 310539a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +59 -53
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
- "-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
- # 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
  #### 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
- # 4. GRADIO CHAT FUNCTION — streaming
111
- # =========================
112
- def chat(user_fact, history):
 
 
 
113
  payload = {
114
  "messages": [
115
- {"role": "system", "content": SYSTEM_PROMPT},
116
- {"role": "user", "content": f"الفعل: {user_fact}"}
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
- stream=True,
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
- yield f"حدث خطأ أثناء الاتصال بالخادم الداخلي: {str(e)}"
154
-
155
 
156
  # =========================
157
- # 5. GRADIO UI
158
  # =========================
 
159
  demo = gr.ChatInterface(
160
  fn=chat,
161
  title="مساعد تكييف الجرائم - قانون العقوبات الجزائري",
162
- description="أدخل تفاصيل الواقعة أو الفعل، وسيقوم النظام بتحديد الوصف القانوني للجريمة والمادة المعاقب عليها.",
163
-
164
  )
165
 
166
  if __name__ == "__main__":
167
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
 
 
 
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
+ )