Case Study

ARIA

My First RAG Chatbot

Role
Solo Build
Status
Live
Stack
React · FastAPI · LangChain
— Interactive Case Study
An editorial spread on the build, the architecture, and what I learned from shipping this project.

A closer look at the decisions, implementation details, and lessons behind the project.

Vaishali Aggarwal portfolio case study magazine cover
01
Overview

Most RAG tutorials explain the individual pieces without showing what it feels like to connect them into a usable application. ARIA was built to explore that gap — from document ingestion and embeddings to retrieval, chat state, and frontend/backend synchronization.

The result is a full-stack chatbot where users can upload documents, ask questions about them, and receive responses grounded in the uploaded content.

02
Highlights
Document ingestion

Upload and delete documents, validate files, extract content, chunk documents, and prepare them for retrieval.

RAG-powered chat

User queries retrieve relevant document chunks before the LLM generates a contextual response.

Per-session isolation

Each user session gets an isolated ChromaDB collection so uploaded documents remain separated.

Shared document state

React Context keeps document state synchronized across pages and centralizes upload, deletion, loading, and error handling.

Request cancellation

AbortController allows users to manually cancel an in-progress chat request.

Optimistic UI

UI updates are handled optimistically where appropriate to make uploads and interactions feel more responsive.

Dynamic greetings

The initial greeting is generated dynamically using the LLM rather than being hardcoded.

Admin document management

A dedicated admin page makes it easier to inspect and manage uploaded documents.

03
Technical Snapshot

The application is split between a React frontend and a layered FastAPI backend, with LangChain handling the RAG workflow and ChromaDB providing session-isolated vector storage.

00Upload documentUser action
01Validate + loadDocument processing
02Chunk documentsText splitting
03Generate embeddingsNomic
04Vector storeSession-isolated ChromaDB
05Retrieve relevant chunksQuery time
06Generate responseGroq
04
Challenges
How do I isolate users?
Each session receives a unique identifier and its own ChromaDB collection, keeping document retrieval isolated between concurrent users.
How should chat state be managed?
Chat messages are managed with a reducer while sessionStorage provides temporary persistence across page navigation and the browser session.
How do I keep documents synchronized?
Document state is centralized with React Context so upload, deletion, loading, and error states remain consistent across pages.
How should users stop a request?
AbortController is used to cancel an in-progress chat request manually instead of forcing the user to wait for the response to finish.
05
Outcome

ARIA gave me hands-on experience building a RAG application beyond a notebook — connecting document ingestion, embeddings, vector storage, retrieval, LLM responses, session isolation, and frontend state into one application.

It is intentionally a learning project rather than a production-ready system, but it gave me a much clearer understanding of where the complexity in RAG applications actually lives.

Shipped end-to-end, live demoPer-session document isolationDocument-grounded responsesManual request cancellationReact + FastAPI architecture
Continue Exploring
More Projects

If you enjoyed this build, here are a few others.

— LET'S TALK

Building something that needs an AI assistant done right?