代购源码中的AI智能选品引擎:从用户行为到订单转化的闭环设计
商品列表一到中午就卡死,LIKE '%keyword%' 全表扫描二十多万行——这不是性能问题,而是选品策略出了问题:上架了太多没人搜的SKU。代购团队每天花大量时间在1688和淘宝上“找爆款”,凭感觉选品,结果要么滞销占库存,要么热销款跟不上补货。
后来在代购源码的迭代中加入了一套AI智能选品与推荐引擎,把选品决策从“拍脑袋”变成了“数据驱动”。这套引擎的核心不是复杂的模型,而是三个闭环:用户画像 → 商品趋势 → 个性化推荐。
一、用户行为采集与特征工程
推荐引擎的第一步是埋点。用户在代购站点的每一次搜索、浏览、加购、下单、弃单,都按事件类型写入Kafka(日单过千才需要,中小规模直接用Redis List即可)。关键字段:user_id、product_id、event_type、timestamp、source(PC/微信/小程序)。
// 埋点数据写入Redis队列(PHP)
function trackEvent($userId, $productId, $eventType) {
$event = json_encode([
'user_id' => $userId,
'product_id' => $productId,
'event_type' => $eventType,
'timestamp' => time(),
'source' => $_SERVER['HTTP_USER_AGENT'] ?? 'unknown'
]);
$redis->lpush('event_queue', $event);
// 每50条触发一次离线处理
if ($redis->llen('event_queue') >= 50) {
dispatch('ProcessEventsJob');
}
}
离线处理时,聚合每个用户的“商品类目偏好权重”。例如:用户浏览过3次日韩美妆、2次轻奢包、1次母婴,那么美妆类目的权重就是3/6=0.5。这个权重每天凌晨用Spark或简单的PHP脚本更新到MySQL的user_preference表。
隐性知识点:弃单事件比下单事件更重要。用户把商品加入购物车但没有支付,说明价格或运费超出了心理预期。系统可以将这类商品标记为“价格敏感型”,在推荐时优先展示优惠券或折扣信息。
二、商品趋势挖掘:1688热销数据+站内转化率
单纯的站内数据有冷启动问题——新用户没有历史行为。需要引入外部数据源。对接1688开放平台的商品搜索接口,按类目拉取“成交指数”和“飙升榜”。注意1688 API有调用频率限制(企业认证账号约50次/秒),所以拉取任务要分散在全天,每次只拉取Top 200的热门商品ID。
站内趋势计算则简单很多:统计最近7天每个商品的“加购率 = 加购次数 / 浏览次数”和“转化率 = 下单次数 / 浏览次数”。加购率高但转化率低,说明运费或关税有问题;两者都高,说明是真爆款。
// 计算商品趋势分(PHP)
function computeTrendScore($productId, $days = 7) {
$stats = DB::selectOne("
SELECT
SUM(view) AS views,
SUM(cart) AS carts,
SUM(order_completed) AS orders
FROM product_stats
WHERE product_id = ? AND date >= DATE_SUB(NOW(), INTERVAL $days DAY)
", [$productId]);
if ($stats['views'] < 10) return 0; // 数据不足
$cartRate = $stats['carts'] / $stats['views'];
$orderRate = $stats['orders'] / $stats['views'];
// 趋势分 = 加购率*0.4 + 转化率*0.6
return round($cartRate * 0.4 + $orderRate * 0.6, 4);
}
趋势分超过0.15(即15%的浏览转化为加购/下单)的商品,可标记为高潜力商品,推送到选品建议列表供运营参考。
三、个性化推荐引擎:协同过滤+实时排序
有了用户画像和商品趋势,推荐算法采用最轻量的Item-based协同过滤。离线阶段计算商品之间的相似度矩阵(基于用户行为共现),存入Redis。在线推荐时,根据用户最近浏览/购买的3个商品,找到最相似的Top 10候选商品,再结合商品趋势分和用户类目权重重新排序。
// 在线推荐(PHP + Redis)
function getRecommendations($userId, $limit = 10) {
// 1. 获取用户最近浏览的3个商品
$recent = DB::select("SELECT product_id FROM user_events
WHERE user_id = ? AND event_type = 'view'
ORDER BY timestamp DESC LIMIT 3", [$userId]);
if (empty($recent)) {
// 冷启动:返回趋势分最高的热门商品
return DB::select("SELECT product_id FROM product_trend WHERE trend_score > 0.15 ORDER BY trend_score DESC LIMIT ?", [$limit]);
}
// 2. 从Redis获取每个浏览商品的相似商品列表
$candidates = [];
foreach ($recent as $item) {
$sims = $redis->zrevrange("sim:{$item['product_id']}", 0, 20);
foreach ($sims as $simId) {
$candidates[$simId] = ($candidates[$simId] ?? 0) + 1;
}
}
// 3. 按共现次数排序,取前30个
arsort($candidates);
$candidateIds = array_slice(array_keys($candidates), 0, 30);
// 4. 按趋势分和用户类目权重二次排序
$userPref = DB::selectOne("SELECT category_weights FROM user_preference WHERE user_id = ?", [$userId]);
$weights = json_decode($userPref['category_weights'] ?? '[]', true);
$products = DB::select("SELECT * FROM products WHERE id IN (" . implode(',', $candidateIds) . ")");
usort($products, function($a, $b) use ($weights) {
$scoreA = $a['trend_score'] * ($weights[$a['category']] ?? 0.5);
$scoreB = $b['trend_score'] * ($weights[$b['category']] ?? 0.5);
return $scoreB <=> $scoreA;
});
return array_slice($products, 0, $limit);
}
这套算法的推荐效果优于随机展示,在日活几千的站点上表现稳定。
四、多端订单统一与支付聚合
AI引擎选出来的商品最终要通过订单系统转化为收入。代购站点通常有多个入口:微信小程序、PC商城、WhatsApp私域下单。后台需要用一套订单处理中心统一聚合。
// 订单创建时自动识别渠道
function createOrder($channel, $userId, $items, $paymentMethod) {
$orderId = generateOrderId();
DB::insert("INSERT INTO orders (id, user_id, channel, payment_method, total_amount, status)
VALUES (?, ?, ?, ?, ?, 'pending')",
[$orderId, $userId, $channel, $paymentMethod, $items['total']]);
// 调用统一支付网关
$paymentUrl = UnifiedPaymentGateway::pay($orderId, $items['total'], $paymentMethod);
return ['order_id' => $orderId, 'payment_url' => $paymentUrl];
}
支付网关需要聚合PayPal、Stripe、微信支付、支付宝等多种方式。不同渠道的汇率和手续费差异很大,所以价格计算引擎要实时调用汇率API(缓存10分钟)并加入缓冲系数。
通过插件市场的设计,新支付渠道可以随时接入,推荐、订单、支付数据统一回流,形成闭环。
隐性知识点:防止推荐系统的“信息茧房”
纯协同过滤会导致用户只看到相似的商品,长期下去推荐越来越窄。解决办法是在推荐列表中混入10%-20%的热门新品(趋势分高但从未被该用户浏览过)。这20%的曝光数据同时用于A/B测试新品的转化潜力。
另外,1688接口升级签名算法时,推荐引擎的商品信息拉取会失败。需要在定时任务中加入重试和降级:如果连续3次拉取热门商品失败,则完全依赖站内趋势分,避免推荐位空白。
这套流程上线后,选品效率和爆款命中率都有改善,客户看到的推荐也更贴合个人兴趣。物流追踪和仓库合包的自动化是选品之后的下一个环节。