.. _sec_projects_intro:
项目背景与目标
==============
前面的章节介绍了推荐系统的各个核心模块——召回、排序、重排。这些知识构成了推荐系统的基本组件,但如何将它们整合成一个完整的系统?本章将回答这个问题。
许多推荐系统的学习者有这样的困惑:论文中的模型看起来很清晰,代码也能跑通,但当被问到“如何在真实场景中部署一个推荐系统”时,却不知道从何入手。这种困惑源于离线实验与在线服务之间的差距。
在离线实验中,我们关注的是模型性能:AUC提升了多少?召回率有没有改进?这些指标固然重要,但它们只回答了“模型好不好”的问题,却没有回答以下问题:
- 当一个用户打开应用时,系统如何在100毫秒内返回推荐结果?
- 用户刚刚评价了一部电影,这个行为如何影响下一次推荐?
- 模型如何部署?特征如何存储?召回和排序如何协同工作?
- 新用户第一次使用时,系统没有任何历史数据,该推荐什么?
这些问题的答案无法从单个模型的论文中找到,需要从系统层面来思考。
本章的目标
----------
本章将带领读者从零开始,构建一个完整的电影推荐系统。这个系统具备以下特征:
.. _funrec_preview:
.. figure:: ../img/frontend_home_login.png
:width: 550px
FunRec 电影推荐系统预览
**功能完整**\ :用户可以浏览电影、搜索电影、查看个性化推荐、对电影评分。系统会根据用户的历史行为调整推荐结果。新用户注册后,即使没有任何观影记录,系统也能通过冷启动策略提供推荐。
**技术真实**\ :我们采用工业界常用的技术栈:FastAPI构建后端服务,Vue.js构建前端界面,PostgreSQL存储业务数据,Redis缓存用户特征,Elasticsearch支撑搜索功能。所有组件通过Docker
Compose编排,可以一键启动。
**算法落地**\ :召回阶段融合多种策略(YoutubeDNN向量召回、物品相似度召回、用户偏好召回)。排序阶段使用DeepFM模型进行CTR预估。重排阶段应用多样性打散策略。冷启动与探索模块基于UCB(Upper
Confidence
Bound)算法平衡exploration与exploitation,帮助系统在学习用户偏好的同时探索新类型。
**架构清晰**\ :离线流程负责数据处理、模型训练、特征上线;在线流程负责实时推理、多阶段筛选、结果组装。两条流程通过存储层(Redis、共享文件目录)进行数据交换。
离线与在线的差异
----------------
许多读者可能通过竞赛或学术论文接触推荐系统,这类场景聚焦于\ **离线评估**\ 。本章的项目则聚焦于\ **端到端部署**——让用户能够实际使用这个推荐系统。两者的区别如下:
======== ============== ================================
维度 离线实验 在线系统
======== ============== ================================
评估方式 离线指标 用户可以实际交互
数据流 静态数据集 实时用户行为
延迟要求 无(批量处理) 毫秒级响应
冷启动 通常忽略 必须处理
基础设施 本地Python脚本 数据库、缓存、搜索引擎、容器编排
最终产出 预测结果文件 可访问的Web应用
======== ============== ================================
技术选型与数据集
----------------
**数据集**\ :我们选择\ `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包管理器,用于快速安装依赖
获取项目代码
------------
本章的完整项目代码位于 ``datawhalechina/fun-rec`` 仓库的
``web_project/`` 目录下:
.. raw:: latex
\diilbookstyleinputcell
.. code:: bash
git clone https://github.com/datawhalechina/fun-rec.git
cd fun-rec/web_project
具体的环境配置和启动步骤见 :numref:`sec_projects_deployment` 和
`web_project/README.md `__\ 。
本章的学习路径
--------------
本章将按照以下顺序展开:
1. **系统架构设计**
:numref:`sec_projects_architecture`\ :从宏观视角理解整个系统的组成部分,明确离线与在线的边界,理解数据如何在各个组件之间流动。
2. **离线流程**
:numref:`sec_projects_offline_pipeline`\ :从原始数据出发,完成特征工程、模型训练、模型评估、模型部署的完整流程。
3. **在线流程**
:numref:`sec_projects_online_pipeline`\ :构建实时推理服务,实现冷启动与探索、多路召回、排序模型、多样性重排的完整链路。
4. **前端与交互**
:numref:`sec_projects_frontend`\ :设计用户界面,实现搜索、推荐、评分等核心功能。
5. **部署与运维** :numref:`sec_projects_deployment`\ :通过Docker
Compose完成系统的容器化部署,讨论生产环境中的监控、日志、性能优化等话题。
每个部分都配有完整代码。读者可以边读边实践,也可以先运行完整项目再逐步理解。