Skip to the content.

Architecture

Neural E-Commerce Search is a two-stage retrieve-and-rank system. The two stages trade off cost against precision: a cheap dense retriever narrows the catalogue to a few hundred candidates, then an expensive cross-encoder reranks only those.

                 query
                   │
        ┌──────────▼───────────┐
        │  Stage 1: Retriever  │   bi-encoder  (shared MiniLM encoder)
        │  dense FAISS search  │   embed query → top-N via cosine
        └──────────┬───────────┘
                   │  N≈100 candidate products
        ┌──────────▼───────────┐
        │  Stage 2: Reranker   │   cross-encoder (DeBERTa-v3-base)
        │  joint query×product │   4-way ESCI head → expected relevance
        └──────────┬───────────┘
                   │  reordered top-k + ESCI label
                   ▼
              ranked results

Stage 1 — Bi-encoder retriever

Stage 2 — Cross-encoder reranker

Why two stages?

A cross-encoder over the full catalogue is O(queries × products) forward passes — infeasible online. A bi-encoder is O(products) once (offline indexing) plus one query embedding at serve time, but it cannot model query×product interactions. Combining them recovers most of the cross-encoder’s quality at a fraction of the cost.

Module map

Concern Module
Config necs.config
ESCI loading necs.data.esci, necs.data.preprocess
Datasets / collators necs.data.datasets
Hard-negative mining necs.data.hard_negatives
Models necs.models.bi_encoder / cross_encoder
Losses necs.training.losses
Training necs.training.train_bi_encoder / train_cross_encoder
Retrieval necs.retrieval.index (FAISS), necs.retrieval.bm25
Metrics / eval necs.eval.metrics, necs.eval.evaluate
Pipeline necs.pipeline.search
Serving necs.api.app