Inspiration

Online shopping rarely follows a perfect keyword query. Shoppers may start with a vague idea, reveal preferences gradually or suddenly change their minds. We wanted to build a shopping agent that could adapt to this natural behaviour while still finding the exact product quickly.

What it does

Our Shopping Copilot:

  • Remembers requirements across multiple turns
  • Separates hard constraints from soft preferences
  • Handles sudden intent changes
  • Asks clarification questions when requests are too broad
  • Returns accurate product recommendations without paid APIs

How we built it

We built a lightweight, fully in-memory Python pipeline using Pydantic, BM25, NumPy and rule-based context extraction. Products are retrieved using full BM25 before being filtered and reranked using constraint matching, phrase relevance and product popularity. Optional dense retrieval and cross-encoder reranking were also implemented and evaluated.

Challenges we faced

The main challenge was balancing coverage, ranking precision and conversation length. Semantic retrieval found broadly relevant products but often missed the exact purchased item. Some seemingly correct extraction improvements also reduced performance because different parts of the ranking pipeline were closely interconnected.

Accomplishments

We improved the Technical Score from 0.1067 to 0.8704, achieving:

  • 99.5% Hit Rate@10
  • 0.7708 MRR
  • 2.065 mean turns to conversion
  • 0.8935 efficiency
  • 0.9074 Technical Score

The final system runs locally, requires no paid API and uses zero LLM tokens during evaluation.

What we learned

We learned that a more complex model is not automatically better. For exact-product recommendation, carefully engineered lexical retrieval, conversational state and deterministic reranking outperformed dense semantic retrieval. Controlled experimentation and measuring trade-offs were essential.

What's next

With more time, we would evaluate on a larger validation set, develop stronger intent-specific buying and browsing routes, improve attribute extraction and explore lightweight learning-to-rank methods that generalise beyond the public sessions.

Built With

Share this project:

Updates

Submission history