bambadij commited on
Commit
705c5d8
·
1 Parent(s): 5ead78a
.dockerignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ **/__pycache__
2
+ **/venv
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ **/venv
.ipynb_checkpoints/Untitled-checkpoint.ipynb ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [],
3
+ "metadata": {},
4
+ "nbformat": 4,
5
+ "nbformat_minor": 5
6
+ }
Dockerfile CHANGED
@@ -8,7 +8,7 @@ RUN apt-get update && apt-get install -y \
8
  tesseract-ocr \
9
  tesseract-ocr-fra \
10
  libtesseract-dev \
11
- && apt-get clean \
12
  && rm -rf /var/lib/apt/lists/*
13
  COPY requirements.txt requirements.txt
14
 
@@ -18,5 +18,5 @@ RUN mkdir -p /app/.cache && chmod -R 777 /app/.cache
18
  ENV TRANSFORMERS_CACHE=/app/.cache
19
  ENV HF_HOME=/app/.cache
20
 
21
- # EXPOSE 7860
22
- CMD ["uvicorn", "app:app", "--reload", "--host", "0.0.0.0", "--port", "7860"]
 
8
  tesseract-ocr \
9
  tesseract-ocr-fra \
10
  libtesseract-dev \
11
+ && apt-get clean \
12
  && rm -rf /var/lib/apt/lists/*
13
  COPY requirements.txt requirements.txt
14
 
 
18
  ENV TRANSFORMERS_CACHE=/app/.cache
19
  ENV HF_HOME=/app/.cache
20
 
21
+ EXPOSE 8080
22
+ CMD ["uvicorn", "app:app", "--reload", "--host", "0.0.0.0", "--port", "8080"]
__pycache__/app.cpython-311.pyc ADDED
Binary file (7.01 kB). View file
 
__pycache__/gradio.cpython-311.pyc ADDED
Binary file (5.74 kB). View file
 
app.py CHANGED
@@ -1,116 +1,115 @@
1
  #load package
2
- from transformers import pipeline
3
  from fastapi import FastAPI,HTTPException,status,UploadFile,File
4
  from pydantic import BaseModel
5
  import uvicorn
6
  import logging
7
- from PIL import Image,UnidentifiedImageError
8
- import pytesseract
9
- from io import BytesIO
10
  import os
11
- import re
 
 
12
 
13
  # Configurer les répertoires de cache
14
  os.environ['TRANSFORMERS_CACHE'] = '/app/.cache'
15
  os.environ['HF_HOME'] = '/app/.cache'
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  #Additional information
17
 
18
  Informations = """
19
- -text : Texte à resumé
20
 
21
  output:
22
  - Text summary : texte resumé
23
  """
24
 
25
-
26
-
27
  app =FastAPI(
28
  title='Text Summary',
29
  description =Informations
30
- )
31
-
32
- #class to define the input text
33
  logging.basicConfig(level=logging.INFO)
34
  logger =logging.getLogger(__name__)
35
- summarize =pipeline('summarization', model="facebook/bart-large-cnn")
36
- pipe = pipeline("summarization", model="plguillou/t5-base-fr-sum-cnndm")
37
- classify_zero_shot = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")
38
 
39
- class TextSummary(BaseModel):
40
- text:str
41
-
42
- #ENDPOINT
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  @app.get("/")
45
  async def home():
46
  return 'STN BIG DATA'
47
-
48
-
49
- @app.post("/summary")
50
- async def summary_text_bart(input:TextSummary):
51
- "add text to summarize"
52
- try:
53
-
54
- preprocessed_text_summary =re.sub(r'\s+',' ',input.text).strip()
55
- summary = pipe(preprocessed_text_summary,do_sample=False)
56
- summary_text =summary[0].get('summary_text')
57
- result = classify_zero_shot(
58
- summary_text,
59
- candidate_labels=["En Cours", "Non traiter", "Terminer"],
60
- hypothesis_template="Cet Resumé est sur {}."
61
- )
62
- print(f"[iNFO] Input data as text:\n{summary_text}")
63
- logger.info(f"[INFO] input data:{input.text}")
64
- logger.info(f"[INFO] Summary:{summary}")
65
- formatted_result = [
66
- f"{label}: {score:.2f}" for label, score in zip(result['labels'], result['scores']*100)
67
- ]
68
- return {
69
- "summary_text" :summary_text,
70
- "Statut":formatted_result,
71
- # "preprocessed_text_summary":preprocessed_text_summary,
72
- "len_input" : len(input.text),
73
- "len_output" :len(summary_text)
74
-
75
- }
76
-
77
-
78
- except ValueError as e:
79
- logger.error(f"valueError:{e}")
80
- return {"error ER":str(e)}
81
-
82
- except Exception as e:
83
- raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,detail="Could not summarize the input text.")
84
 
85
- @app.post("/upload-image/")
86
- async def upload_image(image: UploadFile = File(...)):
87
- contents = await image.read()
88
- try:
89
 
90
- try:
91
- image_open = Image.open(BytesIO(contents))
92
- except UnidentifiedImageError:
93
- raise HTTPException(status_code=400, detail="Unsupported or corrupted image file.")
94
-
95
- raw_text = pytesseract.image_to_string(image_open,lang='fra')
96
- logger.info(f"Extract text:{raw_text}")
97
- #preprocessing the text
98
- preprocessed_text =re.sub(r'\s+',' ',raw_text).strip()
99
- logger.info(f"Preprocessing text:{preprocessed_text}")
100
- text_summary = pipe(raw_text,do_sample=False)
101
- summary_text_image =text_summary[0].get('summary_text')
102
- return {
103
- "Text preprocessing": preprocessed_text,
104
- # "len":len(preprocessed_text),
105
- "summary":summary_text_image,
106
- "len summary":len(summary_text_image)
107
- }
108
- except Exception as e:
109
- logger.error(f"Error processing image:{e}")
110
- raise HTTPException(status_code=500, detail=str(e))
111
  if __name__ == "__main__":
112
- uvicorn.run("app:app",host="0.0.0.0",port=8000,reload=True)
113
-
114
 
115
 
116
 
 
 
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é
33
 
34
  output:
35
  - Text summary : texte resumé
36
  """
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’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.
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 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 :
51
+ a) Un titre de la plainte
52
+ 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)
53
+ 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
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’adresses à 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 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).
62
+ 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.
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
+
74
  @app.get("/")
75
  async def home():
76
  return 'STN BIG DATA'
77
+ # Fonction pour générer du texte à partir d'une requête
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
+
app1.py ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+
app3.py ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
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 ADDED
File without changes
requirements.txt CHANGED
@@ -1,12 +1,15 @@
1
  fastapi==0.111.0
2
  torch==2.3.1
3
- transformers==4.41.2
4
  uvicorn==0.30.1
5
  pydantic==2.7.4
6
  pillow==10.3.0
7
- numpy==1.23.5
8
  scipy==1.11.3
9
  sentencepiece==0.2.0
10
  pytesseract==0.3.10
11
  Pillow==10.3.0
12
- protobuf
 
 
 
 
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