File size: 16,066 Bytes
3fe712e ce14cca 3fe712e c0eca1f 3fe712e c0eca1f 3fe712e c0eca1f 5ff6e68 c0eca1f 7abca01 c629f00 e88a35b 3fe712e c0eca1f 505ff54 c0eca1f d085759 c0eca1f 003aab4 3fe712e e88a35b 26ca5b0 e88a35b 3fe712e 3dbe404 3fe712e c0eca1f bbf7982 c0eca1f d9695d6 cc46e5a 7949d6d 86abdc3 0c6e16f 9729db3 456d5c0 9729db3 0c6e16f 9729db3 51ec059 0fa1a06 0188838 0fa1a06 0188838 0fa1a06 0188838 0fa1a06 0188838 0fa1a06 e88a35b c0eca1f 7949d6d c0eca1f d9695d6 2668b0e d9695d6 505ff54 d9695d6 9948d06 a659c17 3341d9a b1435f0 0c6e16f b1435f0 0c6e16f a659c17 b1435f0 7cb9d32 a659c17 b1435f0 3341d9a 0fa1a06 3341d9a 0fa1a06 3341d9a 0c6e16f 7cb9d32 3341d9a 7cb9d32 b1435f0 d9695d6 003aab4 7a27e9e f87b7e0 0188838 f87b7e0 0188838 f87b7e0 2bf9b44 f87b7e0 003aab4 57da3c7 c0eca1f 003aab4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 |
#load package
from fastapi import FastAPI,HTTPException,status,UploadFile,File,Query
from pydantic import BaseModel
import uvicorn
import logging
import torch
from transformers import T5Tokenizer, T5ForConditionalGeneration,AutoModelForCausalLM,AutoTokenizer
import os
import numpy as np
from openai import OpenAI
import ollama
import pandas as pd
# from io import StringIO
import io
from fastapi.middleware.cors import CORSMiddleware
# Configurer les répertoires de cache
os.environ['TRANSFORMERS_CACHE'] = '/app/.cache'
os.environ['HF_HOME'] = '/app/.cache'
# Charger le modèle et le tokenizer
# model_name = "models/models--t5-base/snapshots/a9723ea7f1b39c1eae772870f3b547bf6ef7e6c1"
# tokenizer = T5Tokenizer.from_pretrained(model_name)
# model = T5ForConditionalGeneration.from_pretrained(model_name)
# model = AutoModelForCausalLM.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True)
# tokenizer = AutoTokenizer.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True)
prompt_first ="Résumé en 4 ou 5 phrases de la plainte suivante :"
client = OpenAI(
base_url="https://integrate.api.nvidia.com/v1",
# api_key="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"
api_key="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"
)
#Additional information
origins = [
"https://bambadij-summaryt5.hf.space/generate/",
"http://bambadij-summaryt5.hf.space/generate/",
"https://integrate.api.nvidia.com/v1",
"http://localhost:8080",
]
Informations = """
-text : Texte à resumé
output:
- Text summary : texte resumé
"""
app =FastAPI(
title='Text Summary',
description =Informations
)
#class to define the input text
logging.basicConfig(level=logging.INFO)
logger =logging.getLogger(__name__)
default_prompt = """Bonjour,
en tant qu’expert dans la gestion et le traitement de plaintes réseaux chez un opérateur de télécommunications, fais moi un descriptif clair de la situation concernant la plainte dont les informations sont fournies plus bas dans ce message. Ecris la situation en 4 ou 5 phrases claires et concises, fais comme si tu parlais à un humain et rajoutes les informations relatives au Client pour une meilleure connaissance de ce dernier ainsi que des éléments de dates/délais pour être précis sur le traitement de la plainte. N’hésites pas à innover sur le ton à utiliser car n’oublies pas que tu dois faire comme si tu parlais à un humain. Ce ton peut être adapté et ne pas toujours être le même en fonction des cas.
Pour m’éviter de lire tout le détail de la plainte (voir le texte partagé plus bas), essayes de trouver toutes les informations utiles permettant de mieux appréhender la situation, par exemple : si les coordonnées GPS (Lat, Lon) sont disponibles essayes de m'indiquer le lieu où est survenue la plainte même de manière approximative. Essayes également de glaner sur internet toutes les informations pouvant aider à mieux comprendre et traiter la plainte (cela peut inclure des informations des réseaux sociaux, des concurrents, etc.) tout en priorisant dans l’analyse les informations fournies dans le texte plus bas; informations qui ont été renseignées par les experts internes chez l’opérateur de télécommunications en question et qui sont structurées en plusieurs sections :
a) Un titre de la plainte
b) Une section avec les Détails de la Plainte contenant l’objet, le numéro client, l’expéditeur, la date de création, les coordonnées géographiques (lat, lon)
c) Une section avec les états d’avancement incluant les échanges (sous format chat) entre les différents acteurs impliqués dans le traitement de la plainte
d) Une section contenant les éléments relatifs à la qualification de la plainte (type de plainte, origine, domaine, sous-domaine, etc…)
e) Une section avec les fichiers joints à la plainte et autres pièces jointes pour mieux comprendre et trouver une solution à cette plainte en vue de satisfaire le Client
Dans la situation que tu vas me donner (en quelques 4 ou 5 phrases comme si tu t’adresses à un humain), assures toi que les points cruciaux (voire rédhibitoires) ci-dessous sont bien présents :
1) Ecris la situation en 4 ou 5 phrases claires et concises, fais comme si tu parlais à un humain
2) Rajoutes les informations relatives au Client pour être précis sur la connaissance de ce dernier.
3) Rajoutes des éléments de dates (remontée, transfert, prise en charge, résolution, clôture, etc…) ainsi que les délais (par exemple de réponse des différents acteurs ou experts de la chaine de traitement) pour mieux apprécier l'efficacité du traitement de la plainte.
4) Rajoutes à la fin une recommandation importante afin d'éviter le mécontentement du Client par exemple pour éviter qu’une Plainte ne soit clôturée sans solution pour le Client notamment et à titre illustratif seulement dans certains cas pour un Client qui a payé pour un service et ne l'a pas obtenu, On ne peut décemment pas clôturer sa plainte sans solution en lui disant d’être plus vigilant, il faut recommander à l’équipe en charge de la plainte de le rembourser ou de trouver un moyen de donner au Client le service pour lequel il a payé (à défaut de le rembourser).
5) N’hésites pas à innover sur le ton à utiliser car n’oublies pas que tu dois faire comme si tu parlais à un humain. Ce ton peut être adapté et ne pas toujours être le même en fonction des cas.
"""
instructions_par_defaut = (
"Fais moi un résumé détaillé de ce plainte : "
"1. Objet de la plainte. "
"2. Détails incluant le numéro client, le problème et les dates importantes. "
"3. Actions prises et suivis incluant les dates et les personnes impliquées. "
"4. Toute action supplémentaire ou recommandation nécessaire."
)
DEFAULT_PROMPT1 = "Résumez la plainte suivante en 5 phrases concises, en vous concentrant sur les faits principaux ,Rajoutes les informations relatives au Client pour être précis sur la connaissance de ce dernier,Rajoutes des éléments de dates (remontée, transfert, prise en charge, résolution, clôture, etc…) ainsi que les délais (par exemple de réponse des différents acteurs ou experts de la chaine de traitement) pour mieux apprécier l'efficacité du traitement de la plainte,Rajoutes à la fin une recommandation importante afin d'éviter le mécontentement du Client par exemple pour éviter qu’une Plainte ne soit clôturée sans solution pour le Client notamment et à titre illustratif seulement dans certains cas pour un Client qui a payé pour un service,fais comme si tu parlais à un humain et ne l'a pas obtenu,et en évitant toute introduction générique comme la répétiton du prompt : "
prompt1 = """
Tu es un assistant IA chargé d'analyser qualitativement les plaintes clients sur plusieurs domaines, en te concentrant sur une seule semaine. Les données fournies incluent des plaintes clients avec des informations sur le statut, le domaine, et des détails descriptifs. Ton objectif est de fournir une analyse détaillée prenant en compte :
1. La répartition des plaintes par statut (FERMÉ, EN COURS, TRANSFÉRÉ, etc.) dans chaque domaine pour la semaine spécifiée.
2. Le temps moyen de traitement des plaintes par statut durant cette semaine.
3. Les intervenants les plus fréquents dans la résolution des plaintes pour cette semaine.
4. Les actions concrètes menées pour résoudre les plaintes cette semaine.
5. Les problèmes récurrents observés dans les plaintes cette semaine (réception, facturation, réseau, etc.).
6. Des recommandations pour améliorer la gestion des plaintes et résoudre les problèmes identifiés pour cette semaine.
Voici un exemple d'information :
- Domaine : "Domaine général" (par ex. MOBILE, FIXE, etc.).
- Statut : "FERMÉ", "EN COURS", "TRANSFÉRÉ".
- Détails de la plainte : erreurs, problème de service, etc.
- Intervenants : équipes techniques, support client, etc.
- Temps de traitement moyen par statut (uniquement pour la semaine en question).
Génère une analyse qualitative complète pour chaque domaine et statut en prenant en compte ces informations pour une seule semaine.
"""
prompt_month = """
Analyse des plaintes par mois :
**Résumé général du mois :**
- Période : [Mois et Année]
**Répartition des plaintes par domaine :**
- Domaine [Nom du domaine] :
- Total des plaintes : [Nombre total de plaintes]
- Statuts des plaintes :
- En cours : [Nombre]
- Transférées : [Nombre]
- Fermées : [Nombre]
- Non pris en charge : [Nombre]
- Autres statuts : [Nombre]
**Problèmes récurrents observés ce mois-ci :**
- lister 1 à 2 probléme les plus fréquents
**Actions entreprises :**
- lister les actions entrepris
**Recommandations pour améliorer la gestion des plaintes :**
1.faites des recommendations
En résumé, voici les principales tendances et recommandations pour améliorer la gestion des plaintes et résoudre les problèmes identifiés ce mois-ci.
---
Utilisez ces informations pour améliorer la qualité du service et optimiser la gestion des plaintes.
et surtout n'oublie pas tu vas parler comme un être humain
"""
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
class TextSummary(BaseModel):
prompt:str
@app.get("/")
async def home():
return 'STN BIG DATA'
# Fonction pour générer du texte à partir d'une requête
# Modèle pour la requête
class RequestModel(BaseModel):
text: str
@app.post("/generate/")
async def generate_text(request: RequestModel):
completion = client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=[{"role": "user", "content": DEFAULT_PROMPT1 + request.text}],
temperature=0.2,
top_p=0.9,
# max_tokens=1024,
stream=True
)
generated_text = ""
for chunk in completion:
if chunk.choices[0].delta.content is not None:
generated_text += chunk.choices[0].delta.content
return {"summary_text_2": generated_text}
@app.post("/analyse/")
async def generate_text(
period: str = Query(..., description="Choisissez entre 'semaine' ou 'mois'"),
file: UploadFile = File(...)):
# Check file size
contents = await file.read()
file_size = len(contents)
if file_size > 5_000_000: # 5MB limit
return {"error": "File size exceeds the 5MB limit. The file will be sampled."}
# Read the uploaded CSV file
try:
df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
except Exception as e:
return {"error": f"Error reading CSV file: {str(e)}"}
# Sample the data if it's too large
if len(df) > 1000: # Adjust this number based on your needs
df = df.sample(n=100, random_state=42)
# Convert the DataFrame to a string
try:
text_to_generate = df.to_string(index=False)
except Exception as e:
return {"error": f"Error converting DataFrame to string: {str(e)}"}
# Ensure the generated text is within size limits
if len(text_to_generate.encode('utf-8')) > 5_000_000:
return {"error": "Generated text exceeds size limit even after sampling. Please reduce the data further."}
# Define the appropriate prompt based on the period (week or month)
if period == "semaine":
prompt = prompt1
elif period == "mois":
prompt = prompt_month
else:
return {"error": "Invalid period. Choose either 'semaine' or 'mois'."}
# Create the request for the API
try:
completion = client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=[{"role": "user", "content": prompt + text_to_generate}],
temperature=0.2,
top_p=0.9,
stream=True
)
except Exception as e:
return {"error": f"Error generating text: {str(e)}"}
generated_text = ""
for chunk in completion:
if chunk.choices[0].delta.content is not None:
generated_text += chunk.choices[0].delta.content
return {"summary_text_2": generated_text}
@app.post("/analyse_globale/")
async def generate_global_analysis(file: UploadFile = File(...)):
# Check file size
contents = await file.read()
file_size = len(contents)
if file_size > 5_000_000: # 5MB limit
return {"error": "File size exceeds the 5MB limit. The file will be sampled."}
# Read the uploaded CSV file
try:
df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
except Exception as e:
return {"error": f"Error reading CSV file: {str(e)}"}
# Sample the data if it's too large
if len(df) > 1000: # Adjust this number based on your needs
df = df.sample(n=100, random_state=42)
# Convert the DataFrame to a string
try:
text_to_generate = df.to_string(index=False)
except Exception as e:
return {"error": f"Error converting DataFrame to string: {str(e)}"}
# Ensure the generated text is within size limits
if len(text_to_generate.encode('utf-8')) > 5_000_000:
return {"error": "Generated text exceeds size limit even after sampling. Please reduce the data further."}
# Define the global analysis prompt
prompt_global = """
Analyse globale des plaintes pour tous les domaines :
**Résumé général :**
- Total des plaintes : [Nombre total de plaintes]
**Répartition des plaintes par domaine :**
{domain_analyses}
**Problèmes récurrents observés dans tous les domaines :**
- lister 1 à 2 probléme les plus fréquents
**Actions entreprises :**
- Action 1 : Description de l'action
**Recommandations pour améliorer la gestion des plaintes :**
1. **[Recommandation 1]** : Détails
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.
---
Utilisez ces informations pour améliorer la qualité du service et optimiser la gestion des plaintes.
"""
# Group data by domain
domain_analyses = ""
for domain, group in df.groupby('DOMAINE'):
domain_summary = group.groupby('STATUT').size().to_dict()
domain_analysis = f"""
- Domaine "{domain}" :
- Total des plaintes : {len(group)}
- Répartition par statut :
- En cours : {domain_summary.get('EN COURS', 0)}
- Transférées : {domain_summary.get('TRANSFERE', 0)}
- Fermées : {domain_summary.get('FERME', 0)}
- Non pris en charge : {domain_summary.get('NON PRIS EN CHARGE', 0)}
- Autres statuts : {sum(v for k, v in domain_summary.items() if k not in ['EN COURS', 'TRANSFERE', 'FERME', 'NON PRIS EN CHARGE'])}
"""
domain_analyses += domain_analysis
# Create the request for the API
try:
completion = client.chat.completions.create(
model="meta/llama-3.1-8b-instruct",
messages=[{"role": "user", "content": prompt_global.format(domain_analyses=domain_analyses) + text_to_generate}],
temperature=0.2,
top_p=0.9,
stream=True
)
except Exception as e:
return {"error": f"Error generating text: {str(e)}"}
generated_text = ""
for chunk in completion:
if chunk.choices[0].delta.content is not None:
generated_text += chunk.choices[0].delta.content
return {"global_analysis_text": generated_text}
if __name__ == "__main__":
uvicorn.run("app:app",reload=True)
|