Spaces:
Runtime error
Runtime error
'fixe'
Browse files- .dockerignore +1 -1
- __pycache__/app.cpython-311.pyc +0 -0
- app.py +291 -62
- app1.py +69 -66
- app3.py +0 -86
- app4.py +0 -12
- models/models--t5-base/.no_exist/a9723ea7f1b39c1eae772870f3b547bf6ef7e6c1/added_tokens.json +0 -0
- requirements.txt +14 -5
.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 |
-
|
2 |
-
|
3 |
from pydantic import BaseModel
|
4 |
import uvicorn
|
5 |
import logging
|
6 |
import torch
|
7 |
-
|
8 |
import os
|
9 |
import numpy as np
|
10 |
-
from
|
11 |
-
import
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 qu
|
50 |
-
Pour m
|
51 |
a) Un titre de la plainte
|
52 |
-
b) Une section avec les Détails de la Plainte contenant l
|
53 |
-
c) Une section avec les états d
|
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 t
|
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 qu
|
62 |
-
5) N
|
63 |
"""
|
64 |
instructions_par_defaut = (
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
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 |
-
#
|
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 |
-
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 |
-
|
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 à
|
29 |
|
30 |
output:
|
31 |
- Text summary : texte resumé
|
32 |
"""
|
33 |
|
34 |
-
app =FastAPI(
|
35 |
title='Text Summary',
|
36 |
-
description
|
37 |
-
)
|
38 |
-
|
|
|
|
|
|
|
39 |
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
|
|
|
|
|
|
|
|
44 |
|
45 |
-
|
|
|
46 |
|
47 |
-
|
|
|
|
|
48 |
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
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 |
-
|
83 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
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
|