datacipen commited on
Commit
64762cf
1 Parent(s): c0e89a8

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +33 -41
main.py CHANGED
@@ -23,8 +23,6 @@ from pinecone import Pinecone
23
  from langchain.memory import ChatMessageHistory, ConversationBufferMemory
24
  import pandas as pd
25
  import numpy as np
26
- from anthropic import Anthropic, HUMAN_PROMPT, AI_PROMPT
27
- from langchain_anthropic import ChatAnthropic
28
  import chainlit as cl
29
  from chainlit.input_widget import Select, TextInput
30
  from chainlit import user_session
@@ -245,13 +243,17 @@ async def start():
245
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="1️⃣ Cliquez sur le bouton dont l'image suit, dans le prompt, pour commencer à élaborer un premier texte de la chaîne documentaire APCC!").send()
246
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="", elements=warning).send()
247
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="2️⃣ Puis sélectionnez ou saisissez un ou plusieurs codes ROME et un type de fiche dans les menus déroulants proposés. Et vous êtes prêt!\n\n🔗 Plateforme de feedback et de fil d'activité : https://cloud.getliteral.ai/").send()
248
- #os.environ['ANTHROPIC_API_KEY'] = os.environ['ANTHROPIC_API_KEY']
249
  contextChat = cl.user_session.get("contextChatBot")
250
  if not contextChat:
251
  contextChat = "Il n'y a pas de contexte."
252
- model = ChatAnthropic(
253
- temperature=1,
254
- model_name="claude-3-opus-20240229"
 
 
 
 
 
255
  )
256
  cl.user_session.set("memory", ConversationBufferMemory(return_messages=True))
257
  memory = cl.user_session.get("memory")
@@ -271,7 +273,6 @@ async def start():
271
  )
272
  | prompt
273
  | model
274
- | StrOutputParser()
275
  )
276
  cl.user_session.set("runnable", runnable)
277
 
@@ -589,22 +590,28 @@ async def construction_FCS(romeListArray,settings):
589
  getChain = "NCS" + romeListArray[0] + " : " + str(text_file_string)
590
  else:
591
  getChain = await recuperation_contexte("NCS" + romeListArray[0])
592
- client_anthropic = await IA()
593
- question ="""
 
 
 
 
 
 
 
594
  1) Extrais de la note de composante sectorielle du contexte, seulement et strictement la liste des 5 appellations métiers principales et écris-la au format liste formée de 5 lignes de ces mêmes métiers, sans phrase d'introduction de type \"Voici...\" et sans y apporter plus de précision quant à la génération de la note de composante sectorielle; la liste devant se termniner par la dernière appellation métier.
595
  2) En fonction des 5 appellations métiers du secteur listées dans le document précédent correspondant à la note de composante sectorielle, crée une fiche synoptique sous forme d'une fiche descriptive très détaillée et très complète, en 5000 mots, comprenant une liste numérotées de 5 activités professionnelles différentes bien décrites, entrecoupées elles-mêmes par une sous-liste numérotées, imbriquée dans chaque liste activité professionnelle, de 5 compétences professionnelles distinctes et bien décrites commençant par un verbe d'action conformément à la taxonomie de Bloom, marquant une progression dans l'acquisition des compétences.
596
  3) Extrais de la fiche synoptique créée, seulement et strictement la liste des 25 premières activités professionnelles principales et écris-la sur une seule ligne construite de ces mêmes 10 activités séparées par des points virgules, sans phrase d'introduction de type \"Voici...\" et sans y apporter plus de précision quant à la génération de la fiche synoptique; la ligne devant commencer par \"activités : --- Choisir une activité --- ; \" et devant se termniner par la dernière activité professionnelle.
597
  4) Extrais de la fiche synoptique créée, seulement et strictement la liste des 25 premières compétences professionnelles principales et écris-la sur une seule ligne construite de ces mêmes 10 compétences séparées par des points virgules, sans phrase d'introduction de type \"Voici...\" et sans y apporter plus de précision quant à la génération de la fiche synoptique; la ligne devant commencer par \"compétences : --- Choisir une compétence --- ; \" et devant se termniner par la dernière compétence professionnelle.
598
  """
599
- completion_FCS = client_anthropic.messages.create(
600
- model="claude-3-opus-20240229",
601
- max_tokens=4000,
602
- temperature=1,
603
- messages=[{
604
- "role": 'user', "content": f"Contexte : Réponds aux questions suivantes en utilisant seulement le contexte ci-contre. Réponds à la manière d'un ingénieur pédagogique pour créer un référentiel. Essayez donc de comprendre en profondeur le contexte et répondez uniquement en vous basant sur les informations fournies. Contexte: Définition d'une activité : une activité est un ensemble cohérent d'actions combinées : pour la réaliser, plusieurs compétences et opérations sont nécessaires, soit successivement, soit conjointement. Elles s'inscrivent à des moments clés du processus de réalisation et ne peuvent en aucun cas être occultées, car elles conditionnent le résultat. Plusieurs activités en vue d'une finalité avec une valeur ajoutée à un produit ou un service sont nécessaires pour mettre en œuvre un processus métier. De ce fait, il est essentiel de déterminer pour chaque activité sa propre finalité et de s'assurer que l'ensemble des activités participent bien d'un même processus. Définition d'une compétence : la compétence est une combinaison de savoirs en action, mobilisés en vue de réaliser une activité professionnelle. Elle s'apprécie, en tant qu'acquis de l'apprentissage selon des modalités adaptées permettant d'en certifier la possession et au regard de l'atteinte d'un résultat pour un niveau d'exigence prédéterminé. Les compétences peuvent être regroupées par domaines selon la nature et leur liaison subordonnée aux activités. Essayez donc de comprendre en profondeur le contexte et répondez uniquement en vous basant sur les informations fournies. Note de composante sectorielle : {getChain}. Questions : {question}"
605
- }]
606
- )
607
- completionFCS = completion_FCS.content[0].text
608
  await cl.sleep(2)
609
  arrayActivites = completionFCS.split('activités : ')
610
  arrayOfActivites = arrayActivites[1].split('compétences : ')
@@ -647,10 +654,10 @@ async def construction_FCS(romeListArray,settings):
647
  ).send()
648
  await cl.sleep(3)
649
  await cl.Message(
650
- author="Datapcc : 🌐🌐🌐",content="Fiche synoptique : " + romeListArray[1] + "\n\n" + completion_FCS.content[0].text
651
  ).send()
652
- cl.user_session.set("FCS" + romeListArray[0], completion_FCS.content[0].text)
653
- cl.user_session.set("contextChatBot", getChain + "\n" + completion_FCS.content[0].text)
654
  await cl.sleep(2)
655
  listPrompts_name = f"Liste des requêtes sur la fiche synoptique"
656
  prompt_elements = []
@@ -660,12 +667,12 @@ async def construction_FCS(romeListArray,settings):
660
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="📚 Bibliothèque de prompts : " + listPrompts_name, elements=prompt_elements).send()
661
  await cl.sleep(2)
662
  actions = [
663
- cl.Action(name="download", value=completion_FCS.content[0].text, description="download_fiche_synoptique")
664
  ]
665
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="Télécharger la fiche", actions=actions).send()
666
  await cl.sleep(2)
667
  saves = [
668
- cl.Action(name="saveToMemory", value=completion_FCS.content[0].text, description="Mettre en mémoire la fiche")
669
  ]
670
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="Mettre en mémoire la fiche", actions=saves).send()
671
  await cl.sleep(2)
@@ -686,7 +693,7 @@ async def construction_FCS(romeListArray,settings):
686
  async def construction_NCS(romeListArray):
687
  context = await contexte(romeListArray)
688
  emploisST = cl.user_session.get("EmploiST")
689
- ### Anthropic Completion ###
690
  client_llm = await IA()
691
  structure = str(modele('Note de composante sectorielle'))
692
  definitions = definition('activite') + ' ' + definition('competence')
@@ -709,21 +716,7 @@ async def construction_NCS(romeListArray):
709
  msg = cl.Message(author="Datapcc : 🌐🌐🌐",content="")
710
  async for chunk in chain.astream({"question":question_p,"context":context_p}):
711
  await msg.stream_token(chunk)
712
-
713
- #for s in chain.stream({"question":question_p,"context":context_p}):
714
- # print(s, end="", flush=True)
715
- #completion_NCS = client_anthropic.messages.create(
716
- # model="claude-3-opus-20240229",
717
- # max_tokens=4000,
718
- # temperature=1,
719
- # messages=[{
720
- # "role": 'user', "content": f"Contexte : Vous êtes un spécialiste du marché de l'emploi en fonction du niveau de qualification, des compétences professionnelles, des compétences transversales, du salaire et de l'expérience. Vous êtes doué pour faire des analyses du système travail sur les métiers les plus demandés grâce à votre aptitude à synthétiser les informations en fonction des critères définis ci-avant. En fonction des informations suivantes et du contexte suivant seulement et strictement. Contexte : {context}. {definitions} Modèle de note sectorielle : {structure}. Réponds en langue française strictement à la question suivante en respectant strictement les données du contexte. Si vous ne pouvez pas répondre à la question sur la base des informations, dites que vous ne trouvez pas de réponse ou que vous ne parvenez pas à trouver de réponse. Essayez donc de comprendre en profondeur le contexte et répondez uniquement en vous basant sur les informations fournies. Ne générez pas de réponses non pertinentes. Si les informations du contexte sont insuffisantes, procédez à une projection sur le secteur, les entreprises et le marché de l'emploi, pour construire la note de composante sectorielle. Question : {question}"
721
- # }]
722
- #)
723
- #await cl.sleep(2)
724
- #await cl.Message(
725
- # author="Datapcc : 🌐🌐🌐",content="Note de composante sectorielle de(s) code(s) ROME : " + romeListArray[0] + "\n\n" + completion_NCS
726
- #).send()
727
  cl.user_session.set("NCS" + romeListArray[0], msg.content)
728
  cl.user_session.set("contextChatBot", context + "\n" + msg.content)
729
  await cl.sleep(2)
@@ -985,7 +978,6 @@ async def setup_agent(settings):
985
  await construction_MDC(romeListArray,settings)
986
  elif settings['type'] == "Référentiel d'évaluation - REV":
987
  await construction_REV(romeListArray,settings)
988
- #os.environ['ANTHROPIC_API_KEY'] = os.environ['ANTHROPIC_API_KEY']
989
  contextChat = cl.user_session.get("contextChatBot")
990
  if not contextChat:
991
  contextChat = "Il n'y a pas de contexte."
@@ -1022,7 +1014,7 @@ async def setup_agent(settings):
1022
 
1023
  @cl.on_message
1024
  async def main(message: cl.Message):
1025
- async with cl.Step(root=True, name="Réponse de Claude Anthropic", type="llm") as parent_step:
1026
  parent_step.input = message.content
1027
  chat_profile = cl.user_session.get("chat_profile")
1028
  chatProfile = chat_profile.split(' - ')
 
23
  from langchain.memory import ChatMessageHistory, ConversationBufferMemory
24
  import pandas as pd
25
  import numpy as np
 
 
26
  import chainlit as cl
27
  from chainlit.input_widget import Select, TextInput
28
  from chainlit import user_session
 
243
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="1️⃣ Cliquez sur le bouton dont l'image suit, dans le prompt, pour commencer à élaborer un premier texte de la chaîne documentaire APCC!").send()
244
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="", elements=warning).send()
245
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="2️⃣ Puis sélectionnez ou saisissez un ou plusieurs codes ROME et un type de fiche dans les menus déroulants proposés. Et vous êtes prêt!\n\n🔗 Plateforme de feedback et de fil d'activité : https://cloud.getliteral.ai/").send()
 
246
  contextChat = cl.user_session.get("contextChatBot")
247
  if not contextChat:
248
  contextChat = "Il n'y a pas de contexte."
249
+ os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.environ['HUGGINGFACEHUB_API_TOKEN']
250
+ repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
251
+
252
+ model = HuggingFaceEndpoint(
253
+ repo_id=repo_id,
254
+ max_new_tokens=8000,
255
+ temperature=0.5,
256
+ streaming=True
257
  )
258
  cl.user_session.set("memory", ConversationBufferMemory(return_messages=True))
259
  memory = cl.user_session.get("memory")
 
273
  )
274
  | prompt
275
  | model
 
276
  )
277
  cl.user_session.set("runnable", runnable)
278
 
 
590
  getChain = "NCS" + romeListArray[0] + " : " + str(text_file_string)
591
  else:
592
  getChain = await recuperation_contexte("NCS" + romeListArray[0])
593
+
594
+ client_llm = await IA()
595
+ template = """<s>[INST] Vous êtes un spécialiste du marché de l'emploi en fonction du niveau de qualification, des compétences professionnelles, des compétences transversales, du salaire et de l'expérience. Vous êtes doué pour faire des analyses du système travail sur les métiers les plus demandés grâce à votre aptitude à synthétiser les informations en fonction des critères définis ci-avant.
596
+
597
+ En fonction des informations suivantes et du contexte suivant seulement et strictement, répondez à la question ci-dessous à partir du contexte ci-dessous :
598
+ {context}
599
+ {question} [/INST] </s>
600
+ """
601
+ question_p ="""
602
  1) Extrais de la note de composante sectorielle du contexte, seulement et strictement la liste des 5 appellations métiers principales et écris-la au format liste formée de 5 lignes de ces mêmes métiers, sans phrase d'introduction de type \"Voici...\" et sans y apporter plus de précision quant à la génération de la note de composante sectorielle; la liste devant se termniner par la dernière appellation métier.
603
  2) En fonction des 5 appellations métiers du secteur listées dans le document précédent correspondant à la note de composante sectorielle, crée une fiche synoptique sous forme d'une fiche descriptive très détaillée et très complète, en 5000 mots, comprenant une liste numérotées de 5 activités professionnelles différentes bien décrites, entrecoupées elles-mêmes par une sous-liste numérotées, imbriquée dans chaque liste activité professionnelle, de 5 compétences professionnelles distinctes et bien décrites commençant par un verbe d'action conformément à la taxonomie de Bloom, marquant une progression dans l'acquisition des compétences.
604
  3) Extrais de la fiche synoptique créée, seulement et strictement la liste des 25 premières activités professionnelles principales et écris-la sur une seule ligne construite de ces mêmes 10 activités séparées par des points virgules, sans phrase d'introduction de type \"Voici...\" et sans y apporter plus de précision quant à la génération de la fiche synoptique; la ligne devant commencer par \"activités : --- Choisir une activité --- ; \" et devant se termniner par la dernière activité professionnelle.
605
  4) Extrais de la fiche synoptique créée, seulement et strictement la liste des 25 premières compétences professionnelles principales et écris-la sur une seule ligne construite de ces mêmes 10 compétences séparées par des points virgules, sans phrase d'introduction de type \"Voici...\" et sans y apporter plus de précision quant à la génération de la fiche synoptique; la ligne devant commencer par \"compétences : --- Choisir une compétence --- ; \" et devant se termniner par la dernière compétence professionnelle.
606
  """
607
+ context_p = f"Contexte : Réponds aux questions suivantes en utilisant seulement le contexte ci-contre. Réponds à la manière d'un ingénieur pédagogique pour créer un référentiel. Essayez donc de comprendre en profondeur le contexte et répondez uniquement en vous basant sur les informations fournies. Contexte: Définition d'une activité : une activité est un ensemble cohérent d'actions combinées : pour la réaliser, plusieurs compétences et opérations sont nécessaires, soit successivement, soit conjointement. Elles s'inscrivent à des moments clés du processus de réalisation et ne peuvent en aucun cas être occultées, car elles conditionnent le résultat. Plusieurs activités en vue d'une finalité avec une valeur ajoutée à un produit ou un service sont nécessaires pour mettre en œuvre un processus métier. De ce fait, il est essentiel de déterminer pour chaque activité sa propre finalité et de s'assurer que l'ensemble des activités participent bien d'un même processus. Définition d'une compétence : la compétence est une combinaison de savoirs en action, mobilisés en vue de réaliser une activité professionnelle. Elle s'apprécie, en tant qu'acquis de l'apprentissage selon des modalités adaptées permettant d'en certifier la possession et au regard de l'atteinte d'un résultat pour un niveau d'exigence prédéterminé. Les compétences peuvent être regroupées par domaines selon la nature et leur liaison subordonnée aux activités. Essayez donc de comprendre en profondeur le contexte et répondez uniquement en vous basant sur les informations fournies. Note de composante sectorielle : {getChain}."
608
+ prompt = PromptTemplate(template=template, input_variables=["question","context"])
609
+ chain = prompt | client_llm
610
+
611
+ msg = cl.Message(author="Datapcc : 🌐🌐🌐",content="")
612
+ async for chunk in chain.astream({"question":question_p,"context":context_p}):
613
+ await msg.stream_token(chunk)
614
+ completionFCS = msg.content
 
615
  await cl.sleep(2)
616
  arrayActivites = completionFCS.split('activités : ')
617
  arrayOfActivites = arrayActivites[1].split('compétences : ')
 
654
  ).send()
655
  await cl.sleep(3)
656
  await cl.Message(
657
+ author="Datapcc : 🌐🌐🌐",content="Fiche synoptique : " + romeListArray[1] + "\n\n" + msg.content
658
  ).send()
659
+ cl.user_session.set("FCS" + romeListArray[0], msg.content)
660
+ cl.user_session.set("contextChatBot", getChain + "\n" + msg.content)
661
  await cl.sleep(2)
662
  listPrompts_name = f"Liste des requêtes sur la fiche synoptique"
663
  prompt_elements = []
 
667
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="📚 Bibliothèque de prompts : " + listPrompts_name, elements=prompt_elements).send()
668
  await cl.sleep(2)
669
  actions = [
670
+ cl.Action(name="download", value=msg.content, description="download_fiche_synoptique")
671
  ]
672
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="Télécharger la fiche", actions=actions).send()
673
  await cl.sleep(2)
674
  saves = [
675
+ cl.Action(name="saveToMemory", value=msg.content, description="Mettre en mémoire la fiche")
676
  ]
677
  await cl.Message(author="Datapcc : 🌐🌐🌐",content="Mettre en mémoire la fiche", actions=saves).send()
678
  await cl.sleep(2)
 
693
  async def construction_NCS(romeListArray):
694
  context = await contexte(romeListArray)
695
  emploisST = cl.user_session.get("EmploiST")
696
+ ### Mistral Completion ###
697
  client_llm = await IA()
698
  structure = str(modele('Note de composante sectorielle'))
699
  definitions = definition('activite') + ' ' + definition('competence')
 
716
  msg = cl.Message(author="Datapcc : 🌐🌐🌐",content="")
717
  async for chunk in chain.astream({"question":question_p,"context":context_p}):
718
  await msg.stream_token(chunk)
719
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
720
  cl.user_session.set("NCS" + romeListArray[0], msg.content)
721
  cl.user_session.set("contextChatBot", context + "\n" + msg.content)
722
  await cl.sleep(2)
 
978
  await construction_MDC(romeListArray,settings)
979
  elif settings['type'] == "Référentiel d'évaluation - REV":
980
  await construction_REV(romeListArray,settings)
 
981
  contextChat = cl.user_session.get("contextChatBot")
982
  if not contextChat:
983
  contextChat = "Il n'y a pas de contexte."
 
1014
 
1015
  @cl.on_message
1016
  async def main(message: cl.Message):
1017
+ async with cl.Step(root=True, name="Réponse de Mistral", type="llm") as parent_step:
1018
  parent_step.input = message.content
1019
  chat_profile = cl.user_session.get("chat_profile")
1020
  chatProfile = chat_profile.split(' - ')