
Upload your notes and PYQ papers, get page-cited answers, spot which topics repeat every year, and auto-generate a predicted model paper. A Django RAG final year project with full source code.
Python | Django | Django REST Framework | ChromaDB | Sentence-Transformers | Groq API | PyMuPDF | scikit-learn | ReportLab | Chart.js | Tailwind CSS | SQLite
ExamPilot AI is a study assistant that only knows what you feed it. You upload your unit-wise notes and your college's previous-year question papers as PDFs, and the app does four things with them: answers your questions while citing the exact page it pulled the answer from, groups reworded duplicate questions across years to show which topics your university keeps repeating, builds a predicted model paper out of those repeat topics, and writes answers sized to the marks allotted.
Here's the part that matters for your viva. This isn't a ChatGPT wrapper with a nice UI on top. If the answer isn't in your uploaded notes, the Chat module replies "Not found in your notes" instead of confidently making something up. That behaviour is enforced twice — once by a cosine-distance threshold in core/rag.py that rejects weak retrieval matches, and again by a system prompt that forbids the model from answering out of its own general knowledge. When your examiner asks "how do you stop hallucination," you have a real, specific, two-layer answer.
Your PDFs never leave your laptop either. PyMuPDF extracts the text, all-MiniLM-L6-v2 from sentence-transformers embeds it locally, and ChromaDB stores the vectors in a folder called chroma_store/ right there on disk. The only outbound network call is the final answer generation, which hits the Groq API.
Ask "what is thrashing" and you get an answer plus the page numbers it came from — not a vague "according to your notes." Chunking happens per page, not across page boundaries, precisely so a citation can never point to an ambiguous location.
Hit "Process PYQs" and the app extracts every individual question from your uploaded papers as structured JSON (question text, marks, unit), embeds each one, and clusters them with scikit-learn's AgglomerativeClustering at a cosine distance threshold of 0.35. Questions worded three different ways across three different years land in the same cluster. Each cluster gets scored by frequency plus a recency weight with a 3-year half-life, so a topic asked twice in 2024 and 2025 outranks one asked three times back in 2015. Output is a bar chart of top topics and a stacked chart of questions per unit split by marks band, both rendered with Chart.js.
Pick a subject, pick how many questions you want per section, and it lays out Section A (2 marks), Section B (5 marks), and Section C (10 marks) from the highest-scoring clusters. Downloadable as a PDF via ReportLab.
Click "Get Answer" next to any generated question. A 2-mark answer comes back as a 40–50 word definition with a short example. A 10-mark answer comes back with an intro, five or six headed points, a diagram description, a conclusion, and key terms bolded. Different marks, genuinely different answer shapes — not the same paragraph padded out.
Run python manage.py load_sample_data and you instantly get two subjects — Operating Systems and Database Management Systems — with notes for 3 units each and five years of PYQ papers from 2021 to 2025. Real PDFs, pushed through the real ingest pipeline, embedded by the real model, clustered by the real clustering code. The analyzer dashboard and paper generator work immediately, no Groq key needed.
Upload, chat, PYQ processing, and answer generation all run through vanilla fetch() helpers in static/js/app.js with spinners and toasts. Django views branch on the X-Requested-With header to serve either a normal page or JSON from the same URL. And there's no Node, no npm install, no webpack — Tailwind comes off the Play CDN and the design tokens live in a hand-written static/css/app.css.
The obvious one is a student prepping for university semester exams with five years of departmental papers sitting in a WhatsApp group. But the pattern goes further than that.
Coaching institutes preparing students for GATE, UGC NET, or state PSC exams can feed in their own question banks and show learners exactly where the repeat weightage sits. College departments can run it over their own paper archive to check whether their question setting has gotten predictable. Corporate L&D teams use the same retrieval-with-citations pattern for internal policy documents where a wrong answer is a compliance problem, not just a lost mark. And any team building a document Q&A tool over private data — legal, medical, HR handbooks — is building this exact architecture, just with different PDFs going in.
The hard part is the clustering threshold. There's no formula that hands you 0.35. Set it too low and "Explain paging" and "What is paging in OS" end up in separate clusters, which wrecks your frequency counts. Set it too high and paging gets merged with segmentation and your model paper starts recommending nonsense. The reasoning behind the chosen value and the average-linkage choice is written out in full inside core/clustering.py — read that docstring before your viva, it's written to be quoted from out loud.
Now the easy part. You'd assume a RAG project means Docker, a vector DB server, a Celery worker, and a Redis instance. This one has none of that. SQLite is the database, Chroma runs in persistent local mode with no server process, ingestion runs synchronously inside the request, and the whole thing starts with python manage.py runserver. If you've built literally any Django CRUD app before, you already know 70% of the structure here. The unfamiliar bits are five or six files inside core/, and each one does exactly one thing.
If you're a student who needs a working project for your college submission, final-year project, semester project, internship, or academic demonstration, this is for you. Whether you're studying BCA, B.Tech, MCA, M.Tech, Computer Science, IT, AI, Data Science, or another related field, you can choose a project that fits your requirements. If you need the source code, project report, documentation, or help setting up and running the project, CodeAj gives you the resources and support to get started faster.
One honest filter though. If your syllabus is strictly a web-development-only paper and your guide wants zero machine learning involved, this might be more than you were asked for. Everyone else — especially if you want something in the AI and ML final year projects space that isn't another Iris flower classifier — should be fine.
You get the complete source code, every Python module and template and migration, plus a project report written to match what Indian university departments actually ask for — abstract, literature survey, system design, ER and data flow diagrams, testing, and results. Setup support is included, so if your virtualenv refuses to activate on your college lab machine at 11 PM the night before submission, that's a fixable problem and not a disaster. You'll find more Django-based builds in our Django projects with source code collection, and if you're still comparing options, the wider Python final year projects catalog is a good place to browse before deciding.
Add any of these professional upgrades to save time and impress your evaluators.
Personal session with an expert developer
We'll install and configure the project on your PC via remote session (Google Meet, Zoom, or AnyDesk).
1-hour live session to explain logic, flow, database design, and key features.
Want to know exactly how the setup works? Review our detailed step-by-step process before scheduling your session.
Fully customized to match your college format, guidelines, and submission standards.
Need feature changes, UI updates, or new features added?
Charges vary based on complexity.
We'll review your request and provide a clear quote before starting work.
Reviews