Tous les guides
IntermédiaireÀ votre rythmeGuide gratuitSection 70/95

Chatbot — Interface avec Streamlit

Pratiquez les fondations du développement : programmation, web, API, données et usages de l’IA. Des sections et exercices pour construire vos premiers projets.

💡

Contenu gratuit, accessible sans compte. Les outils et modèles évoluent : consultez le dossier actuel pour vérifier leurs versions. Modèles et sources

Section 11.4.11 : Chatbot — Interface avec Streamlit

🎯 Objectif pédagogique

Construire une interface web complète pour votre chatbot IA avec Streamlit. Vous serez capable de créer un chatbot fonctionnel avec interface graphique, sidebar de configuration, et affichage temps réel des réponses.


Du terminal au web — Streamlit entre en jeu

Marc a un chatbot qui fonctionne en terminal. C'est bien pour tester, mais personne ne l'utilisera comme ça. Streamlit transforme un script Python en application web en quelques lignes. Zéro HTML, zéro CSS, zéro JavaScript.

Setup minimal

# pip install streamlit openai python-dotenv

# app.py
import streamlit as st
from openai import OpenAI
import os
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))

# Configuration de la page
st.set_page_config(
    page_title="CareerBot — Assistant Emploi 🤖",
    page_icon="🤖",
    layout="centered"
)

st.title("🤖 CareerBot")
st.caption("Ton assistant de recherche d'emploi IA")

Chat interface complète

# System prompt
SYSTEM_PROMPT = """Tu es CareerBot, un assistant de recherche d'emploi spécialisé 
dans la reconversion professionnelle vers les métiers tech/data/IA.
Ton : professionnel, chaleureux, direct. Tu tutoies.
Limite tes réponses à 300 mots max.
Termine toujours par une question ou suggestion d'action."""

# Initialiser l'historique dans session_state
if "messages" not in st.session_state:
    st.session_state.messages = []

# Sidebar — Configuration
with st.sidebar:
    st.header("⚙️ Configuration")
    model = st.selectbox("Modèle", ["gpt-4o-mini", "gpt-4o"], index=0)
    temperature = st.slider("Créativité", 0.0, 1.5, 0.7, 0.1)
    
    st.divider()
    st.header("📋 Profil")
    background = st.text_input("Expérience", "Finance, 8 ans")
    target = st.text_input("Objectif", "Data Analyst")
    
    if st.button("🗑️ Nouvelle conversation"):
        st.session_state.messages = []
        st.rerun()

# Afficher l'historique des messages
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# Chat input
if prompt := st.chat_input("Pose ta question..."):
    # Ajouter le message utilisateur
    st.session_state.messages.append(\{"role": "user", "content": prompt\})
    
    with st.chat_message("user"):
        st.markdown(prompt)
    
    # Construire le contexte enrichi
    enriched_system = f"""\{SYSTEM_PROMPT\}
    
## Profil de l'utilisateur :
- Background : \{background\}
- Objectif : \{target\}"""
    
    # Générer la réponse avec streaming
    with st.chat_message("assistant"):
        messages = [\{"role": "system", "content": enriched_system\}] + st.session_state.messages
        
        stream = client.chat.completions.create(
            model=model,
            messages=messages,
            temperature=temperature,
            stream=True
        )
        
        response = st.write_stream(stream)  # Streamlit gère le streaming !
    
    # Sauvegarder la réponse
    st.session_state.messages.append(\{"role": "assistant", "content": response\})

Fonctionnalités avancées

# Ajoutez ces features à votre chatbot :

# 1. Upload de fichier (CV en PDF)
with st.sidebar:
    uploaded_file = st.file_uploader("📄 Ton CV (PDF)", type=["pdf", "txt"])
    if uploaded_file:
        cv_text = uploaded_file.read().decode("utf-8")  # Pour .txt
        st.session_state.cv = cv_text
        st.success("CV chargé !")

# 2. Boutons d'action rapide
col1, col2, col3 = st.columns(3)
with col1:
    if st.button("📝 Analyser mon CV"):
        prompt = "Analyse mon CV et donne-moi des suggestions d'amélioration."
with col2:
    if st.button("🎯 Préparer un entretien"):
        prompt = "Prépare-moi pour un entretien Data Analyst."
with col3:
    if st.button("📊 Marché de l'emploi"):
        prompt = "Quelles sont les tendances du marché data analyst en 2025 ?"

# 3. Afficher les métriques
with st.sidebar:
    st.header("📊 Stats")
    st.metric("Messages", len(st.session_state.messages))
    tokens_approx = sum(len(m["content"].split()) for m in st.session_state.messages)
    st.metric("Tokens ≈", tokens_approx)
    cost = tokens_approx * 0.00015 / 1000  # Approximation gpt-4o-mini
    st.metric("Coût ≈", f"$\{cost:.4f\}")

Lancer l'application

# Dans le terminal :
streamlit run app.py

# L'app s'ouvre automatiquement dans le navigateur à http://localhost:8501
# Hot reload : chaque modification du fichier se reflète en temps réel

session_state — La clé de Streamlit

Streamlit ré-exécute TOUT le script à chaque interaction. Sans st.session_state, l'historique serait perdu à chaque message. session_state persiste les données entre les re-runs. C'est le concept le plus important de Streamlit.

🏋️ Exercice pratique (30 minutes)

  1. →Installez Streamlit et créez l'app de chatbot complète
  2. →Ajoutez la sidebar avec configuration du modèle et profil
  3. →Implémentez le streaming des réponses
  4. →Ajoutez 3 boutons d'action rapide
  5. →Testez réellement l'interface dans votre navigateur
Vérification rapide

Pourquoi utiliser st.session_state dans un chatbot Streamlit ?

Vérification rapide

Quel est l'avantage de st.write_stream() pour un chatbot ?

Votre progression

Cette progression est déclarative et conservée dans votre navigateur. L’attestation finale ne constitue pas un diplôme ni une évaluation indépendante.

Voir ma progression et mon attestation

Apprendre l’IA, du premier prompt aux agents

15 guides gratuitsQuiz, schémas et ateliersSans compte

Un cas pratique IA dans votre boîte mail

Méthodes, ressources et nouveaux exercices. Gratuit, avec désinscription à tout moment.