Exercices Projets guidés Ajouter une interface Streamlit
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Ajouter une interface Streamlit

Ton pipeline RAG est pret, il est evalue, il marche. Mais pour l'instant, tu l'utilises en tapant du code Python dans un terminal. Essaie de convaincre ton manager avec ca... Ce qu'il te faut, c'est une interface web. Et avec Streamlit, tu peux en creer une en 30 lignes.

Streamlit transforme un script Python en application web. Pas de HTML, pas de CSS, pas de JavaScript. Tu ecris du Python, et Streamlit genere l'interface automatiquement.

Installe-le :

pip install streamlit

Voici le squelette d'une app de chat avec Streamlit :

import streamlit as st

st.title("Assistant FAQ")

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

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

# Input utilisateur
question = st.chat_input("Pose ta question...")

if question:
# Afficher la question
with st.chat_message("user"):
st.write(question)
st.session_state.messages.append({"role": "user", "content": question})

# Generer la reponse (ton pipeline RAG ici)
reponse = "Reponse du pipeline..."

# Afficher la reponse
with st.chat_message("assistant"):
st.write(reponse)
st.session_state.messages.append({"role": "assistant", "content": reponse})

Pour lancer l'app : streamlit run app.py

Dans cet exercice, tu vas ecrire les fonctions backend qui alimentent l'interface Streamlit. L'interface elle-meme, tu la creeras dans un fichier app.py sur ta machine.

Ecris une fonction formater_sources(sources) qui prend une liste de noms de fichiers sources et renvoie une chaine formatee pour l'affichage. Exemple : ["rh.txt", "guide.md"] donne "Sources : rh.txt, guide.md".

Ecris une fonction formater_reponse_complete(resultat_rag) qui prend le dictionnaire de sortie de repondre_rag (avec "reponse", "sources", "nb_chunks") et renvoie une chaine formatee avec la reponse suivie des sources sur une nouvelle ligne.

Ecris une fonction preparer_config_streamlit(titre, system_prompt, k=3) qui renvoie un dictionnaire de configuration pour l'app Streamlit avec les cles "titre", "system_prompt", "k", "theme" (valeur "dark" par defaut), et "placeholder" (le texte du champ de saisie, par defaut "Pose ta question sur la FAQ...").

Exemple :

formater_sources(["rh.txt", "guide.md"])
renvoie "Sources : rh.txt, guide.md"

formater_reponse_complete({"reponse": "25 jours de conges.", "sources": ["rh.txt"], "nb_chunks": 1})
renvoie "25 jours de conges.\n\nSources : rh.txt"

preparer_config_streamlit("FAQ Entreprise", "Tu es un assistant RH.")
renvoie {"titre": "FAQ Entreprise", "system_prompt": "Tu es un assistant RH.", "k": 3, "theme": "dark", "placeholder": "Pose ta question sur la FAQ..."}

Tests (4/5)

Formatage des sources
r = formater_sources(["rh.txt", "guide.md"])
assert r == "Sources : rh.txt, guide.md", f"Attendu 'Sources : rh.txt, guide.md', obtenu '{r}'"
Sources vides
r = formater_sources([])
assert isinstance(r, str), "La fonction doit retourner un string meme avec une liste vide"
assert len(r) > 0, "La fonction ne doit pas retourner un string vide"
Reponse complete formatee
r = formater_reponse_complete({
    "reponse": "25 jours de conges.",
    "sources": ["rh.txt"],
    "nb_chunks": 1,
})
assert "25 jours de conges." in r, "La reponse doit contenir le texte de la reponse"
assert "rh.txt" in r, "La reponse doit contenir les sources"
assert "\n" in r, "La reponse et les sources doivent etre sur des lignes separees"
Config Streamlit complete
config = preparer_config_streamlit("Mon FAQ", "Tu es un assistant.", k=5)
assert config["titre"] == "Mon FAQ"
assert config["system_prompt"] == "Tu es un assistant."
assert config["k"] == 5
assert config["theme"] == "dark"
assert "placeholder" in config

+ 0 tests cachés

Indices (3 disponibles)

solution.py