File size: 6,096 Bytes
29b90eb
 
 
 
2a7178c
 
 
1b1c727
29b90eb
2a7178c
 
29b90eb
 
 
 
2a7178c
ef76d79
6045fcb
d828429
29b90eb
df56330
2a7178c
 
a80aaeb
2a7178c
 
 
29b90eb
f9b31f3
8f9121f
 
 
 
 
 
29b90eb
 
1ecd0db
29b90eb
2a7178c
0833632
1b1c727
 
 
 
0833632
 
 
 
 
1b1c727
 
 
 
 
 
 
 
 
 
8f9121f
1b1c727
6574594
8f9121f
1b1c727
 
 
 
2c8b688
2a7178c
29b90eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from langchain_anthropic import ChatAnthropic
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.memory import ChatMessageHistory, ConversationBufferMemory
from langchain.schema import StrOutputParser
from langchain.schema.runnable import Runnable, RunnablePassthrough, RunnableLambda
from langchain.schema.runnable.config import RunnableConfig
from langchain.schema import StrOutputParser
from langchain.document_loaders.csv_loader import CSVLoader
import os
import pandas as pd
import numpy as np

from langchain.agents.agent_types import AgentType
from langchain_experimental.agents.agent_toolkits import create_csv_agent

import chainlit as cl

os.environ["ANTHROPIC_API_KEY"] = os.environ["ANTHROPIC_API_KEY"]

def library():
    return "Exemple de requêtes sur les données de l'enquête.\n\nQ1 : Quels sont les équipements préférentiels des étudiant.e.s?\nQ2 : Quels sont les 3 outils numériques principaux de l'université pour le travail universitaire?\nQ3 : Quels sont les outils numériques de l'université préférés des étudiant.e.s?\nQ4 : Quels sont les réseaux sociaux préférés des étudiant.e.s?\nQ5 : Quels sont les outils numériques de l'université préférés des étudiant.e.s pour communiquer?\nQ6 : Quels sont les outils numériques de l'université préférés des étudiant.e.s pour le travail universitaire?\nQ7 : Quel est l'usage du mail de l'université?\nQ8 : Quel est l'usage de l'ENT de l'université?\nQ9 : Donne le pourcentage d'étudiant.e.s en licence3 qui utilise souvent Moodle?\nQ10 : Donne le pourcentage d'étudiant.e.s en licence1 qui utilise souvent le mail?\nQ11 : Donne le pourcentage d'étudiant.e.s en licence1 de la filière Sciences économiques qui utilise souvent le mail?\nQ12 : Pourquoi les étudiants utilisent WhatsApp?\nQ13 : Pourquoi les étudiants utilisent Discord?\nQ14 : Quels avantages représentent les outils numériques?\nQ15 : Quelles sont les principales difficultés?\nQ16 : Compare l'usage de l'ENT par rapport à l'usage de l'email."
@cl.author_rename
def rename(orig_author: str):
    rename_dict = {"AgentExecutor": "Agent conversationnel", "Error": "Réponse de l'assistant", "DatapccSkillStream": "Copilot", "load_memory_variables": "Historique de conversation 💬", "Retriever": "Agent conversationnel", "StuffDocumentsChain": "Chaîne de documents", "LLMChain": "Agent", "ChatAnthropic": "Réponse de l'IA 🤖"}
    return rename_dict.get(orig_author, orig_author)

@cl.on_chat_start
async def on_chat_start():
    await cl.Message(f"> Votre assistant conversationnel vous permet d'analyser les données du marché de l'emploi par formation, issues de France Travail.").send()
    #listPrompts_name = f"Liste des requêtes"
    #prompt_elements = []
    #prompt_elements.append(
    #    cl.Text(content=library(), name=listPrompts_name)
    #)
    #await cl.Message(content="📚 Bibliothèque de questions : " + listPrompts_name, elements=prompt_elements).send()
    await cl.Avatar(
        name="You",
        url="https://cipen.univ-gustave-eiffel.fr/typo3conf/ext/cipen_package/Resources/Public/Dataviz/datalab/Venus/logo-ofipe.jpg",
    ).send()
    
    loader = CSVLoader(file_path="./public/FilesMarcheEmploi.csv", csv_args={"delimiter": ",", "fieldnames": ["Label", "Number"],},)

    data = loader.load()
    actions = []
    for j in range(0,len(data)):
        datas = data[j].page_content
        datasArray = datas.split(':')
        label = datasArray[1].replace('Number','')
        value = datasArray[2]
        actions.append(cl.Action(name="selectRome", value=value, label=label),)

    selectRome = await cl.AskActionMessage(
        content="Sélectionnez une formation pour laquelle le COPILOT vous assistera :",
        actions=actions,
    ).send()

    if selectRome and selectRome.get("name") == "selectRome":
        await cl.Message(
            content=f"Vous pouvez utiliser le COPILOT pour répondre à vos questions sur : \"{selectRome.get('label')}\", Codes ROME : \"{selectRome.get('value')}\"",
        ).send()
        selectRomes = selectRome.get('value')
        agent = create_csv_agent(
            ChatAnthropic(temperature=1,model_name="claude-3-opus-20240229"),
            "https://cipen.univ-gustave-eiffel.fr/typo3conf/ext/cipen_package/Resources/Public/Dataviz/datalab/crossfilterings/EmploisRome/" + selectRomes[1:] + ".csv",
            verbose=False,
            agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
        )
        cl.user_session.set("runnable", agent)

@cl.on_message
async def on_message(message: cl.Message):
    memory= cl.user_session.get("memory")
    runnable = cl.user_session.get("runnable")  # type: Runnable
    cb = cl.AsyncLangchainCallbackHandler()
    try:
        res = await runnable.acall("Réponds en langue française à la question suivante :\n" + message.content + "\nDétaille la réponse en faisant une analyse complète.", callbacks=[cb])
        await cl.Message(author="COPILOT",content=res['output']).send()
        listPrompts_name = f"Liste des requêtes"
        prompt_elements = []
        prompt_elements.append(
            cl.Text(content=library(), name=listPrompts_name)
        )
        await cl.Message(content="📚 Bibliothèque de questions : " + listPrompts_name, elements=prompt_elements).send()
    except ValueError as e:
        res = str(e)
        resArray = res.split(":")
        ans = ''
        if str(res).find('parsing') != -1:
            for i in range(2,len(resArray)):
                ans += resArray[i]
            await cl.Message(author="COPILOT",content=ans.replace("`","")).send()
            listPrompts_name = f"Liste des requêtes"
            prompt_elements = []
            prompt_elements.append(
                cl.Text(content=library(), name=listPrompts_name)
            )
            await cl.Message(content="📚 Bibliothèque de questions : " + listPrompts_name, elements=prompt_elements).send()
        else:
            await cl.Message(author="COPILOT",content="Reformulez votre requête, s'il vous plait 😃").send()