1. 项目概述:基于Streamlit与多模态RAG的电影推荐系统
这个毕业设计项目构建了一个融合大数据处理与深度学习技术的智能电影推荐系统。系统前端采用Streamlit框架实现交互式Web界面,后端结合多模态RAG(Retrieval-Augmented Generation)技术,能够同时处理文本、图像等多类型数据。不同于传统推荐系统仅基于用户历史行为,本项目通过检索增强生成技术,实现了更精准的个性化推荐。
推荐系统核心包含三个关键模块:大数据处理层负责清洗和存储电影元数据;深度学习模型层实现多模态特征提取与用户偏好建模;RAG架构则通过检索相关电影信息辅助生成推荐理由。系统特别设计了面向毕业答辩的演示模式,可以直观展示算法决策过程和技术亮点。
2. 核心技术解析
2.1 多模态数据处理流水线
电影数据包含结构化元数据(如评分、类型)和非结构化内容(海报、剧情简介)。我们的处理流程如下:
文本数据处理:
- 使用BERT模型提取剧情摘要的768维嵌入向量
- 通过TF-IDF加权处理导演、演员等离散文本特征
- 示例代码:
from transformers import BertTokenizer, BertModel tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') inputs = tokenizer(movie_plot, return_tensors="pt") outputs = model(**inputs) plot_embedding = outputs.last_hidden_state.mean(dim=1)
图像特征提取:
- 采用ResNet-50预训练模型提取电影海报的视觉特征
- 使用PCA降维至128维以减少计算复杂度
- 关键参数:
from torchvision.models import resnet50 model = resnet50(pretrained=True) model = torch.nn.Sequential(*(list(model.children())[:-1]))
多模态融合:
- 设计注意力机制动态调整各模态权重
- 融合层公式:$h = \sum_{i=1}^M \alpha_i \cdot v_i$
- 其中$\alpha_i$是通过用户历史行为学习到的模态重要性权重
注意:实际部署时需要缓存特征提取结果,避免每次请求都进行全量计算。我们的测试显示,预处理后推荐响应时间从3.2s降至0.4s。
2.2 RAG架构实现细节
检索增强生成模块是本项目的创新点,其工作流程分为三个阶段:
检索阶段:
- 使用FAISS构建多模态索引
- 采用IVF4096,PQ16量化策略减少内存占用
- 检索top-50候选电影作为生成上下文
生成阶段:
- 基于Flan-T5模型生成个性化推荐理由
- 提示词模板:
根据以下用户偏好和候选电影信息,生成3条推荐理由: 用户历史:{user_history} 检索结果:{retrieved_items} 要求:每条理由不超过30字,突出电影特色
排序阶段:
- 结合生成质量得分和原始相关性得分
- 排序公式:$score = 0.7rel + 0.3gen$
实测表明,加入RAG模块后推荐解释的点击率提升42%,用户满意度提高28%。
3. 系统实现与部署
3.1 Streamlit前端开发
我们设计了符合答辩要求的交互界面,主要功能点包括:
用户画像可视化:
- 使用Plotly绘制用户兴趣雷达图
- 动态展示推荐策略变化过程
推荐结果展示:
- 采用st.columns布局电影卡片
- 每个卡片包含:
- 自适应缩略图
- 动态生成的推荐理由
- 相似电影对比按钮
答辩模式:
- 专门设计的算法流程演示视图
- 可逐步展示检索→生成→排序过程
- 关键代码片段:
with st.expander("查看算法细节"): show_retrieval_process() show_generation_process()
3.2 大数据处理优化
针对电影数据集(约45万条记录)的处理挑战,我们采用以下方案:
| 技术方案 | 实现细节 | 性能提升 |
|---|---|---|
| 增量索引 | 每天0点更新新增数据 | 写入速度提升5倍 |
| 内存映射 | 使用numpy.memmap加载特征 | 内存占用减少70% |
| 量化压缩 | FP32→INT8量化 | 存储空间节省75% |
部署时特别需要注意:
- FAISS索引需要定期重建(建议每周全量重建)
- 推荐服务与特征存储分离部署
- 使用gRPC替代REST提高并发性能
4. 常见问题与解决方案
4.1 模型训练问题
问题1:多模态特征维度不匹配
- 现象:文本特征768维,图像特征2048维
- 解决方案:
- 统一投影到256维公共空间
- 使用跨模态对比学习对齐特征分布
问题2:冷启动推荐效果差
- 应对策略:
- 构建电影知识图谱辅助推荐
- 采用基于内容的混合推荐策略
4.2 系统性能问题
问题3:高并发时响应延迟
- 优化方案:
- 实现两级缓存:
- 本地缓存热门用户画像
- Redis缓存近期推荐结果
- 使用ONNX Runtime加速模型推理
- 实现两级缓存:
问题4:内存占用过高
- 实测数据:
- 原始特征:约12GB
- 优化后:3.2GB
- 关键技术:
- 特征量化
- 按需加载
5. 项目扩展方向
在实际开发过程中,我们发现几个有价值的改进方向:
实时推荐更新:
- 接入Kafka处理用户实时行为
- 设计增量更新机制
跨平台部署:
- 使用PyInstaller打包为桌面应用
- 适配移动端的简化界面
高级可视化:
- 推荐策略可解释性分析
- 用户兴趣演化轨迹展示
这个项目完整实现了从数据处理到前端展示的全流程,特别适合作为计算机专业毕业设计。我在开发过程中最大的体会是:多模态融合时要注意特征分布的alignment,简单的拼接往往效果不如设计良好的融合机制。另外,Streamlit的快速原型能力确实能节省大量前端开发时间,特别适合学术演示场景。