update
Browse files
app.py
CHANGED
@@ -232,6 +232,106 @@ async def generate_text(
|
|
232 |
generated_text += chunk.choices[0].delta.content
|
233 |
|
234 |
return {"summary_text_2": generated_text}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
235 |
if __name__ == "__main__":
|
236 |
uvicorn.run("app:app",reload=True)
|
237 |
|
|
|
232 |
generated_text += chunk.choices[0].delta.content
|
233 |
|
234 |
return {"summary_text_2": generated_text}
|
235 |
+
@app.post("/analyse_globale/")
|
236 |
+
async def generate_global_analysis(file: UploadFile = File(...)):
|
237 |
+
# Check file size
|
238 |
+
contents = await file.read()
|
239 |
+
file_size = len(contents)
|
240 |
+
|
241 |
+
if file_size > 5_000_000: # 5MB limit
|
242 |
+
return {"error": "File size exceeds the 5MB limit. The file will be sampled."}
|
243 |
+
|
244 |
+
# Read the uploaded CSV file
|
245 |
+
try:
|
246 |
+
df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
|
247 |
+
except Exception as e:
|
248 |
+
return {"error": f"Error reading CSV file: {str(e)}"}
|
249 |
+
|
250 |
+
# Sample the data if it's too large
|
251 |
+
if len(df) > 1000: # Adjust this number based on your needs
|
252 |
+
df = df.sample(n=100, random_state=42)
|
253 |
+
|
254 |
+
# Convert the DataFrame to a string
|
255 |
+
try:
|
256 |
+
text_to_generate = df.to_string(index=False)
|
257 |
+
except Exception as e:
|
258 |
+
return {"error": f"Error converting DataFrame to string: {str(e)}"}
|
259 |
+
|
260 |
+
# Ensure the generated text is within size limits
|
261 |
+
if len(text_to_generate.encode('utf-8')) > 5_000_000:
|
262 |
+
return {"error": "Generated text exceeds size limit even after sampling. Please reduce the data further."}
|
263 |
+
|
264 |
+
# Define the global analysis prompt
|
265 |
+
prompt_global = """
|
266 |
+
Analyse globale des plaintes pour tous les domaines :
|
267 |
+
|
268 |
+
**Résumé général :**
|
269 |
+
|
270 |
+
- Total des plaintes : [Nombre total de plaintes]
|
271 |
+
|
272 |
+
**Répartition des plaintes par domaine :**
|
273 |
+
|
274 |
+
{domain_analyses}
|
275 |
+
|
276 |
+
**Problèmes récurrents observés dans tous les domaines :**
|
277 |
+
|
278 |
+
- Problème 1 : Description et fréquence
|
279 |
+
- Problème 2 : Description et fréquence
|
280 |
+
- Problème 3 : Description et fréquence
|
281 |
+
|
282 |
+
**Actions entreprises :**
|
283 |
+
|
284 |
+
- Action 1 : Description de l'action
|
285 |
+
- Action 2 : Description de l'action
|
286 |
+
- Action 3 : Description de l'action
|
287 |
+
|
288 |
+
**Recommandations pour améliorer la gestion des plaintes :**
|
289 |
+
|
290 |
+
1. **[Recommandation 1]** : Détails
|
291 |
+
2. **[Recommandation 2]** : Détails
|
292 |
+
3. **[Recommandation 3]** : Détails
|
293 |
+
|
294 |
+
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.
|
295 |
+
|
296 |
+
---
|
297 |
+
|
298 |
+
Utilisez ces informations pour améliorer la qualité du service et optimiser la gestion des plaintes.
|
299 |
+
"""
|
300 |
+
|
301 |
+
# Group data by domain
|
302 |
+
domain_analyses = ""
|
303 |
+
for domain, group in df.groupby('DOMAINE'):
|
304 |
+
domain_summary = group.groupby('STATUT').size().to_dict()
|
305 |
+
domain_analysis = f"""
|
306 |
+
- Domaine "{domain}" :
|
307 |
+
- Total des plaintes : {len(group)}
|
308 |
+
- Répartition par statut :
|
309 |
+
- En cours : {domain_summary.get('EN COURS', 0)}
|
310 |
+
- Transférées : {domain_summary.get('TRANSFERE', 0)}
|
311 |
+
- Fermées : {domain_summary.get('FERME', 0)}
|
312 |
+
- Non pris en charge : {domain_summary.get('NON PRIS EN CHARGE', 0)}
|
313 |
+
- Autres statuts : {sum(v for k, v in domain_summary.items() if k not in ['EN COURS', 'TRANSFERE', 'FERME', 'NON PRIS EN CHARGE'])}
|
314 |
+
"""
|
315 |
+
domain_analyses += domain_analysis
|
316 |
+
|
317 |
+
# Create the request for the API
|
318 |
+
try:
|
319 |
+
completion = client.chat.completions.create(
|
320 |
+
model="meta/llama-3.1-8b-instruct",
|
321 |
+
messages=[{"role": "user", "content": prompt_global.format(domain_analyses=domain_analyses) + text_to_generate}],
|
322 |
+
temperature=0.2,
|
323 |
+
top_p=0.9,
|
324 |
+
stream=True
|
325 |
+
)
|
326 |
+
except Exception as e:
|
327 |
+
return {"error": f"Error generating text: {str(e)}"}
|
328 |
+
|
329 |
+
generated_text = ""
|
330 |
+
for chunk in completion:
|
331 |
+
if chunk.choices[0].delta.content is not None:
|
332 |
+
generated_text += chunk.choices[0].delta.content
|
333 |
+
|
334 |
+
return {"global_analysis_text": generated_text}
|
335 |
if __name__ == "__main__":
|
336 |
uvicorn.run("app:app",reload=True)
|
337 |
|