Spaces:
Running
Running
Update main.py
Browse files
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 |
-
|
253 |
-
|
254 |
-
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
593 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
600 |
-
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
|
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" +
|
651 |
).send()
|
652 |
-
cl.user_session.set("FCS" + romeListArray[0],
|
653 |
-
cl.user_session.set("contextChatBot", getChain + "\n" +
|
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=
|
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=
|
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 |
-
###
|
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
|
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(' - ')
|