Ludovicollin commited on
Commit
d94788c
·
verified ·
1 Parent(s): b2cc4ad

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +12 -144
main.py CHANGED
@@ -15,8 +15,13 @@ import pinecone
15
  from langchain.memory import ChatMessageHistory, ConversationBufferMemory
16
  import pandas as pd
17
  import numpy as np
18
- from anthropic import Anthropic, HUMAN_PROMPT, AI_PROMPT
19
- from langchain.chat_models import ChatAnthropic
 
 
 
 
 
20
  import chainlit as cl
21
  from chainlit.input_widget import TextInput
22
  from chainlit import user_session
@@ -25,11 +30,11 @@ from offres_emploi.utils import dt_to_str_iso
25
  import datetime
26
 
27
  os.environ["TOKENIZERS_PARALLELISM"] = os.environ["TOKENIZERS_PARALLELISM"]
28
- os.environ['ANTHROPIC_API_KEY'] = os.environ['ANTHROPIC_API_KEY']
29
 
30
  @cl.author_rename
31
  def rename(orig_author: str):
32
- rename_dict = {"ConversationalRetrievalChain": "💬 Assistant conversationnel", "Retriever": "Agent conversationnel", "StuffDocumentsChain": "Chaîne de documents", "LLMChain": "Agent", "ChatAnthropic": "🤖 IA"}
33
  return rename_dict.get(orig_author, orig_author)
34
 
35
  @cl.action_callback("download")
@@ -161,10 +166,9 @@ async def start():
161
  chat_memory=message_history,
162
  return_messages=True,
163
  )
164
- streaming_llm = ChatAnthropic(
165
  streaming=True,
166
- temperature=1,
167
- max_tokens=4000
168
  )
169
  qa = ConversationalRetrievalChain.from_llm(
170
  streaming_llm,
@@ -175,85 +179,6 @@ async def start():
175
  retriever=retriever_to_cache()
176
  )
177
  cl.user_session.set("conversation_chain", qa)
178
- elif chatProfile[0] == 'Emplois':
179
- poleemploi = cl.TaskList()
180
- poleemploi.status = "Running..."
181
-
182
- # Create a task and put it in the running state
183
- task1 = cl.Task(title="Chargement des données du marché de l'emploi, en attente...", status=cl.TaskStatus.RUNNING)
184
- await poleemploi.add_task(task1)
185
- await poleemploi.send()
186
- logo = [
187
- cl.Image(name="Logo", size="small", display="inline", path="./public/logo_light.png")
188
- ]
189
-
190
- await cl.Message(author="🌐🌐🌐",content="", elements=logo).send()
191
- #file = to_cache(chatProfile[0])
192
- await cl.Message(author="🌐🌐🌐",content=f"💻😊 Vous pouvez rechercher des \"{chat_profile}\"!").send()
193
- await cl.Message(
194
- author="🌐🌐🌐",content=f"💡Voici des exemples de requête \n\t1️⃣ Basée sur un code ROME : M1403\n\t2️⃣ Basée sur une appellation métier : Coach sportif"
195
- ).send()
196
- task1.status = cl.TaskStatus.DONE
197
- await cl.sleep(0.5)
198
- await poleemploi.remove()
199
- cl.user_session.set("memory", ConversationBufferMemory(return_messages=True))
200
- memory = cl.user_session.get("memory")
201
- cl.user_session.set("runnable", memory)
202
- else:
203
- emploi = cl.TaskList()
204
- emploi.status = "Running..."
205
-
206
- # Create a task and put it in the running state
207
- task1 = cl.Task(title="Chargement des données du marché de l'emploi, en attente...", status=cl.TaskStatus.RUNNING)
208
- await emploi.add_task(task1)
209
- await emploi.send()
210
- logo = [
211
- cl.Image(name="Logo", size="small", display="inline", path="./public/logo_light.png")
212
- ]
213
-
214
- await cl.Message(author="🌐🌐🌐",content="", elements=logo).send()
215
- file = to_cache(chatProfile[0])
216
- await cl.Message(author="🌐🌐🌐",content=f"💻😊 Vous pouvez poser vos questions concernant le marché de l'emploi de \"{chat_profile}\"!").send()
217
- await cl.Message(author="🌐🌐🌐",content=f"📈 Le marché de l'emploi se présente comme un gros tableau structuré comme suit :\n1. Emplois\n2. Type de contrat\n3. Expérience\n4. Compétences professionnelles\n5. Salaire\n6. Qualification\n7. Localisation").send()
218
- await cl.Message(
219
- author="🌐🌐🌐",content=f"💡Voici des exemples de question \n\t1️⃣ Peux-tu créer une liste de 5 emplois différents les plus listés ?\n\t2️⃣ Peux-tu créer une liste de 5 emplois différents les plus listés avec leur salaire moyen correspondant à chacun de ces emplois?\n\t3️⃣ Peux-tu créer une liste de 5 emplois différents les plus listés et leur répartition dans les localisations suivantes, le 75, ou le 77, ou le 78, ou le 91, ou le 92, ou le 93, ou le 94, ou le 95?\n\t4️⃣ Peux-tu créer une liste de 5 emplois différents les plus listés pour un niveau de qualification Bac+2 Bac+3?\n\t5️⃣ Peux-tu créer une liste de 5 emplois différents les plus listés et associer 2 compétences professionnelles à chaque emploi, de type activités professionnelles, sans lister les compétences transversales?\n\t6️⃣ Peux-tu créer une liste de 5 emplois différents les plus listés avec un contrat en CDI?\n\t7️⃣ Quelles sont les compétences professionnelles les mieux payées?"
220
- ).send()
221
- model = ChatAnthropic(model="claude-2.1",top_p=0.9,temperature=1,max_tokens_to_sample=4097,streaming=True)
222
- df = pd.read_csv(file, sep=",")
223
- df = df.replace(np.nan, '', regex=True)
224
- df['combined'] = 'Emploi ' + df['Poste'] + '; type de contrat : ' + df['Contrat'] + '; Compétences professionnelles : ' + df['Savoir'] + '; Salaire : ' + df['Salaire'] + '; Niveau de qualification : ' + df['Niveau'] + '; Localisation : ' + df['Localisation']
225
-
226
- context = []
227
- for i, row in df.iterrows():
228
- context.append(row['combined'])
229
-
230
- context = "\n".join(context)
231
- context = context[0:590000]
232
- task1.status = cl.TaskStatus.DONE
233
- await cl.sleep(5)
234
- await emploi.remove()
235
- cl.user_session.set("memory", ConversationBufferMemory(return_messages=True))
236
- memory = cl.user_session.get("memory")
237
- prompt = ChatPromptTemplate.from_messages(
238
- [
239
- (
240
- "system",
241
- f"Contexte : Vous êtes un spécialiste du marché de l'emploi en fonction du niveau de qualification, des compétences professionnelles, des compétences transversales, du salaire et de l'expérience. Vous êtes doué pour faire des analyses sur les métiers les plus demandés grâce à votre aptitude à synthétiser les informations en fonction des critères définis ci-avant. En fonction des informations suivantes et du contexte suivant seulement et strictement. En fonction des informations suivantes et du contexte suivant seulement et strictement. Contexte et document : {context}. Réponds en langue française strictement à la question suivante en respectant strictement les données du document. 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.",
242
- ),
243
- MessagesPlaceholder(variable_name="history"),
244
- ("human", "{question}, d'après le document en vous réferrant strictement aux données du contexte fixé sans faire de recherche dans vos connaissances ou sur le web? Si les emplois sont différents aux données, recommencez votre liste. Réponse sous forme d'une liste. Si tu ne peux pas donner la liste, fais une projection par emplois."),
245
- ]
246
- )
247
- #runnable = prompt | model | StrOutputParser()
248
- runnable = (
249
- RunnablePassthrough.assign(
250
- history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
251
- )
252
- | prompt
253
- | model
254
- | StrOutputParser()
255
- )
256
- cl.user_session.set("runnable", runnable)
257
 
258
  @cl.on_message
259
  async def main(message: cl.Message):
@@ -289,61 +214,4 @@ async def main(message: cl.Message):
289
  await cl.Message(author="🌐🌐🌐",content="Download", actions=actions).send()
290
 
291
  if metadatas:
292
- await cl.Message(author="🌐🌐🌐",content="Sources : " + metadatas, elements=text_elements).send()
293
- elif chatProfile[0] == "Emplois":
294
- client = Api(client_id=os.environ['POLE_EMPLOI_CLIENT_ID'],
295
- client_secret=os.environ['POLE_EMPLOI_CLIENT_SECRET'])
296
- runnable = cl.user_session.get("runnable")
297
- memory = cl.user_session.get("memory")
298
- msg = cl.Message(author="🌐🌐🌐",content="")
299
- todayDate = datetime.datetime.today()
300
- month, year = (todayDate.month-1, todayDate.year) if todayDate.month != 1 else (12, todayDate.year-1)
301
- start_dt = todayDate.replace(day=1, month=month, year=year)
302
-
303
- end_dt = datetime.datetime.today()
304
-
305
- params = {"motsCles": message.content,'lieux':'75D','minCreationDate': dt_to_str_iso(start_dt),'maxCreationDate': dt_to_str_iso(end_dt),'range':'0-149'}
306
- search_on_big_data = client.search(params=params)
307
- results = search_on_big_data["resultats"]
308
- emplois = []
309
- text_elements = []
310
- for i in range(0,len(results)):
311
- emplois.append("✔️ Emploi : " + results[i]['intitule'] + "\nCode ROME : " + results[i]['romeCode'] + "\nLien vers Pôle Emploi : https://candidat.pole-emploi.fr/offres/recherche/detail/" + results[i]['id'] + "\n\nDescription : " + results[i]['description'] + "\n\n")
312
- emplois_list = ''.join(emplois)
313
- await msg.stream_token(emplois_list)
314
- await msg.send()
315
- listEmplois_name = f"Liste des emplois"
316
- text_elements.append(
317
- cl.Text(content="Question : " + message.content + "\n\nRéponse :\n" + msg.content, name=listEmplois_name)
318
- )
319
- actions = [
320
- cl.Action(name="download", value="Question : " + message.content + "\n\nRéponse : " + msg.content, description="download_emplois")
321
- ]
322
- await cl.Message(author="🌐🌐🌐",content="Download", actions=actions).send()
323
- await cl.Message(author="🌐🌐🌐",content="Source Pôle Emploi : " + listEmplois_name, elements=text_elements).send()
324
-
325
- memory.chat_memory.add_user_message(message.content)
326
- memory.chat_memory.add_ai_message(msg.content)
327
-
328
- else:
329
- memory = cl.user_session.get("memory")
330
- runnable = cl.user_session.get("runnable") # type: Runnable
331
- msg = cl.Message(author="🌐🌐🌐",content="")
332
- text_elements = []
333
- async for chunk in runnable.astream(
334
- {"question": message.content},
335
- config=RunnableConfig(callbacks=[cl.LangchainCallbackHandler()]),
336
- ):
337
- await msg.stream_token(chunk)
338
- await msg.send()
339
- QA_Emplois_name = f"Question-réponse sur les emplois"
340
- text_elements.append(
341
- cl.Text(content="Question : " + message.content + "\n\nRéponse :\n" + msg.content, name=QA_Emplois_name)
342
- )
343
- actions = [
344
- cl.Action(name="download", value="Question : " + message.content + "\n\nRéponse : " + msg.content, description="download_QA_emplois")
345
- ]
346
- await cl.Message(author="🌐🌐🌐",content="Download", actions=actions).send()
347
- await cl.Message(author="🌐🌐🌐",content="Marché Emploi : " + QA_Emplois_name, elements=text_elements).send()
348
- memory.chat_memory.add_user_message(message.content)
349
- memory.chat_memory.add_ai_message(msg.content)
 
15
  from langchain.memory import ChatMessageHistory, ConversationBufferMemory
16
  import pandas as pd
17
  import numpy as np
18
+ from langchain_core.messages import HumanMessage, SystemMessage
19
+ from langchain_core.prompts.chat import (
20
+ ChatPromptTemplate,
21
+ HumanMessagePromptTemplate,
22
+ SystemMessagePromptTemplate,
23
+ )
24
+ from langchain_openai import ChatOpenAI
25
  import chainlit as cl
26
  from chainlit.input_widget import TextInput
27
  from chainlit import user_session
 
30
  import datetime
31
 
32
  os.environ["TOKENIZERS_PARALLELISM"] = os.environ["TOKENIZERS_PARALLELISM"]
33
+ os.environ['OPENAI_API_KEY'] = os.environ['OPENAI_API_KEY']
34
 
35
  @cl.author_rename
36
  def rename(orig_author: str):
37
+ rename_dict = {"ConversationalRetrievalChain": "💬 Assistant conversationnel", "Retriever": "Agent conversationnel", "StuffDocumentsChain": "Chaîne de documents", "LLMChain": "Agent", "Chat OpenAI": "🤖 IA"}
38
  return rename_dict.get(orig_author, orig_author)
39
 
40
  @cl.action_callback("download")
 
166
  chat_memory=message_history,
167
  return_messages=True,
168
  )
169
+ streaming_llm = ChatOpenAI(
170
  streaming=True,
171
+ temperature=1
 
172
  )
173
  qa = ConversationalRetrievalChain.from_llm(
174
  streaming_llm,
 
179
  retriever=retriever_to_cache()
180
  )
181
  cl.user_session.set("conversation_chain", qa)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
 
183
  @cl.on_message
184
  async def main(message: cl.Message):
 
214
  await cl.Message(author="🌐🌐🌐",content="Download", actions=actions).send()
215
 
216
  if metadatas:
217
+ await cl.Message(author="🌐🌐🌐",content="Sources : " + metadatas, elements=text_elements).send()