NLPAlhuzali commited on
Commit
51438c7
·
verified ·
1 Parent(s): dc00d03

Update models/space_a.py

Browse files
Files changed (1) hide show
  1. models/space_a.py +19 -133
models/space_a.py CHANGED
@@ -1,170 +1,56 @@
1
- # -*- coding: utf-8 -*-
2
- # app.py – Arabic Questions Summarization in Mental Healthcare with ALLaM
3
-
4
  import torch
5
  from transformers import AutoTokenizer, AutoModelForCausalLM
6
- import gradio as gr
7
 
8
- # ------------------------------------------------------------------
9
- # 1. Device setup
10
- # ------------------------------------------------------------------
11
  device = "cuda" if torch.cuda.is_available() else "cpu"
12
- print(f"Using device: {device}")
13
-
14
- # ------------------------------------------------------------------
15
- # 2. Load ALLaM – choose params by hardware
16
- # ------------------------------------------------------------------
17
  model_id = "ALLaM-AI/ALLaM-7B-Instruct-preview"
18
  tokenizer = AutoTokenizer.from_pretrained(model_id)
19
-
20
- # 🖥️ CPU-only path
21
  model = AutoModelForCausalLM.from_pretrained(
22
  model_id,
23
  torch_dtype="auto",
24
- device_map="auto", # works for CPU or GPU Space
25
  low_cpu_mem_usage=True,
26
  )
27
 
28
-
29
- # ------------------------------------------------------------------
30
- # 3. Generation helpers
31
- # ------------------------------------------------------------------
32
- def generate_chat_response(
33
- system_text: str,
34
- user_text: str,
35
- max_new_tokens: int = 40,
36
- temperature: float = 0.2,
37
- ):
38
- messages = []
39
- if system_text.strip():
40
- messages.append({"role": "system", "content": system_text})
41
- messages.append({"role": "user", "content": user_text})
42
-
43
- chat_input_text = tokenizer.apply_chat_template(messages, tokenize=False)
44
- inputs = tokenizer(
45
- chat_input_text,
46
- return_tensors="pt",
47
- return_token_type_ids=False,
48
- )
49
- inputs = {k: v.to(model.device) for k, v in inputs.items()}
50
-
51
- with torch.inference_mode():
52
- output_tokens = model.generate(
53
- **inputs,
54
- max_new_tokens=max_new_tokens,
55
- do_sample=False,
56
- pad_token_id=tokenizer.eos_token_id,
57
- )
58
-
59
- output_text = tokenizer.decode(output_tokens[0], skip_special_tokens=True)
60
- output_text = output_text.replace("[/INST]", "")
61
- return output_text.strip()
62
-
63
-
64
- def generate_text(prompt: str, max_new_tokens: int = 60):
65
- system_text = "" # keep system empty exactly as in notebook
66
- return generate_chat_response(
67
- system_text=system_text,
68
- user_text=prompt,
69
- max_new_tokens=max_new_tokens,
70
- )
71
-
72
- # ------------------------------------------------------------------
73
- # 4. Prompt construction
74
- # ------------------------------------------------------------------
75
- def prompt_short_question_cot_few_shots(question_text: str) -> str:
76
  examples = """
77
  أمثلة على كيفية التفكير خطوة بخطوة ثم إعطاء السؤال المختصر:
78
-
79
  السؤال الأصلي:
80
  انا فيني اكتئاب وقلق ووصف لي دكتور citalopram استخدمتها ثلاث شهور ولا نفع احتاج وصفه Ativan
81
-
82
  فكر خطوة بخطوة:
83
  1. المستخدم يعاني من اكتئاب وقلق.
84
  2. تناول دواء citalopram لثلاثة أشهر من دون تحسّن.
85
  3. يسأل عن الحصول على وصفة Ativan كبديل أو إضافة للعلاج.
86
-
87
  السؤال المختصر:
88
  استفسار حول عدم فعالية citalopram والحاجة الى Ativan
89
-
90
-
91
- السؤال الأصلي:
92
- كنت اعاني من قلق وأخذت دواء سبرالكس لمدة 4 شهور وتوقفت عنه في 2014. سأذهب لتحليل بول للعمل، هل سيظهر أثر الدواء؟
93
-
94
- فكر خطوة بخطوة:
95
- 1. المستخدم كان يعاني من قلق وتناول سبرالكس قبل عدة سنوات.
96
- 2. يخشى أن يظهر الدواء القديم في فحص البول المطلوب للعمل.
97
- 3. يريد معرفة إن كان ما زال موجوداً في جسمه.
98
-
99
- السؤال المختصر:
100
- سؤال حول بقاء أثر الدواء في تحليل البول بعد مدة؟
101
-
102
-
103
- السؤال الأصلي:
104
- أصبت بالاضطراب الوجداني منذ 2008، تكررت النوبات عدة مرات. أتناول تيجرتول وأرايبرزول وأولابكس. أرغب بالعلاج النفسي دون أدوية.
105
-
106
- فكر خطوة بخطوة:
107
- 1. المستخدم لديه اضطراب وجداني منذ سنوات طويلة.
108
- 2. لديه نوبات متكررة أعوام 2008، 2009، 2013، 2017، و2018.
109
- 3. يأخذ عدة أدوية (تيجرتول وأرايبرزول وأولابكس).
110
- 4. يريد الآن علاجاً غير دوائي، ربما علاجاً نفسياً بديلاً.
111
-
112
- السؤال المختصر:
113
- استفسار حول علاج الاضطراب الوجداني بدون دواء
114
  """.strip()
115
 
116
- new_question_segment = f"""
117
  الآن لديك سؤال جديد، فكر خطوة بخطوة بشكل مشابه ثم أعطني السؤال المختصر:
118
  تأكد من عدم اضافة ملاحظات أو اضافة معلومة غير موجودة في السؤال
119
  السؤال الأصلي:
120
- {question_text}
121
-
122
  السؤال المختصر:
123
  """
124
 
125
- prompt = f"""
126
  أنت مساعد لغوي مختص بأسئلة الصحة النفسية.
127
  هدفك هو إعادة كتابة الأسئلة المطوّلة في شكل مختصر ومباشر، يركّز على النقطة الأساسية.
128
  {examples}
129
- {new_question_segment}
130
  """.strip()
131
- return prompt
132
-
133
-
134
- def summarize_question_cot_few_shots(question_text: str) -> str:
135
- prompt = prompt_short_question_cot_few_shots(question_text)
136
- raw_output = generate_text(prompt, max_new_tokens=60)
137
-
138
- if "السؤال المختصر:" in raw_output:
139
- short_summary = raw_output.split("السؤال المختصر:")[-1].strip()
140
- else:
141
- short_summary = raw_output.strip()
142
-
143
- return short_summary
144
-
145
- # ------------------------------------------------------------------
146
- # 5. Gradio interface
147
- # ------------------------------------------------------------------
148
- def gradio_predict(question: str) -> str:
149
- return summarize_question_cot_few_shots(question)
150
 
 
 
 
 
151
 
152
- demo = gr.Interface(
153
- fn=gradio_predict,
154
- inputs=gr.Textbox(
155
- lines=7,
156
- label="السؤال الأصلي",
157
- placeholder="اكتب سؤالك المطوّل هنا...",
158
- ),
159
- outputs=gr.Textbox(label="السؤال المختصر"),
160
- title="🧠 Arabic Mental-Health Question Summarizer (ALLaM-7B)",
161
- description=(
162
- "يعيد هذا التطبيق صياغة الأسئلة العربية الطويلة حول الصحة النفسية إلى سؤال مختصر ومباشر."
163
- ),
164
- examples=[
165
- "كنت أعاني من قلق وأخذت دواء سبرالكس لمدة 4 شهور وتوقفت عنه عام 2014..."
166
- ],
167
- )
168
 
169
- if __name__ == "__main__":
170
- demo.launch()
 
 
 
 
1
  import torch
2
  from transformers import AutoTokenizer, AutoModelForCausalLM
 
3
 
 
 
 
4
  device = "cuda" if torch.cuda.is_available() else "cpu"
 
 
 
 
 
5
  model_id = "ALLaM-AI/ALLaM-7B-Instruct-preview"
6
  tokenizer = AutoTokenizer.from_pretrained(model_id)
 
 
7
  model = AutoModelForCausalLM.from_pretrained(
8
  model_id,
9
  torch_dtype="auto",
10
+ device_map="auto",
11
  low_cpu_mem_usage=True,
12
  )
13
 
14
+ def summarize_question(text: str, max_new_tokens: int = 60) -> str:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  examples = """
16
  أمثلة على كيفية التفكير خطوة بخطوة ثم إعطاء السؤال المختصر:
 
17
  السؤال الأصلي:
18
  انا فيني اكتئاب وقلق ووصف لي دكتور citalopram استخدمتها ثلاث شهور ولا نفع احتاج وصفه Ativan
 
19
  فكر خطوة بخطوة:
20
  1. المستخدم يعاني من اكتئاب وقلق.
21
  2. تناول دواء citalopram لثلاثة أشهر من دون تحسّن.
22
  3. يسأل عن الحصول على وصفة Ativan كبديل أو إضافة للعلاج.
 
23
  السؤال المختصر:
24
  استفسار حول عدم فعالية citalopram والحاجة الى Ativan
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  """.strip()
26
 
27
+ new_segment = f"""
28
  الآن لديك سؤال جديد، فكر خطوة بخطوة بشكل مشابه ثم أعطني السؤال المختصر:
29
  تأكد من عدم اضافة ملاحظات أو اضافة معلومة غير موجودة في السؤال
30
  السؤال الأصلي:
31
+ {text}
 
32
  السؤال المختصر:
33
  """
34
 
35
+ full_prompt = f"""
36
  أنت مساعد لغوي مختص بأسئلة الصحة النفسية.
37
  هدفك هو إعادة كتابة الأسئلة المطوّلة في شكل مختصر ومباشر، يركّز على النقطة الأساسية.
38
  {examples}
39
+ {new_segment}
40
  """.strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
+ inputs = tokenizer(
43
+ tokenizer.apply_chat_template([{"role": "user", "content": full_prompt}], tokenize=False),
44
+ return_tensors="pt"
45
+ ).to(model.device)
46
 
47
+ with torch.no_grad():
48
+ output = model.generate(
49
+ **inputs,
50
+ max_new_tokens=max_new_tokens,
51
+ do_sample=False,
52
+ pad_token_id=tokenizer.eos_token_id
53
+ )
 
 
 
 
 
 
 
 
 
54
 
55
+ decoded = tokenizer.decode(output[0], skip_special_tokens=True)
56
+ return decoded.split("السؤال المختصر:")[-1].strip() if "السؤال المختصر:" in decoded else decoded.strip()