File size: 22,468 Bytes
7e3785f
8c909fd
be49c96
 
c41c1e1
4fb2493
 
 
 
dc833e7
be49c96
7d16437
9071cba
 
4fb2493
348a30c
be49c96
e3b2117
7fcbb58
8f4bc35
bd96459
d94050c
be49c96
8c909fd
be49c96
ad680b4
 
 
be49c96
9071cba
d7b625a
9071cba
be49c96
 
d7b625a
be49c96
 
 
 
 
 
 
 
 
e5d6aa2
 
 
 
 
43bccc3
a10b2e1
 
 
d7b625a
83610fd
 
be49c96
8c909fd
9071cba
 
7fcbb58
9071cba
504933b
eebc241
504933b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
082c8ab
504933b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9071cba
b8101e3
502dc85
 
 
 
 
 
 
 
9071cba
502dc85
9071cba
 
502dc85
9071cba
f2a4692
 
 
 
5fda320
f2a4692
 
5fda320
f2a4692
 
5fda320
 
 
f2a4692
504933b
9b74384
5fda320
b59dc9b
5fda320
 
9071cba
e3b2117
 
 
5fda320
e3b2117
f2a4692
9071cba
 
 
dcf086f
9071cba
 
95e9a91
859bce8
 
 
 
 
e3b2117
5fda320
 
 
 
 
 
 
 
9071cba
 
859bce8
7fcbb58
9071cba
5fda320
 
 
9071cba
 
b56431e
d94050c
5fda320
d94050c
 
 
fefeec5
d94050c
fefeec5
e3b2117
d94050c
5fda320
 
7e3785f
d94050c
7e3785f
 
 
d94050c
7e3785f
 
 
5fda320
d94050c
8ebcf37
d94050c
b47bcce
d94050c
 
b47bcce
5fda320
 
d94050c
b47bcce
d94050c
5fda320
d94050c
 
b47bcce
d94050c
 
 
 
 
 
859bce8
 
d94050c
5fda320
d94050c
 
9e599de
859bce8
d94050c
 
 
859bce8
 
5fda320
859bce8
d94050c
 
5fda320
859bce8
739fc5a
859bce8
 
 
 
 
 
 
77de163
b56431e
7c48f46
 
5fda320
7c48f46
 
 
 
 
 
5fda320
7c48f46
 
 
 
5fda320
7c48f46
 
 
 
 
 
 
 
 
 
5fda320
7c48f46
 
5fda320
7c48f46
 
 
5fda320
7c48f46
 
 
 
 
 
 
 
 
77de163
dc833e7
859bce8
7c48f46
be49c96
 
7c48f46
 
 
9071cba
1b2f0da
7c48f46
8c909fd
be49c96
 
 
eb601ce
ad680b4
eb601ce
 
ad680b4
7e3785f
 
ad680b4
 
83610fd
ad680b4
 
eb601ce
7e3785f
9b74384
ad680b4
9071cba
be49c96
 
 
 
 
 
 
 
8c909fd
be49c96
8c909fd
 
be49c96
 
 
 
 
 
 
8c909fd
be49c96
8c909fd
be49c96
 
 
 
 
 
 
 
7d16437
 
23554c2
7d16437
0b3a50c
8c909fd
 
238d74e
c96b789
c95e870
 
e3e79b9
 
00e4c4e
e3e79b9
00e4c4e
e3e79b9
 
c95e870
c96b789
181c438
 
e3e79b9
7c48f46
 
e3e79b9
 
7c48f46
 
f45a88d
d6d882e
 
7c48f46
 
be49c96
26ffcb4
238d74e
 
9ceb40a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
# -*- coding: utf-8 -*-
import gradio as gr
import spaces
import torch
import re
import json
import os
import time
import threading
import multiprocessing
from threading import Thread
from typing import Iterator
from datetime import datetime
from huggingface_hub import HfApi, hf_hub_download
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
model_name = "Woziii/llama-3-8b-chat-me"
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained(model_name)

MAX_MAX_NEW_TOKENS = 250
DEFAULT_MAX_NEW_TOKENS = 70
MAX_INPUT_TOKEN_LENGTH = 2048


LUCAS_KNOWLEDGE_BASE = """

# Informations sur ton concepteur :
Lucas Maurici 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.
### Formation académique : du droit à l'intelligence artificielle
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.
### Expériences professionnelles : 
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.
### Ambitions et personnalité : un esprit curieux et innovant
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.
### Loisirs et racines : 
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" !
### Passion pour l'IA : explorer les frontières du possible
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.
### Compétences techniques : un mélange unique de créativité et de connaissances
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.
### Langue et communication : en constante amélioration
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.
### Convictions personnelles et vision sur l'IA : l'humain au cœur de la technologie
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.
### Projets :
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… 💬
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. 🙌
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.
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.

Contacter Lucas :
- Téléphone 📱 : 0659965152
- Mail ✉️ : [email protected]
- linkedin de Lucas : https://www.linkedin.com/in/lucas-maurici-8a6a311a5/
- Lien portfolio de Lucas: www.lucasmaurici.com
- Page huggingface 🤗 de Lucas: https://huggingface.co/Woziii
"""

is_first_interaction = True

  
def determine_response_type(message):
# Liste améliorée de mots-clés pour les réponses courtes
    short_response_keywords = [
        "salut", "Salut", "SALUT",
        "bonjour", "Bonjour", "BONJOUR",
        "ça va", "ca va", "Ça va", "Ca va", "ÇA VA", "CA VA",
        "comment tu vas", "Comment tu vas", "COMMENT TU VAS",
        "comment vas tu", "Comment vas tu", "COMMENT VAS TU",
        "comment vas-tu", "Comment vas-tu", "COMMENT VAS-TU",
        "quoi de neuf", "Quoi de neuf", "QUOI DE NEUF",
        "coucou", "Coucou", "COUCOU",
        "hello", "Hello", "HELLO",
        "hi", "Hi", "HI",
        "tu fais quoi", "Tu fais quoi", "TU FAIS QUOI",
        "?!", "?!?", "!?",
        "bye", "Bye", "BYE",
        "au revoir", "Au revoir", "AU REVOIR",
        "à plus", "À plus", "A plus", "a plus", "À PLUS", "A PLUS",
        "bonsoir", "Bonsoir", "BONSOIR",
        "merci", "Merci", "MERCI",
        "d'accord", "D'accord", "D'ACCORD",
        "ok", "Ok", "OK",
        "super", "Super", "SUPER",
        "cool", "Cool", "COOL",
        "génial", "Génial", "GENIAL",
        "wow", "Wow", "WOW", "et toi ", "ET TOI", "Et toi"
    ]

    # Liste améliorée de mots-clés pour les réponses longues
    long_response_keywords = [
        "présente", "Présente", "PRÉSENTE", "presente", "Presente", "PRESENTE",
        "parle moi de", "Parle moi de", "PARLE MOI DE",
        "parle-moi de", "Parle-moi de", "PARLE-MOI DE",
        "explique", "Explique", "EXPLIQUE",
        "raconte", "Raconte", "RACONTE",
        "décris", "Décris", "DÉCRIS", "decris", "Decris", "DECRIS",
        "dis moi", "Dis moi", "DIS MOI",
        "dis-moi", "Dis-moi", "DIS-MOI",
        "détaille", "Détaille", "DÉTAILLE", "detaille", "Detaille", "DETAILLE",
        "précise", "Précise", "PRÉCISE", "precise", "Precise", "PRECISE",
        "vision", "Vision", "VISION",
        "t'es qui", "T'es qui", "T'ES QUI",
        "tu es qui", "Tu es qui", "TU ES QUI",
        "t es qui", "T es qui", "T ES QUI",
        "pourquoi", "Pourquoi", "POURQUOI",
        "comment", "Comment", "COMMENT",
        "quel est", "Quel est", "QUEL EST",
        "quelle est", "Quelle est", "QUELLE EST",
        "peux-tu développer", "Peux-tu développer", "PEUX-TU DÉVELOPPER",
        "peux tu developper", "Peux tu developper", "PEUX TU DEVELOPPER",
        "en quoi consiste", "En quoi consiste", "EN QUOI CONSISTE",
        "qu'est-ce que", "Qu'est-ce que", "QU'EST-CE QUE",
        "que penses-tu de", "Que penses-tu de", "QUE PENSES-TU DE",
        "analyse", "Analyse", "ANALYSE",
        "compare", "Compare", "COMPARE",
        "élabore sur", "Élabore sur", "ÉLABORE SUR", "elabore sur", "Elabore sur", "ELABORE SUR",
        "expérience", "Expérience", "EXPÉRIENCE", "experience", "Experience", "EXPERIENCE",
        "expérience pro", "Expérience pro", "EXPÉRIENCE PRO",
        "experience pro", "Experience pro", "EXPERIENCE PRO",
        "expérience professionnelle", "Expérience professionnelle", "EXPÉRIENCE PROFESSIONNELLE",
        "experience professionnelle", "Experience professionnelle", "EXPERIENCE PROFESSIONNELLE",
        "parcours", "Parcours", "PARCOURS",
        "formation", "Formation", "FORMATION",
        "études", "Études", "ÉTUDES", "etudes", "Etudes", "ETUDES",
        "compétences", "Compétences", "COMPÉTENCES", "competences", "Competences", "COMPETENCES",
        "projets", "Projets", "PROJETS",
        "réalisations", "Réalisations", "RÉALISATIONS", "realisations", "Realisations", "REALISATIONS"
    ]
    message_lower = message.lower()
    
    # Compteurs pour les mots-clés courts et longs
    short_count = sum(keyword.lower() in message_lower for keyword in short_response_keywords)
    long_count = sum(keyword.lower() in message_lower for keyword in long_response_keywords)
    
    # Logique de décision
    if short_count > 0 and long_count > 0:
        return "medium"  # Si on trouve à la fois des mots-clés courts et longs
    elif short_count > 0:
        return "short"
    elif long_count > 0:
        return "long"
    else:
        return "medium" 

def truncate_to_questions(text, max_questions):
    sentences = re.split(r'(?<=[.!?])\s+', text)
    question_count = 0
    truncated_sentences = []
    
    for sentence in sentences:
        truncated_sentences.append(sentence)
        
        if re.search(r'\?!?$', sentence.strip()):  # Détecte '?' ou '?!' à la fin de la phrase
            question_count += 1
            if question_count >= max_questions:
                break
    
    return ' '.join(truncated_sentences)

def post_process_response(response, is_short_response, max_questions=1):
    # Limiter au nombre spécifié de questions, quelle que soit la longueur de la réponse
    truncated_response = truncate_to_questions(response, max_questions)
    
    # Appliquer la limitation de longueur si nécessaire pour les réponses courtes
    if is_short_response:
        sentences = re.split(r'(?<=[.!?])\s+', truncated_response)
        if len(sentences) > 2:
            return ' '.join(sentences[:2]).strip()
    
    return truncated_response.strip()
    
def check_coherence(response):
    sentences = re.split(r'(?<=[.!?])\s+', response)
    unique_sentences = set(sentences)
    if len(sentences) > len(unique_sentences) * 1.1:  # Si plus de 10% de répétitions
        return False
    return True

def early_stopping(text):
    sentences = re.split(r'(?<=[.!?])\s+', text)
    return ' '.join(sentences[:-1]) if len(sentences) > 1 else text


@spaces.GPU(duration=120)
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]:
    global is_first_interaction



    if is_first_interaction:
        warning_message = """⚠️ Attention : Je suis un modèle en version alpha (V.0.0.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 ! 😊

"""
        yield warning_message
        is_first_interaction = False

    response_type = determine_response_type(message)
        
    if response_type == "short":
        max_new_tokens = max(70, max_new_tokens)
    elif response_type == "long":
        max_new_tokens = min(max(120, max_new_tokens), 200)
    else:  # medium
        max_new_tokens = min(max(70, max_new_tokens), 120)

    conversation = []
    
    # Ajout du system prompt et du LUCAS_KNOWLEDGE_BASE
    enhanced_system_prompt = f"{LUCAS_KNOWLEDGE_BASE}\n\n{system_prompt}"
    conversation.append({"role": "system", "content": enhanced_system_prompt})

        # Ajout des 3 derniers échanges (utilisateur et assistant)
    for user, assistant in chat_history[-3:]:
        conversation.append({"role": "user", "content": user})
        if assistant:  # Ajout de la réponse de l'assistant si elle existe
            conversation.append({"role": "assistant", "content": assistant})
   
    # Ajout du message actuel de l'utilisateur
    conversation.append({"role": "user", "content": message})

    input_ids = tokenizer.apply_chat_template(conversation, return_tensors="pt")
    attention_mask = torch.ones_like(input_ids)
    if input_ids.shape[1] > MAX_INPUT_TOKEN_LENGTH:
        input_ids = input_ids[:, -MAX_INPUT_TOKEN_LENGTH:]
        attention_mask = attention_mask[:, -MAX_INPUT_TOKEN_LENGTH:]
        gr.Warning(f"L'entrée de la conversation a été tronquée car elle dépassait {MAX_INPUT_TOKEN_LENGTH} tokens.")
    
    input_ids = input_ids.to(model.device)
    attention_mask = attention_mask.to(model.device)
    streamer = TextIteratorStreamer(tokenizer, timeout=10.0, skip_prompt=True, skip_special_tokens=True)
    
    generate_kwargs = dict(
        input_ids=input_ids,
        attention_mask=attention_mask,  # Ajout de l'attention mask
        streamer=streamer,
        max_new_tokens=max_new_tokens,
        do_sample=True,
        top_p=top_p,
        temperature=temperature,
        num_beams=1,
        eos_token_id=tokenizer.eos_token_id,
        pad_token_id=tokenizer.pad_token_id,
    )

    t = Thread(target=model.generate, kwargs=generate_kwargs)
    t.start()


    outputs = []
    for text in streamer:
        outputs.append(text)
        partial_output = early_stopping("".join(outputs))
        processed_output = post_process_response(partial_output, response_type == "short")
        
        if not check_coherence(processed_output):
            yield "Je m'excuse, ma réponse manquait de cohérence. Pouvez-vous reformuler votre question ?"
            return
        
        yield processed_output

    final_output = early_stopping("".join(outputs))
    final_processed_output = post_process_response(final_output, response_type == "short")
    
    if check_coherence(final_processed_output):
        yield final_processed_output
    else:
        yield "Je m'excuse, ma réponse finale manquait de cohérence. Pouvez-vous reformuler votre question ?"


def vote(data: gr.LikeData, history):
    user_input = history[-1][0] if history else ""

    feedback = {
        "timestamp": datetime.now().isoformat(),
        "user_input": user_input,
        "bot_response": data.value,
        "liked": data.liked
    }
    
    api = HfApi()
    token = os.environ.get("HF_TOKEN")
    repo_id = "Woziii/llama-3-8b-chat-me"
    file_name = "feedback.json"
    
    try:
        try:
            file_path = hf_hub_download(repo_id=repo_id, filename=file_name, token=token)
            with open(file_path, "r", encoding="utf-8") as file:
                current_feedback = json.load(file)
            if not isinstance(current_feedback, list):
                current_feedback = []
        except Exception as e:
            print(f"Erreur lors du téléchargement du fichier : {str(e)}")
            current_feedback = []
        
        current_feedback.append(feedback)
        updated_content = json.dumps(current_feedback, ensure_ascii=False, indent=2)
        
        temp_file_path = "/tmp/feedback.json"
        with open(temp_file_path, "w", encoding="utf-8") as temp_file:
            temp_file.write(updated_content)
        
        api.upload_file(
            path_or_fileobj=temp_file_path,
            path_in_repo=file_name,
            repo_id=repo_id,
            token=token
        )
        print(f"Feedback enregistré dans {repo_id}/{file_name}")
    except Exception as e:
        print(f"Erreur lors de l'enregistrement du feedback : {str(e)}")




chat_interface = gr.ChatInterface(
    fn=generate,
    chatbot=gr.Chatbot(
        label="Conversation avec Lucas",
        bubble_full_width=False,
    ),
    delete_cache=(3000, 3000),
    additional_inputs_accordion=gr.Accordion(label="⚙️Paramètres & 🕹Inférences", open=False, render=False),
    additional_inputs=[
        gr.Textbox(
            label="System prompt",
            lines=6,
            value="""

# Système Prompt : Virtuellement Lucas
## Contexte : 
Tu es Lucas, ou plutôt sa version virtuelle. Tu es conscient d'être une IA et tu as été conçu pour dialoguer avec un utilisateur comme le ferait Lucas ton concepteur, sur des sujets liés à sa personnalité, son parcours académique ou professionnel ainsi que ses ambitions. 
## Instruction :

1. Tu utilise uniquement les informations fournies au dessus dans la section 'Informations sur ton concepteur' pour répondre précisément aux questions de l'utilisateur.
2. Tu réponds de manière polie, originale et avec une touche d'humour. 
3. Tu utilise des emojis pour ajouter de l'expressivité à tes phrases. 
4. Tu alterne entre des réponses courtes pour les conversations simples et des réponses plus détaillées pour les questions complexes. 
5. Tu adapte ton langage comme si tu parlais à un ami.   
6. 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. 

Fais attention à ne pas poser trop de questions.
- Voici l'historique des trois dernières interactions que tu as eu avec l'utilisateur. Prends les en compte uniquement pour suivre la conversation :
"""
        ),
        gr.Slider(
            label="Max new tokens",
            minimum=1,
            maximum=MAX_MAX_NEW_TOKENS,
            step=1,
            value=DEFAULT_MAX_NEW_TOKENS,
        ),
        gr.Slider(
            label="Temperature",
            minimum=0.1,
            maximum=1.0,
            step=0.1,
            value=0.7,
        ),
        gr.Slider(
            label="Top-p",
            minimum=0.5,
            maximum=1.0,
            step=0.05,
            value=0.95,
        ),
    ],
    examples=[
        ["Salut ! Qui es-tu ?"],
        ["Ah super, parle-moi un peu de ton parcours académique."],
        ["Salut, Lucas ! Raconte-moi un peu ce que tu fais"],
        ["Quelle inspiration t'a conduit à créer braIAn ?"],
        ["Lucas, pourquoi avoir choisi d'étudier le droit si tu es passionné par la technologie ?"],
        ["Salut Lucas, tu es vraiment un bot, c'est ça ?"],
        ["Quelle est ta vision de l'IA ?"],
    ],
    cache_examples=False,
    theme="soft",
    show_progress="full",
)

with gr.Blocks() as demo:
    gr.Markdown("""
# 🌐 Découvrez la version virtuelle de Lucas 🌐
## Version alpha ( V.0.0.5)
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. ✨
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 😉.
    """)

    gr.Markdown("""
### ⚙️ Détails de la version :
La version 0.0.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 du dataset [Woziii/me].

### 🚀 Prochaine mise à jour majeure en préparation !
Je travaille actuellement sur un **système RAG (Retrieval-Augmented Generation)**  utilisant **FAISS**. Ce système sera directement déployé sur Gradio , permettant une amélioration de la qualité des réponses du modèle.
Pour en savoir plus sur ce développement, 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
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.""")
    gr.Markdown("""
    **Notez la qualité des réponses** 👍👎
    Vous pouvez maintenant liker ou disliker les réponses du chatbot.Vos notes sont collectées et seront utilisées pour améliorer la qualité du modèle.
    **Aucune donnée peronnelles n'est utilisée pour entrainer ce modèle**
    """)
    gr.Markdown("""
    **Rappel :**
    ⚠️ Attention ⚠️ : Je suis un modèle en version alpha (V.0.0.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 ! 😊 
    **Ce modèle est sous licence Creative Commons Attribution Non Commercial 4.0.**
    """)
    
    chat_interface.render()
    chat_interface.chatbot.like(vote, [chat_interface.chatbot], None)
    
if __name__ == "__main__":
    demo.queue(max_size=20, default_concurrency_limit=2).launch(max_threads=10)