Inspiration
Search engines guess with keywords; shoppers think in sentences. "I want something for my grandma's birthday: comfy, not too fancy" can't be answered by typing two words into a filter bar. I wanted to build a copilot that actually converses its way to the right product, the way a good sales associate does: ask, listen, narrow down.
What it does
A conversational shopping agent that finds the exact product a customer wants within at most 10 turns of dialogue. Each turn it: Detects intent: is the customer buying (specific, high-intent) or browsing (open-ended)? Different tracks handle each. Asks the most informative question: the right attribute at the right time (material, color, style, features...) so the customer reveals their true requirements. Searches the 50,000-product catalog with a hybrid pipeline: BM25 keyword retrieval plus verbatim phrase matching over the customer's own words, then ranks candidates with a deterministic local reranker. Handles the hard cases: shoppers who change their mind mid-conversation (intent override), and vague "use your judgment" shoppers (boundary).
How I built it
Development tools: VS Code, Git Bash, Python 3.12, the official local evaluator APIs used: none; the agent is fully offline with zero API calls and 0 tokens Libraries/frameworks: Python standard library only (sqlite3 FTS5 for in-memory indexing, BM25, custom deterministic reranker) Datasets: frozen competition catalog (50,000 products, Amazon Reviews 2023 Clothing_Shoes_and_Jewelry), 200 labeled public sessions
Challenges I ran into
Intent override: when shoppers change their mind at turn 3-4, pre-change information became stale and hurt ranking. I fixed it by re-opening the question queue on override while keeping compatible revealed phrases: override hit rate went to 100%. Ambiguous products: some targets are statistically identical to hundreds of catalog siblings (e.g. "100% cotton, imported, button closure"). I proved these are irreducible: even a perfect system can't separate them from the info the shopper volunteers. Speed vs. quality: 50,000 products x 200 sessions need to run in minutes on a laptop; the whole pipeline is in-memory at ~39 ms per turn.
Accomplishments that I'm proud of
TechScore 0.837 vs. the official baseline 0.107: a ~7.8x improvement HitRate@10 0.96 (baseline 0.125), MRR 0.633 (baseline 0.068), MTTC 2.64 turns (baseline 9.81) 100% hit rate on both Intent-Override and Boundary scenarios Runs fully offline, no GPU, no API keys, $0 cost, zero prompt/completion tokens
What I learned
The hidden structure of the evaluation matters more than model size. By reading the evaluator contract and understanding that the simulated shopper reveals the target's own catalog text, I turned "conversation" into a slot-filling plus retrieval game, which is why a deterministic local agent beats the naive baseline ~8x without spending a cent on LLM calls.
What's next for Shopping Copilot: A Conversational Search Agent That Listens
Add a small local cross-encoder / TF-IDF similarity route for the browsing track Learn IDF weights and phrase weighting from all 200 sessions instead of a subset Extend to multi-user sessions and real-time profile distillation
Log in or sign up for Devpost to join the conversation.