File size: 4,598 Bytes
7e0b3c1
 
ccccb88
 
5114a9c
ccccb88
 
 
 
 
 
 
 
 
5114a9c
 
 
ccccb88
5114a9c
ccccb88
5114a9c
 
ccccb88
 
 
 
 
 
 
 
 
 
 
4b8d1fe
7e0b3c1
a3d234b
ccccb88
a3d234b
7e0b3c1
 
 
a3d234b
ccccb88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5114a9c
 
 
 
 
 
 
ccccb88
 
 
 
 
 
 
 
 
 
5114a9c
 
 
 
 
 
ccccb88
7e0b3c1
 
4b8d1fe
ccccb88
7e0b3c1
 
 
4b8d1fe
ccccb88
 
 
7e0b3c1
 
 
4b8d1fe
ccccb88
7e0b3c1
a3d234b
ccccb88
 
 
 
 
 
 
 
a3d234b
 
ccccb88
a3d234b
ccccb88
a3d234b
ccccb88
a3d234b
 
ccccb88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import numpy as np
import streamlit as st
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
from accelerate import init_empty_weights

# التحقق من توفر GPU
device = "cuda" if torch.cuda.is_available() else "cpu"

@st.cache_resource
def load_model():
    """
    تحميل النموذج والمُرمِّز مع التخزين المؤقت
    """
    tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")
    
    # تحميل النموذج مع إعدادات الذاكرة المنخفضة
    model = AutoModelForCausalLM.from_pretrained(
        "mistralai/Mistral-7B-Instruct-v0.2",
        torch_dtype=torch.float16,
        low_cpu_mem_usage=True,
        device_map="auto"
    )
    return model, tokenizer

# الصور العشوائية للكلاب عند حدوث خطأ
random_dog = [
    "0f476473-2d8b-415e-b944-483768418a95.jpg",
    "1bd75c81-f1d7-4e55-9310-a27595fa8762.jpg",
    "526590d2-8817-4ff0-8c62-fdcba5306d02.jpg",
    "1326984c-39b0-492c-a773-f120d747a7e2.jpg",
    "42a98d03-5ed7-4b3b-af89-7c4376cb14c3.jpg"
]

def reset_conversation():
    '''
    إعادة تعيين المحادثة
    '''
    st.session_state.conversation = []
    st.session_state.messages = []
    return None

def generate_response(prompt, temperature, max_length):
    """
    توليد استجابة من النموذج
    """
    try:
        inputs = tokenizer.encode(prompt, return_tensors="pt").to(device)
        
        with torch.no_grad():
            outputs = model.generate(
                inputs,
                max_length=max_length,
                temperature=temperature,
                do_sample=True,
                pad_token_id=tokenizer.eos_token_id
            )
        
        response = tokenizer.decode(outputs[0], skip_special_tokens=True)
        return response
    except Exception as e:
        return str(e)

# تحميل النموذج والمُرمِّز
try:
    with st.spinner('جاري تحميل النموذج... قد يستغرق هذا بضع دقائق...'):
        model, tokenizer = load_model()
except Exception as e:
    st.error(f"حدث خطأ أثناء تحميل النموذج: {str(e)}")
    st.error("تأكد من تثبيت جميع المكتبات المطلوبة:")
    st.code("""
    pip install -U accelerate>=0.26.0
    pip install transformers
    pip install torch
    pip install streamlit
    """)
    st.stop()

# إعداد واجهة Streamlit
st.subheader('Mistral Chat')

# إضافة أزرار التحكم في الشريط الجانبي
temp_values = st.sidebar.slider('اختر قيمة درجة الحرارة', 0.0, 1.0, 0.5)
max_token_value = st.sidebar.slider('اختر الحد الأقصى للرموز', 100, 2000, 500)
st.sidebar.button('إعادة تعيين المحادثة', on_click=reset_conversation)

# معلومات حول النموذج
st.sidebar.markdown("""
### معلومات النظام
- النموذج: Mistral-7B-Instruct-v0.2
- الجهاز: GPU متوفر ✅ """ if torch.cuda.is_available() else "CPU ⚠️")

# تهيئة سجل المحادثة
if "messages" not in st.session_state:
    st.session_state.messages = []

# عرض رسائل المحادثة السابقة
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# معالجة إدخال المستخدم
if prompt := st.chat_input("اسألني سؤالاً"):
    # عرض رسالة المستخدم
    with st.chat_message("user"):
        st.markdown(prompt)
    st.session_state.messages.append({"role": "user", "content": prompt})
    
    # عرض رد المساعد
    with st.chat_message("assistant"):
        try:
            # توليد الرد
            with st.spinner('جاري التفكير...'):
                response = generate_response(
                    prompt,
                    temperature=temp_values,
                    max_length=max_token_value
                )
            st.write(response)

        except Exception as e:
            response = "😵‍💫 يبدو أن هناك خطأ ما!\n حاول مرة أخرى لاحقاً.\n\n إليك صورة عشوائية لكلب 🐶:"
            st.write(response)
            random_dog_pick = 'https://random.dog/' + random_dog[np.random.randint(len(random_dog))]
            st.image(random_dog_pick)
            st.write("رسالة الخطأ:")
            st.write(e)

        st.session_state.messages.append({"role": "assistant", "content": response})