datacipen commited on
Commit
b0a79cb
1 Parent(s): 08b2384

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +71 -51
main.py CHANGED
@@ -10,10 +10,11 @@ from langchain.schema import StrOutputParser
10
 
11
  from operator import itemgetter
12
  from pinecone import Pinecone
13
-
14
- from langchain.memory import ConversationBufferMemory
15
  from langchain.schema.runnable import Runnable, RunnablePassthrough, RunnableConfig, RunnableLambda
16
  from langchain.callbacks.base import BaseCallbackHandler
 
17
 
18
  import chainlit as cl
19
  from chainlit.input_widget import TextInput, Select, Switch, Slider
@@ -38,9 +39,25 @@ os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.environ['HUGGINGFACEHUB_API_TOKEN']
38
  repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
39
 
40
  model = HuggingFaceEndpoint(
41
- repo_id=repo_id, max_new_tokens=8000, temperature=1.0, task="text2text-generation", streaming=True
42
  )
43
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  @cl.on_chat_start
45
  async def on_chat_start():
46
  await cl.Message(f"> REVIEWSTREAM").send()
@@ -68,34 +85,45 @@ async def on_chat_start():
68
  await cl.Message(f"Vous pouvez requêter sur la thématique : {res.get('value')}").send()
69
  cl.user_session.set("selectRequest", res.get("value"))
70
 
71
- memory = ConversationBufferMemory(return_messages=True)
72
- 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.
73
-
74
- 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.
75
- {context}
76
- {question} [/INST] </s>
77
- """
78
- prompt = ChatPromptTemplate.from_messages(
79
- [
80
- (
81
- "system",
82
- 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}.",
83
- ),
84
- MessagesPlaceholder(variable_name="history"),
85
- ("human", "Réponds à la question suivante de la manière la plus pertinente, la plus exhaustive et la plus détaillée possible. {question}."),
86
- ]
87
- )
88
- runnable = (
89
- RunnablePassthrough.assign(
90
- history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
91
- )
92
- | prompt
93
- | model
94
- | StrOutputParser()
95
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
- cl.user_session.set("memory", memory)
98
- cl.user_session.set("runnable", runnable)
99
 
100
 
101
  @cl.on_message
@@ -103,19 +131,7 @@ async def on_message(message: cl.Message):
103
  memory = cl.user_session.get("memory")
104
  runnable = cl.user_session.get("runnable") # type: Runnable
105
  msg = cl.Message(content="")
106
- os.environ['PINECONE_API_KEY'] = os.environ['PINECONE_API_KEY']
107
- embeddings = HuggingFaceEmbeddings()
108
- index_name = "all-venus"
109
- pc = Pinecone(
110
- api_key=os.environ['PINECONE_API_KEY']
111
- )
112
- index = pc.Index(index_name)
113
- xq = embeddings.embed_query(message.content)
114
- xc = index.query(vector=xq, filter={"categorie": {"$eq": "bibliographie-OPP-DGDIN"}},top_k=120, include_metadata=True)
115
- context_p = ""
116
- for result in xc['matches']:
117
- context_p = context_p + result['metadata']['text']
118
-
119
  class PostMessageHandler(BaseCallbackHandler):
120
  """
121
  Callback handler for handling the retriever and LLM processes.
@@ -140,14 +156,18 @@ async def on_message(message: cl.Message):
140
  )
141
 
142
  async with cl.Step(type="run", name="Réponse de Mistral"):
143
- async for chunk in runnable.astream(
144
- {"question": message.content, "context":context_p},
145
- config=RunnableConfig(callbacks=[
146
- cl.AsyncLangchainCallbackHandler(stream_final_answer=True)
147
- ]),
148
- ):
149
- await msg.stream_token(chunk)
 
 
 
150
 
151
- await msg.send()
 
152
  memory.chat_memory.add_user_message(message.content)
153
  memory.chat_memory.add_ai_message(msg.content)
 
10
 
11
  from operator import itemgetter
12
  from pinecone import Pinecone
13
+ from langchain_pinecone import PineconeVectorStore
14
+ from langchain.memory import ChatMessageHistory, ConversationBufferMemory
15
  from langchain.schema.runnable import Runnable, RunnablePassthrough, RunnableConfig, RunnableLambda
16
  from langchain.callbacks.base import BaseCallbackHandler
17
+ from langchain.chains import ConversationalRetrievalChain
18
 
19
  import chainlit as cl
20
  from chainlit.input_widget import TextInput, Select, Switch, Slider
 
39
  repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
40
 
41
  model = HuggingFaceEndpoint(
42
+ repo_id=repo_id, max_new_tokens=5000, temperature=1.0, task="text2text-generation", streaming=True
43
  )
44
+ os.environ['PINECONE_API_KEY'] = os.environ['PINECONE_API_KEY']
45
+ embeddings = HuggingFaceEmbeddings()
46
+ index_name = "all-venus"
47
+ #pc = Pinecone(
48
+ # api_key=os.environ['PINECONE_API_KEY']
49
+ #)
50
+ #index = pc.Index(index_name)
51
+ #xq = embeddings.embed_query(message.content)
52
+ #xc = index.query(vector=xq, filter={"categorie": {"$eq": "bibliographie-OPP-DGDIN"}},top_k=150, include_metadata=True)
53
+ #context = ""
54
+ #for result in xc['matches']:
55
+ # context = context + result['metadata']['text']
56
+ vectorstore = PineconeVectorStore(
57
+ index_name=index_name, embedding=embeddings
58
+ )
59
+ retriever = vectorstore.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": .7, "k": 150,"filter": {'categorie': {'$eq': 'bibliographie-OPP-DGDIN'}}})
60
+
61
  @cl.on_chat_start
62
  async def on_chat_start():
63
  await cl.Message(f"> REVIEWSTREAM").send()
 
85
  await cl.Message(f"Vous pouvez requêter sur la thématique : {res.get('value')}").send()
86
  cl.user_session.set("selectRequest", res.get("value"))
87
 
88
+ ########## Chain with streaming ##########
89
+ message_history = ChatMessageHistory()
90
+ memory = ConversationBufferMemory(memory_key="chat_history",output_key="answer",chat_memory=message_history,return_messages=True)
91
+ qa = ConversationalRetrievalChain.from_llm(
92
+ model,
93
+ memory=memory,
94
+ chain_type="stuff",
95
+ return_source_documents=True,
96
+ verbose=False,
97
+ retriever=retriever
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  )
99
+ cl.user_session.set("runnable", qa)
100
+ #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.
101
+
102
+ #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.
103
+ #{context}
104
+ #{question} [/INST] </s>
105
+ #"""
106
+ #prompt = ChatPromptTemplate.from_messages(
107
+ # [
108
+ # (
109
+ # "system",
110
+ # 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}.",
111
+ # ),
112
+ # MessagesPlaceholder(variable_name="history"),
113
+ # ("human", "Réponds à la question suivante de la manière la plus pertinente, la plus exhaustive et la plus détaillée possible. {question}."),
114
+ # ]
115
+ #)
116
+ #runnable = (
117
+ # RunnablePassthrough.assign(
118
+ # history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
119
+ # )
120
+ # | prompt
121
+ # | model
122
+ # | StrOutputParser()
123
+ #)
124
 
125
+ #cl.user_session.set("memory", memory)
126
+ #cl.user_session.set("runnable", runnable)
127
 
128
 
129
  @cl.on_message
 
131
  memory = cl.user_session.get("memory")
132
  runnable = cl.user_session.get("runnable") # type: Runnable
133
  msg = cl.Message(content="")
134
+
 
 
 
 
 
 
 
 
 
 
 
 
135
  class PostMessageHandler(BaseCallbackHandler):
136
  """
137
  Callback handler for handling the retriever and LLM processes.
 
156
  )
157
 
158
  async with cl.Step(type="run", name="Réponse de Mistral"):
159
+ #async for chunk in runnable.astream(
160
+ # {"question": message.content},
161
+ # config=RunnableConfig(callbacks=[
162
+ # cl.AsyncLangchainCallbackHandler(stream_final_answer=True)
163
+ # ]),
164
+ #):
165
+ # await msg.stream_token(chunk)
166
+ cb = cl.AsyncLangchainCallbackHandler()
167
+ res = await chain.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 à 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. Question : " + message.content, callbacks=[cb])
168
+ answer = res["answer"]
169
 
170
+ await cl.Message(content=answer).send()
171
+ #await msg.send()
172
  memory.chat_memory.add_user_message(message.content)
173
  memory.chat_memory.add_ai_message(msg.content)