datacipen commited on
Commit
0e96436
1 Parent(s): 169e974

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +78 -83
main.py CHANGED
@@ -42,34 +42,78 @@ def auth_callback(username: str, password: str):
42
  identifier=ident + " : 🧑‍🎓 User Datapcc", metadata={"role": "user", "provider": "credentials"}
43
  )
44
 
45
- os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.environ['HUGGINGFACEHUB_API_TOKEN']
46
- repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
47
-
48
- model = HuggingFaceEndpoint(
49
- repo_id=repo_id, max_new_tokens=5500, temperature=1.0, task="text2text-generation", streaming=True
50
- )
51
- os.environ['PINECONE_API_KEY'] = os.environ['PINECONE_API_KEY']
52
- embeddings = HuggingFaceEmbeddings()
53
- index_name = "all-venus"
54
- #pc = Pinecone(
55
- # api_key=os.environ['PINECONE_API_KEY']
56
- #)
57
- #index = pc.Index(index_name)
58
- #xq = embeddings.embed_query(message.content)
59
- #xc = index.query(vector=xq, filter={"categorie": {"$eq": "bibliographie-OPP-DGDIN"}},top_k=150, include_metadata=True)
60
- #context = ""
61
- #for result in xc['matches']:
62
- # context = context + result['metadata']['text']
63
- vectorstore = PineconeVectorStore(
64
- index_name=index_name, embedding=embeddings
65
- )
66
- retriever = vectorstore.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": .7, "k": 150,"filter": {'categorie': {'$eq': 'bibliographie-OPP-DGDIN'}}})
67
- #search = vectorstore.similarity_search(query,k=50, filter={"categorie": {"$eq": "bibliographie-OPP-DGDIN"}, 'Source': {'$eq': 'Source : Persée'}})
68
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  @cl.on_chat_start
70
  async def on_chat_start():
71
  await cl.Message(f"> REVIEWSTREAM").send()
72
- await cl.Message(f"Nous avons le plaisir de vous accueillir dans l'application de recherche et d'analyse des publications.").send()
 
 
 
 
 
 
 
 
 
73
  listPrompts_name = f"Liste des revues de recherche"
74
  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.
75
  </p>
@@ -90,60 +134,24 @@ async def on_chat_start():
90
  ),
91
  ]
92
  ).send()
93
- res = await cl.AskActionMessage(
94
- content="<div style='width:100%;text-align:center'> </div>",
95
- actions=[
96
- cl.Action(name="Pédagogie durable", value="Pédagogie durable", label="🔥 Pédagogie durable : exemple : «quels sont les modèles d'apprentissage dans les universités?»"),
97
- cl.Action(name="Lieux d'apprentissage", value="Lieux d'apprentissage", label="🔥 Lieux d'apprentissage : exemple : «donne des exemples de lieu d'apprentissage dans les universités?»"),
98
- cl.Action(name="jdlp", value="Journée de La Pédagogie", label="🔥 Journée de La Pédagogie : exemple : «Quelles sont les bonnes pratiques des plateformes de e-learning?»"),
99
- ],
100
- timeout="3600"
101
- ).send()
102
-
103
  if res:
104
  await cl.Message(f"Vous pouvez requêter sur la thématique : {res.get('value')}").send()
105
- cl.user_session.set("selectRequest", res.get("value"))
106
 
107
  ########## Chain with streaming ##########
108
  message_history = ChatMessageHistory()
109
  memory = ConversationBufferMemory(memory_key="chat_history",output_key="answer",chat_memory=message_history,return_messages=True)
110
 
111
  qa = ConversationalRetrievalChain.from_llm(
112
- model,
113
  memory=memory,
114
  chain_type="stuff",
115
  return_source_documents=True,
116
  verbose=False,
117
- retriever=retriever
118
  )
119
  cl.user_session.set("runnable", qa)
120
- #template = """<s>[INST] 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.
121
-
122
- #En fonction des informations suivantes et du contexte suivant seulement et strictement, répondez en langue française strictement à la question ci-dessous à partir du contexte ci-dessous. 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.
123
- #{context}
124
- #{question} [/INST] </s>
125
- #"""
126
- #prompt = ChatPromptTemplate.from_messages(
127
- # [
128
- # (
129
- # "system",
130
- # f"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 informations suivantes et du contexte suivant seulement et strictement. Contexte : {context}.",
131
- # ),
132
- # MessagesPlaceholder(variable_name="history"),
133
- # ("human", "Réponds à la question suivante de la manière la plus pertinente, la plus exhaustive et la plus détaillée possible. {question}."),
134
- # ]
135
- #)
136
- #runnable = (
137
- # RunnablePassthrough.assign(
138
- # history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
139
- # )
140
- # | prompt
141
- # | model
142
- # | StrOutputParser()
143
- #)
144
-
145
  cl.user_session.set("memory", memory)
146
- #cl.user_session.set("runnable", runnable)
147
 
148
 
149
  @cl.on_message
@@ -189,21 +197,11 @@ async def on_message(message: cl.Message):
189
 
190
  await cl.Message(content=GoogleTranslator(source='auto', target='fr').translate(answer)).send()
191
 
192
- search = vectorstore.similarity_search(message.content,k=50, filter={"categorie": {"$eq": "bibliographie-OPP-DGDIN"}})
193
- if len(search) > 0:
194
- test = []
195
- sources_text = ""
196
- verbatim_text = ""
197
- count = 0
198
- for i in range(0,len(search)):
199
- if search[i].metadata['Lien'] not in test:
200
- if count <= 15:
201
- count = count + 1
202
- test.append(search[i].metadata['Lien'])
203
- sources_text = sources_text + str(count) + ". " + search[i].metadata['Titre'] + ', ' + search[i].metadata['Auteurs'] + ', ' + search[i].metadata['Lien'] + "\n"
204
- verbatim_text = verbatim_text + "<p>" + str(count) + ". " + search[i].metadata['Phrase'] + "</p><p>&nbsp;</p>"
205
  sources = [
206
- cl.Text(name="Sources", content=sources_text, display="inline")
207
  ]
208
 
209
  await cl.Message(
@@ -211,13 +209,10 @@ async def on_message(message: cl.Message):
211
  elements=sources,
212
  ).send()
213
  verbatim = [
214
- cl.Text(name="Verbatim", content=verbatim_text, display="side")
215
  ]
216
 
217
  await cl.Message(
218
  content="📚 Liste des Verbatim ",
219
  elements=verbatim,
220
- ).send()
221
- #await msg.send()
222
- #memory.chat_memory.add_user_message(message.content)
223
- #memory.chat_memory.add_ai_message(msg.content)
 
42
  identifier=ident + " : 🧑‍🎓 User Datapcc", metadata={"role": "user", "provider": "credentials"}
43
  )
44
 
45
+ def LLModel():
46
+ os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.environ['HUGGINGFACEHUB_API_TOKEN']
47
+ repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
48
+ model = HuggingFaceEndpoint(
49
+ repo_id=repo_id, max_new_tokens=5500, temperature=1.0, task="text2text-generation", streaming=True
50
+ )
51
+ return model
52
+
53
+ def VectorDatabase(categorie):
54
+ if categorie != "year":
55
+ os.environ['PINECONE_API_KEY'] = os.environ['PINECONE_API_KEY']
56
+ index_name = "all-venus"
57
+ else:
58
+ os.environ['PINECONE_API_KEY'] = os.environ['PINECONE_API_KEYJDLP']
59
+ index_name = "all-jdlp"
60
+
61
+ embeddings = HuggingFaceEmbeddings()
62
+ vectorstore = PineconeVectorStore(
63
+ index_name=index_name, embedding=embeddings
64
+ )
65
+ return vectorstore
66
+
67
+ def Retriever(categorie):
68
+ vectorstore = VectorDatabase(categorie)
69
+ if categorie != "year":
70
+ retriever = vectorstore.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": .7, "k": 150,"filter": {'categorie': {'$eq': categorie}}})
71
+ else:
72
+ retriever = vectorstore.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": .7, "k": 150,"filter": {'year': {'$gte': 2019}}})
73
+ #search = vectorstore.similarity_search(query,k=50, filter={"categorie": {"$eq": "bibliographie-OPP-DGDIN"}, 'Source': {'$eq': 'Source : Persée'}})
74
+ return retriever
75
+
76
+ def Search(input, categorie):
77
+ vectorstore = VectorDatabase(categorie)
78
+ results = []
79
+ test = []
80
+ sources_text = ""
81
+ verbatim_text = ""
82
+ count = 0
83
+ if categorie != "year":
84
+ search = vectorstore.similarity_search(input,k=50, filter={"categorie": {"$eq": categorie}})
85
+ for i in range(0,len(search)):
86
+ if search[i].metadata['Lien'] not in test:
87
+ if count <= 15:
88
+ count = count + 1
89
+ test.append(search[i].metadata['Lien'])
90
+ sources_text = sources_text + str(count) + ". " + search[i].metadata['Titre'] + ', ' + search[i].metadata['Auteurs'] + ', ' + search[i].metadata['Lien'] + "\n"
91
+ verbatim_text = verbatim_text + "<p>" + str(count) + ". " + search[i].metadata['Phrase'] + "</p><p>&nbsp;</p>"
92
+
93
+ else:
94
+ search = vectorstore.similarity_search(input,k=50, filter={"year": {"$gte": 2019}})
95
+ for i in range(0,len(search)):
96
+ if count <= 15:
97
+ count = count + 1
98
+ sources_text = sources_text + str(count) + ". " + search[i].metadata['title'] + ' (JDLP : ' + search[i].metadata['year'] + '), ' + search[i].metadata['author'] + ', ' + search[i].metadata['file'] + "\n"
99
+ verbatim_text = verbatim_text + "<p>" + str(count) + ". JDLP : " + search[i].metadata['jdlp'] + "</p><p>" + search[i].metadata['text'] + "</p>"
100
+
101
+ results = [sources_text, verbatim_text]
102
+ return results
103
+
104
  @cl.on_chat_start
105
  async def on_chat_start():
106
  await cl.Message(f"> REVIEWSTREAM").send()
107
+ #await cl.Message(f"Nous avons le plaisir de vous accueillir dans l'application de recherche et d'analyse des publications.").send()
108
+ res = await cl.AskActionMessage(
109
+ content="<div style='width:100%;text-align:center'>Sélectionnez source documentaire</div>",
110
+ actions=[
111
+ cl.Action(name="bibliographie-OPP-DGDIN", value="Pédagogie durable", label="🔥 Pédagogie durable : exemple : «quels sont les modèles d'apprentissage dans les universités?��"),
112
+ cl.Action(name="bibliographie-OPP-DGDIN", value="Lieux d'apprentissage", label="🔥 Lieux d'apprentissage : exemple : «donne des exemples de lieu d'apprentissage dans les universités?»"),
113
+ cl.Action(name="year", value="Journée de La Pédagogie", label="🔥 Journée de La Pédagogie : exemple : «Quelles sont les bonnes pratiques des plateformes de e-learning?»"),
114
+ ],
115
+ timeout="3600"
116
+ ).send()
117
  listPrompts_name = f"Liste des revues de recherche"
118
  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.
119
  </p>
 
134
  ),
135
  ]
136
  ).send()
 
 
 
 
 
 
 
 
 
 
137
  if res:
138
  await cl.Message(f"Vous pouvez requêter sur la thématique : {res.get('value')}").send()
139
+ cl.user_session.set("selectRequest", res.get("name"))
140
 
141
  ########## Chain with streaming ##########
142
  message_history = ChatMessageHistory()
143
  memory = ConversationBufferMemory(memory_key="chat_history",output_key="answer",chat_memory=message_history,return_messages=True)
144
 
145
  qa = ConversationalRetrievalChain.from_llm(
146
+ LLModel(),
147
  memory=memory,
148
  chain_type="stuff",
149
  return_source_documents=True,
150
  verbose=False,
151
+ retriever=Retriever(res.get("name"))
152
  )
153
  cl.user_session.set("runnable", qa)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
  cl.user_session.set("memory", memory)
 
155
 
156
 
157
  @cl.on_message
 
197
 
198
  await cl.Message(content=GoogleTranslator(source='auto', target='fr').translate(answer)).send()
199
 
200
+ #search = vectorstore.similarity_search(message.content,k=50, filter={"categorie": {"$eq": "bibliographie-OPP-DGDIN"}})
201
+ search = Search(message.content, res.get("name"))
202
+
 
 
 
 
 
 
 
 
 
 
203
  sources = [
204
+ cl.Text(name="Sources", content=search[0], display="inline")
205
  ]
206
 
207
  await cl.Message(
 
209
  elements=sources,
210
  ).send()
211
  verbatim = [
212
+ cl.Text(name="Verbatim", content=search[1], display="side")
213
  ]
214
 
215
  await cl.Message(
216
  content="📚 Liste des Verbatim ",
217
  elements=verbatim,
218
+ ).send()