1. 项目概述与背景
超市商品推荐系统是现代零售行业数字化转型的核心组件之一。我在实际开发中发现,传统超市的线上平台往往面临两个痛点:一是用户面对海量商品时选择困难,二是平台难以精准把握用户偏好导致转化率低下。基于协同过滤算法的推荐系统能有效解决这些问题。
这个项目采用Python+Django+Vue3技术栈构建,前后端分离的设计让系统具备良好的扩展性。后端使用Django REST framework构建API服务,前端用Vue3实现动态交互界面,数据库选用MySQL存储用户行为数据和商品信息。系统核心在于通过协同过滤算法分析用户历史行为(浏览、购买、评分等),建立用户-商品关联矩阵,实现个性化推荐。
提示:协同过滤算法分为基于用户(User-Based)和基于物品(Item-Based)两种实现方式,本系统采用混合策略,在计算效率和推荐准确性之间取得平衡。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型考量
后端选择Django框架主要基于以下考虑:
- 自带ORM简化数据库操作
- 完善的Admin后台管理系统
- REST framework快速构建API
- 丰富的第三方库支持(如django-filter、django-cors-headers)
前端选择Vue3的原因:
- Composition API提升代码组织性
- 更小的打包体积和更好的性能
- 丰富的生态(Vuex、Vue Router、Element Plus等)
数据库选用MySQL而非MongoDB的决策点:
- 数据结构相对固定,关系型数据库更合适
- 需要复杂JOIN操作计算用户相似度
- 事务支持保证数据一致性
2.2 系统模块划分
系统主要包含以下核心模块:
- 用户管理模块:处理注册登录、权限控制
- 商品管理模块:商品CRUD、分类管理
- 行为采集模块:记录浏览、购买、评分等事件
- 推荐引擎模块:核心算法实现
- API接口模块:前后端数据交互
- 反馈优化模块:收集用户对推荐的反馈
3. 核心算法实现
3.1 协同过滤算法原理
协同过滤的核心思想是"物以类聚,人以群分"。算法实现分为三个关键步骤:
-
数据准备:构建用户-商品评分矩阵
- 显式数据:用户主动评分(1-5星)
- 隐式数据:浏览时长、购买次数等转换的权重
-
相似度计算:
- 用户相似度(User-Based):
python复制from sklearn.metrics.pairwise import cosine_similarity user_sim = cosine_similarity(user_item_matrix) - 商品相似度(Item-Based):
python复制
item_sim = cosine_similarity(user_item_matrix.T)
- 用户相似度(User-Based):
-
预测评分:
- 基于用户的预测:
python复制def predict_user_based(user_id, item_id, user_sim, user_item_matrix, k=5): sim_users = user_sim[user_id].argsort()[-k-1:-1][::-1] ratings = user_item_matrix[sim_users, item_id] return np.dot(user_sim[user_id, sim_users], ratings) / np.sum(user_sim[user_id, sim_users]) - 基于商品的预测:
python复制def predict_item_based(user_id, item_id, item_sim, user_item_matrix, k=5): rated_items = np.where(user_item_matrix[user_id] > 0)[0] sim_items = item_sim[item_id, rated_items].argsort()[-k:][::-1] return np.dot(item_sim[item_id, sim_items], user_item_matrix[user_id, rated_items[sim_items]]) / np.sum(item_sim[item_id, sim_items])
- 基于用户的预测:
3.2 混合推荐策略
为克服单一方法的局限性,我们实现加权混合策略:
python复制def hybrid_predict(user_id, item_id, user_sim, item_sim, user_item_matrix, alpha=0.6):
user_pred = predict_user_based(user_id, item_id, user_sim, user_item_matrix)
item_pred = predict_item_based(user_id, item_id, item_sim, user_item_matrix)
return alpha * user_pred + (1-alpha) * item_pred
参数α通过网格搜索确定最优值,实验发现0.6时F1-score最高。
3.3 冷启动解决方案
针对新用户和新商品问题,我们采用以下策略:
- 新用户:基于人口统计信息推荐热门商品
- 新商品:基于商品分类推荐给可能感兴趣的用户
- 随机探索:按5%概率推荐随机商品收集反馈
4. 工程实现细节
4.1 数据库设计
关键表结构设计:
sql复制CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
demographic JSON COMMENT '年龄、性别等人口统计信息'
);
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
category_id INT NOT NULL,
price DECIMAL(10,2),
attributes JSON COMMENT '商品特征'
);
CREATE TABLE user_actions (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
action_type ENUM('view', 'purchase', 'rating') NOT NULL,
value FLOAT COMMENT '评分或浏览时长',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (product_id) REFERENCES products(id)
);
4.2 Django模型定义
python复制from django.db import models
from django.contrib.postgres.fields import JSONField
class User(models.Model):
username = models.CharField(max_length=50, unique=True)
demographic = models.JSONField(default=dict)
class Product(models.Model):
name = models.CharField(max_length=100)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
price = models.DecimalField(max_digits=10, decimal_places=2)
attributes = models.JSONField(default=dict)
class UserAction(models.Model):
ACTION_TYPES = (
('view', 'View'),
('purchase', 'Purchase'),
('rating', 'Rating'),
)
user = models.ForeignKey(User, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
action_type = models.CharField(max_length=10, choices=ACTION_TYPES)
value = models.FloatField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
4.3 推荐API实现
python复制from rest_framework.views import APIView
from rest_framework.response import Response
from .recommender import HybridRecommender
class RecommendationAPI(APIView):
def get(self, request, user_id):
recommender = HybridRecommender()
recommendations = recommender.get_recommendations(user_id, top_n=10)
return Response({
'user_id': user_id,
'recommendations': recommendations,
'timestamp': timezone.now()
})
5. 性能优化实践
5.1 计算效率优化
-
稀疏矩阵存储:
python复制from scipy.sparse import csr_matrix user_item_matrix = csr_matrix((values, (row_indices, col_indices))) -
相似度预计算:
- 每天凌晨计算并缓存用户/商品相似度矩阵
- 使用Redis存储最近计算结果
-
批量处理:
python复制from django.db.models import Count from django.db import transaction @transaction.atomic def batch_update_recommendations(user_ids): for user_id in user_ids: update_user_recommendations(user_id)
5.2 缓存策略
-
多级缓存设计:
- 热点数据:内存缓存(Redis)
- 常规数据:数据库缓存表
- 冷数据:原始数据库
-
缓存失效机制:
- 用户行为触发相关推荐缓存失效
- 定时全局缓存刷新
6. 部署与监控
6.1 生产环境部署
使用Docker Compose编排服务:
yaml复制version: '3'
services:
web:
build: .
command: gunicorn config.wsgi:application --bind 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- redis
- db
redis:
image: redis:alpine
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: recommend
MYSQL_ROOT_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
6.2 监控指标
关键监控指标包括:
- 推荐响应时间(P99 < 200ms)
- 推荐点击率(CTR)
- 转化率(推荐商品购买比例)
- 算法覆盖率(被推荐商品占比)
- 多样性指标(推荐列表的熵值)
使用Prometheus + Grafana搭建监控看板:
python复制from prometheus_client import Counter, Gauge
RECOMMEND_COUNTER = Counter(
'recommend_requests_total',
'Total number of recommendation requests',
['user_id', 'status']
)
RESPONSE_TIME = Gauge(
'recommend_response_time_seconds',
'Recommendation response time in seconds'
)
7. 常见问题与解决方案
7.1 数据稀疏性问题
现象:用户-商品矩阵过于稀疏导致推荐质量下降
解决方案:
- 引入商品分类层级相似度
- 使用矩阵分解降维(SVD、ALS)
- 结合内容特征进行混合推荐
7.2 实时性挑战
现象:用户最新行为无法及时影响推荐结果
优化方案:
- 实时计算流水线:
python复制from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender=UserAction) def update_recommendations(sender, instance, **kwargs): from .tasks import update_user_recommendations update_user_recommendations.delay(instance.user_id) - 使用Flink等流处理框架
7.3 系统扩展性问题
现象:用户量增长后性能下降
优化方向:
- 分片策略:按用户ID哈希分片
- 近似最近邻(ANN)算法替代精确计算
- 分布式计算框架(Spark MLlib)
8. 效果评估与迭代
8.1 离线评估指标
使用留出法评估:
python复制from surprise import Dataset, accuracy
from surprise.model_selection import train_test_split
data = Dataset.load_from_df(ratings_df, reader)
trainset, testset = train_test_split(data, test_size=0.2)
# 训练模型...
predictions = algo.test(testset)
accuracy.rmse(predictions) # 均方根误差
accuracy.mae(predictions) # 平均绝对误差
8.2 在线A/B测试方案
测试分组:
- 对照组:原推荐策略
- 实验组:新算法策略
监测指标:
- 点击率提升比例
- 客单价变化
- 用户停留时长
8.3 持续优化方向
- 引入深度学习模型(NeuralCF、Wide&Deep)
- 多目标优化(点击率+转化率+多样性)
- 上下文感知推荐(时间、地点等)
- 可解释性增强(推荐理由生成)
在实际项目中,我们发现几个关键经验:首先,用户行为数据的质量比数量更重要,需要精心设计埋点方案;其次,算法效果提升存在边际效应,当准确率达到一定阈值后,应更多关注多样性等体验指标;最后,推荐系统不是孤立组件,需要与搜索、促销等模块协同设计。
