Multi-Objective Recommender System for Marketplaces

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1All 1566 services
Multi-Objective Recommender System for Marketplaces
Complex
~2-4 weeks
Frequently Asked Questions

AI Development Areas

AI Solution Development Stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1317
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1226
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    925
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1156
  • image_logo-advance_0.webp
    B2B Advance company logo design
    620
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    894

Multi-Objective Recommender System for Marketplaces

A marketplace with 10 million SKUs and 50,000 sellers—the recommender system here doesn't just pick products; it balances relevance, monetization, and seller satisfaction. A typical mistake: sacrificing quality for conversion or vice versa. Recommender systems for marketplaces are a complex engineering product where poor tuning leads to a drop in GMV or seller churn. Our experience shows that the optimal solution is a multi-objective architecture with weights that adjust to business goals.

How Multi-Objective Architecture Resolves the Conflict of Interests?

The key challenge is that the interests of the buyer (finding the right product), the seller (promoting their product), and the platform (earning revenue) often conflict. We implement scoring with multiple objective functions, each with its own weight. For example, relevance—50%, product quality—20%, seller diversity—15%, promoted products—10%, conversion—5%. Weights are selected empirically through A/B tests.

import numpy as np
import pandas as pd
from dataclasses import dataclass

@dataclass
class MarketplaceItem:
    item_id: str
    seller_id: str
    price: float
    rating: float
    review_count: int
    is_promoted: bool
    conversion_rate: float
    inventory: int

class MarketplaceRecommender:
    """Recommendations with multi-objective balancing"""

    def __init__(self, user_model, item_index, seller_index):
        self.user_model = user_model
        self.item_index = item_index
        self.seller_index = seller_index

        # Objective function weights
        self.weights = {
            'relevance': 0.50,      # Relevance to user
            'quality': 0.20,        # Rating and reviews
            'seller_diversity': 0.15,  # Seller diversity
            'promoted': 0.10,       # Promoted products
            'conversion': 0.05      # Historical CR
        }

    def recommend(self, user_id: str, context: dict,
                   n: int = 20) -> list[dict]:
        """Multi-objective recommendations"""
        # Retrieval: top candidates by relevance
        user_emb = self.user_model.get_user_embedding(user_id)
        candidates = self.item_index.search(user_emb, k=200)

        # Scoring: multi-objective function
        scored = []
        seller_count = {}

        for item_id, relevance_score in candidates:
            item = self._get_item(item_id)
            if item is None or item.inventory == 0:
                continue

            # Product quality
            quality_score = (
                item.rating / 5.0 * 0.6 +
                np.log1p(item.review_count) / 10 * 0.4
            )

            # Penalty for seller concentration
            seller_count[item.seller_id] = seller_count.get(item.seller_id, 0) + 1
            seller_diversity = 1 / seller_count[item.seller_id]

            # Promoted boost (with limit)
            promo_boost = 1.2 if item.is_promoted else 1.0

            # Final score
            final_score = (
                self.weights['relevance'] * relevance_score +
                self.weights['quality'] * quality_score +
                self.weights['seller_diversity'] * seller_diversity +
                self.weights['promoted'] * (promo_boost - 1) +
                self.weights['conversion'] * item.conversion_rate
            )

            scored.append({
                'item_id': item_id,
                'seller_id': item.seller_id,
                'score': final_score,
                'relevance': relevance_score,
                'quality': quality_score
            })

        # Sort and return
        scored.sort(key=lambda x: x['score'], reverse=True)
        return scored[:n]

    def _get_item(self, item_id: str) -> MarketplaceItem:
        return self.seller_index.get(item_id)

    def similar_items_cross_seller(self, item_id: str,
                                    n: int = 6) -> list[dict]:
        """Similar products from other sellers (comparison shopping)"""
        item = self._get_item(item_id)
        if not item:
            return []

        similar = self.item_index.search_similar(item_id, k=20)

        # Filter: different seller, but similar product
        cross_seller = [
            s for s in similar
            if self._get_item(s[0]) and self._get_item(s[0]).seller_id != item.seller_id
        ]

        return cross_seller[:n]

How to Solve the Cold Start Problem?

New products have no interaction history—standard collaborative filtering does not work. According to Wikipedia on cold start, the problem occurs when a new item has no interactions. Our approach: use content-based boost based on metadata. Products with a high rating (≥4.5) and competitive price receive an initial score of 0.5. Additionally, 8% of traffic is allocated to exploration—the product is shown to a random sample of users.

Example exploration strategyWe use 8% of traffic for random display of new products. This allows collecting enough data within 2-3 weeks to switch to a hybrid model.
After 2-3 weeks, enough data accumulates to switch to a hybrid model.

    def handle_new_item_cold_start(self, item: MarketplaceItem,
                                    item_features: dict) -> float:
        """Initial boost for new products"""
        base_score = 0.3  # Base position

        # Metadata-based boost
        if item.rating >= 4.5 and item.review_count >= 10:
            base_score += 0.2
        if item.price < self._get_category_avg_price(item_features.get('category')):
            base_score += 0.1  # Competitive price

        # Explore-exploit balance for new products
        # Show to 5-10% of traffic to collect data
        import random
        if random.random() < 0.08:  # 8% exploration
            return 0.7 + random.random() * 0.3

        return base_score

Comparison of Approaches to Interest Balancing — Recommender System Development

Approach Objective Advantages Disadvantages
Pure relevance Relevance High CTR Ignores monetization, seller dominance
Weighted multi-objective Balance all goals Flexibility, adjustable to business Complexity of weight selection
Constrained optimization (CCO) Maximize GMV under constraints Direct optimization of business metric Risk of quality reduction under tight constraints

Multi-objective architecture increases GMV by 1.12-1.2 times compared to pure relevance and boosts CTR by 1.3-1.5 times. This makes it more effective for long-term monetization.

What Does A/B Testing Provide for Recommendations?

Standard metrics: precision@k, recall@k, NDCG are insufficient for a marketplace. We use business metrics: GMV per session, homepage CTR, conversion rate. An A/B test is conducted for at least 2 weeks with 50/50 traffic split. Additionally, we monitor seller satisfaction through a monthly NPS among sellers.

Recommendation Effectiveness Metrics

Metric Before Implementation After Multi-Objective System
GMV per session baseline +12-20%
Homepage CTR baseline +30-50%
Conversion rate baseline +5-10%

Development Process: From Audit to Deployment

  1. Data audit: analyze interaction logs, product cards, seller profiles. Identify data quality issues and biases (selection bias, popularity bias).
  2. Architecture design: choose models (embeddings, transformers), define pipeline: batch vs online, select vector DB (ChromaDB, Qdrant).
  3. Implementation: write production-ready code in PyTorch/Hugging Face, wrap in REST API with p99 latency < 100ms.
  4. Integration: connect to the storefront, set up data drift monitoring via Weights & Biases.
  5. A/B testing: run experiment, analyze results, adjust weights.
  6. Documentation and training: hand over code, model description, maintenance instructions.

What’s Included in Turnkey Development

  • Full documentation: architecture description, deployment instructions, maintenance guide.
  • Source code of the model and pipeline with comments.
  • REST API for storefront integration.
  • Setup of data drift monitoring and A/B testing.
  • Training of the client's team on the system.
  • Technical support during the launch phase.

Timelines and Cost

Timelines: from 4 weeks (MVP) to 3 months (full system). Cost is calculated individually—depends on data volume, integration complexity, and real-time requirements. Get a consultation: we will analyze your data and propose an architecture suited to your business goals. Contact us for a project assessment—our experience includes 20+ implementations for high-turnover marketplaces. We guarantee a transparent process and post-launch support.