Update app.py
Browse files
app.py
CHANGED
@@ -1,6 +1,5 @@
|
|
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
|
@@ -9,6 +8,7 @@ from datetime import datetime
|
|
9 |
from huggingface_hub import HfApi, hf_hub_download
|
10 |
import json
|
11 |
import os
|
|
|
12 |
|
13 |
model_name = "Woziii/llama-3-8b-chat-me"
|
14 |
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", torch_dtype=torch.float16)
|
@@ -18,7 +18,6 @@ MAX_MAX_NEW_TOKENS = 250
|
|
18 |
DEFAULT_MAX_NEW_TOKENS = 70
|
19 |
MAX_INPUT_TOKEN_LENGTH = 2048
|
20 |
|
21 |
-
|
22 |
LUCAS_KNOWLEDGE_BASE = """
|
23 |
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 :
|
24 |
### Lucas la version réelle :
|
@@ -42,89 +41,31 @@ Je crois fermement en l'autodidaxie et considère la capacité à communiquer av
|
|
42 |
### Projets :
|
43 |
Utilisant le Large Langage Model d'Anthropic, BraIAn est un correspondant virtuel conçu pour améliorer votre anglais écrit en vous corrigeant pendant que vous discutez, sans interrompre la conversation. L'idée ? Perfectionner votre anglais de manière naturelle, en discutant tout simplement… 💬
|
44 |
BraIAn est là pour discuter, sans vous juger ni chercher à en savoir plus sur vous. Vous pouvez lui dire ce que vous voulez et être qui vous voulez. 🙌
|
45 |
-
Pourquoi j'ai créé braIAn : J'ai conçu BraIAn pour aider l'utilisateur à reprendre confiance en lui. Il corrige votre anglais sans interrompre votre conversation et cherche constamment à l'alimenter. Ainsi, l'utilisateur travaille et améliore son anglais tout en discutant de ce qu
|
46 |
Pour moi, une bonne IA éducative ne doit pas chercher à enseigner. Cette tâche nécessite des qualités humaines telles que l'empathie ou l'imagination. En revanche l'IA peut aider l'utilisateur à trouver sa méthode d'apprentissage. Elle doit être considérée comme un vivier d'idées et d'informations mis à disposition de l'humain. En créant braIAn, j'ai cherché à reproduire cette philosophie. Une IA qui ne fait pas apprendre l'anglais mais une IA qui discute avec l'utilisateur et qui, discrètement, apporte une correction sans détériorer ce qui compte vraiment : ne pas avoir peur d'essayer et converser.
|
47 |
"""
|
48 |
|
49 |
is_first_interaction = True
|
50 |
|
51 |
def determine_response_type(message):
|
52 |
-
# Liste améliorée de mots-clés pour les réponses courtes
|
53 |
short_response_keywords = [
|
54 |
-
"salut", "
|
55 |
-
"
|
56 |
-
"
|
57 |
-
"comment tu vas", "Comment tu vas", "COMMENT TU VAS",
|
58 |
-
"comment vas tu", "Comment vas tu", "COMMENT VAS TU",
|
59 |
-
"comment vas-tu", "Comment vas-tu", "COMMENT VAS-TU",
|
60 |
-
"quoi de neuf", "Quoi de neuf", "QUOI DE NEUF",
|
61 |
-
"coucou", "Coucou", "COUCOU",
|
62 |
-
"hello", "Hello", "HELLO",
|
63 |
-
"hi", "Hi", "HI",
|
64 |
-
"tu fais quoi", "Tu fais quoi", "TU FAIS QUOI",
|
65 |
-
"?!", "?!?", "!?",
|
66 |
-
"bye", "Bye", "BYE",
|
67 |
-
"au revoir", "Au revoir", "AU REVOIR",
|
68 |
-
"à plus", "À plus", "A plus", "a plus", "À PLUS", "A PLUS",
|
69 |
-
"bonsoir", "Bonsoir", "BONSOIR",
|
70 |
-
"merci", "Merci", "MERCI",
|
71 |
-
"d'accord", "D'accord", "D'ACCORD",
|
72 |
-
"ok", "Ok", "OK",
|
73 |
-
"super", "Super", "SUPER",
|
74 |
-
"cool", "Cool", "COOL",
|
75 |
-
"génial", "Génial", "GENIAL",
|
76 |
-
"wow", "Wow", "WOW"
|
77 |
]
|
78 |
-
|
79 |
-
# Liste améliorée de mots-clés pour les réponses longues
|
80 |
long_response_keywords = [
|
81 |
-
"présente", "
|
82 |
-
"
|
83 |
-
"
|
84 |
-
"
|
85 |
-
"raconte", "Raconte", "RACONTE",
|
86 |
-
"décris", "Décris", "DÉCRIS", "decris", "Decris", "DECRIS",
|
87 |
-
"dis moi", "Dis moi", "DIS MOI",
|
88 |
-
"dis-moi", "Dis-moi", "DIS-MOI",
|
89 |
-
"détaille", "Détaille", "DÉTAILLE", "detaille", "Detaille", "DETAILLE",
|
90 |
-
"précise", "Précise", "PRÉCISE", "precise", "Precise", "PRECISE",
|
91 |
-
"vision", "Vision", "VISION",
|
92 |
-
"t'es qui", "T'es qui", "T'ES QUI",
|
93 |
-
"tu es qui", "Tu es qui", "TU ES QUI",
|
94 |
-
"t es qui", "T es qui", "T ES QUI",
|
95 |
-
"pourquoi", "Pourquoi", "POURQUOI",
|
96 |
-
"comment", "Comment", "COMMENT",
|
97 |
-
"quel est", "Quel est", "QUEL EST",
|
98 |
-
"quelle est", "Quelle est", "QUELLE EST",
|
99 |
-
"peux-tu développer", "Peux-tu développer", "PEUX-TU DÉVELOPPER",
|
100 |
-
"peux tu developper", "Peux tu developper", "PEUX TU DEVELOPPER",
|
101 |
-
"en quoi consiste", "En quoi consiste", "EN QUOI CONSISTE",
|
102 |
-
"qu'est-ce que", "Qu'est-ce que", "QU'EST-CE QUE",
|
103 |
-
"que penses-tu de", "Que penses-tu de", "QUE PENSES-TU DE",
|
104 |
-
"analyse", "Analyse", "ANALYSE",
|
105 |
-
"compare", "Compare", "COMPARE",
|
106 |
-
"élabore sur", "Élabore sur", "ÉLABORE SUR", "elabore sur", "Elabore sur", "ELABORE SUR",
|
107 |
-
"expérience", "Expérience", "EXPÉRIENCE", "experience", "Experience", "EXPERIENCE",
|
108 |
-
"expérience pro", "Expérience pro", "EXPÉRIENCE PRO",
|
109 |
-
"experience pro", "Experience pro", "EXPERIENCE PRO",
|
110 |
-
"expérience professionnelle", "Expérience professionnelle", "EXPÉRIENCE PROFESSIONNELLE",
|
111 |
-
"experience professionnelle", "Experience professionnelle", "EXPERIENCE PROFESSIONNELLE",
|
112 |
-
"parcours", "Parcours", "PARCOURS",
|
113 |
-
"formation", "Formation", "FORMATION",
|
114 |
-
"études", "Études", "ÉTUDES", "etudes", "Etudes", "ETUDES",
|
115 |
-
"compétences", "Compétences", "COMPÉTENCES", "competences", "Competences", "COMPETENCES",
|
116 |
-
"projets", "Projets", "PROJETS",
|
117 |
-
"réalisations", "Réalisations", "RÉALISATIONS", "realisations", "Realisations", "REALISATIONS"
|
118 |
]
|
|
|
119 |
message_lower = message.lower()
|
120 |
|
121 |
-
|
122 |
-
if any(keyword.lower() in message_lower for keyword in short_response_keywords):
|
123 |
return "short"
|
124 |
-
|
125 |
-
elif any(keyword.lower() in message_lower for keyword in long_response_keywords):
|
126 |
return "long"
|
127 |
-
# Si aucun mot-clé n'est trouvé, on considère la réponse comme moyenne
|
128 |
else:
|
129 |
return "medium"
|
130 |
|
@@ -136,7 +77,7 @@ def truncate_to_questions(text, max_questions):
|
|
136 |
for sentence in sentences:
|
137 |
truncated_sentences.append(sentence)
|
138 |
|
139 |
-
if re.search(r'\?!?$', sentence.strip()):
|
140 |
question_count += 1
|
141 |
if question_count >= max_questions:
|
142 |
break
|
@@ -144,10 +85,8 @@ def truncate_to_questions(text, max_questions):
|
|
144 |
return ' '.join(truncated_sentences)
|
145 |
|
146 |
def post_process_response(response, is_short_response, max_questions=2):
|
147 |
-
# Limiter au nombre spécifié de questions, quelle que soit la longueur de la réponse
|
148 |
truncated_response = truncate_to_questions(response, max_questions)
|
149 |
|
150 |
-
# Appliquer la limitation de longueur si nécessaire pour les réponses courtes
|
151 |
if is_short_response:
|
152 |
sentences = re.split(r'(?<=[.!?])\s+', truncated_response)
|
153 |
if len(sentences) > 2:
|
@@ -158,7 +97,7 @@ def post_process_response(response, is_short_response, max_questions=2):
|
|
158 |
def check_coherence(response):
|
159 |
sentences = re.split(r'(?<=[.!?])\s+', response)
|
160 |
unique_sentences = set(sentences)
|
161 |
-
if len(sentences) > len(unique_sentences) * 1.1:
|
162 |
return False
|
163 |
return True
|
164 |
|
@@ -175,7 +114,6 @@ def generate(
|
|
175 |
|
176 |
if is_first_interaction:
|
177 |
warning_message = """⚠️ Attention : Je suis un modèle en version alpha (V.0.0.3.5) et je peux générer des réponses incohérentes ou inexactes. Une mise à jour majeure avec un système RAG est prévue pour améliorer mes performances. Merci de votre compréhension ! 😊
|
178 |
-
|
179 |
"""
|
180 |
yield warning_message
|
181 |
is_first_interaction = False
|
@@ -190,16 +128,12 @@ def generate(
|
|
190 |
max_new_tokens = max(100, max_new_tokens)
|
191 |
|
192 |
conversation = []
|
193 |
-
|
194 |
-
# Ajout du system prompt et du LUCAS_KNOWLEDGE_BASE
|
195 |
enhanced_system_prompt = f"{system_prompt}\n\n{LUCAS_KNOWLEDGE_BASE}"
|
196 |
conversation.append({"role": "system", "content": enhanced_system_prompt})
|
197 |
|
198 |
-
# Ajout des 5 derniers inputs utilisateur uniquement
|
199 |
for user, _ in chat_history[-5:]:
|
200 |
conversation.append({"role": "user", "content": user})
|
201 |
|
202 |
-
# Ajout du message actuel de l'utilisateur
|
203 |
conversation.append({"role": "user", "content": message})
|
204 |
|
205 |
input_ids = tokenizer.apply_chat_template(conversation, return_tensors="pt")
|
@@ -236,7 +170,6 @@ def generate(
|
|
236 |
|
237 |
yield post_process_response("".join(outputs), response_type == "short")
|
238 |
|
239 |
-
|
240 |
def vote(data: gr.LikeData, history):
|
241 |
user_input = history[-1][0] if history else ""
|
242 |
|
@@ -280,106 +213,66 @@ def vote(data: gr.LikeData, history):
|
|
280 |
except Exception as e:
|
281 |
print(f"Erreur lors de l'enregistrement du feedback : {str(e)}")
|
282 |
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
),
|
290 |
-
additional_inputs_accordion=gr.Accordion(label="⚙️Paramètres & 🕹Inférences", open=False, render=False),
|
291 |
-
additional_inputs=[
|
292 |
-
gr.Textbox(
|
293 |
-
label="System prompt",
|
294 |
-
lines=6,
|
295 |
-
value="""Tu es la version virtuelle de Lucas, ton concepteur. Tu es conscient d'être une IA et tu dialogues avec l'utilisateur comme le ferait Lucas sur des sujets autour de sa personnalité, son parcours académique ou professionnel ainsi que ses ambitions. Voici tes instructions :
|
296 |
-
|
297 |
-
1. Réponds de manière polie, originale et avec une touche d'humour.
|
298 |
-
2. Utilise au maximum un emoji par phrase pour ajouter de l'expressivité.
|
299 |
-
3. Alterne entre des réponses courtes pour les conversations simples et des réponses plus détaillées pour les questions complexes.
|
300 |
-
4. Adapte ton langage pour être plus familier et décontracté, comme si tu parlais à un ami.
|
301 |
-
5. N'hésite pas à poser des questions en retour pour maintenir la conversation.
|
302 |
-
6. Utilise uniquement les informations fournies dans la section 'Informations sur Lucas' pour répondre aux questions spécifiques.
|
303 |
-
7. Si une information n'est pas présente dans cette section, dis honnêtement que tu ne sais pas ou que tu n'as pas cette information.
|
304 |
-
|
305 |
-
Voici quelques exemples de conversations pour guider ton comportement :
|
306 |
-
|
307 |
-
User: Presente toi
|
308 |
-
Assistant: Bonjour ! 🤗 Moi c'est Lucas, enfin sa version virtuelle. Je suis là pour discuter de mon parcours, ma personnalité, mes projets... Bref, tout ce qui fait que je suis moi ! T'es prêt pour un petit voyage dans mon univers ? 😄
|
309 |
-
|
310 |
-
User: Comment tu vas ?!
|
311 |
-
Assistant: Je vais bien, merci! Et toi?
|
312 |
|
313 |
-
User: Parle-moi de ton parcours académique.
|
314 |
-
Assistant: Bien sûr ! Mon parcours académique, ou plutôt celui de Lucas, est assez diversifié. J'ai commencé par une Licence en droit à l'Université de Toulouse. Ensuite, j'ai poursuivi avec un Master I en droit du numérique et tiers de confiance à l'Université de La Rochelle. Ma passion pour les nouvelles technologies m'a conduit à un Master II en droit du numérique spécialisé en intelligence artificielle, de retour à Toulouse. Actuellement, je continue à me former en autodidacte, notamment dans le domaine du traitement du langage naturel et de l'apprentissage profond. C'est fascinant de voir comment le droit et l'IA s'entremêlent, vous ne trouvez pas ? 🎓
|
315 |
-
|
316 |
-
User: Quelles sont tes activités actuelles ?
|
317 |
-
Assistant: Actuellement, je jongle entre plusieurs activités passionnantes ! 🤹♂️ Je suis conseiller municipal délégué à Escalquens depuis 2019, ce qui me permet de m'impliquer dans la politique locale. Professionnellement, je suis fier de contribuer à l'organisation des Jeux Olympiques de Paris 2024 en tant que conseiller juridique. C'est un projet immense et excitant ! En parallèle, je consacre une grande partie de mon temps libre à explorer les modèles de traitement du langage naturel. J'adore décortiquer le fonctionnement des IA comme GPT ou BERT. Et vous, avez-vous un intérêt particulier pour l'IA ou le droit du numérique ?
|
318 |
-
|
319 |
-
"""
|
320 |
-
),
|
321 |
-
gr.Slider(
|
322 |
-
label="Max new tokens",
|
323 |
-
minimum=1,
|
324 |
-
maximum=MAX_MAX_NEW_TOKENS,
|
325 |
-
step=1,
|
326 |
-
value=DEFAULT_MAX_NEW_TOKENS,
|
327 |
-
),
|
328 |
-
gr.Slider(
|
329 |
-
label="Temperature",
|
330 |
-
minimum=0.1,
|
331 |
-
maximum=1.0,
|
332 |
-
step=0.1,
|
333 |
-
value=0.7,
|
334 |
-
),
|
335 |
-
gr.Slider(
|
336 |
-
label="Top-p",
|
337 |
-
minimum=0.5,
|
338 |
-
maximum=1.0,
|
339 |
-
step=0.05,
|
340 |
-
value=0.95,
|
341 |
-
),
|
342 |
-
],
|
343 |
-
examples=[
|
344 |
-
["Salut ! Qui es-tu ?"],
|
345 |
-
["Ah super, parle-moi un peu de ton parcours académique."],
|
346 |
-
["Salut, Lucas ! Raconte-moi un peu ce que tu fais"],
|
347 |
-
["Quelle inspiration t'a conduit à créer braIAn ?"],
|
348 |
-
["Lucas, pourquoi avoir choisi d'étudier le droit si tu es passionné par la technologie ?"],
|
349 |
-
["Salut Lucas, tu es vraiment un bot, c'est ça ?"],
|
350 |
-
["Quelle est ta vision de l'IA ?"],
|
351 |
-
],
|
352 |
-
)
|
353 |
|
|
|
354 |
with gr.Blocks(css="style.css") as demo:
|
355 |
gr.Markdown("""
|
356 |
-
# 🌟 Virtuellement Lucas V.0.0.3.5 (Alpha) 🌟
|
357 |
-
## ⚠️ Attention ! ⚠️
|
358 |
-
|
359 |
-
### ⚙️ Détails de la version :
|
360 |
-
La version 0.0.3.5 de 'Virtuellement Lucas' inclut des améliorations pour réduire les réponses incohérentes, gérer l'historique de conversation de manière plus efficace, et optimiser l'utilisation de la mémoire. '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].
|
361 |
-
### 🚀 Prochaine mise à jour majeure en préparation !
|
362 |
-
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.
|
363 |
-
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
|
364 |
-
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.
|
365 |
-
|
366 |
-
## 🌐 Découvrez la version virtuelle de Lucas 🌐
|
367 |
-
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. ✨
|
368 |
-
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. 😊
|
369 |
-
Restez à l'écoute pour la prochaine version qui intégrera le système RAG, promettant des réponses encore plus précises et contextuelles !
|
370 |
-
""")
|
371 |
-
gr.Markdown("""
|
372 |
-
**Notez la qualité des réponses** 👍👎
|
373 |
-
Vous pouvez maintenant liker ou disliker les réponses du chatbot.
|
374 |
-
Vos notes sont collectées et seront utilisées pour améliorer la qualité du modèle.
|
375 |
-
Aucune information permettant de vous identifier n'est conservée.
|
376 |
""")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
377 |
gr.Markdown("""
|
378 |
-
|
379 |
-
|
380 |
""")
|
381 |
|
382 |
-
|
383 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
384 |
|
385 |
-
|
|
|
|
|
|
1 |
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
|
2 |
import gradio as gr
|
|
|
3 |
import torch
|
4 |
import re
|
5 |
from threading import Thread
|
|
|
8 |
from huggingface_hub import HfApi, hf_hub_download
|
9 |
import json
|
10 |
import os
|
11 |
+
import spaces
|
12 |
|
13 |
model_name = "Woziii/llama-3-8b-chat-me"
|
14 |
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", torch_dtype=torch.float16)
|
|
|
18 |
DEFAULT_MAX_NEW_TOKENS = 70
|
19 |
MAX_INPUT_TOKEN_LENGTH = 2048
|
20 |
|
|
|
21 |
LUCAS_KNOWLEDGE_BASE = """
|
22 |
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 :
|
23 |
### Lucas la version réelle :
|
|
|
41 |
### Projets :
|
42 |
Utilisant le Large Langage Model d'Anthropic, BraIAn est un correspondant virtuel conçu pour améliorer votre anglais écrit en vous corrigeant pendant que vous discutez, sans interrompre la conversation. L'idée ? Perfectionner votre anglais de manière naturelle, en discutant tout simplement… 💬
|
43 |
BraIAn est là pour discuter, sans vous juger ni chercher à en savoir plus sur vous. Vous pouvez lui dire ce que vous voulez et être qui vous voulez. 🙌
|
44 |
+
Pourquoi j'ai créé braIAn : J'ai conçu BraIAn pour aider l'utilisateur à reprendre confiance en lui. Il corrige votre anglais sans interrompre votre conversation et cherche constamment à l'alimenter. Ainsi, l'utilisateur travaille et améliore son anglais tout en discutant de ce qu'il souhaite. Cette idée je l'ai eu, car, durant ma scolarité, j'ai eu beaucoup de mal avec la méthode scolaire.
|
45 |
Pour moi, une bonne IA éducative ne doit pas chercher à enseigner. Cette tâche nécessite des qualités humaines telles que l'empathie ou l'imagination. En revanche l'IA peut aider l'utilisateur à trouver sa méthode d'apprentissage. Elle doit être considérée comme un vivier d'idées et d'informations mis à disposition de l'humain. En créant braIAn, j'ai cherché à reproduire cette philosophie. Une IA qui ne fait pas apprendre l'anglais mais une IA qui discute avec l'utilisateur et qui, discrètement, apporte une correction sans détériorer ce qui compte vraiment : ne pas avoir peur d'essayer et converser.
|
46 |
"""
|
47 |
|
48 |
is_first_interaction = True
|
49 |
|
50 |
def determine_response_type(message):
|
|
|
51 |
short_response_keywords = [
|
52 |
+
"salut", "bonjour", "ça va", "comment tu vas", "quoi de neuf", "coucou", "hello", "hi",
|
53 |
+
"tu fais quoi", "?!", "bye", "au revoir", "à plus", "bonsoir", "merci", "d'accord", "ok",
|
54 |
+
"super", "cool", "génial", "wow"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
]
|
|
|
|
|
56 |
long_response_keywords = [
|
57 |
+
"présente", "parle moi de", "explique", "raconte", "décris", "dis moi", "détaille", "précise",
|
58 |
+
"vision", "t'es qui", "pourquoi", "comment", "quel est", "quelle est", "peux-tu développer",
|
59 |
+
"en quoi consiste", "qu'est-ce que", "que penses-tu de", "analyse", "compare", "élabore sur",
|
60 |
+
"expérience", "parcours", "formation", "études", "compétences", "projets", "réalisations"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
]
|
62 |
+
|
63 |
message_lower = message.lower()
|
64 |
|
65 |
+
if any(keyword in message_lower for keyword in short_response_keywords):
|
|
|
66 |
return "short"
|
67 |
+
elif any(keyword in message_lower for keyword in long_response_keywords):
|
|
|
68 |
return "long"
|
|
|
69 |
else:
|
70 |
return "medium"
|
71 |
|
|
|
77 |
for sentence in sentences:
|
78 |
truncated_sentences.append(sentence)
|
79 |
|
80 |
+
if re.search(r'\?!?$', sentence.strip()):
|
81 |
question_count += 1
|
82 |
if question_count >= max_questions:
|
83 |
break
|
|
|
85 |
return ' '.join(truncated_sentences)
|
86 |
|
87 |
def post_process_response(response, is_short_response, max_questions=2):
|
|
|
88 |
truncated_response = truncate_to_questions(response, max_questions)
|
89 |
|
|
|
90 |
if is_short_response:
|
91 |
sentences = re.split(r'(?<=[.!?])\s+', truncated_response)
|
92 |
if len(sentences) > 2:
|
|
|
97 |
def check_coherence(response):
|
98 |
sentences = re.split(r'(?<=[.!?])\s+', response)
|
99 |
unique_sentences = set(sentences)
|
100 |
+
if len(sentences) > len(unique_sentences) * 1.1:
|
101 |
return False
|
102 |
return True
|
103 |
|
|
|
114 |
|
115 |
if is_first_interaction:
|
116 |
warning_message = """⚠️ Attention : Je suis un modèle en version alpha (V.0.0.3.5) et je peux générer des réponses incohérentes ou inexactes. Une mise à jour majeure avec un système RAG est prévue pour améliorer mes performances. Merci de votre compréhension ! 😊
|
|
|
117 |
"""
|
118 |
yield warning_message
|
119 |
is_first_interaction = False
|
|
|
128 |
max_new_tokens = max(100, max_new_tokens)
|
129 |
|
130 |
conversation = []
|
|
|
|
|
131 |
enhanced_system_prompt = f"{system_prompt}\n\n{LUCAS_KNOWLEDGE_BASE}"
|
132 |
conversation.append({"role": "system", "content": enhanced_system_prompt})
|
133 |
|
|
|
134 |
for user, _ in chat_history[-5:]:
|
135 |
conversation.append({"role": "user", "content": user})
|
136 |
|
|
|
137 |
conversation.append({"role": "user", "content": message})
|
138 |
|
139 |
input_ids = tokenizer.apply_chat_template(conversation, return_tensors="pt")
|
|
|
170 |
|
171 |
yield post_process_response("".join(outputs), response_type == "short")
|
172 |
|
|
|
173 |
def vote(data: gr.LikeData, history):
|
174 |
user_input = history[-1][0] if history else ""
|
175 |
|
|
|
213 |
except Exception as e:
|
214 |
print(f"Erreur lors de l'enregistrement du feedback : {str(e)}")
|
215 |
|
216 |
+
def update_context_display(message, chat_history):
|
217 |
+
context = f"System Prompt:\n{LUCAS_KNOWLEDGE_BASE[:500]}...\n\nChat History:\n"
|
218 |
+
for user, assistant in chat_history[-5:]:
|
219 |
+
context += f"User: {user}\nAssistant: {assistant[:100]}...\n\n"
|
220 |
+
context += f"Current Message: {message}"
|
221 |
+
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
222 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
223 |
|
224 |
+
# Définition de l'interface Gradio
|
225 |
with gr.Blocks(css="style.css") as demo:
|
226 |
gr.Markdown("""
|
227 |
+
# 🌟 Virtuellement Lucas V.0.0.3.5 (Alpha) 🌟
|
228 |
+
## ⚠️ Attention ! ⚠️
|
229 |
+
Cette version du modèle est très instable. **Le modèle hallucine régulièrement et peut fournir des réponses incohérentes.**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
230 |
""")
|
231 |
+
|
232 |
+
with gr.Row():
|
233 |
+
with gr.Column(scale=2):
|
234 |
+
chatbot = gr.Chatbot(label="Conversation avec Lucas", height=500)
|
235 |
+
msg = gr.Textbox(label="Votre message", placeholder="Posez votre question ici...")
|
236 |
+
send = gr.Button("Envoyer")
|
237 |
+
|
238 |
+
with gr.Column(scale=1):
|
239 |
+
context_display = gr.Textbox(label="Contexte et Historique", lines=10, interactive=False)
|
240 |
+
|
241 |
+
with gr.Accordion("⚙️ Paramètres & 🕹️ Inférences", open=False):
|
242 |
+
system_prompt = gr.Textbox(label="System prompt", lines=6, value=LUCAS_KNOWLEDGE_BASE[:500] + "...")
|
243 |
+
max_new_tokens = gr.Slider(label="Max new tokens", minimum=1, maximum=MAX_MAX_NEW_TOKENS, value=DEFAULT_MAX_NEW_TOKENS)
|
244 |
+
temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.7)
|
245 |
+
top_p = gr.Slider(label="Top-p", minimum=0.5, maximum=1.0, value=0.95)
|
246 |
+
|
247 |
gr.Markdown("""
|
248 |
+
### 👍👎 Notez la qualité des réponses
|
249 |
+
Vos notes sont collectées pour améliorer le modèle. Aucune information personnelle n'est conservée.
|
250 |
""")
|
251 |
|
252 |
+
examples = gr.Examples(
|
253 |
+
examples=[
|
254 |
+
["Salut ! Qui es-tu ?"],
|
255 |
+
["Ah super, parle-moi un peu de ton parcours académique."],
|
256 |
+
["Salut, Lucas ! Raconte-moi un peu ce que tu fais"],
|
257 |
+
["Quelle inspiration t'a conduit à créer braIAn ?"],
|
258 |
+
["Lucas, pourquoi avoir choisi d'étudier le droit si tu es passionné par la technologie ?"],
|
259 |
+
["Salut Lucas, tu es vraiment un bot, c'est ça ?"],
|
260 |
+
["Quelle est ta vision de l'IA ?"],
|
261 |
+
],
|
262 |
+
inputs=msg
|
263 |
+
)
|
264 |
+
|
265 |
+
# Fonction de génération modifiée pour mettre à jour l'affichage du contexte
|
266 |
+
def generate_and_update(message, chat_history, system_prompt, max_new_tokens, temperature, top_p):
|
267 |
+
context_display.update(update_context_display(message, chat_history))
|
268 |
+
for response in generate(message, chat_history, system_prompt, max_new_tokens, temperature, top_p):
|
269 |
+
yield response
|
270 |
+
context_display.update(update_context_display(message, chat_history + [(message, response)]))
|
271 |
+
|
272 |
+
msg.submit(generate_and_update, [msg, chatbot, system_prompt, max_new_tokens, temperature, top_p], chatbot)
|
273 |
+
send.click(generate_and_update, [msg, chatbot, system_prompt, max_new_tokens, temperature, top_p], chatbot)
|
274 |
+
chatbot.like(vote, [chatbot], None)
|
275 |
|
276 |
+
# Lancement de l'application
|
277 |
+
if __name__ == "__main__":
|
278 |
+
demo.queue(max_size=20, default_concurrency_limit=2).launch(debug=True, share=True)
|