This prototype explores how Large Language Models (LLMs) and Retrieval-Augmented Generation can support undergraduate students in navigating Bachelor of Science specialization choices through an AI-powered conversational experience. By leveraging conversational AI, institutional academic information, and publicly available alumni data, the Specialization Explorer enables students to reflect on their interests, compare specialization options, and discover academic pathways that align with their goals through personalized, open-ended dialogue.
| Index | Description |
|---|---|
| High Level Architecture | High level overview illustrating component interactions |
| Deployment | How to deploy the project |
| User Guide | The working solution |
| Knowledge Base | How the project uses Bedrock Knowledge Bases |
| Directories | General project directory structure |
| Additional Documentation | Comprehensive guides and references |
| Credits | Meet the team behind the solution |
| License | License details |
The following architecture diagram illustrates the various AWS components utilized to deliver the solution. For an in-depth explanation of the frontend and backend stacks, please look at the Architecture Deep Dive.
To deploy this solution, please follow the steps laid out in the Deployment Guide.
Please refer to the Web App User Guide for instructions on navigating the web app interface.
Please refer to Knowledge Base Documentation as it explains how the project uses Bedrock Knowledges Bases. This includes the data source state machine, S3 and website ingestion phases, scheduler polling, retry behavior, and admin dashboard integration.
├── cdk/
│ ├── bin/
│ │ └── cdk.ts
│ ├── lambda/
│ │ ├── adminAuthorizerFunction/
│ │ │ └── adminAuthorizerFunction.js
│ │ ├── authorization/
│ │ │ ├── addAdminOnSignUp.js
│ │ │ ├── initializeConnection.js
│ │ │ ├── preSignUp.js
│ │ │ └── userAuthorizerFunction.js
│ │ ├── db_setup/
│ │ │ ├── migrations/
│ │ │ │ └── 000_initial_schema.js
│ │ │ └── index.js
│ │ ├── ecrImageWaiter/
│ │ │ ├── index.js
│ │ │ └── package.json
│ │ ├── handlers/
│ │ │ ├── utils/
│ │ │ │ ├── cors.js
│ │ │ │ ├── handlerUtils.js
│ │ │ │ └── validation.js
│ │ │ ├── adminHandler.js
│ │ │ ├── chatSessionHandler.js
│ │ │ ├── initializeConnection.js
│ │ │ ├── systemMessagesHandler.js
│ │ │ └── userHandler.js
│ │ ├── knowledgeBase/
│ │ │ ├── helpers/
│ │ │ └── main.py
│ │ ├── knowledgeBaseProvisioner/
│ │ │ └── main.py
│ │ ├── publicTokenFunction/
│ │ │ ├── cors.js
│ │ │ └── publicTokenFunction.js
│ │ ├── textGeneration/
│ │ │ ├── helpers/
│ │ │ ├── main.py
│ │ │ └── requirements.txt
│ │ ├── vectorIndexManagerSigV4/
│ │ │ ├── Dockerfile
│ │ │ ├── main.py
│ │ │ ├── requirements.in
│ │ │ └── requirements.txt
│ │ └── websocket/
│ │ ├── connect.js
│ │ ├── default.js
│ │ └── disconnect.js
│ ├── layers/
│ │ ├── aws-jwt-verify.zip
│ │ ├── node-pg-migrate.zip
│ │ ├── postgres.zip
│ │ └── psycopg2.zip
│ ├── lib/
│ │ ├── amplify-stack.ts
│ │ ├── api-stack.ts
│ │ ├── cicd-stack.ts
│ │ ├── database-stack.ts
│ │ ├── dbFlow-stack.ts
│ │ ├── knowledge-base-stack.ts
│ │ └── vpc-stack.ts
│ └── OpenAPI_Swagger_Definition.yaml
│
├── Docs/
│ ├── media/
│ ├── API_DOCUMENTATION.md
│ ├── ARCHITECTURE_DEEP_DIVE.md
│ ├── AWS_MANAGED_KEYS.md
│ ├── BEDROCK_GUARDRAILS.md
│ ├── DATABASE_MIGRATIONS.md
│ ├── DEPENDENCY_MANAGEMENT.MD
│ ├── DEPLOYMENT_GUIDE.md
│ ├── MODIFICATION_GUIDE.md
│ ├── SECURITY_OVERVIEW.md
│ └── USER_GUIDE.md
│
└── frontend/
└── src/
├── assets/
├── components/
│ ├── Admin/
│ ├── ChatInterface/
│ └── ui/
├── functions/
├── hooks/
├── layouts/
├── lib/
├── pages/
│ ├── Admin/
│ └── ChatInterface/
├── providers/
├── types/
├── App.tsx
└── main.tsx
- React 19 with TypeScript
- Vite for build tooling
- Tailwind CSS for styling
- shadcn/ui (Radix UI) for UI components
- AWS Amplify for hosting and Cognito authentication
- Recharts for analytics charts
- React Router for client-side routing
- AWS Lambda (Python 3.12 and Node.js 22) for serverless compute
- Amazon Bedrock for LLM inference — Claude Haiku 4.5 and Claude Sonnet 4.6 (Anthropic)
- Amazon Bedrock Knowledge Base with Cohere Embed English v3 for vector embeddings
- Amazon OpenSearch Serverless for vector storage and similarity search
- PostgreSQL (RDS) for relational data storage
- Amazon S3 for knowledge base document storage
- API Gateway (REST and WebSocket) for APIs
- AWS Cognito for authentication and authorization
- AWS CDK (TypeScript) for infrastructure as code
- AWS CodePipeline for CI/CD (Docker image builds)
- Amazon RDS with RDS Proxy for managed PostgreSQL
- Amazon VPC for network isolation
- Architecture Deep Dive: Comprehensive overview of system architecture and component interactions
- Security Overview: Security architecture, controls, and compliance summary
- Deployment Guide: Step-by-step instructions for deploying to AWS
- Modification Guide: Guidelines for customizing and extending the application
- Bedrock Guardrails: Configuration and management of AWS Bedrock guardrails for AI safety
- Database Migrations: Guide to the database migration system and best practices
- Dependency Management: Managing Python dependencies in Lambda functions using pip-tools
- Changelog: Version history and release notes
- API Documentation: Comprehensive API reference for all REST and WebSocket endpoints
- User Guide: Complete guide for end-users on how to interact with Specialization Explorer
This application was architected and developed by the UBC Cloud Innovation Centre team. Thanks to the UBC CIC Technical and Project Management teams for their guidance and support.
This project is distributed under the MIT License.
Licenses of third-party libraries and services used by this system:
PostgreSQL License For PostgreSQL — a liberal open source license, similar to BSD or MIT.
Cohere Terms of Use For Cohere Embed English v3, accessed via Amazon Bedrock for vector embeddings.
Anthropic Usage Policy For Claude Haiku 4.5 and Claude Sonnet 4.6, accessed via Amazon Bedrock for text generation.
MIT License For open-source libraries and components used in this project.
