Building Recommendation Systems
1. Storing Item Embeddings
Example: Item Upsert
index.upsert(vectors=[{
"id": f"item-{item.id}",
"values": embed_item(item),
"metadata": {"category": item.category, "price": item.price, "in_stock": True},
} for item in catalog], namespace="items")
| Field | Typical Source |
|---|---|
| Title + description | Text embedding |
| Image | CLIP / vision embedding |
| Tags / category | Concatenated |
2. Generating User Embeddings
Example: Avg Interacted Items
import numpy as np
def user_vec(interactions): # list of (item_id, weight)
vs = index.fetch(ids=[i for i, _ in interactions])["vectors"]
arr = np.array([np.array(vs[i]["values"]) * w for i, w in interactions])
avg = arr.sum(0) / sum(w for _, w in interactions)
return (avg / np.linalg.norm(avg)).tolist()
3. Finding Similar Items
Example: Item-to-Item
res = index.query(id=f"item-{item_id}", top_k=11) # +1 to skip self
recs = [m for m in res["matches"] if m["id"] != f"item-{item_id}"][:10]
4. Implementing Collaborative Filtering
| Approach | Vector Source |
|---|---|
| User-based | Find similar users → recommend their items |
| Item-based | Find items co-interacted |
| Matrix factorization | ALS embeddings → Pinecone |
5. Using Content-Based Filtering
| Strategy | Detail |
|---|---|
| Item-text embedding | From titles/descriptions |
| Multi-modal | Combine image + text vectors |
| Cold start friendly | Works without interaction history |
6. Implementing Hybrid Recommendations
Example: Blend Signals
qv = blend(user_pref_vec, current_item_vec, alpha=0.6)
res = index.query(vector=qv, top_k=10,
filter={"in_stock": True})
7. Personalizing Results
| Signal | Usage |
|---|---|
| User vector | Bias query vector |
| Demographic | Filter on age_group, region |
| Session context | Recent views as positive examples |
8. Filtering by Availability
Example: Stock + Region
res = index.query(vector=qv, top_k=20,
filter={"$and": [
{"in_stock": True},
{"ships_to": {"$in": [user.country]}},
{"price": {"$lte": user.budget}},
]})
9. Implementing Real-Time Updates
| Event | Action |
|---|---|
| New item | Embed + upsert |
| Out of stock | update(set_metadata={"in_stock": False}) |
| User interaction | Update user vector in cache |
10. Measuring Recommendation Quality
| Metric | Meaning |
|---|---|
| Hit Rate@K | % sessions with a click in top-K |
| nDCG@K | Graded relevance |
| Coverage | % catalog ever recommended |
| Diversity | Mean pairwise distance in top-K |
| Revenue/conv lift | Business-level A/B |