datacipen commited on
Commit
edc46fa
1 Parent(s): de97081

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +18 -126
main.py CHANGED
@@ -2,31 +2,22 @@ import os
2
  import json
3
  import bcrypt
4
  import pandas as pd
 
5
  from typing import List
6
  from pathlib import Path
7
- from langchain_huggingface import HuggingFaceEmbeddings
8
  from langchain_huggingface import HuggingFaceEndpoint
9
- from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
10
  from langchain.schema import StrOutputParser
11
 
12
- from operator import itemgetter
13
- from pinecone import Pinecone
14
- from langchain_pinecone import PineconeVectorStore
15
- from langchain_community.chat_message_histories import ChatMessageHistory
16
- from langchain.memory import ConversationBufferMemory
17
- from langchain.schema.runnable import Runnable, RunnablePassthrough, RunnableConfig, RunnableLambda
18
- from langchain.callbacks.base import BaseCallbackHandler
19
- from langchain.chains import (
20
- StuffDocumentsChain, ConversationalRetrievalChain, create_extraction_chain
21
- )
22
 
23
  import chainlit as cl
24
  from chainlit.input_widget import TextInput, Select, Switch, Slider
25
 
26
  from deep_translator import GoogleTranslator
27
 
28
- from datetime import timedelta
29
-
30
  @cl.step(type="tool")
31
  async def LLMistral():
32
  os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.environ['HUGGINGFACEHUB_API_TOKEN']
@@ -36,106 +27,32 @@ async def LLMistral():
36
  )
37
  return llm
38
 
39
- @cl.step(type="tool")
40
- async def VectorDatabase(categorie):
41
- if categorie == "year" or categorie == "videosTC":
42
- index_name = "all-jdlp"
43
- embeddings = HuggingFaceEmbeddings()
44
- vectorstore = PineconeVectorStore(
45
- index_name=index_name, embedding=embeddings, pinecone_api_key=os.getenv('PINECONE_API_KEYJDLP')
46
- )
47
- return vectorstore
48
-
49
- @cl.step(type="retrieval")
50
- async def Retriever(categorie):
51
- vectorstore = await VectorDatabase(categorie)
52
- if categorie == "videosTC":
53
- retriever = vectorstore.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": .7, "k": 250,"filter": {"title": {"$eq": "videos-table-rondeia"}, "time": {"$gte": 1320}}})
54
- return retriever
55
-
56
- @cl.step(type="embedding")
57
- async def Search(input, categorie):
58
- vectorstore = await VectorDatabase(categorie)
59
- results = []
60
- test = []
61
- sources_text = ""
62
- sources_offres = ""
63
- verbatim_text = ""
64
- count = 0
65
- countOffres = 0
66
- if categorie == "videosTC":
67
- search = vectorstore.similarity_search(input,k=50, filter={"title": {"$eq": "videos-table-rondeia"}, "time": {"$gte": 1320}})
68
- for i in range(0,len(search)):
69
- if count <= 23:
70
- count = count + 1
71
- timeSeq = search[i].metadata["time"]
72
- timeSeqRound = round(timeSeq)
73
- time = timedelta(seconds=timeSeqRound)
74
- sources_text = sources_text + '<div class="gridvid"><a target="_blank" title="' + search[i].metadata['titre'] + ' : ...' + search[i].page_content + '" href="' + search[i].metadata['video'] + '#start=' + str(timeSeq) + '"><img src="' + search[i].metadata['image'] + '" width="100%" alt="' + search[i].metadata['titre'] + ' : ...' + search[i].page_content + '"/><p>🕓 ' + str(time) + ' : ...' + search[i].page_content + ' : ' + search[i].metadata['titre'] + '</p></a></div>'
75
- sources_audio = sources_text + '<div class="gridvid"><a target="_blank" title="' + search[i].metadata['titre'] + ' : ...' + search[i].page_content + '" href="' + search[i].metadata['Audio'] + '#start=' + str(timeSeq) + '"><img src="' + search[i].metadata['thumb'] + '" width="100%" alt="' + search[i].metadata['titre'] + ' : ...' + search[i].page_content + '"/><p>🕓 ' + str(time) + ' : ...' + search[i].page_content + ' : ' + search[i].metadata['titre'] + '</p></a></div>'
76
- verbatim_text = verbatim_text + "<p style='font-size:0.8rem'>" + str(count) + ". " + search[i].metadata['titre'] + "</p><p style='font-size:0.8rem'>🕓 "+ str(time) + " : " + search[i].page_content + "</p>"
77
-
78
- results = [sources_text, verbatim_text, sources_audio]
79
- return results
80
-
81
  @cl.set_chat_profiles
82
  async def chat_profile():
83
  return [
84
- cl.ChatProfile(name="Table ronde autour de l'IA : «IA et gestes professionnels de l’enseignant»",markdown_description="Vidéo exploratoire autour de l'événement",icon="/public/logo-ofipe.png",),
85
  ]
86
 
87
  @cl.set_starters
88
  async def set_starters():
89
  return [
90
  cl.Starter(
91
- label="L'IA comme outil pour les enseignants et les étudiants",
92
- message="Comment les enseignants et les étudiants peuvent-ils utiliser l'IA comme un outil pour améliorer l'apprentissage et l'enseignement ?",
93
- icon="/public/videocam-theme1.svg",
94
- ),
95
-
96
- cl.Starter(
97
- label="Les limites de l'IA et la nécessité de l'intervention humaine",
98
- message="Quelles sont les limites de l'IA et pourquoi est-il important que les enseignants interviennent dans le processus d'apprentissage avec l'IA ?",
99
- icon="/public/videocam-theme2.svg",
100
- ),
101
- cl.Starter(
102
- label="L'importance de l'esprit critique face à l'IA",
103
- message="Comment encourager les étudiants à développer un esprit critique face à l'IA et à ses résultats ?",
104
- icon="/public/videocam-theme3.svg",
105
- ),
106
- cl.Starter(
107
- label="L'éthique et l'IA dans les enseignements du supérieur",
108
- message="Quels sont les enjeux éthiques liés à l'utilisation de l'IA dans les enseignements du supérieur et comment y faire face ?",
109
- icon="/public/videocam-theme4.svg",
110
- ),
111
- cl.Starter(
112
- label="Les impacts de l'IA sur les métiers et les formations",
113
- message="Comment l'IA va transformer les métiers et les formations du supérieur et quels sont les défis à relever ?",
114
- icon="/public/videocam-theme5.svg",
115
- ),
116
- cl.Starter(
117
- label="Les limites de l'IA et les défis technologiques",
118
- message="Quelles sont les limites actuelles de l'IA et quels sont les défis technologiques à relever pour améliorer son utilisation dans les enseignements du supérieur ?",
119
- icon="/public/videocam-theme6.svg",
120
  )
121
- ]
122
 
123
  @cl.on_message
124
  async def on_message(message: cl.Message):
125
- await cl.Message(f"> EVENTIA").send()
126
  model = await LLMistral()
127
- retriever = await Retriever("videosTC")
128
- ########## Chain with streaming ##########
129
- message_history = ChatMessageHistory()
130
- memory = ConversationBufferMemory(memory_key="chat_history",output_key="answer",chat_memory=message_history,return_messages=True)
131
 
132
- qa = ConversationalRetrievalChain.from_llm(
133
- model,
134
- memory=memory,
135
- chain_type="stuff",
136
- return_source_documents=True,
137
  verbose=False,
138
- retriever=retriever
139
  )
140
 
141
  msg = cl.Message(content="")
@@ -163,32 +80,7 @@ async def on_message(message: cl.Message):
163
  )
164
 
165
  cb = cl.AsyncLangchainCallbackHandler()
166
- results = await qa.acall("Contexte : Vous êtes un chercheur de l'enseignement supérieur et vous êtes doué pour faire des analyses d'articles de recherche sur les thématiques liées à la pédagogie, en fonction des critères définis ci-avant. En fonction des informations suivantes et du contexte suivant seulement et strictement, répondez en langue française strictement à la question ci-dessous, en 5000 mots minimum. En plus, tu créeras et tu afficheras, à la fin de ta réponse, 3 questions supplémentaires en relation avec le contexte initial, à chaque étape de la conversation. Tu écriras et tu afficheras les 3 questions supplémentaires en relation avec le contexte initial, à la fin de ta réponse, avec un titrage de niveau 1 qui a pour titre \"Questions en relation avec le contexte : \". Lorsque cela est possible, cite les sources 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. Question : " + message.content, callbacks=[cb])
167
- answer = results["answer"]
168
 
169
- await cl.Message(content=GoogleTranslator(source='auto', target='fr').translate(answer)).send()
170
-
171
- search = await Search(message.content, "videosTC")
172
-
173
- sources = [
174
- cl.Text(name="Sources vidéo", content=search[0], display="inline")
175
- ]
176
- await cl.Message(
177
- content="Vidéos : ",
178
- elements=sources,
179
- ).send()
180
- #if search[2]:
181
- # sourcesOffres = [
182
- # cl.Text(name="Sources audio", content=search[2], display="inline")
183
- # ]
184
- # await cl.Message(
185
- # content="Audio : ",
186
- # elements=sourcesOffres,
187
- # ).send()
188
- verbatim = [
189
- cl.Text(name="Verbatim", content=search[1], display="side")
190
- ]
191
- await cl.Message(
192
- content="📚 Liste des Verbatim ",
193
- elements=verbatim,
194
- ).send()
 
2
  import json
3
  import bcrypt
4
  import pandas as pd
5
+ import numpy as np
6
  from typing import List
7
  from pathlib import Path
 
8
  from langchain_huggingface import HuggingFaceEndpoint
 
9
  from langchain.schema import StrOutputParser
10
 
11
+ from langchain.agents import AgentExecutor
12
+ from langchain.agents.agent_types import AgentType
13
+ from langchain_experimental.agents.agent_toolkits import create_csv_agent
14
+
 
 
 
 
 
 
15
 
16
  import chainlit as cl
17
  from chainlit.input_widget import TextInput, Select, Switch, Slider
18
 
19
  from deep_translator import GoogleTranslator
20
 
 
 
21
  @cl.step(type="tool")
22
  async def LLMistral():
23
  os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.environ['HUGGINGFACEHUB_API_TOKEN']
 
27
  )
28
  return llm
29
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  @cl.set_chat_profiles
31
  async def chat_profile():
32
  return [
33
+ cl.ChatProfile(name="Traitement des données d'enquête : «Expé CFA : questionnaire auprès des professionnels de la branche de l'agencement»",markdown_description="Vidéo exploratoire autour de l'événement",icon="/public/logo-ofipe.png",),
34
  ]
35
 
36
  @cl.set_starters
37
  async def set_starters():
38
  return [
39
  cl.Starter(
40
+ label="Répartition du nombre de CAA dans les entreprises",
41
+ message="Quel est le nombre de chargé.e d'affaires en agencement dans les entreprises?",
42
+ icon="/public/request-theme.svg",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  )
44
+ ]
45
 
46
  @cl.on_message
47
  async def on_message(message: cl.Message):
48
+ await cl.Message(f"> SURVEYIA").send()
49
  model = await LLMistral()
 
 
 
 
50
 
51
+ agent = create_csv_agent(
52
+ llm,
53
+ "./public/ExpeCFA_LP_CAA.csv",
 
 
54
  verbose=False,
55
+ agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION
56
  )
57
 
58
  msg = cl.Message(content="")
 
80
  )
81
 
82
  cb = cl.AsyncLangchainCallbackHandler()
83
+ res = await agent.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])
84
+ answer = res['output']
85
 
86
+ await cl.Message(content=GoogleTranslator(source='auto', target='fr').translate(answer)).send()