# 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})