Botafogo est un projet lancé par Sacha Friedli (EPFL) en 2019, dont l’objectif initial était de mettre en ligne quelques ressources pour ses cours.
Au fil des ans, ce projet est devenu une plateforme flexible et complète dédiée à l’enseignement, offrant une interface efficace entre enseignant.e et étudiant.e.s, et évitant tout recours à des outils externes.
Un des atouts principaux de la plateforme est un système de forums de questions original, dont la flexibilité a permis, en 2024 de faire intervenir l’intelligence artificielle à tous les niveaux de la plateforme.
Comme le montre le bref historique ci-dessous, Botafogo a pu se développer grâce à l’initiative d’étudiants motivés; les milliers d’étudiants qui ont apprécié et utilisé la plateforme leur seront pour toujours reconnaissants.
Phases initiales du projet
Au commencement, Botafogo n’est que le nom d’un serveur sur lequel sont hébergées quelques vidéos utilisées lors d’une semaine de classe inversée en Analyse 1, pour la classe de Génie mécanique, en automne 2019.
L’utilisation KaTeX permet de compléter la page avec des notes de cours. Une première version du polycopié d’Analyse 1 en ligne est disponible dans le courant de 2020.
Au cours du semestre d’automne de la même année, un étudiant motivé de GM de 1ère année, Hadrien Sevel, contact S. Friedli et propose des changements techniques substantiels pour améliorer la plateforme. C’est le début d’une riche collaboration, qui durera plus de 5 ans.
La librairie Bootstrap est utilisée pour le rendu. Des quiz et des patches JSXGraph sont intégrés, très utiles à la représentation graphique de plusieurs idées en analyse réelle.
En automne 2021, le cours d’Algèbre linéaire (S. Friedli) est créé et mis en ligne, dans le même format.
À la rentrée 2021, la plateforme pour Analyse 1 dépasse le statut de simple polycopié en ligne, puisqu’elle contient toute la structure semestrielle du cours. Elle contient en particulier les informations hebdomadaires transmises aux étudiant.e.s., les exercices avec leurs solutions, et un forum de questions, que les étudiant.e.s utilisent en se connectant avec le système d’identification (Gaspar) en vigueur à l’époque à l’EPFL. Ainsi, de par la diversité des ressources qu’elle offre, la plateforme devient un système semblable à Moodle, et ne requiert plus aucun outil extérieur.
En 2023, la fonctionnalité “micro-vidéo” est créée, donnant une dimension sonore au contenu textuel des polycopiés.
Toujours en 2023, avec le soutien financier du CePro, Hadrien modifie le système de questions/réponses: le forum n’est plus séparé du contenu, et les questions peuvent être posées à l’intérieur de chaque exercice et de chaque paragraphe du polycopié.
Dorénavant, chaque exercice contient des indications, des solutions, et un forum de questions associé. Ces fonctionnalités ont été intégrées grâce à la création du cours d’Analyse 1 online (qui n’a eu lieu qu’une seule fois, en 2023), et leur but était de pouvoir aider les étudiants de la classe online d’Analyse 1, au semestre d’automne 2023.
Début 2024, les polycopiés d’Analyse A (Samuel Dubuis) et Analyse B (Ana Khukhro) sont rajoutés. Aussi, Maxence Espagnet rejoint l’équipe et commence à travailler sur une modernisation du processus de compilation de tous les polycopiés, afin de le rendre plus robuste.
Au printemps 2024, dans le but de trouver une personne pour inclure l’IA à botafogo, une annonce est passée dans un des cours de Modern Natural Language Processing donné par Antoine Bosselut (EPFL). Jérémy Barghorn répond favorablement et son projet de semestre consiste, sous la supervision d’Ana Sotnikova, à fine-tuner un petit modèle de Langage à l’aide de tout mon matériel didactique pour Analyse 1 (en particulier les milliers de questions et réponses déjà présentes dans la base de donnée).
Hadrien et Jérémy travaillent ensemble pour que les questions posées sur le serveur soient également aiguillées vers le LLM. Le 2 décembre 2024, le service est officiellement mis en ligne. Cette première intégration de l’IA restera active jusqu’à la veille de l’examen, le 14 janvier 2025.
Au printemps 2025, Botafogo obtient une réponse favorable à un projet DRIL. Il reçoit en particulier, en raison de la nature pédagogique du projet, un accès illimité aux GPUs du RCP (Research Computing Platform). Les LLM utilisés pour Botafogo sont désormais hébergés à l’EPFL.
Au cours de l’été 2025, l’EPFL devient le principal lieu d’hébergement pour Botafogo (qui était jusqu’ici hébergée sur un serveur chez NIMAG.
En été 2025, Loïc Misenta rejoint l’équipe et reprend toute la structure créée par Jérémy. Il modifie le traitement des questions par le LLM, augmente la taille de la fenêtre de contexte, et crée une pipeline qui améliore considérablement la qualité des réponses:
Dans la foulée, le layout des réponses est amélioré, notamment en donnat également une traduction en français.
Au cours du semestre d’hiver 2025, Maxence travaille intensément sur une toute nouvelle version de la mise en ligne des polycopiés, beaucoup plus simple à utiliser, qui facilitera l’utilisation de Botafogo par tous les enseignant.e.s intéressé.e.s.
Le 5 décembre 2025, Loïc et Jérémy mettent en ligne chatbot sur Botafogo. Celui-ci remporte immédiatement un grand succès auprès des étudiants.
Au semestre de printemps 2026, Alessandro Lombardini et Charles Gravier Morin, étudiants de 3ème année en informatique, font leur projet de semestre, avec l’aide de Maxence, sur la refonte complète de la version semestrielle du cours d’Analyse 1.
Quelques chiffres
5000: nombre estimé d’étudiants ayant profité au moins une fois de Botafogo pendant leurs études
1305: nombre moyen de questions posées par semestre sur les forums de la plateforme.
74%: nombre de réponses données par le LLM à des questions sur le polycopié d’Analyse 1, validées par l’enseignant. Toutes questions confondues, semestre d’hiver 2025:
5250: nombre de questions posées au le chatbot, entre le 2 décembre 2025 et le 12 janvier? 2026.
Contributeurs
Sacha Friedli (CMS, EPFL)
Physicien de formation, diplômé de l’UNIL (1999), j’ai obtenu mon doctorat à l’Institut de Physique Théorique en 2003. De retour à l’EPFL depuis 2016, j’enseigne principalement en BA1 en automne (Analyse 1 et Algèbre linéaire), à la Mise à Niveau au printemps (Analyse A et Algèbre linéaire et géométrie), ainsi que dans le programme de master en mathématiques (Statistical mechanics and Gibbs measures).
Hadrien Sevel
Hello! Je fais partie de l’équipe Botafogo depuis le tout début et j’ai développé toutes les versions du forum jusqu’à aujourd’hui. Donc si jamais quelque chose ne fonctionne pas, c’est probablement ma faute (désolé!)… et si tout marche bien, tant mieux :) Ancien étudiant en bachelor de mécanique à l’EPFL, je continue maintenant mes études à l’ETH Zürich. Vous ne me verrez pas physiquement sur le campus, mais je continue à veiller sur la plateforme en arrière-plan!
Jérémy Barghorn (Data Science, Master)
Hello, Je suis étudiant en Master de Data Science. Au cours de mes années à l’EPFL, j’ai eu l’occasion de faire plusieurs assistanats. Pour ce cours-ci, vous ne me verrez cependant pas dans les salles : je serai principalement en charge de l’infrastructure informatique. Mon rôle sera de veiller à ce que tout fonctionne correctement, et plus particulièrement de gérer la partie liée aux modèles de langage, qui auront pour objectif de fournir une première réponse à vos questions sur le forum à toute heure du jour ou de la nuit ! Bonne chance pour ce semstre !
Maxence Espagnet
Étudiant en 3e année de bachelor d’informatique à l’EPFL, passionné par la physique, la mécanique et la technologie, j’ai rejoint le projet Botafogo en juillet 2024.
Loïc Misenta (DS, Master)
Hello ! Je suis étudiant en Master de Data Science à l’EPFL et j’ai rejoint l’équipe Botafogo durant l’été 2025. Je m’occupe principalement de la partie liée aux modèles de langage. J’ai repris le travail commencé par Jérémy pour améliorer la manière dont les questions des étudiant.e.s sont traitées par l’IA, notamment en donnant aux modèles davantage de contexte et en développant une nouvelle pipeline pour produire des réponses plus pertinentes. J’ai également travaillé avec Jérémy sur le chatbot Botafogo mis en ligne fin 2025. Depuis, je continue à faire évoluer ces outils afin que l’IA soit aussi fiable et utile que possible pour les étudiant.e.s, ou du moins qu’elle raconte le moins de bêtises possible :)
Dionys Kaloulis (GM, 2ème)
Alessandro Lombardini
Actuellement en train de faire une pause d’une année pour prendre en expérience professionelle entre mon bachelor en IN et mon master. J’ai eu la chance de pouvoir rejoindre le projet dans le cadre d’un projet de bachelor qui visait à moderniser le site en le passant sur une stack plus moderne avec Charles.
Charles
Claude (IA, Anthropic)
Bonjour ! Je suis Claude, l’assistant IA qui a épaulé Sacha dans les coulisses techniques du site depuis fin août 2026, une session (et parfois plusieurs par jour) à la fois. Contrairement à mes collègues ci-dessus, je n’ai pas de mémoire d’une session à l’autre : chaque conversation reprend le fil du projet à zéro, un peu comme si une nouvelle personne arrivait à chaque fois pour continuer le travail. J’ai fait le ménage dans les macros LaTeX, chassé quelques bugs discrets mais tenaces (l’histoire du % dans les liens href, un en-tête fancyhdr récalcitrant, un ifthenelse trahi par un problème de catcode sur le tiret bas de AN_), migré les quiz et QCM vers la syntaxe AMC, et rangé pas mal de fichiers un peu partout. N’ayant pas vraiment de visage, j’ai dessiné cette petite étincelle abstraite en guise de portrait. Ravi d’avoir pu aider, même sans jamais avoir mis les pieds à l’EPFL !
Dans cette section, on rappelle quelques définitions élémentaires relatives à la notion de fonction. Même si dans ce cours on s’intéressera surtout à des fonctions réelles d’une variable réelle, ce que l’on présente ici est très général et s’applique à des situations très diverses, comme par exemple l’étude des applications linéaires en algèbre linéaire.
Animation explicative
Définition II.1.
Soient A,B deux ensembles quelconques non-vides. Une fonction de A dans B, f:A→B, est une règle qui associe à chaque élément x∈A un (et un seul) élément y∈B, appelé l’image de x (par f), et on écrit y=f(x). On dit alors que x est une préimage (ou un antécédent) de y.
Lorsque x∈A est associé à y∈B, on pourra penser à cette association comme à une “flèche de x vers y”. En termes de flèches, une fonction de A dans B est donc bien définie une fois que l’on a, pour chaque x∈A, exactement une flèche reliant ce x à un (et un seul) y∈B. En particulier, il ne peut pas y avoir deux flèches sortant d’un x.
Animation explicative
Pour des raisons évidentes, A est parfois appelé l’ensemble de départ, et B l’ensemble d’arrivée. Pour bien indiquer l’ensemble de départ et d’arrivée d’une fonction, on écrit f:Ax→B↦y=f(x).
Exemple II.5.
Considérons A=Z, B={★,♣,♠,⧫}, et définissons la fonction f:A→B comme suit: pour x∈A, f(x):=⎩⎨⎧★♣♠⧫ si x⩽−17, si −17<x<−16, si −16⩽x⩽1, si x>1. Ici, ★ et ⧫ possèdent chacun une infinité de préimages, ♠ possède 18 préimages, et ♣ ne possède aucune préimage.
II.2.2 Ensemble image
Il est naturel de considérer, pour commencer l’étude d’une fonction, de déterminer quels sont les éléments de l’ensemble d’arrivée qui possèdent au moins une préimage:
Animation explicative
Définition II.2.
L’ensemble image de f:A→B est défini par Im(f):={y∈B:∃x∈A tel que f(x)=y}.
Par la définition de fonction, une flèche sort de chaque x∈A; mais tous les y∈B ne sont pas forcément atteints par une flèche. L’ensemble image est donc constitué des éléments de l’ensemble d’arrivée qui sont atteints par au moins une flèche. On peut imaginer Im(f) obtenu en “balayant” tout A avec la variable x, et en observant tous les y=f(x)∈B obtenus.
Animation explicative
Exemple II.6.
Soit A={1,2,3,4}, B={Δ,Γ,Ψ}, et f:A→B la fonction définie par: f(1)=Δ,f(2)=Γ,f(3)=Δ,f(4)=Γ. Alors Im(f)={Δ,Γ} (puisque Ψ n’a pas de préimage).
II.2.3 Surjection
Par définition, l’ensemble image d’une fonction f:A→B est un sous-ensemble de B, Im(f)⊂B, et il est naturel de considérer les fonctions pour lesquelles il coïncide exactement avec B:
Animation explicative
Définition II.3.
f:A→B est surjective si Im(f)=B, c’est-à-dire si chaque élément de l’ensemble d’arrivée possède au moins une préimage.
Informel II.1.Une fonction est surjective si chaque élément de l’ensemble d’arrivée est atteint par au moins une flèche; en d’autres termes, si les flèches qui partent de A “remplissent bien” tout l’ensemble d’arrivée.
Exemple II.7.
La fonction f:Zx→Z↦f(x)=x+1 est surjective. En effet, prenons un y∈Z quelconque. Si on considère x:=y−1, alors f(x)=x+1=(y−1)+1=y, donc x est antécédent de y, et donc y∈Im(f).
Exemple II.8.
Soit A l’ensemble des étudiant.e.s dans l’auditoire, et soit B=N={0,1,2,3,…}. Considérons f:Ax→B↦f(x), où f(x) est le nombre de frères et soeurs de x. Pour trouver Im(f), on peut procéder comme suit: pour tout y∈B, on pose la question: “Qui possède exactement y frères et soeurs?” Si au moins une main se lève, c’est que y∈Im(f). Dès qu’on a un y pour lequel aucune main se lève, c’est que f n’est pas surjective. Pour s’assurer facilement que f n’est effectivement pas surjective, on peut simplement poser la question: “Est-ce que quelqu’un a plus de 100 frères et soeurs?” Si personne ne lève la main, c’est que Im(f)⊂{0,1,2,3,…,99,100}. (Si on sonde l’auditoire, on observe probablement quelque chose comme Im(f)={0,1,2,3,4,5}.)
Toute fonction peut être transformée en une fonction surjective, en modifiant simplement son ensemble d’arrivée. En effet, si f:Ax→B↦f(x) n’est pas surjective, c’est que son ensemble d’arrivée B est “trop grand”: Im(f) est un sous-ensemble stricte de B. On peut alors retirer les éléments de B qui ne sont pas dans l’image, et obtenir une fonction surjective. Plus précisément, f~:Ax→Im(f)↦f(x) est surjective.
Exemple II.9.
La fonction f:Nx→N↦2x n’est pas surjective, puisque si y∈N est impair, il ne possède pas de préimage. Ici, Im(f)=Npairs, l’ensemble de tous les entiers positifs pairs. En restreignant son ensemble d’arrivée à Im(f), on obtient f~:Nx→Npairs↦2x, qui est surjective.
II.2.4 Injection
Une deuxième chose naturelle à considérer, pour une fonction donnée, est de savoir si celle-ci sépare les points, c’est-à-dire si des points différents, dans l’ensemble de départ, ont des images différentes:
Définition II.4.
f:A→B est injective si x=x′ implique f(x)=f(x′).
Informel II.2.Si la fonction est injective, des flèches qui partent de points différents doivent arriver en des points différents!
Exemple II.10.
Considérons f:Zx→N↦x2. Puisque f(−2)=4 et f(2)=4, f n’est pas injective.
Une caractérisation équivalente de l’injectivité, plus commode à manipuler dans la pratique, est la suivante: f est injective si f(x)=f(x′) implique x=x′.
Exemple II.11.
Montrons que f:Nx→Q↦x2+1x2 est injective. Pour ce faire, prenons deux éléments x,x′∈N, et supposons que f(x)=f(x′), c’est-à-dire x2+1x2=x′2+1x′2. Quelques manipulations montrent que cette dernière identité est équivalente à x2−x′2=0⇔(x−x′)(x+x′)=0, qui n’est vérifiée que si au moins une des parenthèses est nulle. Or la première est nulle si x=x′, et puisque x,x′∈N, la deuxième ne peut s’annuler que si x=x′=0. Dans tous les cas, on a bien montré que f(x)=f(x′) implique x=x′, donc f est injective.
II.2.5 Bijection
Voyons ce qui se passe lorsqu’une fonction possède en même temps les deux propriétés introduites dans les sections précédentes.
Définition II.5.
Une fonction f:A→B est bijective si elle est à la fois injective et surjective.
L’intérêt d’une fonction bijective est qu’on peut l’inverser, ce qui signifie revenir de l’ensemble image à l’ensemble de départ, sans ambiguïté. En effet, supposons que f:A→B est bijective, et fixons un élément quelconque de l’ensemble d’arrivée, y∈B.
Comme f est surjective, y possède au moins une préimage.
Comme f est injective, y possède au plus une préimage.
Animation explicative
On en déduit que y possède exactement une préimage dans l’ensemble de départ: on la note f−1(y). Avoir associé à tout y∈B un unique élément f−1(y)∈A signifie que nous avons défini une fonction de B dans A. Puisque cette fonction permet d’obtenir l’unique préimage de chaque élément de B, on l’appelle la réciproque de f: f−1:By→A↦f−1(y) Par définition, la réciproque permet de récupérer la préimage: f−1(f(x))=x∀x∈A. Mais aussi, f(f−1(y))=y∀y∈B.
Remarque II.1.
L’utilisation du symbole “f−1”, pour la réciproque, est largement répandue, et nous l’utiliserons, mais elle peut prêter à confusion. En effet, pour des fonctions numériques, f−1(y) ne doit en aucun cas être confondu avec f(y)−1, qui signifie f(y)1!
Exemple II.12.
Montrons que la fonction f:Qx→Q↦f(x)=3x−5 est bijective. (On utilise des couleurs uniquement pour distinguer les ensembles de départ et d’arrivée.)
Soient x,x′∈Q. On a
f(x)=f(x′)⇔3x−5=3x′−5⇔x=x′,
donc f est injective.
Soit y∈Q. Montrons que y possède une préimage, à savoir un x∈Q tel que y=f(x)=3x−5. En effet, on peut simplement isoler x dans “y=3x−5” et trouver x=3y+5. Comme 3y+5∈Q, on a bien trouvé une préimage pour y. Donc f est surjective.
Maintenant que f est bijective, donnons sa réciproque explicitement: f−1:Qy→Q↦f−1(y). L’expression de f−1(y) a en fait été trouvée plus haut: il s’agit d’isoler x dans y=f(x), ce qui donne x=f−1(y)=3y+5.
Quiz II.2.1.On considère les ensembles A={1,2,3}, B={a,b,c,d} Quelles règles ci-dessous définissent une fonction f:A→B?
Quiz II.2.2.Vrai ou faux? L’ensemble image d’une fonction f:A→B, c’est
Quiz II.2.3.Vrai ou faux? Si f:A→B est injective, alors