File size: 3,772 Bytes
2595b5a
66c78d9
2595b5a
 
 
 
 
 
 
 
5d207e8
4085a4c
2595b5a
66c78d9
 
4085a4c
2595b5a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c745c2b
2595b5a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from ctransformers import AutoModelForCausalLM, AutoTokenizer
import torch

# Configuration de la page Streamlit
st.set_page_config(page_title="Assistant Mathématique", page_icon="🔢", layout="wide")

@st.cache_resource
def load_model():
    """Charge le modèle et le tokenizer (mise en cache par Streamlit)"""
    model_name = "analist/deepseek-math-gguf"  # Remplacez par votre nom de modèle
    
    model = AutoModelForCausalLM.from_pretrained(
    "analist/deepseek-math-gguf", model_file="model.gguf"
)
    tokenizer = AutoTokenizer.from_pretrained(model)
    return model, tokenizer

def generate_response(prompt, model, tokenizer):
    """Génère une réponse à partir du prompt"""
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=1200,
            temperature=0.7,
            do_sample=True,
            top_p=0.95,
        )
    
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return response.split("### Response:")[-1].strip()

def format_prompt(question):
    """Formate le prompt comme pendant l'entraînement"""
    return f"""Below is an instruction that describes a task, paired with an input that provides further context.
Write a response that appropriately completes the request.
Before answering, think carefully about the question and create a step-by-step chain of thoughts to ensure a logical and accurate response.
Your goal is to teach maths a beginner so make it friendly and accessible. Break down your chain of thoughts as for him/her to understand.

### Instruction:
You are a maths expert with advanced knowledge in pedagogy, arithmetics, geometry, analysis, calculus.
Please answer the following questions.

### Question:
{question}

### Response:"""

def main():
    # Titre de l'application
    st.title("🔢 Assistant Mathématique")
    st.markdown("---")

    # Chargement du modèle
    with st.spinner("Chargement du modèle..."):
        model, tokenizer = load_model()

    # Initialisation de l'historique des messages dans la session state
    if "messages" not in st.session_state:
        st.session_state.messages = []

    # Affichage de l'historique des messages
    for message in st.session_state.messages:
        with st.chat_message(message["role"]):
            st.markdown(message["content"])

    # Zone de saisie utilisateur
    if question := st.chat_input("Posez votre question mathématique..."):
        # Afficher la question de l'utilisateur
        with st.chat_message("user"):
            st.markdown(question)
        st.session_state.messages.append({"role": "user", "content": question})

        # Générer et afficher la réponse
        with st.chat_message("assistant"):
            with st.spinner("Réflexion en cours..."):
                prompt = format_prompt(question)
                response = generate_response(prompt, model, tokenizer)
                response = response.replace('<think>', '')
                st.markdown(response)
        st.session_state.messages.append({"role": "assistant", "content": response})

    # Bouton pour effacer l'historique
    if st.sidebar.button("Effacer l'historique"):
        st.session_state.messages = []
        st.rerun()

    # Informations dans la barre latérale
    with st.sidebar:
        st.markdown("### À propos")
        st.markdown("""
        Cet assistant utilise un modèle DeepSeek spécialement entraîné pour:
        - Expliquer les concepts mathématiques
        - Résoudre des problèmes étape par étape
        - Fournir des explications claires et adaptées aux débutants
        """)

if __name__ == "__main__":
    main()