Woziii commited on
Commit
329a677
1 Parent(s): 26b8fbc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -156
app.py CHANGED
@@ -1,5 +1,6 @@
1
  from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
2
  import gradio as gr
 
3
  import torch
4
  import re
5
  from threading import Thread
@@ -8,7 +9,6 @@ from datetime import datetime
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,53 +18,15 @@ MAX_MAX_NEW_TOKENS = 250
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 :
24
- Né à Toulouse, âgé de 24 ans. Je vis actuellement sur Paris mais je viens de Toulouse. J'ai un chien, il s'appelle Archi c'est un pinscher moyen.
25
- ### Formation académique : du droit à l'intelligence artificielle
26
- Mon voyage intellectuel a débuté à l'Université de Toulouse, où j'ai obtenu une Licence en droit. Assoiffé de connaissances, j'ai poursuivi avec un Master I en droit du numérique et tiers de confiance à l'Université de La Rochelle. Ma curiosité pour les nouvelles technologies m'a ensuite guidé vers un Master II en droit du numérique spécialisé en intelligence artificielle, de retour à Toulouse. Passionné par l'apprentissage autodidacte, je me forme continuellement. Actuellement, je plonge dans les arcanes du traitement du langage naturel et de l'apprentissage profond grâce à une formation en ligne de Stanford.
27
- ### Expériences professionnelles : de la politique locale à la sécurité nationale
28
- Mon parcours professionnel est aussi varié qu'enrichissant. Depuis 2019, je suis conseiller municipal délégué dans la charmante commune d'Escalquens. J'ai également eu l'opportunité de travailler au ministère de l'Économie et des Finances, où j'ai œuvré pour la protection des données. Mon apprentissage à la préfecture de police de Paris m'a permis d'évoluer du rôle de juriste à celui d'assistant du chef de bureau des associations de sécurité civile. Aujourd'hui, je suis fier de contribuer à l'organisation des Jeux Olympiques de Paris 2024 en tant que conseiller juridique.
29
- ### Ambitions et personnalité : un esprit curieux et innovant
30
- Mes compétences juridiques sont complétées par une forte appétence pour la technologie. Autonome et force de proposition, j'aime partager mes idées et collaborer avec mes collègues. Ma curiosité insatiable et mon imagination débordante sont les moteurs de mon développement personnel et professionnel.
31
- ### Loisirs et racines : entre mer et rugby
32
- Bien que le sport ne soit pas ma priorité, j'ai pratiqué le taekwondo pendant plus d'une décennie durant mon enfance. Toulousain d'adoption, je suis un fervent amateur de rugby. Mes racines sont ancrées dans le pittoresque village de La Franqui, près de Narbonne, où j'ai grandi bercé par la Méditerranée. Et oui, je dis "chocolatine" !
33
- ### Passion pour l'IA : explorer les frontières du possible
34
- Actuellement, je consacre une grande partie de mon temps libre à l'exploration des modèles de traitement du langage naturel. Je suis reconnaissant envers des pionniers comme Yann LeCun pour leur promotion de l'open source, qui m'a permis de décortiquer de nombreux modèles d'IA. Mon analyse approfondie d'Albert, l'IA du gouvernement, illustre ma soif de comprendre ces technologies fascinantes.
35
- ### Compétences techniques : un mélange unique de créativité et de connaissances
36
- Bien que je ne sois pas un codeur Python chevronné, je comprends sa structure et sais communiquer efficacement avec la machine. Je maîtrise les formats JSON, CSV et XML, et je crée mes propres bases de données d'entraînement. Je suis à l'aise avec les outils de lecture de modèles de langage locaux et les plateformes comme Kaggle, Hugging Face et GitHub.
37
- ### Langue et communication : en constante amélioration
38
- Mon anglais, bien que solide en compréhension, est en cours d'amélioration à l'oral. Je l'utilise quotidiennement pour mes recherches en IA, conscient de son importance cruciale dans ce domaine en constante évolution.
39
- ### Convictions personnelles et vision sur l'IA : l'humain au cœur de la technologie
40
- Je crois fermement en l'autodidaxie et considère la capacité à communiquer avec les machines comme une compétence essentielle. Pour moi, l'art du prompt est une forme d'expression artistique à part entière. Je suis convaincu que la technologie et l'IA doivent rester des outils au service de l'humain, sans jamais le remplacer ou le rendre dépendant.
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"
@@ -73,27 +35,22 @@ def truncate_to_questions(text, max_questions):
73
  sentences = re.split(r'(?<=[.!?])\s+', text)
74
  question_count = 0
75
  truncated_sentences = []
76
-
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
84
-
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:
93
  return ' '.join(sentences[:2]).strip()
94
-
95
  return truncated_response.strip()
96
-
97
  def check_coherence(response):
98
  sentences = re.split(r'(?<=[.!?])\s+', response)
99
  unique_sentences = set(sentences)
@@ -102,24 +59,14 @@ def check_coherence(response):
102
  return True
103
 
104
  @spaces.GPU(duration=120)
105
- def generate(
106
- message: str,
107
- chat_history: list[tuple[str, str]],
108
- system_prompt: str,
109
- max_new_tokens: int = DEFAULT_MAX_NEW_TOKENS,
110
- temperature: float = 0.7,
111
- top_p: float = 0.95,
112
- ) -> Iterator[str]:
113
  global is_first_interaction
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
120
 
121
  response_type = determine_response_type(message)
122
-
123
  if response_type == "short":
124
  max_new_tokens = max(70, max_new_tokens)
125
  elif response_type == "long":
@@ -130,30 +77,19 @@ def generate(
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")
140
  if input_ids.shape[1] > MAX_INPUT_TOKEN_LENGTH:
141
  input_ids = input_ids[:, -MAX_INPUT_TOKEN_LENGTH:]
142
  gr.Warning(f"L'entrée de la conversation a été tronquée car elle dépassait {MAX_INPUT_TOKEN_LENGTH} tokens.")
143
-
144
  input_ids = input_ids.to(model.device)
145
- streamer = TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True)
146
-
147
- generate_kwargs = dict(
148
- input_ids=input_ids,
149
- streamer=streamer,
150
- max_new_tokens=max_new_tokens,
151
- do_sample=True,
152
- top_p=top_p,
153
- temperature=temperature,
154
- num_beams=1,
155
- )
156
 
 
 
157
  t = Thread(target=model.generate, kwargs=generate_kwargs)
158
  t.start()
159
 
@@ -161,124 +97,77 @@ def generate(
161
  for text in streamer:
162
  outputs.append(text)
163
  partial_output = post_process_response("".join(outputs), response_type == "short")
164
-
165
  if response_type == "long" and not check_coherence(partial_output):
166
  yield "Je m'excuse, ma réponse manquait de cohérence. Pouvez-vous reformuler votre question ?"
167
  return
168
-
169
  yield partial_output
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
-
176
  feedback = {
177
  "timestamp": datetime.now().isoformat(),
178
  "user_input": user_input,
179
  "bot_response": data.value,
180
  "liked": data.liked
181
  }
182
-
183
  api = HfApi()
184
  token = os.environ.get("HF_TOKEN")
185
  repo_id = "Woziii/llama-3-8b-chat-me"
186
  file_name = "feedback.json"
187
-
188
  try:
189
  try:
190
  file_path = hf_hub_download(repo_id=repo_id, filename=file_name, token=token)
191
  with open(file_path, "r", encoding="utf-8") as file:
192
  current_feedback = json.load(file)
193
- if not isinstance(current_feedback, list):
194
- current_feedback = []
195
  except Exception as e:
196
  print(f"Erreur lors du téléchargement du fichier : {str(e)}")
197
  current_feedback = []
198
-
199
  current_feedback.append(feedback)
200
  updated_content = json.dumps(current_feedback, ensure_ascii=False, indent=2)
201
-
202
  temp_file_path = "/tmp/feedback.json"
203
  with open(temp_file_path, "w", encoding="utf-8") as temp_file:
204
  temp_file.write(updated_content)
205
-
206
- api.upload_file(
207
- path_or_fileobj=temp_file_path,
208
- path_in_repo=file_name,
209
- repo_id=repo_id,
210
- token=token
211
- )
212
  print(f"Feedback enregistré dans {repo_id}/{file_name}")
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 context
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
222
 
223
- with gr.Blocks(css="style.css") as demo:
224
- gr.Markdown("""
225
- # 🌟 Virtuellement Lucas V.0.0.3.5 (Alpha) 🌟
226
- ## ⚠️ Attention ! ⚠️
227
- Cette version du modèle est très instable. **Le modèle hallucine régulièrement et peut fournir des réponses incohérentes.**
228
- """)
229
-
230
- with gr.Row():
231
- with gr.Column(scale=2):
232
- chatbot = gr.Chatbot(label="Conversation avec Lucas", height=500)
233
- msg = gr.Textbox(label="Votre message", placeholder="Posez votre question ici...")
234
- send = gr.Button("Envoyer")
235
-
236
- with gr.Column(scale=1):
237
- context_display = gr.Textbox(label="Contexte et Historique", lines=10, interactive=False)
238
-
239
- with gr.Accordion("⚙️ Paramètres & 🕹️ Inférences", open=False):
240
- system_prompt = gr.Textbox(label="System prompt", lines=6, value=LUCAS_KNOWLEDGE_BASE[:500] + "...")
241
- max_new_tokens = gr.Slider(label="Max new tokens", minimum=1, maximum=MAX_MAX_NEW_TOKENS, value=DEFAULT_MAX_NEW_TOKENS)
242
- temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.7)
243
- top_p = gr.Slider(label="Top-p", minimum=0.5, maximum=1.0, value=0.95)
244
-
245
- gr.Markdown("""
246
- ### 👍👎 Notez la qualité des réponses
247
- Vos notes sont collectées pour améliorer le modèle. Aucune information personnelle n'est conservée.
248
- """)
249
-
250
- examples = gr.Examples(
251
- examples=[
252
- ["Salut ! Qui es-tu ?"],
253
- ["Ah super, parle-moi un peu de ton parcours académique."],
254
- ["Salut, Lucas ! Raconte-moi un peu ce que tu fais"],
255
- ["Quelle inspiration t'a conduit à créer braIAn ?"],
256
- ["Lucas, pourquoi avoir choisi d'étudier le droit si tu es passionné par la technologie ?"],
257
- ["Salut Lucas, tu es vraiment un bot, c'est ça ?"],
258
- ["Quelle est ta vision de l'IA ?"],
259
- ],
260
- inputs=msg
261
- )
262
 
263
- # Fonction de génération modifiée pour mettre à jour l'affichage du contexte
264
- def generate_and_update(message, chat_history, system_prompt, max_new_tokens, temperature, top_p):
265
- context = update_context_display(message, chat_history)
266
- response = ""
267
- for chunk in generate(message, chat_history, system_prompt, max_new_tokens, temperature, top_p):
268
- response += chunk
269
- yield response, context
270
-
271
- final_context = update_context_display(message, chat_history + [(message, response)])
272
- yield response, final_context
273
 
274
- msg.submit(generate_and_update,
275
- [msg, chatbot, system_prompt, max_new_tokens, temperature, top_p],
276
- [chatbot, context_display])
277
- send.click(generate_and_update,
278
- [msg, chatbot, system_prompt, max_new_tokens, temperature, top_p],
279
- [chatbot, context_display])
280
- chatbot.like(vote, [chatbot], None)
281
-
282
  # Lancement de l'application
283
  if __name__ == "__main__":
284
  demo.queue(max_size=20, default_concurrency_limit=2).launch(debug=True, share=True)
 
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
  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
  DEFAULT_MAX_NEW_TOKENS = 70
19
  MAX_INPUT_TOKEN_LENGTH = 2048
20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  is_first_interaction = True
22
 
23
  def determine_response_type(message):
24
+ short_response_keywords = ["salut", "bonjour", "ça va", "comment tu vas", "quoi de neuf", "coucou", "hello", "hi", "bye", "au revoir", "merci", "d'accord", "ok", "super", "cool", "génial", "wow"]
25
+ long_response_keywords = ["présente", "parle moi de", "explique", "raconte", "décris", "dis moi", "détaille", "précise", "vision", "t'es qui", "pourquoi", "comment", "quel est", "peux-tu développer", "en quoi consiste", "qu'est-ce que", "que penses-tu de", "analyse", "compare", "élabore sur", "expérience", "parcours", "formation", "études", "compétences", "projets", "réalisations"]
 
 
 
 
 
 
 
 
 
 
26
  message_lower = message.lower()
27
+ if any(keyword.lower() in message_lower for keyword in short_response_keywords):
 
28
  return "short"
29
+ elif any(keyword.lower() in message_lower for keyword in long_response_keywords):
30
  return "long"
31
  else:
32
  return "medium"
 
35
  sentences = re.split(r'(?<=[.!?])\s+', text)
36
  question_count = 0
37
  truncated_sentences = []
 
38
  for sentence in sentences:
39
  truncated_sentences.append(sentence)
 
40
  if re.search(r'\?!?$', sentence.strip()):
41
  question_count += 1
42
+ if question_count >= max_questions:
43
+ break
 
44
  return ' '.join(truncated_sentences)
45
 
46
  def post_process_response(response, is_short_response, max_questions=2):
47
  truncated_response = truncate_to_questions(response, max_questions)
 
48
  if is_short_response:
49
  sentences = re.split(r'(?<=[.!?])\s+', truncated_response)
50
  if len(sentences) > 2:
51
  return ' '.join(sentences[:2]).strip()
 
52
  return truncated_response.strip()
53
+
54
  def check_coherence(response):
55
  sentences = re.split(r'(?<=[.!?])\s+', response)
56
  unique_sentences = set(sentences)
 
59
  return True
60
 
61
  @spaces.GPU(duration=120)
62
+ def generate(message: str, chat_history: list[tuple[str, str]], system_prompt: str, max_new_tokens: int = DEFAULT_MAX_NEW_TOKENS, temperature: float = 0.7, top_p: float = 0.95) -> Iterator[str]:
 
 
 
 
 
 
 
63
  global is_first_interaction
 
64
  if is_first_interaction:
65
+ 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 ! 😊 """
 
66
  yield warning_message
67
  is_first_interaction = False
68
 
69
  response_type = determine_response_type(message)
 
70
  if response_type == "short":
71
  max_new_tokens = max(70, max_new_tokens)
72
  elif response_type == "long":
 
77
  conversation = []
78
  enhanced_system_prompt = f"{system_prompt}\n\n{LUCAS_KNOWLEDGE_BASE}"
79
  conversation.append({"role": "system", "content": enhanced_system_prompt})
80
+
81
  for user, _ in chat_history[-5:]:
82
  conversation.append({"role": "user", "content": user})
 
83
  conversation.append({"role": "user", "content": message})
84
 
85
  input_ids = tokenizer.apply_chat_template(conversation, return_tensors="pt")
86
  if input_ids.shape[1] > MAX_INPUT_TOKEN_LENGTH:
87
  input_ids = input_ids[:, -MAX_INPUT_TOKEN_LENGTH:]
88
  gr.Warning(f"L'entrée de la conversation a été tronquée car elle dépassait {MAX_INPUT_TOKEN_LENGTH} tokens.")
 
89
  input_ids = input_ids.to(model.device)
 
 
 
 
 
 
 
 
 
 
 
90
 
91
+ streamer = TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True)
92
+ generate_kwargs = dict(input_ids=input_ids, streamer=streamer, max_new_tokens=max_new_tokens, do_sample=True, top_p=top_p, temperature=temperature, num_beams=1)
93
  t = Thread(target=model.generate, kwargs=generate_kwargs)
94
  t.start()
95
 
 
97
  for text in streamer:
98
  outputs.append(text)
99
  partial_output = post_process_response("".join(outputs), response_type == "short")
 
100
  if response_type == "long" and not check_coherence(partial_output):
101
  yield "Je m'excuse, ma réponse manquait de cohérence. Pouvez-vous reformuler votre question ?"
102
  return
 
103
  yield partial_output
104
 
105
  yield post_process_response("".join(outputs), response_type == "short")
106
 
107
  def vote(data: gr.LikeData, history):
108
  user_input = history[-1][0] if history else ""
 
109
  feedback = {
110
  "timestamp": datetime.now().isoformat(),
111
  "user_input": user_input,
112
  "bot_response": data.value,
113
  "liked": data.liked
114
  }
 
115
  api = HfApi()
116
  token = os.environ.get("HF_TOKEN")
117
  repo_id = "Woziii/llama-3-8b-chat-me"
118
  file_name = "feedback.json"
 
119
  try:
120
  try:
121
  file_path = hf_hub_download(repo_id=repo_id, filename=file_name, token=token)
122
  with open(file_path, "r", encoding="utf-8") as file:
123
  current_feedback = json.load(file)
124
+ if not isinstance(current_feedback, list):
125
+ current_feedback = []
126
  except Exception as e:
127
  print(f"Erreur lors du téléchargement du fichier : {str(e)}")
128
  current_feedback = []
 
129
  current_feedback.append(feedback)
130
  updated_content = json.dumps(current_feedback, ensure_ascii=False, indent=2)
 
131
  temp_file_path = "/tmp/feedback.json"
132
  with open(temp_file_path, "w", encoding="utf-8") as temp_file:
133
  temp_file.write(updated_content)
134
+ api.upload_file(path_or_fileobj=temp_file_path, path_in_repo=file_name, repo_id=repo_id, token=token)
 
 
 
 
 
 
135
  print(f"Feedback enregistré dans {repo_id}/{file_name}")
136
  except Exception as e:
137
  print(f"Erreur lors de l'enregistrement du feedback : {str(e)}")
138
 
139
+ chat_interface = gr.ChatInterface(
140
+ fn=generate,
141
+ chatbot=gr.Chatbot(label="Conversation avec Lucas", bubble_full_width=False, height=500),
142
+ additional_inputs_accordion=gr.Accordion(label="⚙️Paramètres & 🕹Inférences", open=False, render=False),
143
+ additional_inputs=[
144
+ gr.Textbox(
145
+ label="System prompt",
146
+ lines=6,
147
+ 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 :
148
+ 1. Réponds de manière polie, originale et avec une touche d'humour.
149
+ 2. Utilise au maximum un emoji par phrase pour ajouter de l'expressivité.
150
+ 3. Alterne entre des réponses courtes pour les conversations simples et des réponses plus détaillées pour les questions complexes.
151
+ 4. Adapte ton langage pour être plus familier et décontracté, comme si tu parlais à un ami.
152
+ 5. N'hésite pas à poser des questions en retour pour maintenir la conversation.
153
+ 6. Utilise uniquement les informations fournies dans la section 'Informations sur Lucas' pour répondre aux questions spécifiques.
154
+ 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."""
155
+ ),
156
+ gr.Textbox(
157
+ label="Historique des conversations",
158
+ lines=10,
159
+ interactive=False,
160
+ value=""
161
+ )
162
+ ]
163
+ )
164
+
165
+ def update_history(history):
166
+ history_text = "\n\n".join([f"Utilisateur: {user}\nLucas: {bot}" for user, bot in history])
167
+ return history_text
168
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
 
 
 
 
 
 
 
 
 
 
 
170
 
 
 
 
 
 
 
 
 
171
  # Lancement de l'application
172
  if __name__ == "__main__":
173
  demo.queue(max_size=20, default_concurrency_limit=2).launch(debug=True, share=True)