2024 · Question generation and adaptive difficulty
StudyWise
Study material that adapts to the student
The problem
Students are handed the same material regardless of what they already understand. Turning a set of lecture notes into something a particular person can learn from is work nobody does, because doing it by hand does not scale.
StudyWise was a final-year project aimed at that gap — take the material a student already has and reshape it into practice rather than expecting them to adapt to it.
The hard part is not generating a question. It is generating the right one. A quiz that stays easy teaches nothing and a quiz that jumps straight to hard is abandoned, so the system has to read how someone is doing and move with them.
How I approached it
Generate questions, then personalise them
I built the multiple-choice generation and tied it to the student's own performance, so the material adapts as they work through it rather than serving a fixed set. The difficulty algorithm went through several passes — getting a model that responds to a run of correct answers without whiplashing on a single mistake took more iterations than the generation itself.
Take input in whatever form the student already has it
Study material does not arrive as clean text. I worked on the PDF path, including asking questions against a document directly, and on an audio pre-processor so a recorded lecture could be fed in as a source instead of only written notes.
Close the loop with feedback
I added the statistics output so a student can see where they are weak rather than just receiving a score, plus flashcard generation as a lighter-weight way through the same material. Some of the work was defensive too — rate-limiting question requests so the generator could not be spammed.
Work as part of a four-person team
This was a team project across four people, with the work split so pieces could progress in parallel and still fit together. It was the first project where I had to care about somebody else's interfaces as much as my own.
What it's built with
- Backend
- Python, Flask, server-rendered Jinja templates
- Data
- Firebase
- Processing
- NLP for question and flashcard generation, PDF parsing, audio pre-processing
What I'd do differently
- A Firebase service account key was committed to the repository. It is a university project that is no longer running, but a credential should never have been in version control — and the fix is to keep secrets in the environment from the first commit, not to remember to remove them later.
- There was a deployment, but it stopped serving and nobody noticed — so the project effectively exists as a repository and a report rather than something anyone can use. Getting a rough hosted version to stay up would have been worth more than the last few features we added instead.
- The difficulty model was tuned by feel against our own testing. It needed real students and a way to measure whether the adaptation actually helped anyone learn faster.