datacipen commited on
Commit
c69ba79
·
verified ·
1 Parent(s): e937da8

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +48 -16
main.py CHANGED
@@ -129,16 +129,39 @@ def Connexion_Mistral():
129
 
130
  @cl.step(type="tool", show_input=True)
131
  @ls.traceable(run_type="llm", name="Connexion à Mistral : paramétrages de la conversation")
132
- def Generation_reponse(client, data, question):
133
- return client.chat.stream(
134
- model="Mistral-Nemo",
135
- messages=[
136
- SystemMessage(content="Tu es un spécialiste de l'enseignement supérieur, des formations et de la pédagogie. Tu es en capacité d'analyser en profondeur les séances pédagogiques et de les mettre en adéquation avec les théories de la recherche en éducation. Répondez à la question seulement et exclusivement à partir du contexte et des définitions ci-contre, de la manière la plus pertinente, seulement en fonction des informations fournies. Contexte : " + str(data) + ". Définition : les formations MIPI (Management de l'Innovation et du Patrimoine Immobilier) concernent le secteur de l'immobilier : facility management, property management, asset management. Les formations MITIC (Management de l'Innovation des Technologies de l'Information et de la Communication) concernent le secteur du numérique : management de projet, innovation et conseil, support numérique aux métiers"),
137
- UserMessage(content=question + "Donne le résultat au format texte markdown, jusqu'à 3000 caractères convertis en UTF-8. Continue la réponse en citant, dans un paragraphe supplémentaire de 3 lignes, introduit un saut de ligne et par \"\n📚 Sources : \", les 3 verbatim, jusqu'à 100 caractères pour chaque verbatim, avec leur numéro de ligne respectif, qui ont permis de générer la réponse, à partir du contexte. Termine la réponse en créant, dans un dernier paragraphe d'une seule et unique ligne, introduite par un saut de ligne et par \"\n📣 Question en relation avec le sujet : \", 1 seule et unique question en relation avec la question posée, en commençant la ligne par \"Question relative au contexte :\"."),
138
- ],
139
- temperature=0.1,
140
- max_tokens=1024,
 
 
 
 
 
 
 
 
 
 
 
 
141
  )
 
 
 
 
 
 
 
 
 
 
 
142
 
143
  @ls.traceable(run_type="llm", name="Connexion à Mistral : paramétrages de la conversation")
144
  def Generation_completion(client, data, question):
@@ -157,15 +180,23 @@ def Generation_completion(client, data, question):
157
 
158
  @cl.step(type="tool", show_input=True)
159
  @traceable(run_type="chain", name="Mistral Assistant des datas Gustaviz",)
160
- async def Affichage_reponse(response):
 
161
  msg = cl.Message(author="COPILOT",content="")
162
 
163
- for update in response:
164
- if update.data.choices:
165
- time.sleep(0.125)
166
- await msg.stream_token(update.data.choices[0].delta.content.replace('Ã','é').replace('©','').replace('Ã','è').replace('¨','').replace('â','\'').replace('€','').replace('™','').replace('Å','oe').replace('“','').replace('®','î').replace('´','ô').replace('<','').replace('>','').replace('/',''))
 
 
 
 
167
 
168
  await msg.send()
 
 
 
169
  return msg
170
 
171
  @cl.step(type="tool", show_input=True)
@@ -474,14 +505,15 @@ async def on_chat_start():
474
  async def main(message: cl.Message):
475
  if cl.user_session.get("chat_profile") != "Offres d'emploi par code ROME" and cl.user_session.get("chat_profile") != "Offres d'emploi par métier type":
476
  data = Chargement_des_datas(cl.user_session.get("chat_profile"))
 
477
  cl.user_session.set("data", data)
478
  client = cl.user_session.get("client")
479
 
480
- response = Generation_reponse(client, data, message.content)
481
 
482
  app_inputs = {"input": message.content}
483
  with ls.trace("Réponse de l'assistant sur les données MIS", "chain", project_name=cl.user_session.get("chat_profile"), inputs=app_inputs) as rt:
484
- msg = await Affichage_reponse(response, langsmith_extra={"metadata": {"session_id": session_id}})
485
  rt.end(outputs={"output": msg})
486
 
487
  answer = msg.content
 
129
 
130
  @cl.step(type="tool", show_input=True)
131
  @ls.traceable(run_type="llm", name="Connexion à Mistral : paramétrages de la conversation")
132
+ def Generation_reponse(client):
133
+ if not cl.user_session.get("saveMemory"):
134
+ cl.user_session.set("saveMemory", "")
135
+ cl.user_session.set("memory", ConversationBufferMemory(return_messages=True))
136
+ memory = cl.user_session.get("memory")
137
+ prompt = ChatPromptTemplate.from_messages(
138
+ [
139
+ (
140
+ "system",
141
+ f"Tu es un spécialiste de l'enseignement supérieur, des formations et de la pédagogie. Tu es en capacité d'analyser en profondeur les séances pédagogiques et de les mettre en adéquation avec les théories de la recherche en éducation. Répondez à la question seulement et exclusivement à partir du contexte et des définitions ci-contre, de la manière la plus pertinente, seulement en fonction des informations fournies. Définition : les formations MIPI (Management de l'Innovation et du Patrimoine Immobilier) concernent le secteur de l'immobilier : facility management, property management, asset management. Les formations MITIC (Management de l'Innovation des Technologies de l'Information et de la Communication) concernent le secteur du numérique : management de projet, innovation et conseil, support numérique aux métiers",
142
+ ),
143
+ MessagesPlaceholder(variable_name="history"),
144
+ ("human", "Contexte : {data}.\n{question}. Donne le résultat au format texte markdown, jusqu'à 3000 caractères convertis en UTF-8. Continue la réponse en citant, dans un paragraphe supplémentaire de 3 lignes, introduit un saut de ligne et par \"\n📚 Sources : \", les 3 verbatim, jusqu'à 100 caractères pour chaque verbatim, avec leur numéro de ligne respectif, qui ont permis de générer la réponse, à partir du contexte. Termine la réponse en créant, dans un dernier paragraphe d'une seule et unique ligne, introduite par un saut de ligne et par \"\n📣 Question en relation avec le sujet : \", 1 seule et unique question en relation avec la question posée, en commençant la ligne par \"Question relative au contexte :\"."),
145
+ ]
146
+ )
147
+ runnable = (
148
+ RunnablePassthrough.assign(
149
+ history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
150
+ )
151
+ | prompt
152
+ | client
153
  )
154
+
155
+ return runnable
156
+ #return client.chat.stream(
157
+ # model="Mistral-Nemo",
158
+ # messages=[
159
+ # SystemMessage(content="Tu es un spécialiste de l'enseignement supérieur, des formations et de la pédagogie. Tu es en capacité d'analyser en profondeur les séances pédagogiques et de les mettre en adéquation avec les théories de la recherche en éducation. Répondez à la question seulement et exclusivement à partir du contexte et des définitions ci-contre, de la manière la plus pertinente, seulement en fonction des informations fournies. Contexte : " + str(data) + ". Définition : les formations MIPI (Management de l'Innovation et du Patrimoine Immobilier) concernent le secteur de l'immobilier : facility management, property management, asset management. Les formations MITIC (Management de l'Innovation des Technologies de l'Information et de la Communication) concernent le secteur du numérique : management de projet, innovation et conseil, support numérique aux métiers"),
160
+ # UserMessage(content=question + "Donne le résultat au format texte markdown, jusqu'à 3000 caractères convertis en UTF-8. Continue la réponse en citant, dans un paragraphe supplémentaire de 3 lignes, introduit un saut de ligne et par \"\n📚 Sources : \", les 3 verbatim, jusqu'à 100 caractères pour chaque verbatim, avec leur numéro de ligne respectif, qui ont permis de générer la réponse, à partir du contexte. Termine la réponse en créant, dans un dernier paragraphe d'une seule et unique ligne, introduite par un saut de ligne et par \"\n📣 Question en relation avec le sujet : \", 1 seule et unique question en relation avec la question posée, en commençant la ligne par \"Question relative au contexte :\"."),
161
+ # ],
162
+ # temperature=0.1,
163
+ # max_tokens=1024,
164
+ #)
165
 
166
  @ls.traceable(run_type="llm", name="Connexion à Mistral : paramétrages de la conversation")
167
  def Generation_completion(client, data, question):
 
180
 
181
  @cl.step(type="tool", show_input=True)
182
  @traceable(run_type="chain", name="Mistral Assistant des datas Gustaviz",)
183
+ async def Affichage_reponse(response, question, data):
184
+ memory = cl.user_session.get("memory")
185
  msg = cl.Message(author="COPILOT",content="")
186
 
187
+ async for chunk in response.astream({"question": question, "data": data},config=RunnableConfig(callbacks=[cl.AsyncLangchainCallbackHandler(stream_final_answer=True)])):
188
+ await msg.stream_token(chunk.replace('Ã','é').replace('©','').replace('Ã','è').replace('¨','').replace('â','\'').replace('€','').replace('™','').replace('Å','oe').replace('“','').replace('®','î').replace('´','ô').replace('<','').replace('>','').replace('/',''))
189
+
190
+
191
+ #for update in response:
192
+ # if update.data.choices:
193
+ # time.sleep(0.125)
194
+ # await msg.stream_token(update.data.choices[0].delta.content.replace('Ã','é').replace('©','').replace('Ã','è').replace('¨','').replace('â','\'').replace('€','').replace('™','').replace('Å','oe').replace('“','').replace('®','î').replace('´','ô').replace('<','').replace('>','').replace('/',''))
195
 
196
  await msg.send()
197
+ memory.chat_memory.add_user_message(question)
198
+ memory.chat_memory.add_ai_message(msg.content)
199
+
200
  return msg
201
 
202
  @cl.step(type="tool", show_input=True)
 
505
  async def main(message: cl.Message):
506
  if cl.user_session.get("chat_profile") != "Offres d'emploi par code ROME" and cl.user_session.get("chat_profile") != "Offres d'emploi par métier type":
507
  data = Chargement_des_datas(cl.user_session.get("chat_profile"))
508
+ data = str(data).replace("{","").replace("}","").replace("[","").replace("]","")
509
  cl.user_session.set("data", data)
510
  client = cl.user_session.get("client")
511
 
512
+ response = Generation_reponse(client)
513
 
514
  app_inputs = {"input": message.content}
515
  with ls.trace("Réponse de l'assistant sur les données MIS", "chain", project_name=cl.user_session.get("chat_profile"), inputs=app_inputs) as rt:
516
+ msg = await Affichage_reponse(response, message.content, data, langsmith_extra={"metadata": {"session_id": session_id}})
517
  rt.end(outputs={"output": msg})
518
 
519
  answer = msg.content