10.1. 项目背景与目标

前面的章节介绍了推荐系统的各个核心模块——召回、排序、重排。这些知识构成了推荐系统的基本组件,但如何将它们整合成一个完整的系统?本章将回答这个问题。

许多推荐系统的学习者有这样的困惑:论文中的模型看起来很清晰,代码也能跑通,但当被问到“如何在真实场景中部署一个推荐系统”时,却不知道从何入手。这种困惑源于离线实验与在线服务之间的差距。

在离线实验中,我们关注的是模型性能:AUC提升了多少?召回率有没有改进?这些指标固然重要,但它们只回答了“模型好不好”的问题,却没有回答以下问题:

  • 当一个用户打开应用时,系统如何在100毫秒内返回推荐结果?

  • 用户刚刚评价了一部电影,这个行为如何影响下一次推荐?

  • 模型如何部署?特征如何存储?召回和排序如何协同工作?

  • 新用户第一次使用时,系统没有任何历史数据,该推荐什么?

这些问题的答案无法从单个模型的论文中找到,需要从系统层面来思考。

10.1.1. 本章的目标

本章将带领读者从零开始,构建一个完整的电影推荐系统。这个系统具备以下特征:

../_images/frontend_home_login.png

图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. 本章的学习路径

本章将按照以下顺序展开:

  1. 系统架构设计 10.2节:从宏观视角理解整个系统的组成部分,明确离线与在线的边界,理解数据如何在各个组件之间流动。

  2. 离线流程 10.3节:从原始数据出发,完成特征工程、模型训练、模型评估、模型部署的完整流程。

  3. 在线流程 10.4节:构建实时推理服务,实现冷启动与探索、多路召回、排序模型、多样性重排的完整链路。

  4. 前端与交互 10.5节:设计用户界面,实现搜索、推荐、评分等核心功能。

  5. 部署与运维 10.6节:通过Docker Compose完成系统的容器化部署,讨论生产环境中的监控、日志、性能优化等话题。

每个部分都配有完整代码。读者可以边读边实践,也可以先运行完整项目再逐步理解。