chatbot_RAG / app.py
mahfouz28's picture
Update app.py
68b88a2 verified
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()