nice-bill's picture
Readme updated
2d773b1
---
title: Personalisation Engine
emoji: 😻
colorFrom: gray
colorTo: indigo
sdk: docker
app_port: 7860
pinned: false
---
# Semantic Book Personalization Engine
A high-performance, standalone recommendation service that uses **Semantic Search** to provide personalized book suggestions.
Unlike traditional recommenders that rely on collaborative filtering (which fails without massive user data), this engine uses **Sentence Transformers** to understand the *content* of books (Title + Author + Genre + Description), allowing it to work effectively from Day 1 ("Cold Start").
## Key Features
* **Semantic Understanding:** Connects "The Haunted School" to "Ghost Beach" based on plot descriptions, not just title keywords.
* **Hybrid Scoring:** Combines **Semantic Similarity** (85%) with **Book Ratings** (15%) to recommend high-quality matches.
* **Smart Optimization:** Uses **Product Quantization (IVF-PQ)** to compress the search index by **48x** (146MB -> 3MB) with minimal accuracy loss.
* **Time-Decay Memory:** Prioritizes a user's *recent* reads over ancient history.
* **Evaluation:** Achieves **40% Exact Hit Rate @ 10** on held-out author tests.
* **Standalone API:** Runs as a separate microservice (FastAPI) on Port 8001.
## Architecture
This project uses a **retrieval-based** approach:
1. **The Brain:** A pre-trained `all-MiniLM-L6-v2` model encodes all book metadata (Title, Author, Genre, Description) into 384-dimensional vectors.
2. **The Index:** A highly optimized FAISS `IndexIVFPQ` (Inverted File + Product Quantization) index for millisecond retrieval.
3. **The Engine:**
* User history is converted to vectors.
* Vectors are aggregated using **Time-Decay Averaging**.
* The engine searches the FAISS index for the nearest neighbors.
* Results are re-ranked using the book's rating.
## Installation & Setup
### Prerequisites
* Python 3.10+ (or Docker)
* `uv` (recommended for fast package management) or `pip`
### 1. Clone the Repository
```bash
git clone <your-repo-url>
cd personalise
```
### 2. Setup Environment
```bash
# Using uv (Recommended)
uv venv
# Windows:
.venv\Scripts\activate
# Linux/Mac:
source .venv/bin/activate
uv pip install -r requirements.txt
```
### 3. Data Preparation (Crucial Step)
The system needs the "Brain" (Embeddings) and "Index" to function.
**Option A: Download Pre-computed Artifacts (Fast)**
```bash
# Make sure you are in the root 'personalise' folder
python scripts/download_artifacts.py
```
**Option B: Generate from Scratch (Slow - ~1.5 hours)**
```bash
# 1. Generate Embeddings
python scripts/1b_generate_semantic_data.py
# 2. Optimize Index
python scripts/optimize_index.py
```
## Run the Application
### Option A: Run Locally
```bash
uvicorn src.personalization.api.main:app --reload --port 8001
```
API will be available at `http://localhost:8001`.
### Option B: Run with Docker
The Dockerfile is optimized to cache the model and data layers.
```bash
# 1. Build the image
docker build -t personalise .
# 2. Run the container
docker run -p 8001:7860 personalise
```
## Evaluation & Demo
We have included a synthetic dataset of 10,000 users to validate the model.
**Run the Offline Evaluation:**
This script uses a "Leave-One-Out" strategy to see if the model can predict the next book a user reads.
```bash
python scripts/evaluate_system.py
```
**Visualize User Clusters:**
Generate a 2D t-SNE plot showing how the model groups users by interest (requires `matplotlib` & `seaborn`).
```bash
# First install viz deps
uv pip install matplotlib seaborn
# Run visualization
python scripts/visualize_users.py
```
*Output saved to `docs/user_clusters_tsne.png`*
**Inspect Synthetic Data:**
```bash
python scripts/inspect_data.py
```
## API Usage
#### POST `/personalize/recommend`
Get personalized books based on reading history.
```json
{
"user_history": ["The Haunted School", "It Came from Beneath the Sink!"],
"top_k": 5
}
```
#### POST `/search`
Semantic search by plot or vibe.
```json
{
"query": "detective in space solving crimes",
"top_k": 5
}
```
## Performance Stats
| Metric | Brute Force (Flat) | Optimized (IVF-PQ) |
| :--- | :--- | :--- |
| **Memory** | ~150 MB | **~3 MB** |
| **Recall @ 10** | 100% | ~95% |
| **Speed** | ~10ms | ~2ms |
| **Hit Rate @ 10** | N/A | **40.0%** |
## Roadmap & Future Improvements
* **Model Compression (ONNX):** Replace the heavy PyTorch dependency with **ONNX Runtime**. This would reduce the Docker image size from ~3GB to ~500MB and improve CPU inference latency by 2-3x.
* **Real-Time Learning:** Implement a "Session-Based" Recommender (using RNNs or Transformers) to adapt to user intent within a single session, rather than just long-term history.
* **A/B Testing Framework:** Add infrastructure to serve different model versions to different user segments to scientifically measure engagement.
## License
MIT