datacipen commited on
Commit
77bd3c6
·
verified ·
1 Parent(s): 2ea1b5e

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +27 -32
main.py CHANGED
@@ -153,29 +153,31 @@ def Generation_reponse(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):
168
- response = client.chat.complete(
169
- model="Mistral-Nemo",
170
- messages=[
171
- 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"),
172
- 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 :\"."),
173
- ],
174
- temperature=0.1,
175
- max_tokens=1024,
176
- top_p=0.1
 
 
 
 
177
  )
178
- msg = response.choices[0].message.content
 
 
 
 
 
 
 
179
  return msg
180
 
181
  @cl.step(type="tool", show_input=True)
@@ -187,12 +189,6 @@ async def Affichage_reponse(response, question, data):
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)
@@ -233,12 +229,11 @@ async def on_action(action):
233
  question = action.value
234
 
235
  await cl.Message(author="COPILOT", content="📊 Connexion à Mistral").send()
236
- response = Generation_reponse(client, data, question)
237
 
238
- #msg = await Affichage_reponse(response)
239
  app_inputs = {"input": question}
240
  with ls.trace("Réponse de l'assistant sur les données MIS", "chain", project_name=action.description, inputs=app_inputs) as rt:
241
- msg = await Affichage_reponse(response, langsmith_extra={"metadata": {"session_id": session_id}})
242
  rt.end(outputs={"output": msg})
243
 
244
  answer = msg.content
@@ -249,6 +244,7 @@ async def on_action(action):
249
  async def on_action(action):
250
  client = cl.user_session.get("client")
251
  data = Chargement_des_datas_web(cl.user_session.get("chat_profile"))
 
252
 
253
  diviseur = str(len(data) // 23500)
254
  reste = str(len(data) % 23500)
@@ -265,17 +261,16 @@ async def on_action(action):
265
  webData = data[deb:end]
266
  answer += Generation_completion(client, webData, question)
267
  else:
268
- answer += Generation_reponse(client, data, question)
269
 
270
  if diviseur != 0 and reste !=0 and len(reste) <= 23500:
271
  answer += Generation_completion(client, reste, question)
272
 
273
- response = Generation_reponse(client, answer, question)
274
 
275
- #msg = await Affichage_reponse(response)
276
  app_inputs = {"input": question}
277
  with ls.trace("Réponse de l'assistant sur les données Web", "chain", project_name=action.description, inputs=app_inputs) as rt:
278
- msg = await Affichage_reponse(response, langsmith_extra={"metadata": {"session_id": session_id}})
279
  rt.end(outputs={"output": msg})
280
 
281
  result = msg.content
 
153
  )
154
 
155
  return runnable
 
 
 
 
 
 
 
 
 
156
 
157
  @ls.traceable(run_type="llm", name="Connexion à Mistral : paramétrages de la conversation")
158
  def Generation_completion(client, data, question):
159
+ if not cl.user_session.get("saveMemory"):
160
+ cl.user_session.set("saveMemory", "")
161
+ cl.user_session.set("memory", ConversationBufferMemory(return_messages=True))
162
+ memory = cl.user_session.get("memory")
163
+ prompt = ChatPromptTemplate.from_messages(
164
+ [
165
+ (
166
+ "system",
167
+ f"Tu es un spécialiste de l'enseignement supérieur, des formations et de la pédagogie, en France. 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",
168
+ ),
169
+ MessagesPlaceholder(variable_name="history"),
170
+ ("human", "Contexte : {data}.\n{question}. Donne le résultat au format texte markdown, sansa générer de bloc de code, jusqu'à 10000 caractères convertis en UTF-8, en langue française absolument. 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. Après et en plus, 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 :\". Réponds en langue française seulement et exclusivement."),
171
+ ]
172
  )
173
+ runnable = (
174
+ RunnablePassthrough.assign(
175
+ history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
176
+ )
177
+ | prompt
178
+ | client
179
+ )
180
+ msg = runnable.invoke({"question": question, "data": data})
181
  return msg
182
 
183
  @cl.step(type="tool", show_input=True)
 
189
  async for chunk in response.astream({"question": question, "data": data},config=RunnableConfig(callbacks=[cl.AsyncLangchainCallbackHandler(stream_final_answer=True)])):
190
  await msg.stream_token(chunk.replace('Ã','é').replace('©','').replace('Ã','è').replace('¨','').replace('â','\'').replace('€','').replace('™','').replace('Å','oe').replace('“','').replace('®','î').replace('´','ô').replace('<','').replace('>','').replace('/',''))
191
 
 
 
 
 
 
 
192
  await msg.send()
193
  memory.chat_memory.add_user_message(question)
194
  memory.chat_memory.add_ai_message(msg.content)
 
229
  question = action.value
230
 
231
  await cl.Message(author="COPILOT", content="📊 Connexion à Mistral").send()
232
+ response = Generation_reponse(client)
233
 
 
234
  app_inputs = {"input": question}
235
  with ls.trace("Réponse de l'assistant sur les données MIS", "chain", project_name=action.description, inputs=app_inputs) as rt:
236
+ msg = await Affichage_reponse(response, question, data, langsmith_extra={"metadata": {"session_id": session_id}})
237
  rt.end(outputs={"output": msg})
238
 
239
  answer = msg.content
 
244
  async def on_action(action):
245
  client = cl.user_session.get("client")
246
  data = Chargement_des_datas_web(cl.user_session.get("chat_profile"))
247
+ data = str(data).replace("{","").replace("}","").replace("[","").replace("]","")
248
 
249
  diviseur = str(len(data) // 23500)
250
  reste = str(len(data) % 23500)
 
261
  webData = data[deb:end]
262
  answer += Generation_completion(client, webData, question)
263
  else:
264
+ answer += Generation_reponse(client)
265
 
266
  if diviseur != 0 and reste !=0 and len(reste) <= 23500:
267
  answer += Generation_completion(client, reste, question)
268
 
269
+ response = Generation_reponse(client)
270
 
 
271
  app_inputs = {"input": question}
272
  with ls.trace("Réponse de l'assistant sur les données Web", "chain", project_name=action.description, inputs=app_inputs) as rt:
273
+ msg = await Affichage_reponse(response, question, data, langsmith_extra={"metadata": {"session_id": session_id}})
274
  rt.end(outputs={"output": msg})
275
 
276
  result = msg.content