10.1. 项目背景与目标¶
前面的章节介绍了推荐系统的各个核心模块——召回、排序、重排。这些知识构成了推荐系统的基本组件,但如何将它们整合成一个完整的系统?本章将回答这个问题。
许多推荐系统的学习者有这样的困惑:论文中的模型看起来很清晰,代码也能跑通,但当被问到“如何在真实场景中部署一个推荐系统”时,却不知道从何入手。这种困惑源于离线实验与在线服务之间的差距。
在离线实验中,我们关注的是模型性能:AUC提升了多少?召回率有没有改进?这些指标固然重要,但它们只回答了“模型好不好”的问题,却没有回答以下问题:
当一个用户打开应用时,系统如何在100毫秒内返回推荐结果?
用户刚刚评价了一部电影,这个行为如何影响下一次推荐?
模型如何部署?特征如何存储?召回和排序如何协同工作?
新用户第一次使用时,系统没有任何历史数据,该推荐什么?
这些问题的答案无法从单个模型的论文中找到,需要从系统层面来思考。
10.1.1. 本章的目标¶
本章将带领读者从零开始,构建一个完整的电影推荐系统。这个系统具备以下特征:
图10.1.1 FunRec 电影推荐系统预览¶
功能完整:用户可以浏览电影、搜索电影、查看个性化推荐、对电影评分。系统会根据用户的历史行为调整推荐结果。新用户注册后,即使没有任何观影记录,系统也能通过冷启动策略提供推荐。
技术真实:我们采用工业界常用的技术栈:FastAPI构建后端服务,Vue.js构建前端界面,PostgreSQL存储业务数据,Redis缓存用户特征,Elasticsearch支撑搜索功能。所有组件通过Docker Compose编排,可以一键启动。
算法落地:召回阶段融合多种策略(YoutubeDNN向量召回、物品相似度召回、用户偏好召回)。排序阶段使用DeepFM模型进行CTR预估。重排阶段应用多样性打散策略。冷启动与探索模块基于UCB(Upper Confidence Bound)算法平衡exploration与exploitation,帮助系统在学习用户偏好的同时探索新类型。
架构清晰:离线流程负责数据处理、模型训练、特征上线;在线流程负责实时推理、多阶段筛选、结果组装。两条流程通过存储层(Redis、共享文件目录)进行数据交换。
10.1.2. 离线与在线的差异¶
许多读者可能通过竞赛或学术论文接触推荐系统,这类场景聚焦于离线评估。本章的项目则聚焦于端到端部署——让用户能够实际使用这个推荐系统。两者的区别如下:
维度 |
离线实验 |
在线系统 |
|---|---|---|
评估方式 |
离线指标 |
用户可以实际交互 |
数据流 |
静态数据集 |
实时用户行为 |
延迟要求 |
无(批量处理) |
毫秒级响应 |
冷启动 |
通常忽略 |
必须处理 |
基础设施 |
本地Python脚本 |
数据库、缓存、搜索引擎、容器编排 |
最终产出 |
预测结果文件 |
可访问的Web应用 |
10.1.3. 技术选型与数据集¶
数据集:我们选择MovieLens-1M作为基础数据集。这是推荐系统领域最经典的基准数据集之一,包含约100万条评分记录、近4000部电影、6000余名用户。数据规模适中,既能展示完整的系统架构,又不会造成过高的计算成本。我们还会从IMDB获取电影的海报、演员、导演等元数据,丰富电影的展示信息。
后端技术栈:
FastAPI:现代化的Python Web框架,原生支持异步,自动生成API文档
PostgreSQL:关系数据库,存储用户、电影、评分等核心业务数据
Redis:内存数据库,缓存用户特征和实时行为序列
Elasticsearch:搜索引擎,支撑电影搜索功能
共享文件目录:存储训练好的模型文件和物品向量
前端技术栈:
Vue.js 3:渐进式JavaScript框架,构建响应式用户界面
Tailwind CSS:CSS框架,用于快速实现UI设计
模型与算法:
召回:YoutubeDNN双塔模型(用户塔 + 物品塔)、物品向量相似度、用户偏好类目召回
排序:DeepFM模型,融合FM的二阶特征交叉与DNN的高阶非线性
重排:类目打散策略(避免连续推荐相同类型的电影)、年代打散策略
基础设施:
Docker Compose:容器编排,一键启动所有服务
uv:Python包管理器,用于快速安装依赖
10.1.4. 获取项目代码¶
本章的完整项目代码位于 datawhalechina/fun-rec 仓库的
web_project/ 目录下:
git clone https://github.com/datawhalechina/fun-rec.git
cd fun-rec/web_project
具体的环境配置和启动步骤见 10.6节 和 web_project/README.md。
10.1.5. 本章的学习路径¶
本章将按照以下顺序展开:
系统架构设计 10.2节:从宏观视角理解整个系统的组成部分,明确离线与在线的边界,理解数据如何在各个组件之间流动。
离线流程 10.3节:从原始数据出发,完成特征工程、模型训练、模型评估、模型部署的完整流程。
在线流程 10.4节:构建实时推理服务,实现冷启动与探索、多路召回、排序模型、多样性重排的完整链路。
前端与交互 10.5节:设计用户界面,实现搜索、推荐、评分等核心功能。
部署与运维 10.6节:通过Docker Compose完成系统的容器化部署,讨论生产环境中的监控、日志、性能优化等话题。
每个部分都配有完整代码。读者可以边读边实践,也可以先运行完整项目再逐步理解。