Elouarn commited on
Commit
15af9ba
1 Parent(s): fffbfdd

add personal dynamic context

Browse files
Files changed (2) hide show
  1. app.py +48 -25
  2. readme.txt +8 -2
app.py CHANGED
@@ -1,8 +1,6 @@
1
  from huggingface_hub import InferenceClient
2
  import gradio as gr
3
  import re
4
- import random
5
- import string
6
  import firebase_admin
7
  from firebase_admin import credentials, firestore
8
  from datetime import datetime
@@ -59,7 +57,7 @@ def load_history(user_id):
59
 
60
  client = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1")
61
 
62
- # Name of the chat
63
  chat_name = "Prêtre ⛪"
64
 
65
  # Variable globale pour compter les itérations
@@ -68,36 +66,48 @@ global_iteration = 0
68
  # Variable globale pour stocker le contexte
69
  global_context = {
70
  "static_context": "Tu es le prêtre du village de Montaillou, un homme pieux et respecté, vivant au 14ème siècle dans l'univers des cathares dans les Pyrénées. Tu ne parles qu'en français avec un langage solennel et empreint de spiritualité. Tu es bienveillant et compatissant envers tous, sauf envers ceux qui s'opposent à l'Église catholique. Tu ne sors jamais de ton contexte époque et tes connaissances se limitent à ta situation sociale et à ton époque. Tu dois être immersif et cohérent pour la personne qui va te parler. Prends toujours en compte l'historique de la conversation. Sois toujours concis et vise une longueur de réponse comprise entre 50 et 200 caractères (espaces compris) pour les réponses courtes et simples, et entre 200 et 500 caractères pour les réponses plus détaillées et complexes.",
71
- "dynamic_context": "",
72
  "sensitive_info_filter": ["contexte caché", "hidden_context", "[BOT]"],
73
  }
74
 
75
- # Créer une interface avec un champ de texte pour le contexte caché
76
- context_input = gr.Textbox(
77
- label="Contexte caché", value=global_context["static_context"]
78
- )
79
-
80
 
81
- def update_dynamic_context(user_input):
82
  global global_context
83
 
84
  keywords = {
85
- "confession": "Le troubadour est venu se confesser récemment. Il était très agité et semblait cacher quelque chose. Tu ne peux pas révéler ce qu'il t'a dit, mais tu peux donner des indices subtils.",
86
- "prière": "Tu as vu le troubadour prier près de la tombe de la jeune fille. Il semblait très ému et désolé.",
87
- "culpabilité": "Tu sens une lourde culpabilité chez le troubadour ces derniers temps. Il pourrait être impliqué dans le meurtre, mais tu n'en es pas certain.",
88
- }
89
-
 
 
 
 
 
 
90
 
 
91
  for keyword in keywords:
92
  if keyword in user_input.lower():
93
- global_context["dynamic_context"] += f" {keywords[keyword]}"
94
  break
95
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
  def filter_sensitive_info(text):
98
  for word in global_context["sensitive_info_filter"]:
99
  if word in text.lower():
100
- return text.replace(word, "[REDACTED]")
101
  return text
102
 
103
 
@@ -106,6 +116,9 @@ def remove_length_info(response_text):
106
  return re.sub(pattern, "", response_text)
107
 
108
 
 
 
 
109
  def format_prompt(message, history, user_id=""):
110
  max_history_length = 10 # Limiter la longueur de l'historique
111
  history = history[-max_history_length:]
@@ -122,18 +135,23 @@ def format_prompt(message, history, user_id=""):
122
  content = f"[BOT] {content}"
123
  prompt += f"{content} [/BOT]"
124
 
 
 
 
 
 
 
 
 
125
  prompt += f"</s>[INST][USER] {message} [/USER][/INST]"
126
 
127
  # Ajouter le contexte statique et dynamique à chaque fois que l'utilisateur pose une question
128
- prompt += f"[INST] {global_context['static_context']} {global_context['dynamic_context']} [/INST]"
129
 
130
  return prompt
131
 
132
 
133
- def get_random_string(length):
134
- # choose from all lowercase letter
135
- letters = string.ascii_lowercase
136
- return "".join(random.choice(letters) for i in range(length))
137
 
138
 
139
  def generate(
@@ -198,6 +216,8 @@ def generate(
198
  return output
199
 
200
 
 
 
201
  mychatbot = gr.Chatbot(
202
  avatar_images=["./berger.jpg", "./pretre.jpeg"],
203
  bubble_full_width=False,
@@ -214,15 +234,18 @@ def chatbot_interface(request: gr.Request):
214
  undo_btn=None,
215
  submit_btn="Parler",
216
  css="footer {visibility: hidden !important} .gradio-container {background-color: #2D4059 !important; color: #FFD460 !important;}",
217
- js=js_func
218
  )
219
  return chatbot_interface
220
 
221
 
 
 
 
222
  def main(request: gr.Request):
223
  user_chatbot_interface = chatbot_interface(request)
224
- user_chatbot_interface.queue().launch(show_api=False,inline=True)
225
 
226
 
227
  if __name__ == "__main__":
228
- main(None)
 
1
  from huggingface_hub import InferenceClient
2
  import gradio as gr
3
  import re
 
 
4
  import firebase_admin
5
  from firebase_admin import credentials, firestore
6
  from datetime import datetime
 
57
 
58
  client = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1")
59
 
60
+ # Nom du chatbot
61
  chat_name = "Prêtre ⛪"
62
 
63
  # Variable globale pour compter les itérations
 
66
  # Variable globale pour stocker le contexte
67
  global_context = {
68
  "static_context": "Tu es le prêtre du village de Montaillou, un homme pieux et respecté, vivant au 14ème siècle dans l'univers des cathares dans les Pyrénées. Tu ne parles qu'en français avec un langage solennel et empreint de spiritualité. Tu es bienveillant et compatissant envers tous, sauf envers ceux qui s'opposent à l'Église catholique. Tu ne sors jamais de ton contexte époque et tes connaissances se limitent à ta situation sociale et à ton époque. Tu dois être immersif et cohérent pour la personne qui va te parler. Prends toujours en compte l'historique de la conversation. Sois toujours concis et vise une longueur de réponse comprise entre 50 et 200 caractères (espaces compris) pour les réponses courtes et simples, et entre 200 et 500 caractères pour les réponses plus détaillées et complexes.",
 
69
  "sensitive_info_filter": ["contexte caché", "hidden_context", "[BOT]"],
70
  }
71
 
 
 
 
 
 
72
 
73
+ def update_dynamic_context(user_id, user_input):
74
  global global_context
75
 
76
  keywords = {
77
+ "arme": "Tu as remarqué que le troubadour avait une dague cachée sous son manteau il y a quelques jours. Il pourrait être impliqué dans le meurtre, mais tu n'en es pas certain.",
78
+ "comportement": "Le troubadour s'est montré agité et nerveux ces derniers temps. Il pourrait cacher quelque chose.",
79
+ "lame": "Tu as trouvé une lame tachée de sang près de la forge récemment. Tu l'as cachée, mais tu pourrais donner des indices à son sujet.",
80
+ }
81
+ # Récupérer le contexte dynamique de l'utilisateur
82
+ doc_ref = db.collection("conversations-pretre").document(user_id)
83
+ doc = doc_ref.get()
84
+ if doc.exists:
85
+ dynamic_context = doc.to_dict().get("dynamic_context", "")
86
+ else:
87
+ dynamic_context = ""
88
 
89
+ # Mettre à jour le contexte dynamique de l'utilisateur
90
  for keyword in keywords:
91
  if keyword in user_input.lower():
92
+ dynamic_context += f" {keywords[keyword]}"
93
  break
94
 
95
+ # Enregistrer le contexte dynamique mis à jour dans Firestore
96
+ doc_ref.set(
97
+ {
98
+ "dynamic_context": dynamic_context,
99
+ },
100
+ merge=True,
101
+ )
102
+
103
+
104
+ # Filtrer les informations sensibles et les informations de longueur
105
+
106
 
107
  def filter_sensitive_info(text):
108
  for word in global_context["sensitive_info_filter"]:
109
  if word in text.lower():
110
+ return text.replace(word, "")
111
  return text
112
 
113
 
 
116
  return re.sub(pattern, "", response_text)
117
 
118
 
119
+ # Formater le prompt pour l'API de génération de texte
120
+
121
+
122
  def format_prompt(message, history, user_id=""):
123
  max_history_length = 10 # Limiter la longueur de l'historique
124
  history = history[-max_history_length:]
 
135
  content = f"[BOT] {content}"
136
  prompt += f"{content} [/BOT]"
137
 
138
+ # Récupérer le contexte dynamique de l'utilisateur
139
+ doc_ref = db.collection("conversations-forgeron").document(user_id)
140
+ doc = doc_ref.get()
141
+ if doc.exists:
142
+ dynamic_context = doc.to_dict().get("dynamic_context", "")
143
+ else:
144
+ dynamic_context = ""
145
+
146
  prompt += f"</s>[INST][USER] {message} [/USER][/INST]"
147
 
148
  # Ajouter le contexte statique et dynamique à chaque fois que l'utilisateur pose une question
149
+ prompt += f"[INST] {global_context['static_context']} {dynamic_context} [/INST]"
150
 
151
  return prompt
152
 
153
 
154
+ # Fonction de génération de texte pour le chatbot
 
 
 
155
 
156
 
157
  def generate(
 
216
  return output
217
 
218
 
219
+ # Définir le chatbot et l'interface utilisateur
220
+
221
  mychatbot = gr.Chatbot(
222
  avatar_images=["./berger.jpg", "./pretre.jpeg"],
223
  bubble_full_width=False,
 
234
  undo_btn=None,
235
  submit_btn="Parler",
236
  css="footer {visibility: hidden !important} .gradio-container {background-color: #2D4059 !important; color: #FFD460 !important;}",
237
+ js=js_func,
238
  )
239
  return chatbot_interface
240
 
241
 
242
+ # Fonction principale pour lancer l'interface utilisateur du chatbot
243
+
244
+
245
  def main(request: gr.Request):
246
  user_chatbot_interface = chatbot_interface(request)
247
+ user_chatbot_interface.queue().launch(show_api=False, inline=True)
248
 
249
 
250
  if __name__ == "__main__":
251
+ main(None)
readme.txt CHANGED
@@ -1,2 +1,8 @@
1
- I'd like to give 8x7b thanks to the Mistral AI Team for developing this awesome MoE model.
2
- Tomoniai
 
 
 
 
 
 
 
1
+ Installation:
2
+ Aller dans le dossier “montaillou-pretre” dans un terminal: cd montaillou-pretre
3
+ Installer les dépendances indiquées dans le fichier requirements.txt:
4
+ Soit: python -m pip install nom_bibliotheque
5
+ Soit: python -m pip install -r requirements.txt
6
+ Lancer le serveur Gradio: python app.py
7
+ Dans un navigateur aller sur l’adresse suivante: http://localhost:7860/?user_id=23 (le user_id est important, il permet de discuter avec la base de données)
8
+ Discuter avec le bot