Similar Product Recommendation System
I helped build a system that surfaces products similar to one a user just clicked, in real time, across multiple recommendation surfaces. This walks through how a system that increased total clicks in the home feed's and product-detail page's recommendation areas by 13% and 9% respectively was built.
Situation
User engagement with the recommendation area on the product-detail screen was lower than expected, and we traced the cause to the collaborative-filtering algorithm already running there. A collaborative-filtering algorithm that recommends "products other users viewed together" didn't align well with Bungaejangter users' actual behavior pattern — deciding on a specific item they want, then comparing similar alternatives before buying. So we needed a content-based algorithm that recommends items with attributes similar to the one a user clicked.
Task
- Defining a product vector: Since the core of this algorithm is finding "products similar to the one a user clicked," we needed to represent a product's multi-dimensional attributes — category, brand, price, title text — in a single unified vector space where semantically close products sit near each other.
- Domain fit: Public pretrained text encoders are trained on data that doesn't reflect Bungaejangter's domain vocabulary, so we'd need to continue training on domain data regardless. On top of that, since a public encoder's backbone size sets a hard floor on operating cost, we built a lightweight encoder designed from the ground up for our domain and task.
- Operating cost: Recommendation inference is a high-call-volume component that runs 24/7, so a system that could run reliably on minimal CPU resources was preferred to keep costs down.
Action
Result
The algorithm we built first launched in the first container of the recommendation area at the bottom of the product-detail screen. That spot had been running a system that pre-trained product vectors with a collaborative-filtering algorithm to recommend similar products. That approach couldn't recommend a newly listed product at all until its vector had been trained, which meant a lower-performing fallback algorithm was shown fairly often.
Our algorithm, by contrast, doesn't pre-train a vector per product — instead, it takes product attributes (title, category, brand, price, size) as input and generates the vector at inference time. That means a newly listed product is vectorized instantly, with no training step, and can be recommended right away — resolving the legacy algorithm's cold-start limitation.
An A/B test against the legacy algorithm showed a 30% higher daily average CTR, and we replaced the legacy algorithm with ours. As a result, clicks on products in that recommendation area rose substantially, increasing per-user product clicks across the entire product-detail page by about 6% over baseline. On the strength of that result, the same algorithm has since been extended to a slot on the home screen that recommends products similar to ones a user recently clicked.
We later redesigned the text encoder to fix a bug that had been degrading embedding quality, and the following changes in user engagement on the home and product-detail recommendation surfaces were observed as a result.
- Home recommendation area: recommendation-area click volume up 13% over baseline, translating to a 10.2% increase in CTR and a 10.4% increase in the share of users who clicked the recommendation area
- Product-detail recommendation area: recommendation-area click volume up 9% over baseline, translating to a 4.1% increase in CTR and a 3.6% increase in the share of users who clicked the recommendation area