ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

FunRec Recsys 实战指南:基于 MovieLens-1M 的电影推荐系统全栈搭建与运行

FunRec Recsys 实战指南:基于 MovieLens-1M 的电影推荐系统全栈搭建与运行 人工智能机器学习深度学习教程示例工程后端前端【免费下载链接】fun-rec推荐系统入门教程在线阅读地址https://datawhalechina.github.io/fun-rec/项目地址https://gitcode.com/datawhalechina/fun-rec点击查看免费下载本篇文章围绕开源仓库datawhalechina/fun-rec中的 web_project/README.md 展开系统讲解一个可直接运行的电影推荐系统示例项目 FunRec Recsys它覆盖离线训练、在线服务与前端展示的完整链路并基于 MovieLens-1M 数据集构建。读完本文你将掌握从数据下载、基础设施启动、数据灌库、模型训练部署到在线推荐流水线与前端交互的完整实操方法并理解多路召回、DeepFM 精排、UCB 冷启动探索与多样性重排等关键模块的源码级实现。项目定位与核心特性FunRec Recsys 是 Datawhale 推荐系统教程仓库fun-rec中配套的一个端到端工程示例web_project/README.md 明确其定位为“一个完整的电影推荐系统示例项目涵盖离线训练、在线服务、前端展示的全流程实现”数据集为 MovieLens-1M约 6000 用户、4000 部电影、100 万条评分记录并叠加 IMDb 元数据。其核心特性可归纳为五条主线多路召回YoutubeDNN 向量召回 I2I 相似度召回 偏好类目召回采用 Snake Merge蛇形/轮询方式融合各路结果精准排序DeepFM 点击率CTR预测模型作为精排阶段冷启动处理UCB 类型探索算法平衡“探索新类型”与“利用已知偏好”多样性重排对推荐结果按类型、年代进行连续打散缓解信息茧房完整工程链路特征工程 → 模型训练 → 在线服务 → 前端交互。这些特性并非仅停留在 README 描述层面而是可以在仓库源码中逐一找到落点详见后文“在线推荐流水线”一节。系统架构总览从目录结构看web_project 由backend与frontend两大块组成README 将其划分为三个层面前端web_project/frontendVue 3 Vite Tailwind提供首页推荐、电影详情、搜索、用户认证、个人中心等页面对应源码位于 frontend/src/views 与 frontend/src/components。离线流水线web_project/backend/offline/按“特征工程 → 召回模型训练YoutubeDNN→ 排序模型训练DeepFM→ 模型部署本地目录→ 特征上线Redis”的顺序执行总入口是 offline/pipeline.py。在线流水线web_project/backend/online/冷启动检测 → 多路召回YoutubeDNN I2I 偏好类目→ 精排DeepFM→ 重排打散→ 结果组装总入口是 online/pipeline.py。存储层PostgreSQL 承载业务数据用户、电影、评分、IMDb 元数据Redis 缓存用户画像与行为特征Elasticsearch 建立电影搜索索引。三者的容器化配置集中在 web_project/docker-compose.yamlPostgreSQL 15、Redis 7、Elasticsearch 9.2.0单节点、关闭 xpack 安全认证。本地环境搭建1. 下载并解压数据集项目依赖一份预处理好的 MovieLens-1M IMDb 数据包funrec-movielens-1m.zip下载后解压并记录数据集的绝对路径。后续所有配置都以该绝对路径为锚点。2. 配置环境变量复制 web_project/.env.example 为.env位于web_project目录下并设置两个关键变量FUNREC_RAW_DATA_PATH第一步解压得到的数据集绝对路径会被挂载进 Docker 容器与后端共享FUNREC_PROCESSED_DATA_PATH处理后的数据特征文件、模型产物等缓存绝对路径可自由指定。从 offline/config.py 可以看到离线代码通过load_dotenv(../.env)读取环境变量后在FUNREC_PROCESSED_DATA_PATH/web_project下自动创建临时目录、模型保存目录与部署目录因此该路径必须可写且磁盘空间充足。3. 启动基础设施在web_project目录下执行docker compose up --build该命令会根据 web_project/docker-compose.yaml 拉起整套中间件PostgreSQL 15端口 5432、Redis 7端口 6379、Elasticsearch 9.2.0端口 9200/9300随后构建并启动backendFastAPI端口 8000与frontendNginx端口 3000两个应用容器。各服务均配置了 healthcheckbackend只有在 Postgres、Redis、Elasticsearch 全部健康后才就绪backend容器还会将${FUNREC_RAW_DATA_PATH}挂载为容器内/data../tmp挂载为模型部署目录。4. 同步 Python 依赖后端采用uv作为包管理器进入backend目录后执行cd backend uv sync --python 3.11注意 Python 版本约束backend/pyproject.toml 中requires-python 3.11, 3.12且依赖锁定tensorflow2.15.0Apple Silicon 上自动切换为tensorflow-macos2.15.0这正是 README 强调“需要 Python 3.11因为 TensorFlow 2.15 仅支持该版本”的原因。同文件还声明了tf_keras2.15.0配合docker-compose.yaml中TF_USE_LEGACY_KERAS1环境变量使用。数据导入与搜索索引加载数据到数据库make ingest-data-to-database对应的 Makefile 目标是uv run scripts/ingest_data_to_database.py --reset --create-test-user见 backend/Makefile。该命令完成五件事重建表结构删除并重新创建所有数据库表导入核心数据约 6000 用户含性别、年龄、职业等人口统计属性、约 4000 部电影含类型、年份、IMDb 评分、约 100 万条评分记录导入 IMDb 元数据演员、导演、编剧、别名等对应NameBasics、TitleCrew、TitlePrincipal、TitleAka等表计算统计信息基于评分数据更新每部电影的平均分与评分数创建测试用户testfunrec.com/test123456管理员权限且偏好 Sci-Fi 类型。源码层面scripts/ingest_data_to_database.py 从 pickle 文件加载 DataFrame每满 1000 条批量落库以控制事务规模并将 IMDb 评分与电影按imdb_id关联后写回电影表。索引电影到 Elasticsearchmake index-movies-to-elasticsearch执行 scripts/index_movies_elasticsearch.py流程为连接 Elasticsearch 并按需创建索引 → 从 PostgreSQL 读取全部电影 → 批量写入含标题、类型、年份、评分等字段。完成后前端搜索功能即可使用。运行离线流水线特征处理、模型训练与部署make run-offline-pipeline该命令对应uv run python -m offline.pipeline --steps all --flush-redis按顺序执行六个阶段README 给出了完整映射表步骤说明代码1. 召回特征处理构建用户行为序列、编码类别特征offline/feature/preprocess_retrieval.py2. 排序特征处理构建正负样本困难负样本 随机负样本offline/feature/preprocess_ranking.py3. 召回模型训练训练 YoutubeDNN 双塔模型offline/training/train_retrieval.py4. 排序模型训练训练 DeepFM 点击率预测模型offline/training/train_ranking.py5. 特征上线写入 Redis用户画像、行为历史、偏好类目offline/storage/redis_ingest.py6. 模型部署部署到本地共享目录模型文件、向量、词表offline/storage/local_deploy.py首次运行约需 5-10 分钟含模型训练。后续可通过--steps参数单独运行某个步骤。--steps的取值与语义在 offline/pipeline.py 中定义all会展开为retrieval_preprocess,ranking_preprocess,retrieval_training,ranking_training,ingest,deploy也支持直接传这些子步骤名逗号分隔并可叠加--flush-redis在特征上线前清空 Redis。该设计使流水线具备天然的断点续跑能力。特征工程与训练的超参数集中在 offline/config.py理解它们有助于调参配置项默认值作用MAX_SEQ_LEN10用户行为序列最大长度召回/排序特征EMB_DIM16嵌入向量维度NEG_SAMPLE_SIZE20负采样大小BATCH_SIZE128训练批大小EPOCHS3训练轮数LEARNING_RATE0.001学习率该文件还定义了各阶段产物的落盘位置召回特征样本train_eval_sample_final.pkl、词表vocab_dict.pkl、物品向量item_embeddings.npy、电影 ID 列表movie_ids.npy以及 DeepFM 模型目录ranking_model这些文件最终由第 6 步统一部署到deployed_models目录供在线服务加载。在线推荐流水线从源码看一次完整推荐README 将在线流水线概括为“冷启动检测 → 多路召回YoutubeDNN I2I 偏好类目→ 精排DeepFM→ 重排打散→ 结果组装”online/pipeline.py 中的RecommendationPipeline.recommend()是这一切的编排核心其关键参数如下参数默认值含义recall_top_k100召回阶段候选数ranking_top_k20精排后进入重排的结果数enable_rankingTrue是否启用 DeepFM 精排enable_rerankingTrue是否应用多样性打散enable_cold_startTrue是否检测并处理冷启动用户cold_start_threshold5交互次数低于该值的用户视为冷启动cold_start_top_k20冷启动用户的推荐数量各阶段职责对应 online/pipeline.py冷启动检测通过ColdStartDetector(threshold5)判断用户交互次数是否小于阈值若是则直接路由到冷启动路径跳过常规召回/精排召回RecallService并行执行多个召回策略产出 100 个候选候选结果携带recall_type标记来源通道精排RankingService调用 DeepFM 模型做 CTR 预估取前 20 个若模型未就绪或调用失败会回退到“仅按召回分数排序”fallback/recall_only保证系统可用性重排RerankingService先补齐物品的类型、年份特征再执行打散策略如“最多连续 2 个相同类型”“最多连续 3 个相同年代”结果组装输出RecommendationResult含recall_count、ranking_strategy、reranking_strategies、is_cold_start等元信息便于 API 层透传与观测。多路召回与 Snake Merge从 online/recall/service.py 看RecallService以策略列表方式注册召回通道并提供_merge_results_round_robin做轮询式蛇形合并——交替从各通道取候选、按movie_id去重直到填满top_k从而保证候选集的多样性。冷启动策略在 online/cold_start/service.py 中按优先级注册了三个策略UCBGenreStrategy基于类型的 UCB 探索/利用从评分中学习平衡探索新类型与利用已有偏好→PreferredGenreStrategy用户声明偏好的个性化推荐→PopularRecentStrategy热门电影回退。README 中“UCB 类型探索算法平衡探索与利用”即指向这里的 UCB 实现。运行检查与前端访问检查各服务状态# 后端健康检查 curl http://localhost:8000/health # Elasticsearch curl http://localhost:9200 # 数据库就绪状态 docker exec -it funrec-postgres pg_isready -U funrec/health由 app/api/v1/endpoints/health.py 提供RecommendationPipeline.get_health_status()online/pipeline.py还会把冷启动、召回、精排、重排各组件的就绪状态一并聚合到健康检查结果中是排查“模型是否加载成功”“Redis 是否写入特征”的利器。访问前端浏览器打开http://localhost:3000使用测试账号登录Emailtestfunrec.comPasswordtest123456登录后可体验首页推荐多路召回 DeepFM 精排 打散重排的最终结果、电影详情、搜索Elasticsearch、个人中心等功能。仓库 docs/_images/frontend_home_login.png 展示了首页推荐与登录界面的实际效果docs/_images/frontend_movie_detail.png 则对应电影详情页的展示形态可作为前端 UI 的直观参照。测试与验证后端提供基于 pytest 的测试套件进入backend目录后uv sync --python 3.11 --extra dev make testuv sync --extra dev会额外安装 backend/pyproject.toml 中dev组的pytest、pytest-asyncio、httpx等依赖make test即uv run pytest。Makefile还提供了更细粒度的入口test-verbose详细输出、test-auth仅认证测试、test-specific仅运行指定用例如健康检查便于开发者在修改推荐流水线后快速回归验证。小结FunRec Recsys 以一个可运行的完整项目将推荐系统领域最常见的工程链路串了起来数据MovieLens-1M IMDb→ 离线特征工程 → YoutubeDNN 多路召回与 DeepFM 精排训练 → Redis 特征上线与模型部署 → 在线冷启动/召回/精排/重排流水线 → 前端展示。本文中的每一步均可在 web_project/backend 与 web_project/frontend 中找到对应源码从 web_project/README.md 出发按序执行即可在本地复现这套电影推荐系统并将其作为理解真实工业级推荐架构多路召回融合、CTR 精排、冷启动探索、多样性打散的实践范本。赞分享人工智能机器学习深度学习教程示例工程后端前端【免费下载链接】fun-rec推荐系统入门教程在线阅读地址https://datawhalechina.github.io/fun-rec/项目地址https://gitcode.com/datawhalechina/fun-rec点击查看免费下载相关推荐7步打造电影推荐系统基于Amazon DSSTNE的MovieLens实战指南7步打造电影推荐系统基于Amazon DSSTNE的MovieLens实战指南 Amazon DSSTNEDeep Scalable Sparse TensTensorFlow Lite 端侧推荐系统 Android 实战基于 MovieLens 的双编码器推荐应用构建与运行指南TensorFlow Lite 端侧推荐系统 Android 实战基于 MovieLens 的双编码器推荐应用构建与运行指南 导读 本文以 lite/exam示例工程使用DeepMatch构建YoutubeDNN推荐模型实战基于MovieLens-1M数据集使用DeepMatch构建YoutubeDNN推荐模型实战基于MovieLens 1M数据集 项目背景 DeepMatch是一个专注于深度匹配模型的推荐系统工上一篇突破性技术WSABuilds项目彻底改变Windows Android体验下一篇Mermaid在线编辑器终极指南从零开始创建专业技术图表创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表