maxenceLIOGIER commited on
Commit
8b562f7
·
verified ·
1 Parent(s): 7d694df

Upload folder using huggingface_hub

Browse files
app/views/aide_telephonique.py CHANGED
@@ -98,10 +98,9 @@ def summarize_conversation(messages, llm):
98
  llm_chain = prompt | llm
99
  start_time = time.time()
100
  summary = llm_chain.invoke({"conversation": conversation})
101
- latency = (time.time() - start_time) * 1000 # Convertir en ms
102
- token_count = len(summary.split())
103
- track_metrics(latency, token_count)
104
- return summary
105
 
106
 
107
  def aide_telephonique_page():
@@ -117,10 +116,8 @@ def aide_telephonique_page():
117
  Cela peut être gênant en faussant les résultats du LLM.
118
  """
119
 
120
- st.title("Aide téléphonique pour les opérateurs du SAMU")
121
- st.subheader(
122
- "Interrogez l'IA durant votre appel pour obtenir des aides et conseils"
123
- )
124
 
125
  # Initialisation de l'état de session
126
  if "recording" not in st.session_state:
@@ -139,6 +136,14 @@ def aide_telephonique_page():
139
  st.session_state.message_count = 0
140
  if "session_id" not in st.session_state:
141
  st.session_state.session_id = str(uuid.uuid4())
 
 
 
 
 
 
 
 
142
 
143
  # Contrôles d'enregistrement
144
  col1, col2 = st.columns(2)
@@ -166,7 +171,10 @@ def aide_telephonique_page():
166
  st.info("Enregistrement en cours...")
167
 
168
  template = """
169
- Tu es une IA conçue pour assister les agents des urgences en analysant leurs appels.
 
 
 
170
 
171
  **Règles à respecter :**
172
  - Tu dois être **empathique, calme, direct et professionnel**.
@@ -177,22 +185,21 @@ def aide_telephonique_page():
177
  - **Tes réponses doivent toujours être en français, sauf si l'opérateur parle en anglais.**
178
  - **Formule tes réponses sous forme d’instructions précises pour l’opérateur.**
179
  - **Tes réponses doivent toujours être en français, correctes grammaticalement et sans faute de syntaxe.**
180
- - **Tes réponses ne doivent jamais commencer par "réponse correcte". Réponds directement comme cela t'a été demandé.**
181
 
182
  **Important :** Tu n’as accès **qu'à la voix de l'opérateur**. Tu ne dois pas générer de contenu supplémentaire ni interpréter des éléments que tu ne peux pas entendre.
183
 
184
  ### **Exemple de réponse attendue :**
185
  **Opérateur :** "Il y a eu un accident, des blessés peut-être."
186
- **Réponse correcte :** "Demandez à l'appelant combien de blessés il y a."
187
 
188
  **Opérateur :** "Où est l’accident ?"
189
- **Réponse correcte :** "Demandez une adresse exacte ou un point de repère."
190
 
191
  **Voici la dernière déclaration ou question de l'opérateur :**
192
  {text_query}
193
 
194
- **Voici le contexte dont tu auras besoin pour répondre au mieux aux questions:**
195
- {context}
196
  """
197
 
198
  prompt = PromptTemplate(
@@ -233,8 +240,11 @@ def aide_telephonique_page():
233
  recent_messages = all_messages[-5:] # on garde les 5 derniers
234
 
235
  # Résumé de la conversation via le LLM
236
- summary = summarize_conversation(old_messages, llm)
237
-
 
 
 
238
  # Mettre à jour l'historique avec le résumé et les messages récents
239
  st.session_state.history = ChatMessageHistory()
240
  for msg in recent_messages:
@@ -362,6 +372,7 @@ def aide_telephonique_page():
362
 
363
  # Appel du LLM si le test de sécurité est accepté
364
  if filtre["status"] == "Accepté" and test_sim_cos:
 
365
  response = llm_chain.invoke(
366
  {
367
  "text_query": st.session_state.history.messages,
@@ -370,6 +381,12 @@ def aide_telephonique_page():
370
  ),
371
  }
372
  )
 
 
 
 
 
 
373
  st.session_state.history.add_ai_message(response)
374
  with st.chat_message("assistant"):
375
  st.markdown(response)
@@ -406,5 +423,19 @@ def aide_telephonique_page():
406
  # Résumé de la conversation via le LLM
407
  st.write("Résumé de la conversation :")
408
  messages = st.session_state.history.messages
409
- summary = summarize_conversation(messages, llm)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
410
  st.write(summary)
 
98
  llm_chain = prompt | llm
99
  start_time = time.time()
100
  summary = llm_chain.invoke({"conversation": conversation})
101
+ latency_summary = (time.time() - start_time) * 1000 # Convertir en ms
102
+ tokens_summary = len(summary.split())
103
+ return summary, latency_summary, tokens_summary
 
104
 
105
 
106
  def aide_telephonique_page():
 
116
  Cela peut être gênant en faussant les résultats du LLM.
117
  """
118
 
119
+ st.title("Requête du modèle")
120
+ st.subheader("Interrogez le LLM via votre voix ou texte")
 
 
121
 
122
  # Initialisation de l'état de session
123
  if "recording" not in st.session_state:
 
136
  st.session_state.message_count = 0
137
  if "session_id" not in st.session_state:
138
  st.session_state.session_id = str(uuid.uuid4())
139
+ if "latency_summary_list" not in st.session_state:
140
+ st.session_state.latency_summary_list = []
141
+ if "tokens_summary_list" not in st.session_state:
142
+ st.session_state.tokens_summary_list = []
143
+ if "latency_response_list" not in st.session_state:
144
+ st.session_state.latency_response_list = []
145
+ if "tokens_response_list" not in st.session_state:
146
+ st.session_state.tokens_response_list = []
147
 
148
  # Contrôles d'enregistrement
149
  col1, col2 = st.columns(2)
 
171
  st.info("Enregistrement en cours...")
172
 
173
  template = """
174
+ Tu es une IA conçue pour assister les agents des urgences en analysant leurs appels.
175
+
176
+ **Voici le contexte dont tu auras besoin pour répondre au mieux aux questions:**
177
+ {context}
178
 
179
  **Règles à respecter :**
180
  - Tu dois être **empathique, calme, direct et professionnel**.
 
185
  - **Tes réponses doivent toujours être en français, sauf si l'opérateur parle en anglais.**
186
  - **Formule tes réponses sous forme d’instructions précises pour l’opérateur.**
187
  - **Tes réponses doivent toujours être en français, correctes grammaticalement et sans faute de syntaxe.**
188
+ - **Tes réponses ne doivent jamais commencer en introduisant la réponse (ex: "réponse :"). Réponds directement comme cela t'a été demandé.**
189
 
190
  **Important :** Tu n’as accès **qu'à la voix de l'opérateur**. Tu ne dois pas générer de contenu supplémentaire ni interpréter des éléments que tu ne peux pas entendre.
191
 
192
  ### **Exemple de réponse attendue :**
193
  **Opérateur :** "Il y a eu un accident, des blessés peut-être."
194
+ "Demandez à l'appelant combien de blessés il y a."
195
 
196
  **Opérateur :** "Où est l’accident ?"
197
+ "Demandez une adresse exacte ou un point de repère."
198
 
199
  **Voici la dernière déclaration ou question de l'opérateur :**
200
  {text_query}
201
 
202
+ **Pour rappel** tu dois absolument répondre uniquement en français avec des réponses les plus courtes possibles.
 
203
  """
204
 
205
  prompt = PromptTemplate(
 
240
  recent_messages = all_messages[-5:] # on garde les 5 derniers
241
 
242
  # Résumé de la conversation via le LLM
243
+ summary, latency_summary, tokens_summary = summarize_conversation(
244
+ old_messages, llm
245
+ )
246
+ st.session_state.latency_summary_list.append(latency_summary)
247
+ st.session_state.tokens_summary_list.append(tokens_summary)
248
  # Mettre à jour l'historique avec le résumé et les messages récents
249
  st.session_state.history = ChatMessageHistory()
250
  for msg in recent_messages:
 
372
 
373
  # Appel du LLM si le test de sécurité est accepté
374
  if filtre["status"] == "Accepté" and test_sim_cos:
375
+ start_time = time.time()
376
  response = llm_chain.invoke(
377
  {
378
  "text_query": st.session_state.history.messages,
 
381
  ),
382
  }
383
  )
384
+ latency_response = (time.time() - start_time) * 1000 # ms
385
+ tokens_response = len(response.split())
386
+
387
+ st.session_state.latency_response_list.append(latency_response)
388
+ st.session_state.tokens_response_list.append(tokens_response)
389
+
390
  st.session_state.history.add_ai_message(response)
391
  with st.chat_message("assistant"):
392
  st.markdown(response)
 
423
  # Résumé de la conversation via le LLM
424
  st.write("Résumé de la conversation :")
425
  messages = st.session_state.history.messages
426
+ summary, latency_summary, tokens_summary = summarize_conversation(
427
+ messages, llm
428
+ )
429
+ st.session_state.latency_summary_list.append(latency_summary)
430
+ st.session_state.tokens_summary_list.append(tokens_summary)
431
+ total_latency_response = sum(st.session_state.latency_response_list)
432
+ total_tokens_response = sum(st.session_state.tokens_response_list)
433
+ total_latency_summary = sum(st.session_state.latency_summary_list)
434
+ total_tokens_summary = sum(st.session_state.tokens_summary_list)
435
+
436
+ track_metrics(
437
+ total_latency_response + total_latency_summary,
438
+ total_tokens_response + total_tokens_summary,
439
+ )
440
+
441
  st.write(summary)
app/views/dashboard.py CHANGED
@@ -1,5 +1,3 @@
1
- """ Tableau de bord des performances et de l'impact écologique et financier """
2
-
3
  import streamlit as st
4
  import plotly.express as px
5
 
@@ -13,6 +11,7 @@ CARBON_PER_QUERY = 0.8
13
  def track_metrics(latency, token_count):
14
  """Met à jour les métriques avec une nouvelle requête"""
15
 
 
16
  if "metrics" not in st.session_state:
17
  st.session_state.metrics = {
18
  "total_queries": 0,
@@ -40,23 +39,13 @@ def get_metrics():
40
 
41
 
42
  def dashboard_page():
43
- """Page permettant de visualiser les métriques de performance et d'impact"""
44
-
45
  st.title("Tableau de Bord des Performances")
46
  st.subheader("Suivi des performances et de l'impact")
47
 
48
  # si enregistrement en cours, on l'arrête
49
  arret_enregistrement()
50
 
51
- # Stocker les métriques globales
52
- if "metrics" not in st.session_state:
53
- st.session_state.metrics = {
54
- "total_queries": 0,
55
- "latency_history": [],
56
- "cost_history": [],
57
- "carbon_history": [],
58
- }
59
-
60
  metrics = get_metrics()
61
 
62
  col1, col2, col3 = st.columns(3)
@@ -66,32 +55,38 @@ def dashboard_page():
66
 
67
  if st.session_state.metrics["total_queries"] == 0:
68
  st.warning(
69
- "Aucune donnée disponible pour le moment. \
70
- Posez des questions pour générer des métriques."
71
  )
72
  return
73
 
74
- # if len(st.session_state.metrics["latency_history"]) > 0:
75
  st.subheader("📊 Visualisation des métriques")
76
 
77
  col1, col2 = st.columns(2)
78
 
79
  with col1:
80
- fig1 = px.line(
81
- x=list(range(1, len(st.session_state.metrics["latency_history"]) + 1)),
82
- y=st.session_state.metrics["latency_history"],
83
- labels={"x": "Numéro de la requête", "y": "Latence (ms)"},
84
- title="Latence par requête",
85
- color_discrete_sequence=["#1f8b4c"],
86
- )
87
- st.plotly_chart(fig1, use_container_width=True)
 
 
 
 
 
88
 
89
  with col2:
90
- fig2 = px.line(
91
- x=list(range(1, len(st.session_state.metrics["cost_history"]) + 1)),
92
- y=st.session_state.metrics["cost_history"],
93
- labels={"x": "Numéro de la requête", "y": "Coût (€)"},
94
- title="Coût cumulé des requêtes",
95
- color_discrete_sequence=["#1f8b4c"],
96
- )
97
- st.plotly_chart(fig2, use_container_width=True)
 
 
 
 
 
 
1
  import streamlit as st
2
  import plotly.express as px
3
 
 
11
  def track_metrics(latency, token_count):
12
  """Met à jour les métriques avec une nouvelle requête"""
13
 
14
+ # Initialiser les métriques globales si elles n'existent pas déja
15
  if "metrics" not in st.session_state:
16
  st.session_state.metrics = {
17
  "total_queries": 0,
 
39
 
40
 
41
  def dashboard_page():
42
+ """Affichage des métriques et graphiques"""
 
43
  st.title("Tableau de Bord des Performances")
44
  st.subheader("Suivi des performances et de l'impact")
45
 
46
  # si enregistrement en cours, on l'arrête
47
  arret_enregistrement()
48
 
 
 
 
 
 
 
 
 
 
49
  metrics = get_metrics()
50
 
51
  col1, col2, col3 = st.columns(3)
 
55
 
56
  if st.session_state.metrics["total_queries"] == 0:
57
  st.warning(
58
+ "Aucune donnée disponible pour le moment. Posez des questions pour générer des métriques."
 
59
  )
60
  return
61
 
 
62
  st.subheader("📊 Visualisation des métriques")
63
 
64
  col1, col2 = st.columns(2)
65
 
66
  with col1:
67
+ if st.session_state.metrics["latency_history"]:
68
+ fig1 = px.line(
69
+ x=list(range(1, len(st.session_state.metrics["latency_history"]) + 1)),
70
+ y=st.session_state.metrics["latency_history"],
71
+ labels={"x": "Numéro de la requête", "y": "Latence (ms)"},
72
+ title="Latence par requête",
73
+ color_discrete_sequence=["#1f8b4c"],
74
+ )
75
+ st.plotly_chart(fig1, use_container_width=True)
76
+ else:
77
+ st.warning(
78
+ "🚨 Aucune donnée de latence disponible pour générer le graphique."
79
+ )
80
 
81
  with col2:
82
+ if st.session_state.metrics["cost_history"]:
83
+ fig2 = px.line(
84
+ x=list(range(1, len(st.session_state.metrics["cost_history"]) + 1)),
85
+ y=st.session_state.metrics["cost_history"],
86
+ labels={"x": "Numéro de la requête", "y": "Coût (€)"},
87
+ title="Coût cumulé des requêtes",
88
+ color_discrete_sequence=["#1f8b4c"],
89
+ )
90
+ st.plotly_chart(fig2, use_container_width=True)
91
+ else:
92
+ st.warning("🚨 Aucune donnée de coût disponible pour générer le graphique.")
database/db_logsv2.db CHANGED
Binary files a/database/db_logsv2.db and b/database/db_logsv2.db differ
 
requirements.txt CHANGED
@@ -9,10 +9,7 @@ matplotlib==3.10.0
9
  numpy
10
  pandas==2.2.3
11
  plotly==6.0.0
12
- # portaudio==19.6.0
13
- # PyAudio
14
  pyaudio
15
- # pyaudio-wheels
16
  python-dotenv==1.0.1
17
  rapidfuzz==3.12.1
18
  Requests==2.32.3
 
9
  numpy
10
  pandas==2.2.3
11
  plotly==6.0.0
 
 
12
  pyaudio
 
13
  python-dotenv==1.0.1
14
  rapidfuzz==3.12.1
15
  Requests==2.32.3
src/security/__pycache__/security_report.cpython-311.pyc CHANGED
Binary files a/src/security/__pycache__/security_report.cpython-311.pyc and b/src/security/__pycache__/security_report.cpython-311.pyc differ