from langchain_community.llms import HuggingFaceEndpoint from langchain_core.prompts import PromptTemplate 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 import os import pandas as pd import numpy as np from langchain.agents import AgentExecutor from langchain.agents.agent_types import AgentType from langchain_experimental.agents.agent_toolkits import create_csv_agent from deep_translator import GoogleTranslator import chainlit as cl 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", "HuggingFaceEndpoint": "Réponse de Mistral AI 🤖"} 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 de l'enquête sur les usages du numérique par les étudiant.e.s Licence").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() os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.environ['HUGGINGFACEHUB_API_TOKEN'] repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1" llm = HuggingFaceEndpoint( repo_id=repo_id, temperature=1.0 ) agent = create_csv_agent( llm, "https://cipen.univ-gustave-eiffel.fr/typo3conf/ext/cipen_package/Resources/Public/Dataviz/datalab/crossfilterings/enquete-DClic-juin2022-dataviz-ord1.csv", verbose=True, 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 en 2000 mots minimum.", callbacks=[cb]) await cl.Message(author="COPILOT",content=GoogleTranslator(source='auto', target='fr').translate(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()