Live product
Cinerd
Find a film from a memory.
22,029 films in the catalog
Personal project: ingestion, search, evaluation and deployment
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.