recommender-backend / README.md
Kareman's picture
fix(readme)
435e28e
---
title: Movie Recommender
emoji: 🤖
colorFrom: blue
colorTo: green
sdk: docker
sdk_version: "1.0"
app_file: app.main
pinned: false
---
# 🎬 Movie Recommender System (FastAPI + LangGraph + FAISS)
This project is an AI-powered **movie recommender system**.
It uses **FAISS vector search**, **local embeddings**, and **LLMs (via OpenRouter)** to recommend movies in **any language**.
The pipeline:
1. Detects the language of the user query.
2. Translates the query into English.
3. Retrieves similar movies using embeddings + FAISS.
4. Generates natural language explanations with an LLM.
5. Translates the explanations back into the user’s language.
---
## ✨ Features
- Multilingual support (query in any language 🌍).
- Fast similarity search with **FAISS**.
- Local embeddings with [MiniLM](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2).
- Explanations powered by **OpenRouter LLMs**.
- Modular pipeline built with **LangGraph**.
---
## 🛠️ Tech Stack
- **Backend**: FastAPI
- **Vector DB**: FAISS
- **Embeddings**: `sentence-transformers/all-MiniLM-L6-v2` (local)
- **Orchestration**: LangChain + LangGraph
- **LLM**: OpenRouter (Meta LLaMA Scout free by default)
- **Deployment**: Docker / Hugging Face Spaces
---
## 📂 Project Structure
```
.
├── app/
│ ├── main.py # FastAPI entry point
│ ├── recommender.py # Core recommender logic
│ ├── graph.py # LangGraph workflow
│ └── utils.py # Helper functions
├── data/ # Movies dataset
├── faiss_index/ # Prebuilt FAISS index + metadata
├── prepare_data.py # Script to build FAISS index
├── requirements.txt
├── .env # API keys (not committed)
├── .gitignore
└── README.md
```
---
## 🚀 Getting Started
### 1. Clone & Setup
```bash
git clone https://github.com/your-username/movie-recommender.git
cd movie-recommender
# Create virtual environment
python -m venv .venv
source .venv/bin/activate
# Install dependencies
pip install -r requirements.txt
```
### 2. Environment Variables
Create a `.env` file in the project root:
```ini
OPENROUTER=your_openrouter_api_key
```
### 3. Prepare FAISS Index
If not already included:
```bash
python prepare_data.py
```
This builds:
- `faiss_index/movies_index.faiss`
- `faiss_index/movies.pkl`
### 4. Run FastAPI App
```bash
uvicorn app.main:app --reload
```
Backend will start at:
👉 http://127.0.0.1:8000
Interactive API docs at:
👉 http://127.0.0.1:8000/docs
---
## 📌 Example Usage
### Request
```bash
curl -X POST http://127.0.0.1:8000/recommend -H "Content-Type: application/json" -d '{"query": "لطفا یک فیلم فانتزی هیجان انگیز شاد بهم معرفی کن", "k": 5}'
```
### Response
```json
[
{
"title": "The Incredibles",
"genres": "Action|Animation|Adventure",
"overview": "A family of superheroes...",
"explanation": "این فیلم یک ماجراجویی شاد و هیجان‌انگیز است که با درخواست شما مطابقت دارد."
},
...
]
```
---
## 🐳 Deployment with Docker
Build and run locally:
```bash
docker build -t movie-recommender .
docker run -p 8000:8000 movie-recommender
```
For Hugging Face Spaces:
- Only `/tmp` is writable at runtime.
- Pre-download embeddings + FAISS index during build.
---
## 🧩 Next Steps
- Add **user profiles** for personalized recommendations.
- Support **hybrid search** (metadata + embeddings).
- Add **Next.js frontend** for a full-stack app.
- Deploy to **Hugging Face Spaces**.
---
## 📜 License
MIT License. Free to use & modify.