Ludovicollin commited on
Commit
0ff4c1d
·
verified ·
1 Parent(s): 57d9093

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +113 -74
main.py CHANGED
@@ -28,6 +28,9 @@ from offres_emploi.utils import dt_to_str_iso
28
  import datetime
29
  import bcrypt
30
  import json
 
 
 
31
 
32
  @cl.password_auth_callback
33
  def auth_callback(username: str, password: str):
@@ -46,6 +49,20 @@ def auth_callback(username: str, password: str):
46
  identifier=ident + " : 🧑‍🎓 User Datapcc", metadata={"role": "user", "provider": "credentials"}
47
  )
48
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  def modele(document):
50
  if document == "Note de composante sectorielle":
51
  note = """
@@ -368,81 +385,103 @@ async def setup_agent(settings):
368
  message_id3 = await cl.Message(content="🕝 Récupération de la note sectorielle").send()
369
  taskFCS1.forId = message_id3
370
  await FCS.send()
371
- question ="""
372
- 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.
373
- 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 4000 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.
374
- 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.
375
- 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.
376
- """
377
- taskFCS1.status = cl.TaskStatus.DONE
378
- await FCS.send()
379
- message_id4 = await cl.Message(content="🕝 Construction de la Fiche synoptique : " + romeListArray[1]).send()
380
- taskFCS2.forId = message_id4
381
- await FCS.send()
382
- completion_FCS = anthropic.completions.create(
383
- model="claude-2.1",
384
- max_tokens_to_sample=4000,
385
- temperature=1,
386
- prompt=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 : {cl.user_session.get('NCS' + romeListArray[0])}.${HUMAN_PROMPT}. Questions : {question}${AI_PROMPT}",
387
- )
388
- taskFCS2.status = cl.TaskStatus.DONE
389
- await FCS.send()
390
- await cl.sleep(2)
391
- completionFCS = completion_FCS.completion
392
- arrayActivites = completionFCS.split('activités : ')
393
- arrayOfActivites = arrayActivites[1].split('compétences : ')
394
- arrayOfCompetences = completionFCS.split('compétences : ')
395
- arrayOfRome = cl.user_session.get("arraySettingsRome")
396
- if settings['rome']:
397
- indexOfRome = np.where(arrayOfRome==settings['rome'])[0][0]
398
- else:
399
- indexOfRome = 0
400
- #initialRome = cl.user_session.get('romeFree')
401
- settings = await cl.ChatSettings(
402
- [
403
- Select(
404
- id="rome",
405
- label="Codes Rome",
406
- values=["", "M1302 - DU entrepreneuriat", "F1106,F1201,F1103,H1206,K1802 - Licence Génie Urbain", "M1502,M1503 - LP Gestion Opérationnelles des Ressources Humaines", "K1902 - LP Management et Droits des Affaires Immobilières"],
407
- initial_index=indexOfRome,
408
- ),
409
- TextInput(id="romeInput", label="ou saisir une liste de codes ROME jusqu'à 5 codes", initial=settings['romeInput'], placeholder="ou saisir une liste de codes ROME jusqu'à 5 codes", tooltip="saisir une liste de codes Rome séparés par des virgules, jusqu'à 5 codes ROME"),
410
- Select(
411
- id="type",
412
- label="Type de fiche",
413
- values=["", "Note de composante sectorielle - NCS", "Fiche synoptique - FCS", "Fiche activité - FCA", "Fiche compétence - FCC", "Module de formation - cours - MDF", "Matrice de cohérences - MDC", "Référentiel d'évaluation - REV"],
414
- initial_index=2,
415
- ),
416
- Select(
417
- id="activite",
418
- label="Activites",
419
- values=arrayOfActivites[0].split(';'),
420
- initial_index=0,
421
- ),
422
- TextInput(id="activiteInput", label="ou saisir une activité", placeholder="ou saisir une activité", tooltip="saisir votre propre activité professionnelle pour en avoir un descriptif détaillé"),
423
- Select(
424
- id="competence",
425
- label="Competences",
426
- values=arrayOfCompetences[1].split(';'),
427
- initial_index=0,
428
- ),
429
- TextInput(id="competenceInput", label="ou saisir une compétence", placeholder="ou saisir une compétence", tooltip="saisir votre propre compétence professionnelle pour en avoir un descriptif détaillé"),
430
- ]
431
- ).send()
432
- await cl.sleep(2)
433
- await cl.Message(
434
- author="Datapcc : 🌐🌐🌐",content="Fiche synoptique : " + romeListArray[1] + "\n\n" + completion_FCS.completion
435
  ).send()
436
- cl.user_session.set("FCS" + romeListArray[0], completion_FCS.completion)
437
- cl.user_session.set("contextChatBot", completion_FCS.completion)
438
- actions = [
439
- cl.Action(name="download", value=completion_FCS.completion, description="download_fiche_synoptique")
440
- ]
441
- await cl.Message(author="Datapcc : 🌐🌐🌐",content="Download", actions=actions).send()
442
- await cl.sleep(2)
443
- await FCS.remove()
444
- cl.user_session.set("allactivities", arrayOfActivites[0])
445
- cl.user_session.set("allskills", arrayOfCompetences[1])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
446
  else:
447
  await cl.Message(
448
  author="Datapcc : 🌐🌐🌐",content="⛔ Vous n'avez pas encore créé de Note sectorielle!"
 
28
  import datetime
29
  import bcrypt
30
  import json
31
+ from langchain.document_loaders import PyPDFLoader, TextLoader
32
+ from chainlit.types import AskFileResponse
33
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
34
 
35
  @cl.password_auth_callback
36
  def auth_callback(username: str, password: str):
 
49
  identifier=ident + " : 🧑‍🎓 User Datapcc", metadata={"role": "user", "provider": "credentials"}
50
  )
51
 
52
+ def process_file(file: AskFileResponse):
53
+ if file.type == "text/plain":
54
+ Loader = TextLoader
55
+ elif file.type == "application/pdf":
56
+ Loader = PyPDFLoader
57
+
58
+ text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
59
+ loader = Loader(file.path)
60
+ documents = loader.load()
61
+ docs = text_splitter.split_documents(documents)
62
+ for i, doc in enumerate(docs):
63
+ doc.metadata["source"] = f"source_{i}"
64
+ return docs
65
+
66
  def modele(document):
67
  if document == "Note de composante sectorielle":
68
  note = """
 
385
  message_id3 = await cl.Message(content="🕝 Récupération de la note sectorielle").send()
386
  taskFCS1.forId = message_id3
387
  await FCS.send()
388
+
389
+
390
+ goFCS = await cl.AskActionMessage(
391
+ content="Voulez-vous téléverser votre propre document de Note sectorielle?",
392
+ actions=[
393
+ cl.Action(name="continue", value="continue", label="✅ Oui, je veux charger ma note sectorielle"),
394
+ cl.Action(name="cancel", value="cancel", label="❌ Non, je veux continuer avec la version du contexte"),
395
+ ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
396
  ).send()
397
+
398
+ if goFCS and goFCS.get("value") == "continue":
399
+ files = None
400
+
401
+ while files == None:
402
+ files = await cl.AskFileMessage(
403
+ content="Please upload a text file to begin!", accept=["text/plain"]
404
+ ).send()
405
+
406
+ text_file = files[0]
407
+ docs = process_file(text_file)
408
+ cl.user_session.set('NCS' + romeListArray[0], docs)
409
+ else:
410
+ question ="""
411
+ 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.
412
+ 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 4000 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.
413
+ 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.
414
+ 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.
415
+ """
416
+ taskFCS1.status = cl.TaskStatus.DONE
417
+ await FCS.send()
418
+ message_id4 = await cl.Message(content="🕝 Construction de la Fiche synoptique : " + romeListArray[1]).send()
419
+ taskFCS2.forId = message_id4
420
+ await FCS.send()
421
+ completion_FCS = anthropic.completions.create(
422
+ model="claude-2.1",
423
+ max_tokens_to_sample=4000,
424
+ temperature=1,
425
+ prompt=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 : {cl.user_session.get('NCS' + romeListArray[0])}.${HUMAN_PROMPT}. Questions : {question}${AI_PROMPT}",
426
+ )
427
+ taskFCS2.status = cl.TaskStatus.DONE
428
+ await FCS.send()
429
+ await cl.sleep(2)
430
+ completionFCS = completion_FCS.completion
431
+ arrayActivites = completionFCS.split('activités : ')
432
+ arrayOfActivites = arrayActivites[1].split('compétences : ')
433
+ arrayOfCompetences = completionFCS.split('compétences : ')
434
+ arrayOfRome = cl.user_session.get("arraySettingsRome")
435
+ if settings['rome']:
436
+ indexOfRome = np.where(arrayOfRome==settings['rome'])[0][0]
437
+ else:
438
+ indexOfRome = 0
439
+ #initialRome = cl.user_session.get('romeFree')
440
+ settings = await cl.ChatSettings(
441
+ [
442
+ Select(
443
+ id="rome",
444
+ label="Codes Rome",
445
+ values=["", "M1302 - DU entrepreneuriat", "F1106,F1201,F1103,H1206,K1802 - Licence Génie Urbain", "M1502,M1503 - LP Gestion Opérationnelles des Ressources Humaines", "K1902 - LP Management et Droits des Affaires Immobilières"],
446
+ initial_index=indexOfRome,
447
+ ),
448
+ TextInput(id="romeInput", label="ou saisir une liste de codes ROME jusqu'à 5 codes", initial=settings['romeInput'], placeholder="ou saisir une liste de codes ROME jusqu'à 5 codes", tooltip="saisir une liste de codes Rome séparés par des virgules, jusqu'à 5 codes ROME"),
449
+ Select(
450
+ id="type",
451
+ label="Type de fiche",
452
+ values=["", "Note de composante sectorielle - NCS", "Fiche synoptique - FCS", "Fiche activité - FCA", "Fiche compétence - FCC", "Module de formation - cours - MDF", "Matrice de cohérences - MDC", "Référentiel d'évaluation - REV"],
453
+ initial_index=2,
454
+ ),
455
+ Select(
456
+ id="activite",
457
+ label="Activites",
458
+ values=arrayOfActivites[0].split(';'),
459
+ initial_index=0,
460
+ ),
461
+ TextInput(id="activiteInput", label="ou saisir une activité", placeholder="ou saisir une activité", tooltip="saisir votre propre activité professionnelle pour en avoir un descriptif détaillé"),
462
+ Select(
463
+ id="competence",
464
+ label="Competences",
465
+ values=arrayOfCompetences[1].split(';'),
466
+ initial_index=0,
467
+ ),
468
+ TextInput(id="competenceInput", label="ou saisir une compétence", placeholder="ou saisir une compétence", tooltip="saisir votre propre compétence professionnelle pour en avoir un descriptif détaillé"),
469
+ ]
470
+ ).send()
471
+ await cl.sleep(2)
472
+ await cl.Message(
473
+ author="Datapcc : 🌐🌐🌐",content="Fiche synoptique : " + romeListArray[1] + "\n\n" + completion_FCS.completion
474
+ ).send()
475
+ cl.user_session.set("FCS" + romeListArray[0], completion_FCS.completion)
476
+ cl.user_session.set("contextChatBot", completion_FCS.completion)
477
+ actions = [
478
+ cl.Action(name="download", value=completion_FCS.completion, description="download_fiche_synoptique")
479
+ ]
480
+ await cl.Message(author="Datapcc : 🌐🌐🌐",content="Download", actions=actions).send()
481
+ await cl.sleep(2)
482
+ await FCS.remove()
483
+ cl.user_session.set("allactivities", arrayOfActivites[0])
484
+ cl.user_session.set("allskills", arrayOfCompetences[1])
485
  else:
486
  await cl.Message(
487
  author="Datapcc : 🌐🌐🌐",content="⛔ Vous n'avez pas encore créé de Note sectorielle!"