Locgi-spaces / src /streamlit_app.py
Mauricio-100's picture
Update src/streamlit_app.py
4b78fc3 verified
Raw
History Blame Contribute Delete
5.55 kB
import streamlit as st
import torch
from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer
# Configuration de la page
st.set_page_config(
page_title="Locgi - Chatbot",
page_icon="💬",
layout="centered"
)
# Titre et description
st.title("💬 Locgi - Votre Assistant")
st.markdown("""
Bienvenue ! Je suis Locgi, votre assistant conversationnel.
Posez-moi vos questions et discutons ensemble !
""")
# Initialisation de l'historique de conversation
if "messages" not in st.session_state:
st.session_state.messages = [
{"role": "assistant", "content": "Bonjour ! Je suis Locgi. Comment puis-je vous aider aujourd'hui ?"}
]
# Initialisation du modèle de conversation
@st.cache_resource
def load_model():
try:
# Vérifier si CUDA est disponible
device = "cuda" if torch.cuda.is_available() else "cpu"
# Charger le modèle et le tokenizer
model_name = "openai/gpt-oss-20b"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16 if device == "cuda" else torch.float32,
low_cpu_mem_usage=True
)
# Déplacer le modèle sur le bon device
model = model.to(device)
# Créer le pipeline
generator = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
device=0 if device == "cuda" else -1
)
return generator, device
except Exception as e:
st.error(f"Erreur lors du chargement du modèle : {e}")
return None, None
# Chargement du modèle
chatbot, device = load_model()
# Affichage de l'information sur le device
if device:
st.sidebar.info(f"Modèle chargé sur : {'GPU' if device == 'cuda' else 'CPU'}")
else:
st.sidebar.warning("Modèle non chargé")
# Affichage de l'historique des messages
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Zone de saisie utilisateur
if prompt := st.chat_input("Écrivez votre message ici..."):
# Ajout du message utilisateur à l'historique
st.session_state.messages.append({"role": "user", "content": prompt})
# Affichage du message utilisateur
with st.chat_message("user"):
st.markdown(prompt)
# Génération de la réponse du bot
if chatbot:
with st.chat_message("assistant"):
with st.spinner("Locgi réfléchit..."):
try:
# Construire le contexte de conversation
conversation_history = ""
for msg in st.session_state.messages[-5:]: # Garder les 5 derniers messages pour le contexte
if msg["role"] == "user":
conversation_history += f"Utilisateur: {msg['content']}\n"
else:
conversation_history += f"Locgi: {msg['content']}\n"
conversation_history += f"Locgi: "
# Génération de la réponse
response = chatbot(
conversation_history,
max_new_tokens=150,
do_sample=True,
temperature=0.7,
top_p=0.9,
pad_token_id=chatbot.tokenizer.eos_token_id
)[0]['generated_text']
# Extraire la réponse générée
if "Locgi: " in response:
response = response.split("Locgi: ")[-1].strip()
# Limiter la réponse à la première phrase complète si nécessaire
if len(response) > 0:
st.markdown(response)
else:
response = "Désolé, je n'ai pas compris. Pouvez-vous reformuler ?"
st.markdown(response)
# Ajout de la réponse à l'historique
st.session_state.messages.append(
{"role": "assistant", "content": response}
)
except Exception as e:
error_msg = f"Désolé, une erreur est survenue : {str(e)}"
st.error(error_msg)
st.session_state.messages.append(
{"role": "assistant", "content": "Désolé, j'ai rencontré un problème technique."}
)
else:
st.error("Le modèle n'a pas pu être chargé. Veuillez réessayer ou utiliser un autre modèle.")
# Bouton pour effacer la conversation
if st.sidebar.button("🗑️ Effacer la conversation"):
st.session_state.messages = [
{"role": "assistant", "content": "Bonjour ! Je suis Locgi. Comment puis-je vous aider aujourd'hui ?"}
]
st.rerun()
# Paramètres de génération dans la barre latérale
st.sidebar.markdown("---")
st.sidebar.markdown("### Paramètres de génération")
temperature = st.sidebar.slider("Température", 0.1, 1.5, 0.7, 0.1)
max_tokens = st.sidebar.slider("Tokens maximum", 50, 500, 150, 10)
# Pied de page
st.sidebar.markdown("---")
st.sidebar.markdown("### À propos de Locgi")
st.sidebar.markdown("Locgi est un assistant conversationnel basé sur le modèle GPT d'OpenAI.")