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 !
La méthode de preuve par récurrence (appelée aussi preuve par induction) est une technique de démonstration qui, quand elle s’applique, permet de démontrer une infinité d’affirmations en seulement deux étapes.
Supposons que l’on définisse, pour chaque entier n⩾1, une certaine propriété P(n). Pour chaque n, P(n) est soit vraie, soit fausse.
Exemple II.17.
Soit P(n)=“le nombre entier n est divisible par 2”. Alors P(1) est fausse, P(2) est vraie, P(3) est fausse, etc. Donc on peut tout de suite résoudre tous les cas: P(n) est vraie si n est pair, fausse si n est impair.
En mathématiques, on a souvent besoin de montrer qu’une infinité de propriétés sont vraies simultanément: P(1) est vraie, P(2) est vraie, P(3) est vraie, etc. Si ces propriétés P(n) n’ont rien à voir les unes avec les autres, on n’a d’autre alternative que de les vérifier les unes après les autres.
Exemple II.18.
Supposons qu’un certain univers contienne une infinité de galaxies. Soit P(n) la propriété “il existe, dans cet univers, une galaxie dans laquelle on peut trouver exactement n planètes sur lesquelles on trouve de la vie”. Si on fixe un n et qu’on se pose la question de savoir si P(n) est vraie ou fausse, on n’a qu’un seul moyen d’obtenir la réponse: parcourir tout l’univers jusqu’à trouver une galaxie contenant exactement n planètes sur lesquelles on trouve la vie.
Si on a de la chance, on peut espérer étudier la véracité de ces propriétés P(n) en profitant de certaines relations pouvant exister entre elles, pour des n différents. Dans le cas de la récurrence, on s’intéresse à une relation entre les paires d’entiers consécutifs, n et n+1, et la relation considérée est la suivante: si P(n) est vraie, alors P(n+1) est vraie aussi.
Exemple II.19.
Dans l’exemple du dessus (galaxies), il n’y a aucune corrélation du genre entre les propriétés P(n) pour des n différents, puisque savoir que P(n) est vraie n’implique pas forcément que P(n+1) soit vraie aussi.
Exemple II.20.
Supposons que l’on ait devant nous une très longue table sur laquelle sont posés une infinité d’ordinateurs, numérotés 1,2,3,…. On découvre avec effroi que sur chacun de ces ordinateurs est installé un système opérationnel propriétaire, issu d’une grande compagnie.
On suppose que ces ordinateurs sont tous allumés, et que pour tout n, le n-ème ordinateur envoie constamment des données non-cryptées vers son voisin n+1. Dans ce cas, il est absolument certain que si l’ordinateur n est infecté par un virus, alors l’ordinateur n+1 est infecté aussi. En d’autres termes, si on définit la propriété P(n)=“le nème ordinateur est infecté par un virus”, on sait que si P(n) est vraie, alors P(n+1) est vraie aussi. Ceci a la conséquence suivante: si un seul de ces ordinateurs est infecté, alors tous les suivants le sont aussi. En particulier, si le premier est infecté, alors tous sont infectés.
La méthode de démonstration par récurrence consiste à donner une démonstration dans laquelle on utilise une structure semblable à celle de ce dernier exemple. On la résume comme suit: Montrer par récurrence qu’une infinité de propriétés P(n) (n=1,2,3,…) sont vraies, cela consiste
à vérifier que la première propriété P(1) est vraie, (c’est l’initialisation), puis
à vérifier que quel que soit l’indice n⩾1, si P(n) est vraie, alors cela entraîne que P(n+1) est vraie aussi (c’est le pas d’induction).
Si on peut effectivement vérifier ces deux étapes, alors 1. implique que P(1) est vraie, mais alors 2. implique que P(2) est vraie aussi, mais alors 2. implique que P(3) est vraie aussi, etc. Par ce procédé, on démontre donc bien que P(n) est vraie pour tout n⩾1.
Informel II.3.Pour que le pas d’induction ait une chance de fonctionner, il faut évidemment que les propriétés P(n) et P(n+1) puissent être mises en relation, quel que soit n! Et là, la difficulté est de travailler avec un n quelconque, dont on ne spécifie pas la valeur; dans les situations concrètes, ceci implique en général un calcul littéral, dans lequel on manipule ce n inconnu.
Exemple II.21.
Nous allons montrer que pour tout n∈N∗, 1+2+3+4+⋯+n=2n(n+1) Commençons par nommer les deux membres de l’identité ci-dessus, en posant an:=1+2+3+4+⋯+n, et bn:=2n(n+1). Pour un n spécifique pas trop grand, on peut toujours le vérifier en calculant la valeur de an, puis celle de bn, puis de voir si elles sont égales. Par exemple,
pour n=1, on a a1=1 et b1=21⋅2=1, et donc a1=b1
pour n=2, on a a2=1+2=3 et b2=22⋅3=3, et donc a2=b2.
On voit donc que a1=b1 et a2=b2. On pourrait continuer à vérifier la relation “an=bn” pour des n toujours plus grands, en calculant séparément les nombres an et bn “à la main”, et en vérifiant qu’ils sont effectivement égaux. Mais ceci n’exclut pas qu’il existe un n, éventuellement très grand, pour lequel an=bn! Définissons donc, pour tout n⩾1, la propriété P(n) comme étant: “pour l’entier n, on a an=bn”. Montrons, par récurrence, que P(n) est vraie pour tout n⩾1.
Initialisation: on a déjà vérifié plus haut, “à la main”, que a1=b1, et donc on sait que P(1) est vraie.
Pas d’induction: supposons que pour un n donné (dont on n’a pas besoin de spécifier la valeur), P(n) est vraie , c’est-à-dire que l’on a effectivement
an=bn.
Pour montrer que ceci entraîne que P(n+1) est vraie, on va faire un calcul, à l’issue duquel on obtiendra que an+1=bn+1. Or la structure du problème fait que an+1 peut être relié à an. En effet,
an+1=1+2+3+4+⋯+n+(n+1)=an+(n+1).
Mais, puisque l’on est en train de supposer que an=bn, on peut l’utiliser et faire un peu d’arithmétique:
on a bien montré que an+1=bn+1. Ceci montre que siP(n) est vraie, alors P(n+1) est vraie aussi.
On a donc bien montré que P(n) est vraie pour tout n⩾1.
Remarque II.2.
En utilisant la même technique, on peut montrer que pour tout n∈N, 12+22+32+42+⋯+n2=6n(n+1)(2n+1) En fait il existe des formules semblables pour toute somme du type 1k+2k+3k+⋯+nk, où k⩾1 est un entier. Voir ici (Mathologer) pour plus d’informations.
Exemple II.22.
Posons, pour tout n⩾1, an=10n−1, et considérons l’affirmation P(n) définie par “an est un multiple de 9”.
Pour n=1, on a a1=101−1=9, qui est un multiple de 9.
Supposons que P(n) est vraie, c’est-à-dire que an est un multiple de 9. Ceci s’exprime en disant qu’il existe un entier k tel que an=9k. Remarquons alors qu’on peut écrire
Or puisque k est un entier, k′=10k+1 est aussi un entier. Donc an+1=9k′: an+1 est aussi un multiple de 9, et donc P(n+1) est vraie.
Ceci montre que P(n) est vraie pour tout n⩾1.
II.7.1 La formule du binôme de Newton
Rappelons la définition des coefficients binômiaux. Pour un entier n⩾1 quelconque, et pour tout 1⩽k⩽n, (kn):=k!(n−k)!n! En combinatoire, (kn) compte le nombre de façons d’arranger k objets indistingables dans n boîtes (un objet par boîte).
Lemme II.3.
(formule du binôme de Newton) Soient x,y∈R. Alors pour tout entier n⩾1, (x+y)n=k=0∑n(kn)xn−kyk.