Update main.py
Browse files
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
|
13 |
-
from
|
14 |
-
from
|
15 |
-
|
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="
|
85 |
]
|
86 |
|
87 |
@cl.set_starters
|
88 |
async def set_starters():
|
89 |
return [
|
90 |
cl.Starter(
|
91 |
-
label="
|
92 |
-
message="
|
93 |
-
icon="/public/
|
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">
|
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 |
-
|
133 |
-
|
134 |
-
|
135 |
-
chain_type="stuff",
|
136 |
-
return_source_documents=True,
|
137 |
verbose=False,
|
138 |
-
|
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 |
-
|
167 |
-
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()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|