misia / main.py
datacipen's picture
Update main.py
e06b607 verified
raw
history blame
6.17 kB
import json
import os
import time
from urllib.request import urlopen
import pandas as pd
from pathlib import Path
from typing import Dict, List, Optional
from operator import itemgetter
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import ElasticsearchStore
from langchain import HuggingFacePipeline
from langchain.chains import RetrievalQA
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import Runnable, RunnablePassthrough, RunnableLambda
from langchain.schema.runnable.config import RunnableConfig
from langchain.memory import ChatMessageHistory, ConversationBufferMemory
from huggingface_hub import login
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers import AutoTokenizer, pipeline
from deep_translator import GoogleTranslator
import chainlit as cl
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import SystemMessage, UserMessage
from azure.core.credentials import AzureKeyCredential
#os.environ['HF_TOKEN'] = os.environ['HF_TOKEN']
os.environ["GITHUB_TOKEN"] = os.environ["GITHUB_TOKEN"]
from langchain_huggingface import HuggingFaceEndpoint
from langchain_core.prompts import PromptTemplate
@cl.on_chat_start
def on_chat_start():
print("A new chat session has started!")
file_path='./public/content-MIPI-MITIC.json'
data = json.loads(Path(file_path).read_text())
#template = """<s>[INST] Tu es un spécialiste de l'enseignement supérieur, des formations et de la pédagogie.
#Tu es en capacité d'analyser en profondeur les séances pédagogiques et de les mettre en adéquation avec les théories de la recherche en éducation.
#Répondez à la question ci-dessous seulement et exclusivement à partir du contexte ci-dessous, de la manière la plus pertinente, seulement en fonction des informations fournies :
#Contexte : {context}.
#Question : {question} [/INST].
#Essayez donc de comprendre en profondeur le contexte et répondez uniquement en vous basant sur les informations fournies.
#Dis que tu ne connais pas la réponse, lorsque tu ne trouves pas les informations nécessaires dans le contexte.
#Donne la réponse au format texte markdown, jusqu'à 500 mots, sans générer de code.
#Donne la réponse au format tableau lorsque cela est utile.
#Donne la réponse en français seulement.</s>
#"""
#prompt = ChatPromptTemplate.from_template(template)
#prompt = PromptTemplate(template=template, input_variables=["question","context"])
#repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
#repo_id = "mistralai/Mistral-7B-Instruct-v0.2"
#llm = HuggingFaceEndpoint(
# repo_id=repo_id, task="text2text-generation", max_new_tokens=1024, temperature=0.001, streaming=True
#)
#chain = prompt | llm | StrOutputParser()
#cl.user_session.set("memory", ConversationBufferMemory(return_messages=True))
#memory = cl.user_session.get("memory")
#runnable = (
# RunnablePassthrough.assign(
# history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")
# )
# | prompt
# | llm
# | StrOutputParser()
#)
#cl.user_session.set("referentiel", data)
#cl.user_session.set("chain", chain)
client = ChatCompletionsClient(
endpoint="https://models.inference.ai.azure.com",
credential=AzureKeyCredential(os.environ["GITHUB_TOKEN"]),
)
cl.user_session.set("data", data)
cl.user_session.set("client", client)
@cl.on_message
async def main(message: cl.Message):
# Your custom logic goes here...
#memory = cl.user_session.get("memory")
#chain = cl.user_session.get("chain")
#data = cl.user_session.get("referentiel")
msg = cl.Message(author="COPILOT",content="")
#async for chunk in chain.stream(
# {"question": message.content,"context":data},
# config=RunnableConfig(callbacks=[cl.LangchainCallbackHandler()])
#):
# await msg.stream_token(chunk)
#await msg.send()
#for chunk in chain.stream({"question":message.content + ". Réponds au format tableau. Réponds seulement en français et jamais en anglais.","context":data},config=RunnableConfig(callbacks=[cl.LangchainCallbackHandler(stream_final_answer=True, answer_prefix_tokens=["FINAL", "ANSWER", "Chatbot", "Assistant", "answer"])])):
# await msg.stream_token(chunk)
#print(s, end="", flush=True)
data = cl.user_session.get("data")
client = cl.user_session.get("client")
response = client.complete(
stream=True,
messages=[
SystemMessage(content="Tu es un spécialiste de l'enseignement supérieur, des formations et de la pédagogie. Tu es en capacité d'analyser en profondeur les séances pédagogiques et de les mettre en adéquation avec les théories de la recherche en éducation. Répondez à la question seulement et exclusivement à partir du contexte ci-contre, de la manière la plus pertinente, seulement en fonction des informations fournies. Contexte : " + str(data)),
UserMessage(content=message.content + "Donne le résultat au format texte."),
],
model="Phi-3.5-MoE-instruct",
presence_penalty=0.1,
frequency_penalty=0.8,
max_tokens=4096,
stop=["<|endoftext|>"],
temperature=0,
top_p=1,
model_extras={
"logprobs": True
}
)
for update in response:
if update.choices:
await msg.stream_token(update.choices[0].delta.content)
await msg.send()
# Send a response back to the user
#await cl.Message(
# content=f"Réponse: {res}",
#).send()
@cl.on_stop
def on_stop():
print("L'utilisateur veut arrêter la completion en cours!")
#@cl.on_chat_end
#def on_chat_end():
# print("The user disconnected!")
#from chainlit.types import ThreadDict
#@cl.on_chat_resume
#async def on_chat_resume(thread: ThreadDict):
# print("The user resumed a previous chat session!")