Sacof commited on
Commit
9b325cf
·
verified ·
1 Parent(s): 6271160

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -5
app.py CHANGED
@@ -7,40 +7,57 @@ import os
7
  from datetime import datetime
8
 
9
  MODEL_NAME = "google/gemma-2b-it"
10
- MAX_TOKENS = 1600
11
- TEMPERATURE = 0.7
12
  CSV_FILE = "conversations.csv"
 
 
13
 
14
  print("Chargement du modèle...")
15
  tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
16
  model = AutoModelForCausalLM.from_pretrained(
17
  MODEL_NAME,
18
- torch_dtype=torch.float32,
19
  )
20
  print("Modèle chargé avec succès")
21
 
 
 
 
 
 
 
 
 
 
22
  if not os.path.exists(CSV_FILE):
23
  with open(CSV_FILE, mode="w", newline="", encoding="utf-8") as file:
24
  writer = csv.writer(file)
25
  writer.writerow(["timestamp", "user_message", "assistant_response"])
26
 
 
27
  @spaces.GPU
28
  def chat_with_finanfa(message, history=None):
29
  if history is None:
30
  history = []
31
 
 
32
  system_prompt = (
33
  "Tu es FINANFA, un assistant médical intelligent, empathique et précis. "
 
34
  "Tu ne réponds qu’aux questions liées à la santé, aux maladies ou aux médicaments. "
35
  "Si une question n’est pas médicale, tu dis poliment que tu ne peux pas répondre."
36
  )
37
 
 
38
  conversation = f"Système : {system_prompt}\n"
 
 
39
  for user_msg, bot_msg in history:
40
  conversation += f"Utilisateur : {user_msg}\nAssistant : {bot_msg}\n"
41
  conversation += f"Utilisateur : {message}\nAssistant :"
42
 
43
- inputs = tokenizer(conversation, return_tensors="pt")
 
44
  outputs = model.generate(
45
  **inputs,
46
  max_new_tokens=MAX_TOKENS,
@@ -52,6 +69,7 @@ def chat_with_finanfa(message, history=None):
52
  response = tokenizer.decode(outputs[0], skip_special_tokens=True)
53
  response = response.split("Assistant :")[-1].strip()
54
 
 
55
  timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
56
  with open(CSV_FILE, mode="a", newline="", encoding="utf-8") as file:
57
  writer = csv.writer(file)
@@ -59,11 +77,31 @@ def chat_with_finanfa(message, history=None):
59
 
60
  return response
61
 
 
62
  with gr.Blocks(title="FINANFA — Chatbot Médical") as demo:
63
  gr.Markdown(
64
  """
65
  # 🏥 **FINANFA — Assistant Médical**
66
- Cet assistant répond uniquement aux questions médicales.
 
67
  ⚠️ Il ne remplace pas un avis médical professionnel.
68
  """
69
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  from datetime import datetime
8
 
9
  MODEL_NAME = "google/gemma-2b-it"
10
+ INFO_FILE = "infos_medicaux.txt"
 
11
  CSV_FILE = "conversations.csv"
12
+ MAX_TOKENS = 1500
13
+ TEMPERATURE = 0.7
14
 
15
  print("Chargement du modèle...")
16
  tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
17
  model = AutoModelForCausalLM.from_pretrained(
18
  MODEL_NAME,
19
+ torch_dtype=torch.float32
20
  )
21
  print("Modèle chargé avec succès")
22
 
23
+ if os.path.exists(INFO_FILE):
24
+ with open(INFO_FILE, "r", encoding="utf-8") as f:
25
+ medical_context = f.read()
26
+ print(f"📘 Contexte médical chargé depuis {INFO_FILE} ({len(medical_context)} caractères)")
27
+ else:
28
+ medical_context = ""
29
+ print("⚠️ Aucun fichier infos_medicaux.txt trouvé. FINANFA fonctionnera sans contexte médical local.")
30
+
31
+ # === INITIALISATION DU FICHIER CSV ===
32
  if not os.path.exists(CSV_FILE):
33
  with open(CSV_FILE, mode="w", newline="", encoding="utf-8") as file:
34
  writer = csv.writer(file)
35
  writer.writerow(["timestamp", "user_message", "assistant_response"])
36
 
37
+ # === FONCTION PRINCIPALE DU CHATBOT ===
38
  @spaces.GPU
39
  def chat_with_finanfa(message, history=None):
40
  if history is None:
41
  history = []
42
 
43
+ # Instructions système
44
  system_prompt = (
45
  "Tu es FINANFA, un assistant médical intelligent, empathique et précis. "
46
+ "Tu t'appuies sur les connaissances médicales fournies dans ton contexte. "
47
  "Tu ne réponds qu’aux questions liées à la santé, aux maladies ou aux médicaments. "
48
  "Si une question n’est pas médicale, tu dis poliment que tu ne peux pas répondre."
49
  )
50
 
51
+ # Construction du contexte conversationnel
52
  conversation = f"Système : {system_prompt}\n"
53
+ if medical_context:
54
+ conversation += f"Connaissances médicales : {medical_context}\n"
55
  for user_msg, bot_msg in history:
56
  conversation += f"Utilisateur : {user_msg}\nAssistant : {bot_msg}\n"
57
  conversation += f"Utilisateur : {message}\nAssistant :"
58
 
59
+ # Génération de la réponse
60
+ inputs = tokenizer(conversation, return_tensors="pt", truncation=True)
61
  outputs = model.generate(
62
  **inputs,
63
  max_new_tokens=MAX_TOKENS,
 
69
  response = tokenizer.decode(outputs[0], skip_special_tokens=True)
70
  response = response.split("Assistant :")[-1].strip()
71
 
72
+ # Sauvegarde dans le CSV
73
  timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
74
  with open(CSV_FILE, mode="a", newline="", encoding="utf-8") as file:
75
  writer = csv.writer(file)
 
77
 
78
  return response
79
 
80
+ # === INTERFACE GRADIO ===
81
  with gr.Blocks(title="FINANFA — Chatbot Médical") as demo:
82
  gr.Markdown(
83
  """
84
  # 🏥 **FINANFA — Assistant Médical**
85
+ Cet assistant répond uniquement aux questions médicales
86
+ et utilise un fichier `.txt` pour enrichir ses réponses.
87
  ⚠️ Il ne remplace pas un avis médical professionnel.
88
  """
89
  )
90
+
91
+ chat = gr.ChatInterface(
92
+ fn=chat_with_finanfa,
93
+ title="FINANFA - Assistant Médical",
94
+ description="Posez vos questions médicales en toute sécurité.",
95
+ examples=[
96
+ "Quels sont les symptômes du paludisme ?",
97
+ "Comment prévenir le diabète ?",
98
+ "Quels médicaments prendre pour la fièvre ?"
99
+ ]
100
+ )
101
+
102
+ # Bouton pour télécharger le CSV
103
+ with gr.Row():
104
+ gr.Markdown("### 📥 Télécharger les conversations")
105
+ gr.File(CSV_FILE, label="Conversations sauvegardées")
106
+
107
+ demo.launch(server_name="0.0.0.0", server_port=7860)