July 1, 2026
Movie discovery
Designed an ML serving workflow combining content similarity, item co-occurrence, and popularity; orchestrated training and exposed recommendations behind a FastAPI contract.
Machine learning project
- Role
- ML systems and backend engineer
- Published
- July 2026
- Focus
- Machine learning project
- Engineer
- Saaim Abdullah

A recommender is a product system, not a similarity function
Scope in numbers
| Area | Implemented architecture | Engineering benefit |
|---|---|---|
| Ranking signals | 3 — content, co-occurrence, popularity | Different evidence for familiar items and cold starts |
| Main API capabilities | 4 groups — recommend, similar items, health, model reload | Clear serving and operational contracts |
| Model lifecycles | 2 — offline training and online serving | Training failures do not block every live request |
| Source families | Ratings, tags, links, and movie metadata | Join user behavior with item context |
| Optional cache systems | 1 — Redis | Avoid repeat work where cache keys are safe |
| Scheduling | Airflow workflow | Repeatable feature/model preparation |
How the system works, from file to response
| Phase | Engineering work | Output |
|---|---|---|
| Ingest | Read MovieLens ratings, tags, links, metadata | Consistent movie and interaction records |
| Prepare | Clean identifiers, merge catalogue attributes, derive features | Content and behavior inputs |
| Train | Build content, co-occurrence, popularity scoring structures | Candidate ranking signals |
| Evaluate | Apply offline ranking checks to saved outputs | Comparable model candidate information |
| Package | Serialize model and its dependencies | Explicit loadable artifact |
| Serve | FastAPI loads artifact and validates request | Recommendation/similar-item response |
| Optimize | Optional Redis lookup, structured logs, traces | Controlled latency and observable requests |
| Refresh | Operator invokes model reload | Change model independently from API code |
Signal 1: content similarity
Signal 2: item co-occurrence
Signal 3: popularity
The serving contract matters as much as the model
Trade-offs and what they cost
| Engineering choice | Why it is useful | Hidden cost |
|---|---|---|
| Blend three signals | Covers content, behavior, and sparse-history cases | Weight selection needs offline testing |
| Artifacts separate from requests | Training can be reproducible and scheduled | Versioning and compatibility become mandatory |
| FastAPI | Clear, typed HTTP serving layer | Request concurrency and artifact memory require testing |
| Optional Redis | Potentially reduces repeated ranking work | Cache invalidation on model changes |
| Model reload operation | Model iteration without full service rewrite | Thread safety, rollback, deployment coordination |
| Airflow training | Observable stage dependencies | Scheduler is unnecessary for the smallest local experiments |
How I would prove ranking quality
| Metric | Question it answers | What to report |
|---|---|---|
| Recall@10 | Were relevant held-out items retrieved? | Score and eligible-user count |
| NDCG@10 | Were relevant items near the top? | Score by user segment |
| Coverage | How much of the catalogue is actually recommended? | Percentage of distinct recommended items |
| Cold-start hit rate | How does the service perform with sparse history? | Separate cohorts, not blended overall average |
| API p50/p95 latency | How quickly do users receive results? | Warm, cold, and cached separately |
| Reload failure recovery | Does an invalid artifact disrupt requests? | Test outcome, rollback path |
@10 represents the proposed evaluation cutoff, not a published result. I would also run ablation tests: remove each signal and measure its marginal contribution instead of assuming all three deserve equal weight.
Result
Source



SaaimOpen to full-time roles, contract work, and conversations about things worth building.