Akademia
Exams generated from your own material
The problem
Studying from your own material means writing your own exam questions first. That is the slowest part of preparing for anything, and it is the part everyone skips.
Akademia takes the documents you already have and produces questions from them. The interesting engineering is not the prompt. It is everything around the prompt.
A retrieval problem, not a prompting problem
An uploaded document is stored, chunked at a thousand characters with two hundred characters of overlap, and each chunk is embedded and kept alongside its source. Generation retrieves the top eight chunks for a topic and writes questions only from those passages, so a question stays answerable from the material the user actually supplied.
Embeddings run on text-embedding-3-small through OpenRouter, while the chat model is Llama 3.3 70B on Groq. Two providers is not indecision: Groq serves no embedding models, so the pipeline has to span both. Gemini Embedding 2 is being added as a second embedding provider so that no single vendor can strand the pipeline.
Generated questions are drafts, not answers
Nothing a model writes becomes a real question on its own. Every generated item lands in a drafts table with a status of generated, validated or rejected, and carries a reference back to the source document it came from.
That gate is the whole point. A model that hallucinates a plausible question about a topic you are being examined on is worse than no question at all, so the system is built on the assumption that it will, and makes a human the last step.
A seam where the vector store will go
The first version stores each embedding as a JSON float array in a text column. That is not the end state and the migration says so out loud: the upgrade path to a pgvector column of dimension 1536 is written into the schema as a comment, and retrieval sits behind a port.
Switching from a full scan to a real vector index means writing one adapter. The domain does not find out. Shipping the simple version first was a choice, not an oversight, and leaving the seam visible is what makes it a choice.
The rest of the product
Around the pipeline there is an actual application: timed exams and mock tests, spaced-repetition flashcards on the SM-2 algorithm, a subjects to units to questions hierarchy, JWT with Google OAuth2 for sign-in, and a Stripe store for study materials.
Java 21 and Spring Boot 3.4 on the backend, React 18 with Vite 5 and Tailwind on the front, the whole stack in Docker.