update analyse globale
Browse files
app.py
CHANGED
@@ -231,24 +231,54 @@ async def generate_text(
|
|
231 |
return {"summary_text_2": generated_text}
|
232 |
@app.post("/analyse_globale/")
|
233 |
async def generate_global_analysis(file: UploadFile = File(...)):
|
234 |
-
#
|
235 |
contents = await file.read()
|
|
|
|
|
236 |
file_size = len(contents)
|
237 |
-
if file_size > 5_000_000: #
|
238 |
-
return {"error": "
|
239 |
|
240 |
-
#
|
241 |
try:
|
242 |
df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
|
243 |
except Exception as e:
|
244 |
-
return {"error": f"
|
245 |
|
246 |
-
|
247 |
-
|
|
|
248 |
|
249 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
250 |
|
251 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
252 |
domain_analyses = ""
|
253 |
for domain, group in df.groupby('DOMAINE'):
|
254 |
domain_summary = group.groupby('STATUT').size().to_dict()
|
@@ -264,62 +294,24 @@ async def generate_global_analysis(file: UploadFile = File(...)):
|
|
264 |
"""
|
265 |
domain_analyses += domain_analysis
|
266 |
|
267 |
-
#
|
268 |
-
blocages_analysis = df[df['STATUT'] == 'EN COURS'].groupby('DOMAINE').size().sort_values(ascending=False)
|
269 |
-
blocages_text = "\n".join([f" - {domain}: {count} plaintes en cours" for domain, count in blocages_analysis.items()])
|
270 |
-
|
271 |
-
# Analyse de la réactivité (basée sur le nombre de plaintes non traitées)
|
272 |
-
reactivite_analysis = df[df['STATUT'].isin(['EN COURS', 'NON PRIS EN CHARGE'])].groupby('DOMAINE').size().sort_values(ascending=False)
|
273 |
-
reactivite_text = "\n".join([f" - {domain}: {count} plaintes non résolues" for domain, count in reactivite_analysis.items()])
|
274 |
-
|
275 |
-
# Mise à jour du prompt global
|
276 |
-
prompt_global = f"""
|
277 |
-
Analyse globale des plaintes pour tous les domaines :
|
278 |
-
Résumé général :
|
279 |
-
- Total des plaintes analysées : {total_plaintes}
|
280 |
-
Répartition des plaintes par domaine :
|
281 |
-
{domain_analyses}
|
282 |
-
Analyse des blocages :
|
283 |
-
Les domaines suivants présentent le plus grand nombre de plaintes en cours, ce qui peut indiquer des blocages dans le travail :
|
284 |
-
{blocages_text}
|
285 |
-
Analyse de la réactivité :
|
286 |
-
Les domaines suivants ont le plus grand nombre de plaintes non résolues (en cours ou non prises en charge), ce qui peut indiquer une moindre réactivité :
|
287 |
-
{reactivite_text}
|
288 |
-
Basé sur ces données :
|
289 |
-
1. Identifiez les 2-3 principaux facteurs qui semblent bloquer le travail le plus, en vous basant sur les domaines avec le plus de plaintes en cours.
|
290 |
-
2. Analysez pourquoi certains domaines semblent moins réactifs que d'autres, en vous basant sur le nombre de plaintes non résolues.
|
291 |
-
3. Proposez 3-4 actions concrètes qui pourraient être mises en place pour :
|
292 |
-
a) Débloquer le travail dans les domaines les plus affectés
|
293 |
-
b) Améliorer la réactivité dans les domaines moins performants
|
294 |
-
4. Expliquez comment ces actions pourraient améliorer globalement la gestion des plaintes et réduire les temps de résolution.
|
295 |
-
5. Recommandez des mesures spécifiques pour suivre et améliorer la performance dans les domaines identifiés comme problématiques.
|
296 |
-
En résumé, présentez une analyse focalisée sur les blocages du travail et la réactivité des différents domaines, avec des recommandations concrètes pour améliorer la situation.
|
297 |
-
"""
|
298 |
-
# Format the prompt with the analyzed data
|
299 |
-
# formatted_prompt = prompt_global.format(
|
300 |
-
# total_plaintes=len(df),
|
301 |
-
# month_most_domains=month_with_most_domains,
|
302 |
-
# dominant_domain=dominant_domain,
|
303 |
-
# domain_analyses=domain_analyses
|
304 |
-
# )
|
305 |
-
|
306 |
-
# Create the request for the API
|
307 |
try:
|
|
|
308 |
completion = client.chat.completions.create(
|
309 |
model="meta/llama-3.1-8b-instruct",
|
310 |
-
messages=[{"role": "user", "content": prompt_global }],
|
311 |
-
temperature=0.2,
|
312 |
-
top_p=0.9,
|
313 |
-
stream=True
|
314 |
)
|
315 |
except Exception as e:
|
316 |
-
return {"error": f"
|
317 |
|
|
|
318 |
generated_text = ""
|
319 |
for chunk in completion:
|
320 |
if chunk.choices[0].delta.content is not None:
|
321 |
generated_text += chunk.choices[0].delta.content
|
322 |
|
|
|
323 |
return {"global_analysis_text": generated_text}
|
324 |
if __name__ == "__main__":
|
325 |
uvicorn.run("app:app",reload=True)
|
|
|
231 |
return {"summary_text_2": generated_text}
|
232 |
@app.post("/analyse_globale/")
|
233 |
async def generate_global_analysis(file: UploadFile = File(...)):
|
234 |
+
# Lire le fichier téléchargé
|
235 |
contents = await file.read()
|
236 |
+
|
237 |
+
# Vérification de la taille du fichier
|
238 |
file_size = len(contents)
|
239 |
+
if file_size > 5_000_000: # Limite de 5 Mo
|
240 |
+
return {"error": "La taille du fichier dépasse la limite de 5 Mo. Le fichier sera échantillonné."}
|
241 |
|
242 |
+
# Lire le fichier CSV téléchargé
|
243 |
try:
|
244 |
df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
|
245 |
except Exception as e:
|
246 |
+
return {"error": f"Erreur lors de la lecture du fichier CSV : {str(e)}"}
|
247 |
|
248 |
+
# Échantillonner les données si elles sont trop grandes
|
249 |
+
if len(df) > 1000: # Ajustez ce nombre selon vos besoins
|
250 |
+
df = df.sample(n=500, random_state=42)
|
251 |
|
252 |
+
# Convertir le DataFrame en chaîne de caractères
|
253 |
+
try:
|
254 |
+
text_to_generate = df.to_string(index=False)
|
255 |
+
except Exception as e:
|
256 |
+
return {"error": f"Erreur lors de la conversion du DataFrame en chaîne : {str(e)}"}
|
257 |
+
|
258 |
+
# S'assurer que le texte généré est dans les limites de taille
|
259 |
+
if len(text_to_generate.encode('utf-8')) > 5_000_000:
|
260 |
+
return {"error": "Le texte généré dépasse la limite de taille même après échantillonnage. Veuillez réduire davantage les données."}
|
261 |
|
262 |
+
# Définir le prompt de l'analyse globale
|
263 |
+
prompt_global = """
|
264 |
+
Analyse globale des plaintes pour tous les domaines :
|
265 |
+
Résumé général :
|
266 |
+
- Total des plaintes : {len(df)}
|
267 |
+
Répartition des plaintes par domaine :
|
268 |
+
{domain_analyses}
|
269 |
+
Problèmes récurrents observés dans tous les domaines :
|
270 |
+
- lister 1 à 2 problèmes les plus fréquents
|
271 |
+
Actions entreprises :
|
272 |
+
- Action 1 : Description de l'action
|
273 |
+
Recommandations pour améliorer la gestion des plaintes :
|
274 |
+
1. [Recommandation 1] : Détails
|
275 |
+
|
276 |
+
En résumé, voici les principales tendances et recommandations pour améliorer la gestion des plaintes et résoudre les problèmes identifiés à travers tous les domaines.
|
277 |
+
---
|
278 |
+
Utilisez ces informations pour améliorer la qualité du service et optimiser la gestion des plaintes.
|
279 |
+
"""
|
280 |
+
|
281 |
+
# Groupement des données par domaine
|
282 |
domain_analyses = ""
|
283 |
for domain, group in df.groupby('DOMAINE'):
|
284 |
domain_summary = group.groupby('STATUT').size().to_dict()
|
|
|
294 |
"""
|
295 |
domain_analyses += domain_analysis
|
296 |
|
297 |
+
# Création de la requête pour l'API (exemple avec un modèle fictif)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
298 |
try:
|
299 |
+
# Remplacez cette partie par la logique spécifique à votre API
|
300 |
completion = client.chat.completions.create(
|
301 |
model="meta/llama-3.1-8b-instruct",
|
302 |
+
messages=[{"role": "user", "content": prompt_global.format(domain_analyses=domain_analyses) + text_to_generate}],
|
303 |
+
temperature=0.2, top_p=0.9, stream=True
|
|
|
|
|
304 |
)
|
305 |
except Exception as e:
|
306 |
+
return {"error": f"Erreur lors de la génération du texte : {str(e)}"}
|
307 |
|
308 |
+
# Récupération du texte généré
|
309 |
generated_text = ""
|
310 |
for chunk in completion:
|
311 |
if chunk.choices[0].delta.content is not None:
|
312 |
generated_text += chunk.choices[0].delta.content
|
313 |
|
314 |
+
# Retour du texte généré
|
315 |
return {"global_analysis_text": generated_text}
|
316 |
if __name__ == "__main__":
|
317 |
uvicorn.run("app:app",reload=True)
|