Multi-Stage Pipeline Tutorial#
This tutorial walks through building a production-style recommendation pipeline using CoreRec’s three-stage architecture: Retrieval → Ranking → Reranking.
Overview#
Real-world recommendation systems don’t just run one model. They use a pipeline:
Retrieval (Stage 1): Fast candidate generation from millions of items → ~500 candidates
Ranking (Stage 2): Precise scoring of candidates → ~50 items
Reranking (Stage 3): Business rules, diversity, fairness → final 10 items
Step 1: Setup#
import numpy as np
import pandas as pd
# Generate sample interaction data
np.random.seed(42)
interactions = []
for user_id in range(1000):
n_items = np.random.randint(10, 50)
items = np.random.choice(5000, n_items, replace=False)
for item_id in items:
interactions.append({
'user_id': user_id,
'item_id': item_id,
'rating': np.random.randint(1, 6),
})
train_df = pd.DataFrame(interactions)
Step 2: Create Retrievers#
from corerec.engines.collaborative import SAR
from corerec.retrieval import CollaborativeRetriever, PopularityRetriever
# Collaborative filtering retriever (use default userID/itemID columns)
train_df = train_df.rename(columns={
'user_id': 'userID',
'item_id': 'itemID',
})
sar = SAR()
sar.fit(train_df)
collab_retriever = CollaborativeRetriever(model=sar, name="collab")
# Popularity-based retriever for cold-start coverage
item_counts = train_df.groupby('item_id').size()
pop_retriever = PopularityRetriever(name="popularity")
pop_retriever.fit(
item_ids=list(item_counts.index),
interaction_counts=list(item_counts.values),
)
Step 3: Create Ranker#
from corerec.ranking import PointwiseRanker
def score_fn(features):
return 0.7 * features.get('retrieval_score', 0) + 0.3 * features.get('popularity', 0)
ranker = PointwiseRanker(score_fn=score_fn, name="blended")
ranker.fit()
Step 4: Create Rerankers#
from corerec.reranking import DiversityReranker, BusinessRulesReranker
diversity = DiversityReranker(lambda_=0.7)
business = BusinessRulesReranker(name="business")
business.add_boost(item_id=42, multiplier=2.0)
business.add_blocklist([999, 998])
Step 5: Build Pipeline#
from corerec.pipelines import RecommendationPipeline, PipelineConfig
pipeline = RecommendationPipeline(
config=PipelineConfig(
retrieval_k=200,
ranking_k=50,
final_k=10,
fusion_strategy='rrf',
),
name="tutorial_pipeline",
)
pipeline.add_retriever(collab_retriever, weight=1.0)
pipeline.add_retriever(pop_retriever, weight=0.3)
pipeline.set_ranker(ranker)
pipeline.add_reranker(diversity)
pipeline.add_reranker(business)
Step 6: Generate Recommendations#
result = pipeline.recommend(query=5, top_k=10)
print(f"Retrieved: {result.retrieval_candidates} candidates")
print(f"Ranked: {result.ranking_candidates} candidates")
print(f"Final: {result.final_candidates} items")
print(f"Total time: {result.total_ms:.1f}ms")
for item_id, score in result:
print(f" Item {item_id}: {score:.4f}")
Step 7: Configuration from YAML#
from corerec.pipelines import load_pipeline_config, build_pipeline_from_config
# Load from YAML file
config = load_pipeline_config('pipeline.yaml')
pipeline = build_pipeline_from_config(config)
Example pipeline.yaml:
pipeline:
name: production_v1
retrieval:
k: 500
fusion: rrf
sources:
- type: collaborative
weight: 1.0
- type: popularity
weight: 0.3
ranking:
k: 100
type: pointwise
reranking:
- type: diversity
lambda: 0.7
- type: business
boost:
- item: 42
multiplier: 2.0