team3 / app.py
charlie0608's picture
Update app.py
eca1299 verified
raw
history blame
No virus
4.82 kB
# import streamlit as st
# import random
# import time
# from mistralai.client import MistralClient
# from mistralai.models.chat_completion import ChatMessage
# api_key = st.secrets["MISTRAL_API_KEY"]
# model = "mistral-large-latest"
# client = MistralClient(api_key=api_key)
# chat_response = client.chat(
# model=model,
# messages=[ChatMessage(role="user", content="What is the best French cheese?")]
# )
# # Streamed response emulator
# def response_generator():
# response = client.chat(
# model=model,
# messages=[ChatMessage(role="user", content="What is the best French cheese?")]
# )
# st.title("Personality test")
# # Initialize chat history
# if "messages" not in st.session_state:
# st.session_state.messages = []
# # Display chat messages from history on app rerun
# for message in st.session_state.messages:
# with st.chat_message(message["role"]):
# st.markdown(message["content"])
# # Accept user input
# if prompt := st.chat_input("What is up?"):
# # Add user message to chat history
# st.session_state.messages.append({"role": "user", "content": prompt})
# # Display user message in chat message container
# with st.chat_message("user"):
# st.markdown(prompt)
# # Display assistant response in chat message container
# with st.chat_message("assistant"):
# response = st.write_stream(response_generator())
# # Add assistant response to chat history
# st.session_state.messages.append({"role": "assistant", "content": response})
from mistralai.client import MistralClient
from mistralai.models.chat_completion import ChatMessage
import streamlit as st
import json
import faiss
import numpy as np
model = "open-mixtral-8x7b"
mistral_api_key = st.secrets["MISTRAL_API_KEY"]
client = MistralClient(api_key=mistral_api_key)
st.title("Assistant ChatBot catalogue 2024")
def load_json(rep:str):
f = open(rep, encoding='UTF-8')
return json.load(f)
def split_chunk(data, chunk_size):
data_str = [json.dumps(entry) for entry in data]
chunk_size = chunk_size
chunks = [data_str[i:i + chunk_size] for i in range(0, len(data_str), chunk_size)]
print(f"Nb. chunks = {len(chunks)}")
return chunks
def get_text_embedding(input):
embeddings_batch_response = client.embeddings(
model='mistral-embed',
input=input
)
return embeddings_batch_response.data[0].embedding
def load_vector_db(text_embedded):
d = text_embedded.shape[1]
index = faiss.IndexFlatL2(d)
index.add(text_embedded)
return index
def find_similar_chunk(index, question_embeddings, chunks):
D, I = index.search(question_embeddings, k=2) # distance, index
return [chunks[i] for i in I.tolist()[0]]
def prompt_chat(retrieved_chunk, question):
return f"""
Les informations contextuelles sont les suivantes.
---------------------
{retrieved_chunk}
---------------------
Compte tenu des informations contextuelles et sans connaissances préalables,
réponds en français à la question suivante de manière concise.
Utilise des listes pour plus de lisibilité.
Question: {question}
Réponse:
"""
# Chargement des données
data = load_json('catalogue_2024.json')
chunks = split_chunk(data, 3)
text_embeddings = np.load("catalogue_embeddings.npy")
index = load_vector_db(text_embeddings)
if "messages" not in st.session_state:
st.session_state["messages"] = [{"role": "assistant", "content": "Comment puis-je vous aider?"}]
st.session_state["History"] = []
st.session_state.History.append(ChatMessage(role="assitant", content="Comment puis-je vous aider?"))
for msg in st.session_state.messages:
st.chat_message(msg["role"]).write(msg["content"])
if prompt := st.chat_input():
question_embeddings = np.array([get_text_embedding(prompt)])
retrieved_chunk = find_similar_chunk(index, question_embeddings, chunks)
p = prompt_chat(retrieved_chunk=retrieved_chunk, question=prompt)
st.session_state.messages.append({"role": "user", "content": prompt})
st.session_state.History.append(ChatMessage(role="user", content=p))
st.chat_message("user").write(prompt)
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""
for response in client.chat_stream(
model=model,
messages=st.session_state.History[1:]
):
full_response += (response.choices[0].delta.content or "")
message_placeholder.markdown(full_response + "|")
message_placeholder.markdown(full_response)
st.session_state.History.append(ChatMessage(role="assistant", content=full_response))
st.session_state.messages.append({"role": "assistant", "content": full_response})