Inspiration
What it d## Inspiration
Most chatbots can talk about anything except the documents you actually care about. I wanted an assistant that could read my own files (PDFs, spreadsheets, slides, even photos of text) and answer questions grounded in that content instead of guessing. I also wanted it to feel like a real product, not a notebook demo, so I built Vini AI, a RAG chatbot with a clean web UI, document upload, OCR and a live knowledge base.
What it does
Vini AI is a Retrieval-Augmented Generation chatbot that:
- Answers questions about uploaded documents and summarizes them
- Supports PDF, DOCX, XLSX, PPTX, TXT, MD, CSV, JSON, HTML and images (PNG, JPG, WEBP, BMP, TIFF)
- Extracts text from images with OCR (Tesseract), so scanned pages become searchable
- Crawls and ingests a website into the knowledge base and refreshes it on demand with no restart (
POST /api/syaa/refresh) - Gives real-time India date and time (Asia/Kolkata), generated dynamically rather than stored in the knowledge base
- Keeps chat history in SQLite and exposes knowledge-base stats (
/api/kb/count,/api/kb/stats) - Acts as a general-purpose AI assistant when a question isn't about the documents
How I built it
Pipeline: upload → text extraction → chunking → embeddings → vector storage → retrieval → generation
- Extraction: PyMuPDF (PDF), python-docx, OpenPyXL, python-pptx, and Tesseract OCR for images
- Chunking: large documents are split into smaller pieces for precise retrieval
- Embeddings:
all-MiniLM-L6-v2from Sentence Transformers - Vector store: ChromaDB for similarity search
- Generation: the top chunks go to GPT-OSS 120B on the Groq API as context, which gives fast responses
- Backend: Flask with SQLite for history, served by Gunicorn
- Frontend: HTML, CSS and JavaScript, with a live frontend on Lovable
- Deployment: Dockerized and ready for Render, with API keys kept in environment variables
Stack: Python, Flask, Groq, GPT-OSS 120B, ChromaDB, Sentence Transformers, PyMuPDF, Tesseract, SQLite, Docker, Gunicorn
Challenges I ran into
- Many file formats: every format needs its own parser and fails differently, so I normalized everything to clean text before chunking.
- OCR setup: getting Tesseract working reliably (especially on Windows) meant adding a configurable
TESSERACT_CMDpath and writing a setup guide. - Time-sensitive answers: a vector store can't answer "what time is it?", so date and time are handled dynamically instead of being embedded.
- Keeping knowledge fresh: I built a website ingestion and refresh endpoint so the knowledge base updates without restarting the app.
- Secrets and deployment: keeping the Groq API key out of the repo and making the app run the same locally, in Docker and on Render.
Accomplishments that I'm proud of
- A complete end-to-end RAG system covering ingestion, OCR, retrieval, generation, a UI and deployment, not just a notebook
- One chatbot that handles 15+ file types, including images
- A knowledge base you can refresh live, with its own stats endpoints
- A Docker-ready, deployment-ready project with documentation
What I learned
- How chunking and embedding choices affect answer quality in RAG
- Why retrieval and live data (like the current time) need to be handled separately
- How to structure a Flask app around a vector database, an LLM API and persistent chat history
- Practical deployment skills: Docker, environment variables and secret management
What's next for Vini AI
- User authentication and multiple knowledge bases per user
- Streaming responses and better conversation memory
- Voice input and text-to-speech
- Multi-language support and a more mobile-friendly UI
- A cloud-hosted vector database and an analytics dashboard
Links: GitHub · Live frontend · See the architecture diagram in the project gallery
Log in or sign up for Devpost to join the conversation.