Spaces:
Running
Running
Update main.py
Browse files
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=
|
| 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 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 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 |
-
|
| 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 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
):
|
| 149 |
-
|
|
|
|
|
|
|
|
|
|
| 150 |
|
| 151 |
-
await
|
|
|
|
| 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)
|