Inspiration

Shopping queries are rarely complete in one turn. A user may start with a vague request, add preferences later, or completely change their intent. For this challenge, I wanted to build a shopping agent that could handle that conversational behavior while remaining fast, offline, and easy to deploy.

What it does

ShopLite is a lightweight conversational shopping copilot for TikTok TechJam 2026 Track 4.

It maintains conversation context across turns, asks clarifying questions when the request is vague, searches a frozen catalog of 50,000 products, and continuously updates its ranked recommendations as the user's preferences evolve.

The final system runs fully offline on CPU and requires no hosted LLM, paid API, GPU, or dense embedding files.

How I built it

The final architecture combines:

  • Multi-turn conversation memory
  • Adaptive clarification
  • SQLite FTS5 BM25 retrieval
  • Cross-turn recommendation diversification
  • Intent-override handling
  • Quality-adjusted catalog reranking

The agent builds an in-memory FTS5 index over product titles, categories, features, descriptions, and other catalog metadata.

As users provide more information, their messages are accumulated into the retrieval query. Previously shown products are suppressed to improve exploration across turns, while explicit intent changes reset the candidate history.

The final reranking stage uses only catalog-visible signals such as product rating and review count.

Results

On the released 200-session public evaluation set:

System HitRate@10 MRR MTTC Technical Score
Official BM25 baseline 0.125 0.068 9.81 0.1067
ShopLite 0.990 0.764 2.71 0.8900

This means the final lightweight agent successfully retrieves the target product within the Top 10 in 99% of the released public sessions.

Engineering trade-off

I also experimented with BLaIR dense semantic retrieval.

That version achieved a slightly higher public Technical Score of 0.8946, but required approximately:

  • 1.29 GB peak RAM
  • 626 MB of dense model assets
  • 77.8 seconds for the full public evaluation

The lightweight version achieved 0.8900 while using only about:

  • 338 MB peak RAM
  • 0 MB dense model assets
  • 32.6 seconds for the same evaluation

Since the score difference was only 0.0046, I selected the lightweight version as the final deployment architecture.

Challenges

The biggest challenge was balancing recall, ranking quality, conversational efficiency, and deployment cost.

Dense retrieval improved ranking in some browsing cases, but also introduced substantial memory and packaging overhead. Another challenge was handling vague and changing user intent without relying on an LLM or a learned slot-filling model.

Through controlled experiments, I found that conversation memory and clarification contributed more to overall performance than simply adding a larger retrieval model.

What I learned

This project taught me that conversational recommendation is not only a retrieval problem.

State management, clarification strategy, candidate diversity, ranking, and deployment constraints all interact with each other.

One of the most important lessons was that the highest-scoring model is not always the best system to ship. A very small loss in public score produced a much simpler, faster, and more reproducible final solution.

What's next

Future improvements could include:

  • More robust attribute-specific clarification
  • Better handling of contradictory conversation history
  • Lightweight semantic retrieval without large model assets
  • Learned constraint-aware reranking
  • A production shopping interface

The current submission intentionally prioritizes reproducibility, offline execution, and deployment efficiency.

Built With

Share this project:

Updates

Submission history