Update main.py
Browse files
main.py
CHANGED
@@ -37,25 +37,12 @@ async def LLModel():
|
|
37 |
|
38 |
@cl.step(type="tool")
|
39 |
async def VectorDatabase(categorie):
|
40 |
-
if categorie == "
|
41 |
-
index_name = "all-venus"
|
42 |
-
embeddings = HuggingFaceEmbeddings()
|
43 |
-
vectorstore = PineconeVectorStore(
|
44 |
-
index_name=index_name, embedding=embeddings, pinecone_api_key=os.getenv('PINECONE_API_KEY')
|
45 |
-
)
|
46 |
-
elif categorie == "year" or categorie == "videosTC":
|
47 |
index_name = "all-jdlp"
|
48 |
embeddings = HuggingFaceEmbeddings()
|
49 |
vectorstore = PineconeVectorStore(
|
50 |
index_name=index_name, embedding=embeddings, pinecone_api_key=os.getenv('PINECONE_API_KEYJDLP')
|
51 |
)
|
52 |
-
elif categorie == "skills":
|
53 |
-
index_name = "all-skills"
|
54 |
-
embeddings = HuggingFaceEmbeddings()
|
55 |
-
vectorstore = PineconeVectorStore(
|
56 |
-
index_name=index_name, embedding=embeddings, pinecone_api_key=os.getenv('PINECONE_API_KEYSKILLS')
|
57 |
-
)
|
58 |
-
|
59 |
return vectorstore
|
60 |
|
61 |
@cl.step(type="retrieval")
|
@@ -81,36 +68,7 @@ async def Search(input, categorie):
|
|
81 |
verbatim_text = ""
|
82 |
count = 0
|
83 |
countOffres = 0
|
84 |
-
if categorie == "
|
85 |
-
search = vectorstore.similarity_search(input,k=50, filter={"categorie": {"$eq": categorie}})
|
86 |
-
for i in range(0,len(search)):
|
87 |
-
if search[i].metadata['Lien'] not in test:
|
88 |
-
if count <= 15:
|
89 |
-
count = count + 1
|
90 |
-
test.append(search[i].metadata['Lien'])
|
91 |
-
sources_text = sources_text + str(count) + ". " + search[i].metadata['Titre'] + ', ' + search[i].metadata['Auteurs'] + ', ' + search[i].metadata['Lien'] + "\n"
|
92 |
-
verbatim_text = verbatim_text + "<p style='font-size:0.8rem'>" + str(count) + ". " + search[i].metadata['Phrase'] + "</p><p> </p>"
|
93 |
-
|
94 |
-
elif categorie == "year":
|
95 |
-
search = vectorstore.similarity_search(input,k=50, filter={"year": {"$gte": 2019}})
|
96 |
-
for i in range(0,len(search)):
|
97 |
-
if count <= 15:
|
98 |
-
count = count + 1
|
99 |
-
sources_text = sources_text + str(count) + ". " + search[i].metadata['title'] + ' (JDLP : ' + str(search[i].metadata['year']) + '), ' + search[i].metadata['author'] + ', https://cipen.univ-gustave-eiffel.fr/fileadmin/CIPEN/OPP/' + search[i].metadata['file'] + "\n"
|
100 |
-
verbatim_text = verbatim_text + "<p style='font-size:0.8rem'>" + str(count) + ". JDLP : " + search[i].metadata['jdlp'] + "</p><p style='font-size:0.8rem'>" + search[i].page_content + "</p>"
|
101 |
-
elif categorie == "skills":
|
102 |
-
search = vectorstore.similarity_search(input,k=50, filter={"file": {"$eq": 'competences-master-CFA.csv'}})
|
103 |
-
searchOffres = vectorstore.similarity_search(input,k=50, filter={"file": {"$eq": 'marche-emploi-CFA.csv'}})
|
104 |
-
for i in range(0,len(search)):
|
105 |
-
if count <= 15:
|
106 |
-
count = count + 1
|
107 |
-
sources_text = sources_text + str(count) + ". " + search[i].metadata['diplôme'] + ' (année : ' + search[i].metadata['année'] + '), ' + search[i].metadata['domaine'] + ', https://www.francecompetences.fr/recherche/rncp/' + str(search[i].metadata['rncp'])[4:] + "/\n"
|
108 |
-
verbatim_text = verbatim_text + "<p style='font-size:0.8rem'>" + str(count) + ". " + search[i].metadata['diplôme'] + "</p><p style='font-size:0.8rem'>" + search[i].page_content + "</p>"
|
109 |
-
for i in range(0,len(searchOffres)):
|
110 |
-
if countOffres <= 15:
|
111 |
-
countOffres = countOffres + 1
|
112 |
-
sources_offres = sources_offres + str(countOffres) + ". " + searchOffres[i].metadata['Poste'] + " (type de contrat : " + searchOffres[i].metadata['Contrat'] + ")\n"
|
113 |
-
elif categorie == "videosTC":
|
114 |
search = vectorstore.similarity_search(input,k=50, filter={"title": {"$eq": "videos-confinement-timeline"}})
|
115 |
for i in range(0,len(search)):
|
116 |
if count <= 17:
|
@@ -124,50 +82,40 @@ async def Search(input, categorie):
|
|
124 |
results = [sources_text, verbatim_text, sources_offres]
|
125 |
return results
|
126 |
|
127 |
-
@cl.
|
128 |
-
async def
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
).send()
|
147 |
-
listPrompts_name = f"Liste des revues de recherche"
|
148 |
-
contentPrompts = """<p><img src='/public/hal-logo-header.png' width='32' align='absmiddle' /> <strong> Hal Archives Ouvertes</strong> : Une archive ouverte est un réservoir numérique contenant des documents issus de la recherche scientifique, généralement déposés par leurs auteurs, et permettant au grand public d'y accéder gratuitement et sans contraintes.
|
149 |
-
</p>
|
150 |
-
<p><img src='/public/logo-persee.png' width='32' align='absmiddle' /> <strong>Persée</strong> : offre un accès libre et gratuit à des collections complètes de publications scientifiques (revues, livres, actes de colloques, publications en série, sources primaires, etc.) associé à une gamme d'outils de recherche et d'exploitation.</p>
|
151 |
-
"""
|
152 |
-
prompt_elements = []
|
153 |
-
prompt_elements.append(
|
154 |
-
cl.Text(content=contentPrompts, name=listPrompts_name, display="side")
|
155 |
-
)
|
156 |
-
await cl.Message(content="📚 " + listPrompts_name, elements=prompt_elements).send()
|
157 |
-
settings = await cl.ChatSettings(
|
158 |
-
[
|
159 |
-
Select(
|
160 |
-
id="Model",
|
161 |
-
label="Publications de recherche",
|
162 |
-
values=["---", "HAL", "Persée"],
|
163 |
-
initial_index=0,
|
164 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
165 |
]
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
cl.user_session.set("selectRequest", res.get("name"))
|
170 |
-
|
171 |
model = await LLModel()
|
172 |
retriever = await Retriever(cl.user_session.get("selectRequest"))
|
173 |
########## Chain with streaming ##########
|
@@ -182,13 +130,7 @@ async def on_chat_start():
|
|
182 |
verbose=False,
|
183 |
retriever=retriever
|
184 |
)
|
185 |
-
cl.user_session.set("runnable", qa)
|
186 |
-
cl.user_session.set("memory", memory)
|
187 |
|
188 |
-
@cl.on_message
|
189 |
-
async def on_message(message: cl.Message):
|
190 |
-
memory = cl.user_session.get("memory")
|
191 |
-
runnable = cl.user_session.get("runnable") # type: Runnable
|
192 |
msg = cl.Message(content="")
|
193 |
|
194 |
class PostMessageHandler(BaseCallbackHandler):
|
@@ -214,13 +156,13 @@ async def on_message(message: cl.Message):
|
|
214 |
)
|
215 |
|
216 |
cb = cl.AsyncLangchainCallbackHandler()
|
217 |
-
results = await
|
218 |
answer = results["answer"]
|
219 |
|
220 |
await cl.Message(content=GoogleTranslator(source='auto', target='fr').translate(answer)).send()
|
221 |
|
222 |
#search = vectorstore.similarity_search(message.content,k=50, filter={"categorie": {"$eq": "bibliographie-OPP-DGDIN"}})
|
223 |
-
search = await Search(message.content,
|
224 |
|
225 |
#os.environ["GOOGLE_CSE_ID"] = os.getenv('GOOGLE_CSE_ID')
|
226 |
#os.environ["GOOGLE_API_KEY"] = os.getenv('GOOGLE_API_KEY')
|
|
|
37 |
|
38 |
@cl.step(type="tool")
|
39 |
async def VectorDatabase(categorie):
|
40 |
+
if categorie == "year" or categorie == "videosTC":
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
index_name = "all-jdlp"
|
42 |
embeddings = HuggingFaceEmbeddings()
|
43 |
vectorstore = PineconeVectorStore(
|
44 |
index_name=index_name, embedding=embeddings, pinecone_api_key=os.getenv('PINECONE_API_KEYJDLP')
|
45 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
return vectorstore
|
47 |
|
48 |
@cl.step(type="retrieval")
|
|
|
68 |
verbatim_text = ""
|
69 |
count = 0
|
70 |
countOffres = 0
|
71 |
+
if categorie == "videosTC":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
search = vectorstore.similarity_search(input,k=50, filter={"title": {"$eq": "videos-confinement-timeline"}})
|
73 |
for i in range(0,len(search)):
|
74 |
if count <= 17:
|
|
|
82 |
results = [sources_text, verbatim_text, sources_offres]
|
83 |
return results
|
84 |
|
85 |
+
@cl.set_chat_profiles
|
86 |
+
async def chat_profile():
|
87 |
+
return [
|
88 |
+
cl.ChatProfile(name="Table ronde autour de l'IA",markdown_description="Vidéo exploratoire autour de l'événement",icon="/public/logo-ofipe.png",),
|
89 |
+
]
|
90 |
+
|
91 |
+
@cl.set_starters
|
92 |
+
async def set_starters():
|
93 |
+
return [
|
94 |
+
cl.Starter(
|
95 |
+
label="IA et gestes professionnels de l’enseignant",
|
96 |
+
message="Comment apprendre une langue étrangère avec l’IA? Comment enseigner en tenant compte des possibilités conversationnelles avec l'IA?",
|
97 |
+
icon="/public/videocam-theme1.svg",
|
98 |
+
),
|
99 |
+
|
100 |
+
cl.Starter(
|
101 |
+
label="IA et gestes professionnels de l’enseignant",
|
102 |
+
message="Comment apprendre une langue étrangère avec l’IA? Comment enseigner en tenant compte des possibilités conversationnelles avec l'IA?",
|
103 |
+
icon="/public/videocam-theme1.svg",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
),
|
105 |
+
cl.Starter(
|
106 |
+
label="IA et gestes professionnels de l’enseignant",
|
107 |
+
message="Comment apprendre une langue étrangère avec l’IA? Comment enseigner en tenant compte des possibilités conversationnelles avec l'IA?",
|
108 |
+
icon="/public/videocam-theme1.svg",
|
109 |
+
),
|
110 |
+
cl.Starter(
|
111 |
+
label="IA et gestes professionnels de l’enseignant",
|
112 |
+
message="Comment apprendre une langue étrangère avec l’IA? Comment enseigner en tenant compte des possibilités conversationnelles avec l'IA?",
|
113 |
+
icon="/public/videocam-theme1.svg",
|
114 |
+
)
|
115 |
]
|
116 |
+
|
117 |
+
@cl.on_message
|
118 |
+
async def on_message(message: cl.Message):
|
|
|
|
|
119 |
model = await LLModel()
|
120 |
retriever = await Retriever(cl.user_session.get("selectRequest"))
|
121 |
########## Chain with streaming ##########
|
|
|
130 |
verbose=False,
|
131 |
retriever=retriever
|
132 |
)
|
|
|
|
|
133 |
|
|
|
|
|
|
|
|
|
134 |
msg = cl.Message(content="")
|
135 |
|
136 |
class PostMessageHandler(BaseCallbackHandler):
|
|
|
156 |
)
|
157 |
|
158 |
cb = cl.AsyncLangchainCallbackHandler()
|
159 |
+
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])
|
160 |
answer = results["answer"]
|
161 |
|
162 |
await cl.Message(content=GoogleTranslator(source='auto', target='fr').translate(answer)).send()
|
163 |
|
164 |
#search = vectorstore.similarity_search(message.content,k=50, filter={"categorie": {"$eq": "bibliographie-OPP-DGDIN"}})
|
165 |
+
search = await Search(message.content, "videosTC")
|
166 |
|
167 |
#os.environ["GOOGLE_CSE_ID"] = os.getenv('GOOGLE_CSE_ID')
|
168 |
#os.environ["GOOGLE_API_KEY"] = os.getenv('GOOGLE_API_KEY')
|