Spaces:
Sleeping
Sleeping
# -*- coding: utf-8 -*- | |
# ALLaM 7B – Arabic Mental Health Question Summarizer | |
import torch | |
from transformers import AutoTokenizer, AutoModelForCausalLM | |
device = "cuda" if torch.cuda.is_available() else "cpu" | |
model_id = "ALLaM-AI/ALLaM-7B-Instruct-preview" | |
tokenizer = AutoTokenizer.from_pretrained(model_id) | |
model = AutoModelForCausalLM.from_pretrained( | |
model_id, | |
torch_dtype="auto", | |
device_map="auto", | |
low_cpu_mem_usage=True, | |
) | |
def _generate(system_text: str, user_text: str, max_new_tokens: int = 60) -> str: | |
messages = [] | |
if system_text.strip(): | |
messages.append({"role": "system", "content": system_text}) | |
messages.append({"role": "user", "content": user_text}) | |
prompt_text = tokenizer.apply_chat_template(messages, tokenize=False) | |
inputs = tokenizer(prompt_text, return_tensors="pt").to(model.device) | |
with torch.no_grad(): | |
output = model.generate( | |
**inputs, | |
max_new_tokens=max_new_tokens, | |
do_sample=False, | |
pad_token_id=tokenizer.eos_token_id, | |
) | |
decoded = tokenizer.decode(output[0], skip_special_tokens=True) | |
return decoded.replace("[/INST]", "").strip() | |
def summarize_question(question_text: str) -> str: | |
examples = """ | |
أمثلة على كيفية التفكير خطوة بخطوة ثم إعطاء السؤال المختصر: | |
السؤال الأصلي: | |
انا فيني اكتئاب وقلق ووصف لي دكتور citalopram استخدمتها ثلاث شهور ولا نفع احتاج وصفه Ativan | |
فكر خطوة بخطوة: | |
1. المستخدم يعاني من اكتئاب وقلق. | |
2. تناول دواء citalopram لثلاثة أشهر من دون تحسّن. | |
3. يسأل عن الحصول على وصفة Ativan كبديل أو إضافة للعلاج. | |
السؤال المختصر: | |
استفسار حول عدم فعالية citalopram والحاجة الى Ativan | |
السؤال الأصلي: | |
كنت اعاني من قلق وأخذت دواء سبرالكس لمدة 4 شهور وتوقفت عنه في 2014. سأذهب لتحليل بول للعمل، هل سيظهر أثر الدواء؟ | |
فكر خطوة بخطوة: | |
1. المستخدم كان يعاني من قلق وتناول سبرالكس قبل عدة سنوات. | |
2. يخشى أن يظهر الدواء القديم في فحص البول المطلوب للعمل. | |
3. يريد معرفة إن كان ما زال موجوداً في جسمه. | |
السؤال المختصر: | |
سؤال حول بقاء أثر الدواء في تحليل البول بعد مدة؟ | |
""".strip() | |
new_segment = f""" | |
الآن لديك سؤال جديد، فكر خطوة بخطوة بشكل مشابه ثم أعطني السؤال المختصر: | |
تأكد من عدم اضافة ملاحظات أو اضافة معلومة غير موجودة في السؤال | |
السؤال الأصلي: | |
{question_text} | |
السؤال المختصر: | |
""".strip() | |
final_prompt = f""" | |
أنت مساعد لغوي مختص بأسئلة الصحة النفسية. | |
هدفك هو إعادة كتابة الأسئلة المطوّلة في شكل مختصر ومباشر، يركّز على النقطة الأساسية. | |
{examples} | |
{new_segment} | |
""".strip() | |
response = _generate("", final_prompt) | |
return response.split("السؤال المختصر:")[-1].strip() if "السؤال المختصر:" in response else response.strip() | |