tasq/node_modules/agentdb/dist/simulation/scenarios/domain-examples/e-commerce-recommendations.js

158 lines
5.8 KiB
JavaScript

/**
* E-Commerce Recommendations: Personalized Product Discovery
*
* Use Case: Recommend similar products based on user preferences,
* browsing history, and product embeddings.
*
* Optimization Priority: DIVERSITY + RELEVANCE
*/
export const ECOMMERCE_ATTENTION_CONFIG = {
heads: 8, // Optimal for balanced performance
forwardPassTargetMs: 20, // 20ms acceptable for recommendations
batchSize: 64, // Batch user requests
precision: 'float32', // Full precision for quality
diversityBoost: true, // Promote diverse recommendations
// Louvain clustering for product categories
clustering: {
algorithm: 'louvain',
minModularity: 0.75, // High-quality clusters
semanticPurity: 0.87, // 87.2% purity validated
hierarchicalLevels: 3 // Category hierarchy (dept > category > subcategory)
},
// Dynamic-k based on user engagement
dynamicK: {
min: 10, // Minimum 10 recommendations
max: 50, // Maximum 50 for exploration
adaptationStrategy: 'user-engagement' // Active users get more
}
};
// Example: Product recommendation with diversity
export async function recommendProducts(userProfile, // User preferences embeddings
productCatalog, // HNSWGraph type
userEngagement, applyAttention, applyDiversityBoost, clusterRecommendations, findCluster, diversityWeight = 0.3) {
const config = ECOMMERCE_ATTENTION_CONFIG;
// 8-head attention for user query enhancement
const enhanced = await applyAttention(userProfile, config);
// Dynamic-k based on user engagement (engaged users get more options)
const k = Math.round(10 + userEngagement * 40); // 10-50 range
// Search with clustering for category diversity
const candidates = await productCatalog.search(enhanced, k);
// Apply diversity boost (promote different categories)
const diversified = await applyDiversityBoost(candidates, diversityWeight);
// Cluster recommendations by category (Louvain)
const clusters = await clusterRecommendations(diversified, config.clustering);
return diversified.map((p) => ({
productId: p.id,
relevanceScore: p.score,
category: p.metadata.category,
cluster: findCluster(p, clusters),
priceUSD: p.metadata.price
}));
}
// Performance targets for e-commerce
export const ECOMMERCE_PERFORMANCE_TARGETS = {
p95LatencyMs: 50, // 50ms p95 (user experience)
clickThroughRate: 0.15, // 15% CTR target
conversionRate: 0.05, // 5% conversion target
diversityScore: 0.7, // 70% category diversity
uptimePercent: 99.9 // 99.9% uptime (3 nines)
};
// E-commerce platform-specific configurations
export const ECOMMERCE_CONFIG_VARIATIONS = {
// Fashion/apparel (high visual similarity)
fashion: {
...ECOMMERCE_ATTENTION_CONFIG,
heads: 12, // More heads for visual nuance
diversityBoost: true,
clustering: {
...ECOMMERCE_ATTENTION_CONFIG.clustering,
hierarchicalLevels: 4 // Deeper taxonomy (category > subcategory > style > color)
}
},
// Electronics (specification-driven)
electronics: {
...ECOMMERCE_ATTENTION_CONFIG,
heads: 8,
specificationWeight: 0.6, // Emphasize specs over style
diversityBoost: false // Users want specific features
},
// Grocery (frequent purchases)
grocery: {
...ECOMMERCE_ATTENTION_CONFIG,
heads: 6,
forwardPassTargetMs: 10, // Faster for mobile
batchSize: 128, // High volume
dynamicK: { min: 15, max: 30, adaptationStrategy: 'cart-size' }
},
// Luxury goods (personalization critical)
luxury: {
...ECOMMERCE_ATTENTION_CONFIG,
heads: 16, // Maximum personalization
forwardPassTargetMs: 50, // Allow more time
diversityBoost: false, // Highly targeted
precision: 'float32'
}
};
// User segment adaptations
export function adaptConfigToUserSegment(baseConfig, segment) {
switch (segment) {
case 'browser':
return {
...baseConfig,
dynamicK: { ...baseConfig.dynamicK, min: 20, max: 50 }, // More exploration
diversityBoost: true // Show variety
};
case 'buyer':
return {
...baseConfig,
dynamicK: { ...baseConfig.dynamicK, min: 10, max: 30 }, // Focused recommendations
diversityBoost: false
};
case 'loyal':
return {
...baseConfig,
heads: 12, // Better personalization
dynamicK: { ...baseConfig.dynamicK, min: 15, max: 40 }
};
case 'vip':
return {
...baseConfig,
heads: 16, // Maximum personalization
forwardPassTargetMs: 30,
precision: 'float32'
};
}
}
export function adaptConfigToPromotion(baseConfig, context) {
if (context.isSale) {
return {
...baseConfig,
dynamicK: { ...baseConfig.dynamicK, min: 20, max: 60 }, // Show more options
diversityBoost: true // Cross-sell opportunities
// Note: Sale boost handled in ranking layer
};
}
return baseConfig;
}
// A/B testing configuration generator
export function generateABTestConfigs(baseConfig) {
return {
control: baseConfig,
moreHeads: {
...baseConfig,
heads: 12
},
moreDiversity: {
...baseConfig,
diversityBoost: true,
dynamicK: { ...baseConfig.dynamicK, min: 15, max: 60 }
},
fasterLatency: {
...baseConfig,
heads: 6,
forwardPassTargetMs: 10,
precision: 'float32' // Lower precision not yet supported
}
};
}
//# sourceMappingURL=e-commerce-recommendations.js.map