All projects

Live product

Cinerd

Find a film from a memory.

22,029 films in the catalog

MY ROLE

Personal project: ingestion, search, evaluation and deployment

HOW TO READ THE RESULT

On the test set kept separate from calibration, nDCG@10 rose from 0.360 with BM25 to 0.829 with hybrid search. The metric evaluates ranking; it is not an accuracy percentage.

THE DECISION THAT MATTERS

Remove a more complex model

The cross-encoder increased latency around 40-fold without a consistent quality gain. Removing it was an evaluation-driven decision.

A REAL CINERD DECISION

Keep a more complex model?

I tested a cross-encoder to rerank results. Evaluation showed a gain within the noise and latency around 40 times higher.

See the decision and reasoning

I removed the cross-encoder from production. The inconsistent gain did not justify the latency cost. Hybrid search continued to be evaluated through quality tests.

These numbers describe the test reported in the résumé. This interaction presents the decision; it does not run a new measurement or execute the models.

The challenge

We don't always remember a film's title. A vague description of a scene or character should be enough to start searching.

My contribution

I built a catalog of 22,029 titles and a search engine combining keywords with semantic understanding. I handled data ingestion, quality evaluation and production infrastructure.

The result

The product is live. On the test set, result ranking quality went from 0.360 to 0.829 in nDCG@10, comparing keyword-only search with hybrid search. The closer to 1, the better the ranking under this metric.

Explore the technical details

Catalog from TMDB, IMDb and Wikipedia. Eight search signals, including BM25, multilingual-e5-large embeddings, characters and popularity. Z-score normalization with clipping for extremes. Recommendations with a custom SVD, 64 factors and 10 million MovieLens ratings (RMSE 0.83), combined with content through RRF.

Oracle Cloud deployment, DVC, CI with ruff, mypy and pytest, and Prometheus metrics. INT8 quantization reduced memory from 2.3 to 1.7 GB. A cross-encoder was removed because it increased latency around 40-fold without a consistent quality gain.

Code on GitHub
Next project: Credit data pipelineDiscuss an opportunity

Project image