Skip to content

Interview Preparation

Two-minute script

“I built a grievance redressal platform with a React/Vite frontend and async FastAPI backend. Citizens use an LLM-assisted conversation that classifies a grievance, extracts mandatory fields, asks follow-ups, and creates a case. PostgreSQL stores the workflow, Redis holds temporary chat state, pgvector powers policy RAG with role filters, and GCS stores attachments and ATR PDFs. Terraform deploys the API and operational jobs to Cloud Run with Cloud SQL, IAM, and Secret Manager.”

Likely questions

  • Why separate Redis sessions from PostgreSQL cases?
  • How does role-based RAG prevent unauthorized context from entering the prompt?
  • How do Cloud Run jobs improve migrations and ingestion?
  • What happens when an LLM returns malformed extraction data?
  • How are officer workload and SLA deadlines calculated?
  • Which controls protect uploaded documents and generated PDFs?

Honest tradeoffs

The modular monolith is simpler than microservices but still has provider and deployment coupling. The PoC has strong infrastructure direction, while production observability, notification delivery, abuse controls, and browser/E2E coverage need more evidence.

Five-minute deep dive

Start with the ownership boundary: the browser owns presentation and session interaction; FastAPI owns authorization and workflow; PostgreSQL owns durable case truth; Redis owns temporary conversation state; GCS owns binary artifacts; Gemini/LiteLLM provide model capabilities; Terraform owns the GCP topology. Then walk one case from /chat/start through SSE, category confirmation, field extraction, finalization, assignment, and dashboard tracking.

The strongest design discussion is the RAG boundary. Retrieval does not search all chunks and filter after generation; it computes an allowlist from the authenticated role before pgvector search. The LLM is instructed to cite only retrieved sources, and returned source names are checked against the retrieved set.

STAR prompts

  • Situation: users struggled with fixed forms for complex complaints.
  • Task: preserve structured case records without making citizens learn the schema.
  • Action: use a bounded classification/extraction/follow-up workflow with explicit category confirmation.
  • Result: a conversational intake path feeds deterministic assignment, SLA, and reporting.

  • Situation: local services and cloud deployment had different operational needs.

  • Task: support local iteration while preparing GCP hosting.
  • Action: keep Docker Compose for Postgres/Redis and model Cloud Run, Cloud SQL, GCS, IAM, and jobs in Terraform.
  • Result: infrastructure responsibilities are explicit and migration steps are scriptable.