MMOON commited on
Commit
02f9aa6
·
verified ·
1 Parent(s): 3116c2c

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +39 -37
src/streamlit_app.py CHANGED
@@ -3,7 +3,10 @@ import torch
3
  from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
4
  from huggingface_hub import login
5
 
 
6
  # --- CONFIGURATION DE LA PAGE ---
 
 
7
  st.set_page_config(
8
  page_title="Chat Avancé avec Apertus",
9
  page_icon="🚀",
@@ -11,28 +14,15 @@ st.set_page_config(
11
  initial_sidebar_state="expanded",
12
  )
13
 
14
- # --- STYLES CSS PERSONNALISÉS (Optionnel) ---
15
- st.markdown("""
16
- <style>
17
- .stSpinner > div > div {
18
- border-top-color: #f63366;
19
- }
20
- .stChatMessage {
21
- background-color: #f0f2f6;
22
- border-radius: 10px;
23
- padding: 15px;
24
- margin-bottom: 10px;
25
- }
26
- </style>
27
- """, unsafe_allow_html=True)
28
-
29
-
30
- # --- BARRE LATÉRALE DE CONFIGURATION ---
31
  with st.sidebar:
32
  st.title("🚀 Paramètres")
33
  st.markdown("Configurez l'assistant et le modèle de langage.")
34
 
35
- # --- Authentification Hugging Face ---
36
  st.subheader("Authentification Hugging Face")
37
  hf_token = st.text_input("Votre Token Hugging Face (hf_...)", type="password")
38
  if st.button("Se Connecter"):
@@ -46,7 +36,7 @@ with st.sidebar:
46
  else:
47
  st.warning("Veuillez entrer un token Hugging Face.")
48
 
49
- # --- Sélection du Modèle ---
50
  st.subheader("Sélection du Modèle")
51
  model_options = {
52
  "Apertus 8B (Rapide)": "swiss-ai/Apertus-8B-Instruct-2509",
@@ -56,23 +46,34 @@ with st.sidebar:
56
  model_id = model_options[selected_model_name]
57
  st.caption(f"ID du modèle : `{model_id}`")
58
 
59
-
60
- # --- Paramètres de Génération ---
61
  st.subheader("Paramètres de Génération")
62
- temperature = st.slider("Température", min_value=0.1, max_value=1.5, value=0.7, step=0.05,
63
- help="Plus la valeur est élevée, plus la réponse est créative et aléatoire.")
64
- max_new_tokens = st.slider("Tokens Max", min_value=64, max_value=1024, value=256, step=64,
65
- help="Longueur maximale de la réponse générée.")
66
- top_p = st.slider("Top-p (Nucleus Sampling)", min_value=0.1, max_value=1.0, value=0.95, step=0.05,
67
- help="Contrôle la diversité en sélectionnant les mots les plus probables dont la somme des probabilités dépasse ce seuil.")
 
 
 
 
 
 
 
 
 
68
 
69
  # --- Bouton pour effacer l'historique ---
 
70
  if st.button("🗑️ Effacer l'historique"):
71
  st.session_state.messages = []
72
  st.experimental_rerun()
73
 
74
-
75
- # --- CHARGEMENT DU MODÈLE (MIS EN CACHE) ---
 
 
76
  @st.cache_resource(show_spinner=False)
77
  def load_model(model_identifier):
78
  """Charge le tokenizer et le modèle avec quantification 4-bit."""
@@ -90,19 +91,21 @@ def load_model(model_identifier):
90
  )
91
  return tokenizer, model
92
 
93
- # Charge le modèle sélectionné
94
  try:
95
  tokenizer, model = load_model(model_id)
96
  except Exception as e:
97
  st.error(f"Impossible de charger le modèle. Assurez-vous d'être connecté si le modèle est privé. Erreur : {e}")
98
  st.stop()
99
 
100
-
101
  # --- INTERFACE DE CHAT PRINCIPALE ---
 
 
102
  st.title("🤖 Chat avec Apertus")
103
  st.caption(f"Vous discutez actuellement avec **{selected_model_name}**.")
104
 
105
- # Initialisation de l'historique du chat
106
  if "messages" not in st.session_state:
107
  st.session_state.messages = []
108
 
@@ -111,19 +114,18 @@ for message in st.session_state.messages:
111
  with st.chat_message(message["role"]):
112
  st.markdown(message["content"])
113
 
114
- # Zone de saisie utilisateur
115
  if prompt := st.chat_input("Posez votre question à Apertus..."):
116
- # Ajout et affichage du message utilisateur
117
  st.session_state.messages.append({"role": "user", "content": prompt})
118
  with st.chat_message("user"):
119
  st.markdown(prompt)
120
 
121
- # --- GÉNÉRATION DE LA RÉPONSE ---
122
  with st.chat_message("assistant"):
123
  response_placeholder = st.empty()
124
  with st.spinner("Réflexion en cours... 🤔"):
125
  # Préparation des entrées pour le modèle
126
- # Nous ne formaterons plus le prompt, le modèle instruct est déjà finetuné pour ça.
127
  input_ids = tokenizer(prompt, return_tensors="pt").to(model.device)
128
 
129
  # Génération de la réponse
@@ -138,7 +140,7 @@ if prompt := st.chat_input("Posez votre question à Apertus..."):
138
 
139
  # Décodage et nettoyage de la réponse
140
  response_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
141
- # Nettoyage pour retirer la question initiale de la réponse
142
  cleaned_response = response_text.replace(prompt, "").strip()
143
 
144
  response_placeholder.markdown(cleaned_response)
 
3
  from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
4
  from huggingface_hub import login
5
 
6
+ # ==============================================================================
7
  # --- CONFIGURATION DE LA PAGE ---
8
+ # Définit le titre, l'icône et la mise en page de l'application.
9
+ # ==============================================================================
10
  st.set_page_config(
11
  page_title="Chat Avancé avec Apertus",
12
  page_icon="🚀",
 
14
  initial_sidebar_state="expanded",
15
  )
16
 
17
+ # ==============================================================================
18
+ # --- BARRE LATÉRALE (SIDEBAR) ---
19
+ # Contient toutes les options de configuration pour l'utilisateur.
20
+ # ==============================================================================
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  with st.sidebar:
22
  st.title("🚀 Paramètres")
23
  st.markdown("Configurez l'assistant et le modèle de langage.")
24
 
25
+ # --- Section d'Authentification Hugging Face ---
26
  st.subheader("Authentification Hugging Face")
27
  hf_token = st.text_input("Votre Token Hugging Face (hf_...)", type="password")
28
  if st.button("Se Connecter"):
 
36
  else:
37
  st.warning("Veuillez entrer un token Hugging Face.")
38
 
39
+ # --- Section de Sélection du Modèle ---
40
  st.subheader("Sélection du Modèle")
41
  model_options = {
42
  "Apertus 8B (Rapide)": "swiss-ai/Apertus-8B-Instruct-2509",
 
46
  model_id = model_options[selected_model_name]
47
  st.caption(f"ID du modèle : `{model_id}`")
48
 
49
+ # --- Section des Paramètres de Génération ---
 
50
  st.subheader("Paramètres de Génération")
51
+ temperature = st.slider(
52
+ "Température",
53
+ min_value=0.1, max_value=1.5, value=0.7, step=0.05,
54
+ help="Plus la valeur est élevée, plus la réponse est créative et aléatoire."
55
+ )
56
+ max_new_tokens = st.slider(
57
+ "Tokens Max",
58
+ min_value=64, max_value=1024, value=256, step=64,
59
+ help="Longueur maximale de la réponse générée."
60
+ )
61
+ top_p = st.slider(
62
+ "Top-p (Nucleus Sampling)",
63
+ min_value=0.1, max_value=1.0, value=0.95, step=0.05,
64
+ help="Contrôle la diversité en sélectionnant les mots les plus probables."
65
+ )
66
 
67
  # --- Bouton pour effacer l'historique ---
68
+ st.subheader("Gestion du Chat")
69
  if st.button("🗑️ Effacer l'historique"):
70
  st.session_state.messages = []
71
  st.experimental_rerun()
72
 
73
+ # ==============================================================================
74
+ # --- FONCTION DE CHARGEMENT DU MODÈLE ---
75
+ # Mise en cache pour ne charger le modèle qu'une seule fois.
76
+ # ==============================================================================
77
  @st.cache_resource(show_spinner=False)
78
  def load_model(model_identifier):
79
  """Charge le tokenizer et le modèle avec quantification 4-bit."""
 
91
  )
92
  return tokenizer, model
93
 
94
+ # Essai de chargement du modèle
95
  try:
96
  tokenizer, model = load_model(model_id)
97
  except Exception as e:
98
  st.error(f"Impossible de charger le modèle. Assurez-vous d'être connecté si le modèle est privé. Erreur : {e}")
99
  st.stop()
100
 
101
+ # ==============================================================================
102
  # --- INTERFACE DE CHAT PRINCIPALE ---
103
+ # Affiche les messages et gère les entrées de l'utilisateur.
104
+ # ==============================================================================
105
  st.title("🤖 Chat avec Apertus")
106
  st.caption(f"Vous discutez actuellement avec **{selected_model_name}**.")
107
 
108
+ # Initialisation de l'historique du chat s'il n'existe pas
109
  if "messages" not in st.session_state:
110
  st.session_state.messages = []
111
 
 
114
  with st.chat_message(message["role"]):
115
  st.markdown(message["content"])
116
 
117
+ # Zone de saisie pour l'utilisateur
118
  if prompt := st.chat_input("Posez votre question à Apertus..."):
119
+ # Ajout et affichage du message de l'utilisateur
120
  st.session_state.messages.append({"role": "user", "content": prompt})
121
  with st.chat_message("user"):
122
  st.markdown(prompt)
123
 
124
+ # --- Génération de la réponse de l'assistant ---
125
  with st.chat_message("assistant"):
126
  response_placeholder = st.empty()
127
  with st.spinner("Réflexion en cours... 🤔"):
128
  # Préparation des entrées pour le modèle
 
129
  input_ids = tokenizer(prompt, return_tensors="pt").to(model.device)
130
 
131
  # Génération de la réponse
 
140
 
141
  # Décodage et nettoyage de la réponse
142
  response_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
143
+ # Nettoyage pour retirer le prompt de la réponse générée
144
  cleaned_response = response_text.replace(prompt, "").strip()
145
 
146
  response_placeholder.markdown(cleaned_response)