Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from langchain_community.document_loaders import TextLoader, PyMuPDFLoader | |
| from langchain.text_splitter import RecursiveCharacterTextSplitter | |
| from langchain_community.vectorstores import FAISS | |
| from langchain_google_genai import GoogleGenerativeAIEmbeddings, ChatGoogleGenerativeAI | |
| from langchain.schema import SystemMessage, HumanMessage | |
| import requests | |
| import time | |
| # Clé API Google Gemini | |
| API_KEY = "AIzaSyAVUg8B8r-oddxEAzonh3g_7KOyeL3wUK0" | |
| # Charger et traiter les fichiers | |
| pdf_loader = PyMuPDFLoader("doc_0.pdf") | |
| txt_loader = TextLoader("UCAD info3.txt") | |
| pdf_docs = pdf_loader.load() | |
| txt_docs = txt_loader.load() | |
| documents = pdf_docs + txt_docs # Fusionner les documents | |
| # Découpage des textes en chunks | |
| text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) | |
| chunks = text_splitter.split_documents(documents) | |
| # Génération des embeddings et indexation | |
| embedding_model = GoogleGenerativeAIEmbeddings(model="models/embedding-001", google_api_key=API_KEY) | |
| vector_store = FAISS.from_documents(chunks, embedding_model) | |
| # Modèle de génération de texte | |
| chat_model = ChatGoogleGenerativeAI(model="gemini-1.5-flash", api_key=API_KEY) | |
| # 🔹 Configuration de la page en mode large | |
| st.set_page_config(page_title="Assistant UCAD (Université Cheikh Anta Diop de Dakar)", page_icon="💡", layout="wide") | |
| # 🔹 Initialisation des messages | |
| if "messages" not in st.session_state: | |
| st.session_state.messages = [ | |
| {"role": "bot", "content": "Bonjour, je suis l'assistant UCAD ! Comment puis-je vous aider ? 😊"} | |
| ] | |
| # 🔹 Affichage des messages dans un conteneur | |
| st.header("Assistant UCAD (Université Cheikh Anta Diop de Dakar)") | |
| for msg in st.session_state.messages: | |
| role_prefix = "🤖 Assistant UCAD" if msg["role"] == "bot" else "👤 Vous" | |
| st.markdown(f"**{role_prefix}** : {msg['content']}") | |
| # 🔹 Zone de saisie utilisateur | |
| user_input = st.text_input("Posez votre question ici...") | |
| if st.button("Envoyer"): | |
| if user_input: | |
| st.session_state.messages.append({"role": "user", "content": user_input}) | |
| # 🔹 Affichage du spinner (chargement) | |
| with st.spinner("L'Assistant réfléchit... 🤔"): | |
| time.sleep(1.5) # Simule un délai de réponse | |
| # 🔹 Recherche des documents pertinents avec FAISS | |
| retrieved_docs = vector_store.similarity_search(user_input, k=3) | |
| context = "\n\n".join([doc.page_content for doc in retrieved_docs]) | |
| # 🔹 Envoi de la question à Google Gemini pour la génération de réponse | |
| messages = [ | |
| SystemMessage(content="Tu es un assistant qui répond aux questions en utilisant les informations fournies."), | |
| HumanMessage(content=f"Document : {context}\n\nQuestion : {user_input}\nRéponse détaillée :") | |
| ] | |
| try: | |
| response = chat_model(messages) | |
| bot_response = response.content | |
| except Exception: | |
| bot_response = "Je n'ai pas pu obtenir une réponse pour le moment." | |
| # 🔹 Ajouter la réponse du bot | |
| st.session_state.messages.append({"role": "bot", "content": bot_response}) | |
| # 🔄 Rafraîchir l'affichage | |
| st.rerun() |