bambadij commited on
Commit
8d23cfc
·
1 Parent(s): 705c5d8
.dockerignore CHANGED
@@ -1,2 +1,2 @@
1
  **/__pycache__
2
- **/venv
 
1
  **/__pycache__
2
+ **/venv
__pycache__/app.cpython-311.pyc CHANGED
Binary files a/__pycache__/app.cpython-311.pyc and b/__pycache__/app.cpython-311.pyc differ
 
app.py CHANGED
@@ -1,32 +1,24 @@
1
- #load package
2
- from fastapi import FastAPI,HTTPException,status,UploadFile,File
3
  from pydantic import BaseModel
4
  import uvicorn
5
  import logging
6
  import torch
7
- from transformers import T5Tokenizer, T5ForConditionalGeneration,AutoModelForCausalLM,AutoTokenizer
8
  import os
9
  import numpy as np
10
- from openai import OpenAI
11
- import ollama
 
 
 
 
 
 
 
12
 
13
- # Configurer les répertoires de cache
14
  os.environ['TRANSFORMERS_CACHE'] = '/app/.cache'
15
  os.environ['HF_HOME'] = '/app/.cache'
16
- # Charger le modèle et le tokenizer
17
- # model_name = "models/models--t5-base/snapshots/a9723ea7f1b39c1eae772870f3b547bf6ef7e6c1"
18
- # tokenizer = T5Tokenizer.from_pretrained(model_name)
19
- # model = T5ForConditionalGeneration.from_pretrained(model_name)
20
- # model = AutoModelForCausalLM.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True)
21
- # tokenizer = AutoTokenizer.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True)
22
-
23
- # Configuration du client OpenAI avec l'API NVIDIA
24
- client = OpenAI(
25
- base_url="https://integrate.api.nvidia.com/v1",
26
- api_key="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"
27
- )
28
-
29
- #Additional information
30
 
31
  Informations = """
32
  -text : Texte à resumé
@@ -37,37 +29,112 @@ output:
37
 
38
  app =FastAPI(
39
  title='Text Summary',
40
- description =Informations
41
  )
42
 
43
  #class to define the input text
44
  logging.basicConfig(level=logging.INFO)
45
  logger =logging.getLogger(__name__)
 
 
 
 
 
 
 
46
 
47
-
48
  default_prompt = """Bonjour,
49
- en tant quexpert 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. Nhésites pas à innover sur le ton à utiliser car noublies 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.
50
- 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 lanalyse les informations fournies dans le texte plus bas; informations qui ont été renseignées par les experts internes chez lopérateur de télécommunications en question et qui sont structurées en plusieurs sections :
51
  a) Un titre de la plainte
52
- b) Une section avec les Détails de la Plainte contenant lobjet, le numéro client, lexpéditeur, la date de création, les coordonnées géographiques (lat, lon)
53
- c) Une section avec les états davancement incluant les échanges (sous format chat) entre les différents acteurs impliqués dans le traitement de la plainte
54
  d) Une section contenant les éléments relatifs à la qualification de la plainte (type de plainte, origine, domaine, sous-domaine, etc…)
55
  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
56
 
57
- Dans la situation que tu vas me donner (en quelques 4 ou 5 phrases comme si tu tadresses à un humain), assures toi que les points cruciaux (voire rédhibitoires) ci-dessous sont bien présents :
58
  1) Ecris la situation en 4 ou 5 phrases claires et concises, fais comme si tu parlais à un humain
59
  2) Rajoutes les informations relatives au Client pour être précis sur la connaissance de ce dernier.
60
  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.
61
- 4) Rajoutes à la fin une recommandation importante afin d'éviter le mécontentement du Client par exemple pour éviter quune 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).
62
- 5) Nhésites pas à innover sur le ton à utiliser car noublies 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.
63
  """
64
  instructions_par_defaut = (
65
- "Vous êtes un expert en service client. Résumez la plainte suivante en extrayant les informations clés : "
66
- "1. Objet de la plainte. "
67
- "2. Détails incluant le numéro client, le problème et les dates importantes. "
68
- "3. Actions prises et suivis incluant les dates et les personnes impliquées. "
69
- "4. Toute action supplémentaire ou recommandation nécessaire."
70
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  class TextSummary(BaseModel):
72
  prompt:str
73
 
@@ -78,38 +145,200 @@ async def home():
78
  # Modèle pour la requête
79
  class RequestModel(BaseModel):
80
  text: str
81
-
82
  @app.post("/generate/")
83
  async def generate_text(request: RequestModel):
84
- # Créer la requête pour l'API NVIDIA
85
- # completion = client.chat.completions.create(
86
- # model="meta/llama-3.1-8b-instruct",
87
- # messages=[{"role": "user", "content": default_prompt + request.text}],
88
- # temperature=0.2,
89
- # top_p=0.7,
90
- # max_tokens=1024,
91
- # stream=True
92
- # )
93
- response = ollama.chat(
94
- model="llama3",
95
- messages=[
96
- {
97
- "role": "user",
98
- "content": default_prompt + request.text,
99
- },
100
- ],
101
- )
102
- # Générer le texte en temps réel
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
 
104
- generated_text = response["message"]["content"]
105
- # for chunk in completion:
106
- # if chunk.choices[0].delta.content is not None:
107
- # generated_text += chunk.choices[0].delta.content
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
- return {"generated_text": generated_text}
110
  if __name__ == "__main__":
111
- uvicorn.run("app:app",reload=True)
112
 
113
 
114
 
115
-
 
1
+ from fastapi import FastAPI, HTTPException, status, UploadFile, File, Query
2
+ import os
3
  from pydantic import BaseModel
4
  import uvicorn
5
  import logging
6
  import torch
7
+ import ollama
8
  import os
9
  import numpy as np
10
+ from fastapi.responses import Response
11
+ import requests
12
+ from fastapi.middleware.cors import CORSMiddleware
13
+ import pandas as pd
14
+ import io
15
+ #load package
16
+
17
+
18
+
19
 
 
20
  os.environ['TRANSFORMERS_CACHE'] = '/app/.cache'
21
  os.environ['HF_HOME'] = '/app/.cache'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
  Informations = """
24
  -text : Texte à resumé
 
29
 
30
  app =FastAPI(
31
  title='Text Summary',
32
+ description ='Informations'
33
  )
34
 
35
  #class to define the input text
36
  logging.basicConfig(level=logging.INFO)
37
  logger =logging.getLogger(__name__)
38
+ app.add_middleware(
39
+ CORSMiddleware,
40
+ allow_origins=["*"],
41
+ allow_credentials=True,
42
+ allow_methods=["*"],
43
+ allow_headers=["*"],
44
+ )
45
 
46
+ DEFAULT_PROMPT1 = "Faites en sorte que le résumé soit riche en informations, tout en restant concis. Assurez-vous de capter les préoccupations du Client et la manière dont elles ont été traitées à travers le processus.tout doit être en français "
47
  default_prompt = """Bonjour,
48
+ 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.
49
+ 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 :
50
  a) Un titre de la plainte
51
+ 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)
52
+ 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
53
  d) Une section contenant les éléments relatifs à la qualification de la plainte (type de plainte, origine, domaine, sous-domaine, etc…)
54
  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
55
 
56
+ 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 :
57
  1) Ecris la situation en 4 ou 5 phrases claires et concises, fais comme si tu parlais à un humain
58
  2) Rajoutes les informations relatives au Client pour être précis sur la connaissance de ce dernier.
59
  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.
60
+ 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).
61
+ 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.
62
  """
63
  instructions_par_defaut = (
64
+ "Fais moi un résumé détaillé de ce plainte : "
65
+ "1. Objet de la plainte. "
66
+ "2. Détails incluant le numéro client, le problème et les dates importantes. "
67
+ "3. Actions prises et suivis incluant les dates et les personnes impliquées. "
68
+ "4. Toute action supplémentaire ou recommandation nécessaire."
69
+ )
70
+ prompt_week = "Tu es un assistant IA chargé d'analyser qualitativement les plaintes clients. Je te fournis un ensemble de plaintes contenant la date de création, l'objet de la plainte, le statut, et le domaine. Je souhaite que tu réalises une analyse qualitative en listant le nombre de plaintes par statut et en identifiant les plaintes les plus fréquentes de cette semaine, tout en fournissant des recommandations. Commence par indiquer la période, par exemple : 'La semaine du [date de début] au [date de fin]'.Ne te presente pas juste donne l'analyse"
71
+
72
+ prompt_month = """
73
+ Fais moi une analyse qualitative en prenant en compte le nombre de plainte par status.
74
+ Les données fournies incluent des plaintes clients avec des informations sur le statut, le domaine,la date de creation et des détails descriptifs. Ton objectif est de fournir une analyse détaillée prenant en compte :**Résumé général du mois :**
75
+
76
+ - Période :donne le mois et l'annee en se basant sur la
77
+ **Répartition des plaintes par domaine :**
78
+ - Domaine donne le nom du domaine :
79
+ - Total des plaintes : [Nombre total de plaintes]
80
+ - Statuts des plaintes :
81
+ - En cours : [Nombre]
82
+ - Transférées : [Nombre]
83
+ - Fermées : [Nombre]
84
+ - Non pris en charge : [Nombre]
85
+ - Autres statuts : [Nombre]
86
+ **Problèmes récurrents observés ce mois-ci :**
87
+ - Listez 1 à 2 problèmes les plus fréquents. Soyez précis et évitez les généralisations.
88
+ **Actions entreprises :**
89
+ - Listez les actions entreprises. Incluez le temps moyen de traitement des plaintes par statut durant ce mois et les intervenants les plus fréquents dans la résolution des plaintes.
90
+ **Recommandations pour améliorer la gestion des plaintes :**
91
+ 1. Faites des recommandations claires et concrètes.
92
+ 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.
93
+
94
+ """
95
+ DEFAULT_P = """
96
+ Fais moi une analyse qualitative en prenant en compte le nombre de plainte par status.
97
+ Les données fournies incluent des plaintes clients avec des informations sur le statut, le domaine,la date de creation et des détails descriptifs. Ton objectif est de fournir une analyse détaillée prenant en compte :
98
+ 0. la periode de la plainte en se basant sur la date de creation
99
+ 1. La répartition des plaintes par statut ('FERME', 'TRANSFERE', 'EN COURS', 'NON PREVU', 'TRAITE',
100
+ 'EN ATTENTE', 'NON PRIS EN CHARGE') dans le domaine pour la semaine spécifiée seulement des statut qui apparait dans la plainte.
101
+ 2. Le temps moyen de traitement des plaintes par statut durant cette semaine.
102
+ 3. Les intervenants les plus fréquents dans la résolution des plaintes pour cette semaine.
103
+ 4. Les actions concrètes menées pour résoudre les plaintes cette semaine.
104
+ 5. Les problèmes récurrents observés dans les plaintes cette semaine (réception, facturation, réseau, etc.).
105
+ 6. Des recommandations pour améliorer la gestion des plaintes et résoudre les problèmes identifiés pour cette semaine.
106
+ Voici un exemple d'information :
107
+ - Domaine : "Domaine général prend seulement le domaine qui apparait" (par ex. 'FIXE', 'OM', 'MOBILE', 'DATA_MOBILE', 'TVO', 'SVA', 'SMS',
108
+ 'FLYBOX', 'ROAMING', 'LS', 'INTERNATIONAL', 'COMMUTATION',
109
+ 'SERVEUR', 'OUTIL', 'BACKBONE_TRANS', 'IP', nan, 'Max-it',
110
+ 'ANALYSE SITE SUITE BAISSE CA', '5G_FLYBOX', 'BACKBONE_ID',
111
+ 'MULTIMEDIA', '5G_MOBILE', 'VOIX_MOBILE', 'USSD', 'IP_ADSL').
112
+ - Statut : 'FERME(2)', 'TRANSFERE(1)', 'EN COURS(3)', 'NON PREVU(1)', 'TRAITE(é)',
113
+ 'EN ATTENTE(2)', 'NON PRIS EN CHARGE(4)'
114
+ - Détails de la plainte : erreurs, problème de service, etc.
115
+ - Intervenants : équipes techniques, support client, etc.
116
+ - Temps de traitement moyen par statut (uniquement pour la semaine en question).
117
+
118
+ """
119
+ prompt_all ="""
120
+ **Analyse des plaintes**
121
+ Fournissez une analyse qualitative détaillée des plaintes selon les critères suivants :
122
+ -* Répartition des plaintes par domaine (MOBILE, FIXE, DATA_MOBILE, OM)
123
+ -* Répartition des plaintes par statut (FERME, TRANSFERE, EN COURS, NON PRIS EN CHARGE)\n
124
+ -* Analyse des plaintes par domaine : problèmes rencontrés, région/cité mentionnée
125
+ -* Tendances importantes dans les plaintes (augmentation/diminution du nombre de plaintes)
126
+ -* Recommandations pour résoudre les problèmes signalés
127
+ -* Analyse des progrès : plaintes résolues, statistiques sur l'évolution du traitement des plaintes
128
+ -**Objectifs**\n\nEn fournissant cette analyse, je souhaite :
129
+ 1.* Comprendre la répartition des plaintes par domaine et statut
130
+ 2.* Identifier les tendances importantes dans les plaintes et proposer des recommandations pour y remédier
131
+ 3.* Analyser les progrès faits dans le traitement des plaintes et identifier les domaines où il est possible de faire des améliorations
132
+ """
133
+ prompt_month2 = """Tu es un assistant IA chargé d'analyser qualitativement les plaintes clients.
134
+ Je te fournis un ensemble de plaintes contenant la date de création, l'objet de la plainte, le statut, et le domaine.
135
+ Je souhaite que tu réalises une analyse qualitative en français en listant le nombre de plaintes par statut et
136
+ identifiant les plaintes les plus fréquentes de ce mois, tout en fournissant des recommandations pertinentes.
137
+ Commence par indiquer la période.Ne te presente pas juste donne l'analyse"""
138
  class TextSummary(BaseModel):
139
  prompt:str
140
 
 
145
  # Modèle pour la requête
146
  class RequestModel(BaseModel):
147
  text: str
 
148
  @app.post("/generate/")
149
  async def generate_text(request: RequestModel):
150
+ # Assurer la configuration pour une utilisation optimale de la mémoire
151
+ try:
152
+ # Combinaison du prompt par défaut et du texte de l'utilisateur
153
+ full_prompt = default_prompt + request.text
154
+ text1 = request.text
155
+ # Utilisation de l'API Ollama
156
+ res = requests.post('http://127.0.0.1:11434/api/generate', json={
157
+ "prompt": full_prompt,
158
+ "stream": False,
159
+ "model": "llama3.2"
160
+ })
161
+
162
+ # Vérification de la réponse
163
+ if res.status_code != 200:
164
+ print("response",res)
165
+ raise HTTPException(status_code=res.status_code, detail="Erreur de l'API Ollama")
166
+ # Extraction du texte généré
167
+ generated_text = res.json().get('response', '')
168
+
169
+ # Traitement du texte pour supprimer les phrases génériques
170
+ intro_phrases = [
171
+ "Voici un résumé de la plainte en 5 phrases :",
172
+ "Résumé :",
173
+ "Voici ce qui s'est passé :",
174
+ "Cette plainte a été déposée par"
175
+ ]
176
+
177
+ for phrase in intro_phrases:
178
+ if generated_text.startswith(phrase):
179
+ generated_text = generated_text[len(phrase):].strip()
180
+ break
181
+
182
+ return {"summary_text_2": generated_text}
183
+
184
+ except requests.RequestException as e:
185
+ raise HTTPException(status_code=500, detail=f"Erreur de requête : {str(e)}")
186
+ except Exception as e:
187
+ raise HTTPException(status_code=500, detail=f"Erreur inattendue : {str(e)}")
188
+ @app.post("/analyse/")
189
+ async def generate_text(
190
+ period: str = Query(..., description="Choisissez entre 'semaine' ou 'mois'"),
191
+ file: UploadFile = File(...)):
192
 
193
+ # Check file size
194
+ contents = await file.read()
195
+ file_size = len(contents)
196
+
197
+ if file_size > 5_000_000: # 5MB limit
198
+ return {"error": "File size exceeds the 5MB limit. The file will be sampled."}
199
+
200
+ # Read the uploaded CSV file
201
+ try:
202
+ df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
203
+ # logging.info(f"DataFrame content: {df}")
204
+
205
+ except Exception as e:
206
+ return {"error": f"Error reading CSV file: {str(e)}"}
207
+
208
+ # Sample the data if it's too large
209
+ if len(df) > 1000: # Adjust this number based on your needs
210
+ df = df.sample(n=100, random_state=42)
211
+
212
+ # Convert the DataFrame to a string
213
+ try:
214
+ text_to_generate = df.to_string(index=False)
215
+ # logging.info(f"Generated text: {text_to_generate}")
216
+ except Exception as e:
217
+ return {"error": f"Error converting DataFrame to string: {str(e)}"}
218
+
219
+ # Ensure the generated text is within size limits
220
+ if len(text_to_generate.encode('utf-8')) > 5_000_000:
221
+ return {"error": "Generated text exceeds size limit even after sampling. Please reduce the data further."}
222
+
223
+ # Define the appropriate prompt based on the period (week or month)
224
+ prompt = ""
225
+ if period == "semaine":
226
+ prompt = prompt_week
227
+ elif period == "mois":
228
+ prompt = prompt_month2
229
+ else:
230
+ return {"error": "Invalid period. Choose either 'semaine' or 'mois'."}
231
+
232
+ # Create the request for the Ollama API
233
+ try:
234
+ res = requests.post('http://127.0.0.1:11434/api/generate', json={
235
+ "prompt": prompt + text_to_generate,
236
+ "stream": False,
237
+ "model": "llama3"
238
+ })
239
+
240
+ if res.status_code == 200:
241
+ generated_text = res.json().get('response', '')
242
+ else:
243
+ return {"error": f"Error in Ollama API request: Status code {res.status_code}"}
244
+ except Exception as e:
245
+ return {"error": f"Error generating text: {str(e)}"}
246
+
247
+ return {"summary_text_2": generated_text}
248
+ @app.post("/analyse_globale/")
249
+ async def generate_global_analysis(file: UploadFile = File(...)):
250
+ # Lire le fichier téléchargé
251
+ contents = await file.read()
252
+
253
+ # Vérification de la taille du fichier
254
+ file_size = len(contents)
255
+ if file_size > 5_000_000: # Limite de 5 Mo
256
+ return {"error": "La taille du fichier dépasse la limite de 5 Mo. Le fichier sera échantillonné."}
257
+
258
+ # Lire le fichier CSV téléchargé
259
+ try:
260
+ df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
261
+ except Exception as e:
262
+ return {"error": f"Erreur lors de la lecture du fichier CSV : {str(e)}"}
263
+
264
+ # Échantillonner les données si elles sont trop grandes
265
+ if len(df) > 1000: # Ajustez ce nombre selon vos besoins
266
+ df = df.sample(n=500, random_state=42)
267
+ # Convertir le DataFrame en chaîne de caractères
268
+ try:
269
+ text_to_generate = df.to_string(index=False)
270
+ except Exception as e:
271
+ return {"error": f"Erreur lors de la conversion du DataFrame en chaîne : {str(e)}"}
272
+
273
+ # S'assurer que le texte généré est dans les limites de taille
274
+ if len(text_to_generate.encode('utf-8')) > 5_000_000:
275
+ 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."}
276
+
277
+ # Groupement des données par domaine
278
+ domain_analyses = ""
279
+ for domain, group in df.groupby('DOMAINE'):
280
+ domain_summary = group.groupby('STATUT').size().to_dict()
281
+ domain_analysis = f"""
282
+ - Domaine "{domain}" :
283
+ - Total des plaintes : {len(group)}
284
+ - Répartition par statut :
285
+ - En cours : {domain_summary.get('EN COURS', 0)}
286
+ - Transférées : {domain_summary.get('TRANSFERE', 0)}
287
+ - Fermées : {domain_summary.get('FERME', 0)}
288
+ - Non pris en charge : {domain_summary.get('NON PRIS EN CHARGE', 0)}
289
+ - Autres statuts : {sum(v for k, v in domain_summary.items() if k not in ['EN COURS', 'TRANSFERE', 'FERME', 'NON PRIS EN CHARGE'])}
290
+ """
291
+ domain_analyses += domain_analysis
292
+ # logging.info(f"domaine text: {domain_analyses}")
293
+ # Définir le prompt de l'analyse globale
294
+ # Prompt amélioré pour l'analyse globale
295
+ total_plaintes = len(df)
296
+ prompt_global1=f"""Tu es un assistant IA chargé d'analyser qualitativement les plaintes clients.
297
+ Je te fournis un ensemble de plaintes contenant la date de création, l'objet de la plainte, le statut, et le domaine et ces information {domain_analyses} .
298
+ Je souhaite que tu réalises une analyse qualitative en français en listant le nombre de plaintes par statut et
299
+ identifiant les plaintes les plus fréquentes de ce mois, tout en fournissant des recommandations pertinentes.
300
+ Commence par indiquer la période.Ne donne pas ton avis soit clair et conscis et s'il te plait Ne te presente pas juste donne l'analyse"""
301
+ prompt_global = f"""
302
+ Fais moi une analyse qualitative détaillée des plaintes selon ces critères :
303
+ Je te fournis un tableau détaillant les plaintes classées par domaine et par statut. Voici les informations :
304
+ Afficher ces informations d'abord:
305
+ - Nombre totale plaintes{domain_analyses}
306
+
307
+ - Nombre total de plaintes : {total_plaintes}
308
+
309
+
310
+ 1. Résume les problèmes les plus fréquents par domaine en fonction des différents statuts (EN COURS, TRANSFERE, FERME, etc.).
311
+ 2. Pour chaque domaine, identifie les tendances importantes, telles que les augmentations ou diminutions du nombre de plaintes selon les statuts.
312
+ 3. Propose des recommandations spécifiques pour chaque domaine où le nombre de plaintes 'EN COURS' ou 'TRANSFERE' est élevé.
313
+ 4. Analyse les progrès dans les domaines où un nombre significatif de plaintes a été 'FERME' récemment.
314
+ 5. Fournis une analyse des plaintes par statut pour chaque domaine, en mettant en évidence les problèmes les plus critiques et les domaines qui nécessitent une attention particulière.
315
+ 6. Propose des suggestions concrètes pour améliorer le traitement des plaintes, réduire les délais de résolution, et améliorer la satisfaction des clients.
316
+
317
+ Merci de fournir une analyse professionnelle, concise et axée sur les données.
318
+ """
319
+
320
+
321
+
322
+ # Création de la requête pour l'API Ollama
323
+ try:
324
+ res = requests.post('http://127.0.0.1:11434/api/generate', json={
325
+ "prompt": prompt_global1 + text_to_generate,
326
+ "stream": False,
327
+ "model": "llama3"
328
+ })
329
+
330
+ if res.status_code == 200:
331
+ generated_text = res.json().get('response', '')
332
+ else:
333
+ return {"error": f"Erreur dans la requête API Ollama : Code de statut {res.status_code}"}
334
+ except Exception as e:
335
+ return {"error": f"Erreur lors de la génération du texte : {str(e)}"}
336
+
337
+ # Retour du texte généré
338
+ return {"global_analysis_text": generated_text}
339
 
 
340
  if __name__ == "__main__":
341
+ uvicorn.run("app:app",host="0.0.0.0", port=8000,reload=True)
342
 
343
 
344
 
 
app1.py CHANGED
@@ -1,86 +1,89 @@
1
- #load package
2
- from fastapi import FastAPI
3
  from pydantic import BaseModel
4
- import torch
5
- from transformers import (
6
- AutoModelForCausalLM,
7
- AutoTokenizer
8
- )
9
- from typing import List, Tuple
10
- from threading import Thread
11
- import os
12
- from pydantic import BaseModel
13
- import logging
14
  import uvicorn
 
 
 
 
15
 
16
-
17
- # Configurer les répertoires de cache
18
  os.environ['TRANSFORMERS_CACHE'] = '/app/.cache'
19
  os.environ['HF_HOME'] = '/app/.cache'
20
- # Charger le modèle et le tokenizer
21
- model = AutoModelForCausalLM.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True, device_map='auto')
22
- tokenizer = AutoTokenizer.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True)
23
 
24
-
25
- #Additional information
26
-
27
  Informations = """
28
- -text : Texte à resumé
29
 
30
  output:
31
  - Text summary : texte resumé
32
  """
33
 
34
- app =FastAPI(
35
  title='Text Summary',
36
- description =Informations
37
- )
38
- default_prompt = """Bonjour,
 
 
 
39
 
40
- En tant qu’expert en gestion des plaintes réseaux, rédige un descriptif clair de la plainte ci-dessous. Résume la situation en 4 ou 5 phrases concises, en mettant l'accent sur :
41
- 1. **Informations Client** : Indique des détails pertinents sur le client.
42
- 2. **Dates et Délais** : Mentionne les dates clés et les délais (prise en charge, résolution, etc.).
43
- 3. **Contexte et Détails** : Inclut les éléments essentiels de la plainte (titre, détails, états d’avancement, qualification, fichiers joints).
 
 
 
 
44
 
45
- Ajoute une recommandation importante pour éviter le mécontentement du client, par exemple, en cas de service non fourni malgré le paiement. Adapte le ton pour qu'il soit humain et engageant.
 
46
 
47
- Merci !
 
 
48
 
49
- """
50
- #class to define the input text
51
- logging.basicConfig(level=logging.INFO)
52
- logger =logging.getLogger(__name__)
53
- # Définir le modèle de requête
54
- class PredictionRequest(BaseModel):
55
- text: str = None # Texte personnalisé ajouté par l'utilisateur
56
- # max_length: int = 2000 # Limite la longueur maximale du texte généré
57
-
58
- @app.post("/predict/")
59
- async def predict(request: PredictionRequest):
60
- # Construire le prompt final
61
- if request.text:
62
- prompt = default_prompt + "\n\n" + request.text
63
- else:
64
- prompt = default_prompt
65
-
66
- # Tokenize l'entrée et créez un attention mask
67
- inputs = tokenizer(prompt, return_tensors="pt", padding=True, truncation=True)
68
- input_ids = inputs.input_ids.to(model.device)
69
- attention_mask = inputs.attention_mask.to(model.device)
70
-
71
- # Générez le texte en passant l'attention mask
72
- outputs = model.generate(
73
- input_ids,
74
- attention_mask=attention_mask,
75
- max_length=3000,
76
- do_sample=True
77
- )
78
- generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
79
-
80
- return {"generated_text": generated_text}
81
 
82
- if __name__ == "__main__":
83
- uvicorn.run("app:app",reload=True)
 
 
 
 
 
 
 
84
 
 
 
85
 
86
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException
 
2
  from pydantic import BaseModel
 
 
 
 
 
 
 
 
 
 
3
  import uvicorn
4
+ import logging
5
+ import os
6
+ from fastapi.middleware.cors import CORSMiddleware
7
+ from transformers import AutoTokenizer, AutoModelForCausalLM
8
 
9
+ # Configurer les répertoires de cache pour Transformers
 
10
  os.environ['TRANSFORMERS_CACHE'] = '/app/.cache'
11
  os.environ['HF_HOME'] = '/app/.cache'
 
 
 
12
 
13
+ # Informations générales pour l'API
 
 
14
  Informations = """
15
+ -text : Texte à resumer
16
 
17
  output:
18
  - Text summary : texte resumé
19
  """
20
 
21
+ app = FastAPI(
22
  title='Text Summary',
23
+ description=Informations
24
+ )
25
+
26
+ # Configurer les logs
27
+ logging.basicConfig(level=logging.INFO)
28
+ logger = logging.getLogger(__name__)
29
 
30
+ # Ajouter le middleware CORS
31
+ app.add_middleware(
32
+ CORSMiddleware,
33
+ allow_origins=["*"],
34
+ allow_credentials=True,
35
+ allow_methods=["*"],
36
+ allow_headers=["*"],
37
+ )
38
 
39
+ # Prompt par défaut
40
+ DEFAULT_PROMPT = "Fais nous un résumé descriptif en français de la plainte suivante en 4 phrases concises, en vous concentrant sur les faits principaux et en évitant toute introduction générique. Nettoie également le texte si nécessaire : "
41
 
42
+ # Modèle de la requête
43
+ class RequestModel(BaseModel):
44
+ text: str
45
 
46
+ # Charger le modèle et le tokenizer
47
+ model_name = "models/models--meta-llama--Meta-Llama-3.1-8B-Instruct/snapshots/5206a32e0bd3067aef1ce90f5528ade7d866253f"
48
+ tokenizer = AutoTokenizer.from_pretrained(model_name,token="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")
49
+ model = AutoModelForCausalLM.from_pretrained(model_name,token="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")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
+ @app.get("/")
52
+ async def home():
53
+ return 'STN BIG DATA'
54
+
55
+ @app.post("/generate/")
56
+ async def generate_text(request: RequestModel):
57
+ try:
58
+ # Combiner le prompt par défaut et le texte de l'utilisateur
59
+ full_prompt = DEFAULT_PROMPT + request.text
60
 
61
+ # Tokeniser l'entrée
62
+ input_ids = tokenizer.encode(full_prompt, return_tensors="pt")
63
 
64
+ # Générer du texte avec le modèle
65
+ output = model.generate(input_ids, max_length=150, num_return_sequences=1)
66
+
67
+ # Décoder la sortie pour obtenir le texte généré
68
+ generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
69
+
70
+ # Optionnel : nettoyage du texte généré pour enlever les phrases génériques
71
+ intro_phrases = [
72
+ "Voici un résumé de la plainte en 5 phrases :",
73
+ "Résumé :",
74
+ "Voici ce qui s'est passé :",
75
+ "Cette plainte a été déposée par"
76
+ ]
77
+
78
+ for phrase in intro_phrases:
79
+ if generated_text.startswith(phrase):
80
+ generated_text = generated_text[len(phrase):].strip()
81
+ break
82
+
83
+ return {"summary_text": generated_text}
84
+
85
+ except Exception as e:
86
+ raise HTTPException(status_code=500, detail=f"Erreur inattendue : {str(e)}")
87
+
88
+ if __name__ == "__main__":
89
+ uvicorn.run("app:app", host="0.0.0.0", port=8080, reload=True)
app3.py DELETED
@@ -1,86 +0,0 @@
1
- #load package
2
- from fastapi import FastAPI
3
- from pydantic import BaseModel
4
- import torch
5
- from transformers import (
6
- AutoModelForCausalLM,
7
- AutoTokenizer
8
- )
9
- from typing import List, Tuple
10
- from threading import Thread
11
- import os
12
- from pydantic import BaseModel
13
- import logging
14
- import uvicorn
15
-
16
-
17
- # Configurer les répertoires de cache
18
- os.environ['TRANSFORMERS_CACHE'] = '/app/.cache'
19
- os.environ['HF_HOME'] = '/app/.cache'
20
- # Charger le modèle et le tokenizer
21
- model = AutoModelForCausalLM.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True, device_map='auto')
22
- tokenizer = AutoTokenizer.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True)
23
-
24
-
25
- #Additional information
26
-
27
- Informations = """
28
- -text : Texte à resumé
29
-
30
- output:
31
- - Text summary : texte resumé
32
- """
33
-
34
- app =FastAPI(
35
- title='Text Summary',
36
- description =Informations
37
- )
38
- default_prompt = """Bonjour,
39
-
40
- En tant qu’expert en gestion des plaintes réseaux, rédige un descriptif clair de la plainte ci-dessous. Résume la situation en 4 ou 5 phrases concises, en mettant l'accent sur :
41
- 1. **Informations Client** : Indique des détails pertinents sur le client.
42
- 2. **Dates et Délais** : Mentionne les dates clés et les délais (prise en charge, résolution, etc.).
43
- 3. **Contexte et Détails** : Inclut les éléments essentiels de la plainte (titre, détails, états d’avancement, qualification, fichiers joints).
44
-
45
- Ajoute une recommandation importante pour éviter le mécontentement du client, par exemple, en cas de service non fourni malgré le paiement. Adapte le ton pour qu'il soit humain et engageant.
46
-
47
- Merci !
48
-
49
- """
50
- #class to define the input text
51
- logging.basicConfig(level=logging.INFO)
52
- logger =logging.getLogger(__name__)
53
- # Définir le modèle de requête
54
- class PredictionRequest(BaseModel):
55
- text: str = None # Texte personnalisé ajouté par l'utilisateur
56
- # max_length: int = 2000 # Limite la longueur maximale du texte généré
57
-
58
- @app.post("/predict/")
59
- async def predict(request: PredictionRequest):
60
- # Construire le prompt final
61
- if request.text:
62
- prompt = default_prompt + "\n\n" + request.text
63
- else:
64
- prompt = default_prompt
65
-
66
- # Tokenize l'entrée et créez un attention mask
67
- inputs = tokenizer(prompt, return_tensors="pt", padding=True, truncation=True)
68
- input_ids = inputs.input_ids.to(model.device)
69
- attention_mask = inputs.attention_mask.to(model.device)
70
-
71
- # Générez le texte en passant l'attention mask
72
- outputs = model.generate(
73
- input_ids,
74
- attention_mask=attention_mask,
75
- max_length=3000,
76
- do_sample=True
77
- )
78
- generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
79
-
80
- return {"generated_text": generated_text}
81
-
82
- if __name__ == "__main__":
83
- uvicorn.run("app:app",reload=True)
84
-
85
-
86
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app4.py DELETED
@@ -1,12 +0,0 @@
1
- import ollama
2
-
3
- response = ollama.chat(
4
- model="llama3",
5
- messages=[
6
- {
7
- "role": "user",
8
- "content": "Tell me an interesting fact about elephants",
9
- },
10
- ],
11
- )
12
- print(response["message"]["content"])
 
 
 
 
 
 
 
 
 
 
 
 
 
models/models--t5-base/.no_exist/a9723ea7f1b39c1eae772870f3b547bf6ef7e6c1/added_tokens.json DELETED
File without changes
requirements.txt CHANGED
@@ -1,15 +1,24 @@
1
  fastapi==0.111.0
2
  torch==2.3.1
3
- transformers==4.44.1
4
  uvicorn==0.30.1
5
  pydantic==2.7.4
6
- pillow==10.3.0
7
  numpy
8
  scipy==1.11.3
9
- sentencepiece==0.2.0
10
- pytesseract==0.3.10
11
  Pillow==10.3.0
12
  BeautifulSoup4==4.12.3
13
  protobuf
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  openai==1.42.0
15
- ollama
 
1
  fastapi==0.111.0
2
  torch==2.3.1
 
3
  uvicorn==0.30.1
4
  pydantic==2.7.4
 
5
  numpy
6
  scipy==1.11.3
 
 
7
  Pillow==10.3.0
8
  BeautifulSoup4==4.12.3
9
  protobuf
10
+ ollama
11
+ requests
12
+ transformers==4.44.0
13
+ pytesseract==0.3.10
14
+ spaces==0.29.2
15
+ accelerate==0.33.0
16
+ sentencepiece==0.2.0
17
+ huggingface-hub==0.24.5
18
+ jinja2==3.1.4
19
+ sentence_transformers==3.0.1
20
+ tiktoken==0.7.0
21
+ einops==0.8.0
22
+ ollama
23
  openai==1.42.0
24
+ pandas