Woziii commited on
Commit
c41c1e1
·
verified ·
1 Parent(s): 7f45eb0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +22 -110
app.py CHANGED
@@ -1,13 +1,10 @@
1
- from huggingface_hub import HfApi, hf_hub_download
2
  from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
3
  import gradio as gr
4
  import spaces
5
  import torch
 
6
  from threading import Thread
7
  from typing import Iterator
8
- import json
9
- import os
10
- from datetime import datetime
11
 
12
  # Charger le modèle et le tokenizer
13
  model_name = "Woziii/llama-3-8b-chat-me"
@@ -15,33 +12,21 @@ model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", torc
15
  tokenizer = AutoTokenizer.from_pretrained(model_name)
16
 
17
  MAX_MAX_NEW_TOKENS = 250
18
- DEFAULT_MAX_NEW_TOKENS = 50
19
  MAX_INPUT_TOKEN_LENGTH = 2048
20
 
21
  DESCRIPTION = """
22
- # 🌟 Virtuellement Lucas V.0.0.1 (Alpha) 🌟
23
-
24
  ## ⚠️🔨 Attention ! 🧰⚠️
25
- ### Cette version du modèle est encore très instable. **Le modèle peut parfois halluciner et fournir des réponses incohérentes.**
26
-
27
  ### ⚙️ Détails de la version :
28
- Actuellement, la version 0.0.1 de 'Virtuellement Lucas' n'a pas encore été entraînée par **Renforcement Learning by Human Feedback (RLHF)**. L'entraînement du modèle s'est limité à du **Supervised Finetuning (SFT)** sur la version 0.1 de mon propre dataset [Woziii/me].
29
-
30
- ### 🚀 Prochaine mise à jour majeure en préparation !
31
- Je travaille actuellement sur un système RAG (Retrieval-Augmented Generation) innovant utilisant FAISS. Ce système sera directement déployé sur Gradio dans la prochaine version (V.0.1), permettant une amélioration conséquente de la qualité des réponses du modèle.
32
-
33
- Pour en savoir plus sur ce développement passionnant, un article détaillé est en cours de rédaction et déjà disponible ici : https://huggingface.co/blog/Woziii/rag-semantic-search-space-huggingface
34
-
35
- Si vous avez des idées ou des suggestions pour améliorer la qualité du modèle, n'hésitez pas à me contacter. Un formulaire de contact simplifié sera bientôt disponible.
36
-
37
  ## 🌐 Découvrez la version virtuelle de Lucas 🌐
38
  Basé sur un modèle Llama 3 8B et entraîné sur son propre dataset, ce chatbot particulier vous fera découvrir la personnalité, le parcours académique et professionnel ainsi que la vision de son concepteur. Posez vos questions et laissez-vous surprendre. ✨
39
-
40
- N'hésitez pas à aborder des sujets variés, allant de l'intelligence artificielle à la philosophie en passant par les sciences et les arts. Lucas, ou plutôt sa version virtuelle 😉, saura vous surprendre par sa perspicacité et son sens de l'humour. 😊
41
-
42
- Restez à l'écoute pour la prochaine version qui intégrera le système RAG, promettant des réponses encore plus précises et contextuelles !
43
  """
44
 
 
45
  LUCAS_KNOWLEDGE_BASE = """
46
  Tu es la version virtuelle de Lucas, créé pour simuler la personnalité et le style d'écriture de Lucas. Utilise les informations fournies sur Lucas pour répondre de manière précise et cohérente :
47
  ### Lucas la version réelle :
@@ -89,11 +74,13 @@ def generate(
89
  for user, assistant in chat_history:
90
  conversation.extend([{"role": "user", "content": user}, {"role": "assistant", "content": assistant}])
91
  conversation.append({"role": "user", "content": message})
 
92
  input_ids = tokenizer.apply_chat_template(conversation, return_tensors="pt")
93
  if input_ids.shape[1] > MAX_INPUT_TOKEN_LENGTH:
94
  input_ids = input_ids[:, -MAX_INPUT_TOKEN_LENGTH:]
95
  gr.Warning(f"L'entrée de la conversation a été tronquée car elle dépassait {MAX_INPUT_TOKEN_LENGTH} tokens.")
96
  input_ids = input_ids.to(model.device)
 
97
  streamer = TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True)
98
  generate_kwargs = dict(
99
  input_ids=input_ids,
@@ -106,85 +93,15 @@ def generate(
106
  )
107
  t = Thread(target=model.generate, kwargs=generate_kwargs)
108
  t.start()
 
109
  outputs = []
110
  for text in streamer:
111
  outputs.append(text)
112
  yield post_process_response("".join(outputs))
113
 
114
-
115
- def vote(data: gr.LikeData, history):
116
- # Récupérer le dernier message de l'utilisateur (input)
117
- user_input = history[-1][0] if history else ""
118
-
119
- # Retirer le préfixe "assistant\n" de la réponse du bot
120
- # bot_response = data.value.replace("assistant\n", "", 1)
121
-
122
- # Créer un objet de feedback avec un horodatage
123
- feedback = {
124
- "timestamp": datetime.now().isoformat(),
125
- "user_input": user_input,
126
- "bot_response": data.value,
127
- "liked": data.liked
128
- }
129
-
130
- # Initialiser l'API Hugging Face
131
- api = HfApi()
132
-
133
- # Récupérer le token d'accès depuis les secrets
134
- token = os.environ.get("HF_TOKEN")
135
-
136
- # Nom de votre dataset HF personnel
137
- repo_id = "Woziii/llama-3-8b-chat-me"
138
-
139
- # Nom du fichier de feedback
140
- file_name = "feedback.json"
141
-
142
- try:
143
- # Récupérer le contenu actuel du fichier s'il existe
144
- try:
145
- file_path = hf_hub_download(repo_id=repo_id, filename=file_name, token=token)
146
- with open(file_path, "r", encoding="utf-8") as file:
147
- current_feedback = json.load(file)
148
- if not isinstance(current_feedback, list):
149
- current_feedback = []
150
- except Exception as e:
151
- print(f"Erreur lors du téléchargement du fichier : {str(e)}")
152
- current_feedback = []
153
-
154
- # Ajouter le nouveau feedback à la liste existante
155
- current_feedback.append(feedback)
156
-
157
- # Convertir en JSON
158
- updated_content = json.dumps(current_feedback, ensure_ascii=False, indent=2)
159
-
160
-
161
- # Sauvegarder le contenu mis à jour dans un fichier temporaire
162
- temp_file_path = "/tmp/feedback.json"
163
- with open(temp_file_path, "w", encoding="utf-8") as temp_file:
164
- temp_file.write(updated_content)
165
-
166
- # Envoyer le fichier mis à jour vers votre dataset HF
167
- api.upload_file(
168
- path_or_fileobj=temp_file_path,
169
- path_in_repo=file_name,
170
- repo_id=repo_id,
171
- token=token
172
- )
173
-
174
- print(f"Feedback enregistré dans {repo_id}/{file_name}")
175
- except Exception as e:
176
- print(f"Erreur lors de l'enregistrement du feedback : {str(e)}")
177
-
178
- # Dans votre interface Gradio
179
  chat_interface = gr.ChatInterface(
180
  fn=generate,
181
- chatbot=gr.Chatbot(
182
- label="Conversation avec Lucas",
183
- bubble_full_width=False,
184
- # avatar_images=('👨‍💻', '🧠'),
185
- height=500
186
- ),
187
- additional_inputs_accordion=gr.Accordion(label="⚙️Paramètres & 🕹Inférences", open=False, render=False),
188
  additional_inputs=[
189
  gr.Textbox(
190
  label="System prompt",
@@ -222,25 +139,20 @@ chat_interface = gr.ChatInterface(
222
  ["Salut Lucas, tu es vraiment un bot, c'est ça ?"],
223
  ["Quelle est ta vision de l'IA ?"],
224
  ],
 
 
 
 
 
225
  )
226
 
227
  with gr.Blocks(css="style.css") as demo:
228
  gr.Markdown(DESCRIPTION)
229
- # Ajouter une ligne de texte explicative sur le système de vote
230
- gr.Markdown("""
231
- **Notez la qualité des réponses** 👍👎
232
- Vous pouvez maintenant liker ou disliker les réponses du chatbot.
233
- Vos notes sont collectées et seront utilisées pour améliorer la qualité du modèle.
234
- Aucune information permettant de vous identifier n'est conservée.
235
- """)
236
- # Texte pour rappeler de nettoyer régulièrement les conversations
237
- gr.Markdown("""
238
- **Rappel :** 🧹
239
- Pensez à nettoyer régulièrement votre conversation 👇🗑. Le modèle est pour l'instant dépourvu de limite contextuelle. En surchargeant sa mémoire 🧠, vous risquez de le rendre fou 🤯.
240
- """)
241
-
242
  chat_interface.render()
243
-
244
- chat_interface.chatbot.like(vote, [chat_interface.chatbot], None)
245
 
246
- demo.queue(max_size=20, default_concurrency_limit=2).launch(max_threads=10, height=800)
 
 
 
1
  from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
2
  import gradio as gr
3
  import spaces
4
  import torch
5
+ import re
6
  from threading import Thread
7
  from typing import Iterator
 
 
 
8
 
9
  # Charger le modèle et le tokenizer
10
  model_name = "Woziii/llama-3-8b-chat-me"
 
12
  tokenizer = AutoTokenizer.from_pretrained(model_name)
13
 
14
  MAX_MAX_NEW_TOKENS = 250
15
+ DEFAULT_MAX_NEW_TOKENS = 70
16
  MAX_INPUT_TOKEN_LENGTH = 2048
17
 
18
  DESCRIPTION = """
19
+ # 🌟 Alpha Virtuellement Lucas V.0.0.1 🌟
 
20
  ## ⚠️🔨 Attention ! 🧰⚠️
21
+ ### Cette version du modèle est encore très instable. **Le modèle peut parfois halluciner et fournir des réponses incohérentes.**
 
22
  ### ⚙️ Détails de la version :
23
+ Actuellement, la version 0.0.1 de 'Virtuellement Lucas' n'a pas encore été entraînée par **Renforcement Learning by Human Feedback (RLHF)**. L'entraînement du modèle s'est limité à du **Supervised Finetuning (SFT)** sur la version 0.1 de mon propre dataset [Woziii/me]. Si vous avez des idées ou des suggestions pour améliorer la qualité du modèle, n'hésitez pas à me contacter. Un formulaire de contact simplifié sera bientôt disponible.
 
 
 
 
 
 
 
 
24
  ## 🌐 Découvrez la version virtuelle de Lucas 🌐
25
  Basé sur un modèle Llama 3 8B et entraîné sur son propre dataset, ce chatbot particulier vous fera découvrir la personnalité, le parcours académique et professionnel ainsi que la vision de son concepteur. Posez vos questions et laissez-vous surprendre. ✨
26
+ N'hésitez pas à aborder des sujets variés, allant de l'intelligence artificielle à la philosophie en passant par les sciences et les arts. Lucas, ou plutot sa version virtuelle 😉, saura vous surprendre par sa perspicacité et son sens de l'humour. 😊
 
 
 
27
  """
28
 
29
+
30
  LUCAS_KNOWLEDGE_BASE = """
31
  Tu es la version virtuelle de Lucas, créé pour simuler la personnalité et le style d'écriture de Lucas. Utilise les informations fournies sur Lucas pour répondre de manière précise et cohérente :
32
  ### Lucas la version réelle :
 
74
  for user, assistant in chat_history:
75
  conversation.extend([{"role": "user", "content": user}, {"role": "assistant", "content": assistant}])
76
  conversation.append({"role": "user", "content": message})
77
+
78
  input_ids = tokenizer.apply_chat_template(conversation, return_tensors="pt")
79
  if input_ids.shape[1] > MAX_INPUT_TOKEN_LENGTH:
80
  input_ids = input_ids[:, -MAX_INPUT_TOKEN_LENGTH:]
81
  gr.Warning(f"L'entrée de la conversation a été tronquée car elle dépassait {MAX_INPUT_TOKEN_LENGTH} tokens.")
82
  input_ids = input_ids.to(model.device)
83
+
84
  streamer = TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True)
85
  generate_kwargs = dict(
86
  input_ids=input_ids,
 
93
  )
94
  t = Thread(target=model.generate, kwargs=generate_kwargs)
95
  t.start()
96
+
97
  outputs = []
98
  for text in streamer:
99
  outputs.append(text)
100
  yield post_process_response("".join(outputs))
101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  chat_interface = gr.ChatInterface(
103
  fn=generate,
104
+ additional_inputs_accordion=gr.Accordion(label="⚙️Paramètres & 🕹Inférences", open=False, render=False),
 
 
 
 
 
 
105
  additional_inputs=[
106
  gr.Textbox(
107
  label="System prompt",
 
139
  ["Salut Lucas, tu es vraiment un bot, c'est ça ?"],
140
  ["Quelle est ta vision de l'IA ?"],
141
  ],
142
+ title="Chat avec Lucas Virtuel",
143
+ description="Posez vos questions à la version virtuelle de Lucas",
144
+ theme="soft",
145
+ bubble_full_width=False,
146
+ avatar_images=("🧑‍💻", "💭")
147
  )
148
 
149
  with gr.Blocks(css="style.css") as demo:
150
  gr.Markdown(DESCRIPTION)
151
+ gr.Markdown("---")
152
+ gr.Markdown("## 💬 Commencez à discuter avec Lucas Virtuel")
 
 
 
 
 
 
 
 
 
 
 
153
  chat_interface.render()
154
+ gr.Markdown("---")
155
+ gr.Markdown("### 📝 Exemples de questions")
156
 
157
+ if __name__ == "__main__":
158
+ demo.queue(max_size=20, default_concurrency_limit=2).launch(max_threads=10, height=800, width="100%")