---
id: wiki-2026-0508-adaptive-curation
title: Adaptive Curation
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Dynamic Curation, Personalized Curation, Active Curation]
duplicate_of: none
source_trust_level: A
confidence_score: 0.88
verification_status: applied
tags: [recsys, curation, personalization, active-learning, feedback]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
  language: Python
  framework: PyTorch/scikit-learn
---

# Adaptive Curation

## 매 한 줄
> **"매 selection 의 close-loop — 매 user feedback 의 corpus 의 reshape."**. Adaptive curation 의 static collection 의 X, 매 user signal (click, dwell, rating, embedding drift) 의 use → 매 corpus / ranking / recommendation 의 dynamic adjust. 매 2026 의 LLM-augmented (semantic embedding + bandits + RLHF) 의 standard.

## 매 핵심

### 매 Components
- **Catalog / corpus**: candidate items.
- **User signal**: explicit (rating, like) + implicit (click, dwell, scroll depth).
- **Ranker / selector**: scoring function (often embedding sim + bandit + LTR).
- **Update loop**: feedback → model update → next selection.

### 매 Algorithms
- **Collaborative filtering**: matrix factorization (SVD, ALS).
- **Content-based**: TF-IDF / semantic embedding (sentence-transformers, OpenAI ada-3, Cohere v4).
- **Hybrid**: 매 collaborative + content.
- **Bandits**: ε-greedy, UCB, Thompson sampling — 매 explore/exploit.
- **Contextual bandit / LinUCB**: user feature 의 use.
- **RLHF / DPO**: 매 LLM-era curation (Claude, GPT-5).

### 매 응용
1. News feed (TikTok, X).
2. E-commerce product ranking (Amazon, Coupang).
3. Knowledge base curation (Notion AI, Glean).
4. RAG corpus filtering — 매 LLM context 의 dynamic selection.

## 💻 패턴

### Pattern 1 — Embedding-based candidate retrieval

```python
import numpy as np
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("all-MiniLM-L12-v2")
docs = ["AI safety", "RAG patterns", "vector DB"]
doc_emb = model.encode(docs, normalize_embeddings=True)

def retrieve(query: str, k=5):
    q = model.encode(query, normalize_embeddings=True)
    scores = doc_emb @ q
    return np.argsort(-scores)[:k]
```

### Pattern 2 — Thompson Sampling bandit

```python
import numpy as np

class ThompsonSampler:
    def __init__(self, n_arms):
        self.alpha = np.ones(n_arms)
        self.beta = np.ones(n_arms)
    def select(self):
        samples = np.random.beta(self.alpha, self.beta)
        return int(np.argmax(samples))
    def update(self, arm, reward):
        if reward > 0: self.alpha[arm] += 1
        else: self.beta[arm] += 1
```

### Pattern 3 — Click-through online update

```python
def on_click(user_id, item_id, dwell_s):
    reward = 1 if dwell_s > 5 else 0
    bandit.update(item_id, reward)
    feature_store.log(user_id, item_id, dwell_s)
```

### Pattern 4 — Contextual ranker (LightGBM LTR)

```python
import lightgbm as lgb
ranker = lgb.LGBMRanker(objective="lambdarank", n_estimators=300)
ranker.fit(X_train, y_train, group=group_train)
scores = ranker.predict(X_val)
```

### Pattern 5 — RAG with adaptive filter

```python
def adaptive_rag(query, user_profile):
    candidates = vector_db.search(query, k=50)
    reranked = cross_encoder.rerank(query, candidates)
    filtered = [c for c in reranked if user_profile.relevance(c) > 0.6]
    return filtered[:5]
```

## 매 결정 기준

| 상황 | Approach |
|---|---|
| Cold start, no user data | Content-based + popularity prior |
| Rich interaction logs | Hybrid + LTR |
| Real-time exploration | Thompson / LinUCB |
| LLM context curation | Embedding + cross-encoder rerank |
| Long-tail discovery | UCB exploration boost |

**기본값**: embedding retrieval + cross-encoder rerank + Thompson exploration.

## 🔗 Graph
- 부모: [[Recommender-Systems]] · [[Active-Learning]]
- 변형: [[Collaborative-Filtering]] · [[Multi-Armed-Bandit]]
- 응용: [[RAG]]
- Adjacent: [[Relevance-Feedback]] · [[Ranking-Algorithms]]

## 🤖 LLM 활용
**언제**: dynamic corpus, user feedback available, explore/exploit tradeoff matters, RAG context selection.
**언제 X**: static catalog (use plain ranking), no feedback (cold start dominates), regulated content (use rule-based).

## ❌ 안티패턴
- **Filter bubble**: pure exploit 의 user 의 narrow exposure.
- **Feedback contamination**: bot click 의 model 의 poison.
- **No exploration decay**: ε constant — 매 mature system 의 ε ↓.
- **Position bias ignore**: top item 의 click 의 inflate — debiasing essential.

## 🧪 검증 / 중복
- Verified (Netflix tech blog, TikTok recsys papers, RecSys 2024 proceedings).
- 신뢰도 A.

## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — FULL content (bandits, LTR, RAG patterns) |
