1. 项目概述这个基于微信小程序的个性化电影推荐系统是我在完成毕业设计时开发的一个实战项目。作为一个电影爱好者我经常遇到片荒的困扰——面对海量电影资源却不知道看什么好。市面上的推荐系统要么过于简单要么推荐结果不够精准。于是我决定自己动手开发一个能真正理解用户喜好的智能推荐系统。微信小程序作为载体有几个明显优势首先它无需安装用户即用即走其次微信生态提供了丰富的社交功能可以挖掘好友间的观影偏好最重要的是小程序开发门槛相对较低适合个人开发者快速实现产品原型。2. 系统架构设计2.1 技术选型与整体架构整个系统采用前后端分离的架构前端部分微信小程序原生开发WXMLWXSSJSECharts for WeChat 用于数据可视化Vant Weapp 组件库提升UI体验后端部分Spring Boot 2.7 作为基础框架MyBatis-Plus 3.5 处理数据持久化Redis 6.2 缓存热门推荐结果MongoDB 5.0 存储用户行为日志推荐引擎Python 3.8 TensorFlow 2.6协同过滤算法UserCF和ItemCF基于内容的推荐CB混合推荐策略提示选择Spring Boot是因为它对微信生态的兼容性好MyBatis-Plus能大幅简化数据库操作而Redis缓存可以显著提升推荐响应速度。2.2 数据流设计系统数据流分为三个主要环节数据采集层用户显式行为评分、收藏、评论用户隐式行为浏览时长、暂停/快进社交关系数据微信好友观影动态数据处理层实时计算用户最近30分钟内的行为权重更高离线计算每晚2点全量更新用户画像增量更新每2小时更新一次推荐结果服务输出层个性化推荐列表主feed相似用户在看社交推荐热门趋势基于近期热度3. 核心功能实现3.1 用户画像构建用户画像是推荐系统的基石我们设计了多维度的标签体系# 用户画像数据结构示例 user_profile { user_id: wx123456, basic_info: { gender: male, age: 25 }, preference: { genres: [科幻, 悬疑, 喜剧], directors: [诺兰, 斯皮尔伯格], actors: [莱昂纳多, 汤姆·汉克斯] }, behavior_pattern: { watch_time: 21:00-23:00, device: iPhone, network: WiFi }, social_graph: { close_friends: [wx234567, wx345678], influence_score: 0.75 } }构建过程分为三步冷启动阶段通过问卷收集初始偏好行为积累阶段加权计算各类行为动态调整阶段引入时间衰减因子3.2 推荐算法实现3.2.1 协同过滤优化传统协同过滤面临稀疏性问题我们做了两点改进基于社交关系的权重调整最终评分 基础评分 × (1 0.2×好友相似度)时间衰减因子def time_decay(days): return math.exp(-0.05 * days) # 半衰期约14天3.2.2 混合推荐策略我们采用加权混合策略算法类型权重适用场景UserCF0.4社交推荐ItemCF0.3相似影片CB0.2冷启动热门推荐0.1新用户# 混合推荐代码片段 def hybrid_recommend(user): uc_rec user_cf(user) * 0.4 ic_rec item_cf(user) * 0.3 cb_rec content_based(user) * 0.2 hot_rec hot_movies() * 0.1 return normalize(uc_rec ic_rec cb_rec hot_rec)3.3 微信小程序关键实现3.3.1 性能优化技巧分页加载Page({ data: { movies: [], page: 1 }, onReachBottom() { this.setData({page: this.data.page 1}) this.loadMoreData() } })缓存策略本地缓存wx.setStorageSync(hot_movies, data)图片懒加载请求合并// 使用Promise.all合并并行请求 Promise.all([ getRecommendations(), getFriendActivities() ]).then(([recs, activities]) { // 更新UI })3.3.2 社交功能实现利用微信开放能力// 分享功能 onShareAppMessage() { return { title: 我发现了一部好电影, path: /pages/movie/detail?id this.data.movieId } } // 获取好友关系 wx.getFriendCloudStorage({ keyList: [watchedMovies], success(res) { console.log(好友数据, res.data) } })4. 数据库详细设计4.1 核心表结构优化除了基础的用户表和电影表我们特别设计了用户行为日志表user_behaviorCREATE TABLE user_behavior ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, user_id INT(11) NOT NULL, movie_id INT(11) NOT NULL, behavior_type TINYINT(4) NOT NULL COMMENT 1浏览 2播放 3评分 4收藏, value FLOAT DEFAULT NULL COMMENT 评分值/播放进度, device_id VARCHAR(64) DEFAULT NULL, ip_address VARCHAR(39) DEFAULT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), INDEX idx_user_movie (user_id, movie_id), INDEX idx_time (created_at) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;推荐结果表recommendation_resultsCREATE TABLE recommendation_results ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, user_id INT(11) NOT NULL, movie_id INT(11) NOT NULL, algorithm VARCHAR(20) NOT NULL COMMENT ucf/icf/cb/hybrid, score FLOAT NOT NULL, position INT(11) NOT NULL COMMENT 推荐位次, expire_time TIMESTAMP NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_user_movie (user_id, movie_id), INDEX idx_user_score (user_id, score) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;4.2 查询优化实践针对高频查询场景我们采用以下优化方案热点数据缓存Cacheable(value userRecs, key #userId) public ListMovie getRecommendations(Integer userId) { // 数据库查询逻辑 }读写分离写操作主库读操作从库 缓存索引优化EXPLAIN SELECT * FROM user_behavior WHERE user_id 123 AND created_at 2023-01-015. 部署与性能调优5.1 服务器配置我们使用阿里云ECS基础配置组件配置数量应用服务器2核4GCentOS 7.92Redis1G内存持久化开启1MySQL4核8GSSD磁盘1主1从Python引擎4核8GGPU加速15.2 压力测试结果使用JMeter进行测试场景并发数平均响应时间错误率获取推荐列表1000238ms0.1%提交评分500156ms0%混合读写场景800342ms0.3%优化措施引入Hystrix实现熔断降级调整Tomcat线程池参数推荐结果预计算缓存6. 常见问题与解决方案6.1 冷启动问题现象新用户没有历史行为数据推荐质量差解决方案注册时引导填写偏好问卷初期采用热门多样性策略利用微信社交数据如地区、年龄def cold_start_recommend(user): if not user.history: # 组合策略 return hot_movies()[:5] diverse_movies()[:5]6.2 推荐多样性不足现象推荐结果过于集中在某些类型改进方案引入Serendipity因子def diversity_score(movie, user): genre_diff 1 - cosine(user.genre_pref, movie.genres) return genre_diff * 0.7 random.random() * 0.3定期注入随机探索项6.3 微信小程序审核问题经验分享避免使用推荐等敏感词改用猜你喜欢用户数据收集需明确声明分享功能不能强制要求用户授权7. 项目总结与展望这个项目从构思到实现历时4个月期间最大的挑战是推荐算法的效果调优。通过AB测试发现加入社交因素后推荐准确率提升了18%但同时也增加了系统复杂度。几个关键收获用户行为数据的质量比数量更重要简单的算法组合往往比复杂模型更稳定微信小程序的性能瓶颈主要在网络请求未来改进方向引入实时流处理如Flink尝试深度强化学习算法增加跨平台支持如H5版本这个项目让我深刻体会到一个好的推荐系统不仅需要技术实力更需要对人性的理解。当看到用户因为我们的推荐发现心仪电影时那种成就感是无可替代的。