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
- ai
- bm25
- conversational
- fts5
- information
- language
- natural
- processing
- python
- recommendation
- retrieval
- search
- sqlite
- systems
Log in or sign up for Devpost to join the conversation.