[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2009":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":17,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":5,"hasWiki":21,"hasPages":20,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":14,"starSnapshotCount":14,"syncStatus":15,"lastSyncTime":26,"discoverSource":27},2009,"RecommenderSystem","1-dr-eam\u002FRecommenderSystem","1-dr-eam","本项目复现了工业界常用的且有效的推荐系统各模块，将其进行全链路整合，并提供外部调用API",null,"Python",151,16,11,0,2,13,6,3.69,"MIT License",false,true,[],"2026-06-12 02:00:35","# Recommender System\n本项目复现了工业界常用的有效的推荐系统各模块，并将其整合，外部封装良好，使用简便  \n实现思路主要参考了王树森老师的b站视频，链接如下：https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1HZ421U77y\u002F?spm_id_from=333.1007.top_right_bar_window_history.content.click\n## 🗂️ Architecture\n本推荐系统的结构与工业界常用的结构相似，即大致分为4个模块：召回、粗排、精排、重排  \n架构图如下\n\n![推荐系统架构图](images\u002FRS架构图.png)\n### Recall\n召回的目的是尽可能的将用户可能喜欢的物品都纳入考虑范围内，这个范围可能会很大，在工业级系统中可能会从几亿物品中召回出几千个物品  \n本系统的召回模块中主要有6个召回通道：基于用户的协同过滤UserCF、基于物品的协同过滤ItemCF、双塔模型召回、基于关键词和分类的召回、基于内容特征的聚类召回和基于LightGCN的召回  \n其中基于关键词和分类的召回通道和基于内容特征的聚类召回通道用于解决物品冷启动问题\n### Rough Ranking\n粗排的目的是给召回出的几千个物品打分，这个粗排分数表示了当前用户喜欢这个物品的可能性，可能性越大，分数越高，最后根据这个分数排序，截断分数最高的前几百个物品送到下一个环节：精排  \n因为粗排要处理的物品数仍然较多，因此打分模型不能太复杂，本系统的粗排模块使用的模型是三塔模型，这是一种介于双塔模型（后融合模型）和多目标排序模型（前融合模型）之间的模型，能够同时兼顾计算量和精度\n### Fine Ranking\n经过粗排的打分和截断，剩下的物品可认为都是用户比较感兴趣的物品了，而精排的目的是通过更复杂的模型进一步打分，更精准的刻画用户与物品之间的兴趣关系，该精排分数也会作为最后推荐结果的一个重要依据  \n本系统的精排模块使用多目标DCN排序模型，网络比粗排模型更复杂，打出来的分也更精确  \n注意：本系统中的精排模块只对物品打分，不做截断，从粗排模块传来的所有物品都会带着其精排分数进入下一个模块：重排\n### Rearrangement\n经过粗排和精排，我们已经对用户对物品的兴趣分数（即精排分数）做了详尽精确的刻画，而重排的目的是在最终的推荐结果中添加多样性，避免内容过于相近的内容出现在很小的一个区域  \n以小红书的场景为例，重排的目的就是避免内容非常相近的内容出现在同一个页面，用户不能同时看到这些内容。工业界的实践中发现，添加多样性可以有效提升推荐系统的大盘指标  \n本系统的重排模块主要利用MMR算法引入多样性，MMR算法中物品相似性的度量是通过提取两个物品的内容特征向量，再计算余弦相似度得到的。而物品的内容特征向量是通过分别提取物品的图文特征再进行concat得到的，这里用到的图片特征提取器和文字特征提取器来自于OpenAI团队做的一项著名工作：Clip，GitHub仓库链接如下：https:\u002F\u002Fgithub.com\u002Fopenai\u002FCLIP\n## 🏷️ Version\n### v1.0\n本推荐系统的第一个版本完成于2026.3.20，主要模块及用到的模型如下：  \n召回：基于用户的协同过滤UserCF、基于物品的协同过滤ItemCF、双塔模型召回、基于关键词和分类的召回、基于内容特征的聚类召回  \n粗排：三塔模型（其中的神经网络是简单的MLP）  \n精排：多目标排序模型（其中的神经网络是简单的MLP，没有做特征交叉）  \n重排：Clip的图片特征提取器和文字特征提取器，MMR算法\n### v1.1\n更新日期：2026.3.27，主要内容如下：  \n1.添加基于LightGCN的图算法召回通道  \n2.精排模型替换为多目标DCN深度交叉网络  \n3.针对使用clip处理大数据量的场景做了一些计算内存优化\n### v2.0\n更新日期：2026.4.2，主要内容如下：  \n1.优化离线计算环节  \n主要利用了faiss向量数据库进行优化，双塔模型和LightGCN的物品特征向量在离线计算后插入faiss中（选择的索引是IVFxPQy），以便在在线推荐环节快速匹配相似度最高的TopK  \n三塔模型的物品塔输出的物品特征向量也一样可以离线计算，但是因为还要取出来做前期融合，因此只能用内存或缓存进行存储，无法用faiss  \n2.优化模型超参数  \n在本次更新中，用超参数搜索方法寻找到了各个神经网络模型适合的超参数，所用数据集在\u002Fdata文件夹中   \n3.数据流  \n到v3.0为止，工业级推荐系统所需的所有构件都已实现完毕，并具备部署能力，下面对目前推荐系统的**数据流**进行说明：  \n(1) 从CSV文件中读取物品数据、用户数据、历史交互数据，得到三个Dataframe对象  \n(2) 预处理Dataframe对象，得到用户画像和物品对象，同时构建推荐需要的字典等数据结构  \n(3) 用准备好的数据初始化各推荐器，对于UserCF等非神经网络方法需要构建相似度矩阵等，而对于双塔模型等神经网络方法可直接载入预训练好的模型权重  \n(4) 到这步可进行在线推荐，可认为推荐系统是一个端到端服务，输入用户ID、当前时间(小时)、当前是否是周末和当前是否是节假日四个信息，输出推荐的物品ID列表，列表中的顺序是有意义的，越靠前的推荐度越高并同时兼顾了多样性\n### v3.0\n更新日期：2026.4.10，本次更新主要针对工程落地问题，主要内容如下：  \n1.基于FastAPI构建微服务  \n基于FastAPI实现了推荐系统的对外接口(在interface\u002Fmain.py中)，并部署在某IP下，经过**实测**，服务运行正常，响应速度良好  \n注：因为工业级应用常使用数据库存储数据，本次更新中RecommenderSystem类针对数据库的数据流进行了一些调整，但基本逻辑不变，作为一个独立类放在了interface\u002Frecommender_system.py中  \n2.支持基于数据库的离线-在线协同架构  \n离线存储：应用启动时从数据库中读取推荐所需数据，将其转换为需要的Dataframe对象格式，然后做预处理，初始化各推荐器  \n在线推荐：将推荐系统部署到某IP节点后可接受来自外部的推荐请求，返回推荐的物品ID列表  \n**另**：模型的预训练权重和数据库的DDL语句已经分别上传到了\u002Fmodel_weights和\u002Fsql文件夹中\n### v3.1\n更新日期：2026.4.16，主要内容如下：  \n1.支持根据新数据微调\n在interface\u002Fmain.py中添加了微调接口，该接口可根据调用方传来的起止时间划定“新数据”的范围，此后系统内部可自动调用数据库接口查询数据并进行模型微调  \n2.补充异常处理  \n对接口和Service层函数添加了异常处理和参数校验，提升系统鲁棒性  \n### v4.0  \n更新日期：2026.5.20，主要内容如下：  \n1.添加Swing召回通道，已整合到主链条中  \n2.将主链条中双塔模型的用户塔和物品塔由简单的MLP替换为DCN  \n3.添加了一些较为先进的精排模型和特征交叉网络，为了避免主链条过于臃肿，这些模型的定义放在了models文件夹中，本次更新的模型如下：  \n✅  通用基础模型MLP  \n✅  精排模型MMoE  \n✅  特征交叉网络LHUC  \n✅  特征交叉网络SENet\n## 📊 Dataset\n本项目所用的数据集只有一部分书籍信息是真实的，其他都是用AI工具生成的模拟的用户数据和交互记录，很大程度上只是为了模拟大数据量场景，进而做性能优化  \n这样的数据集无法用于科研等严肃领域，也不涉及隐私问题\n## ⚙️ Dependency\n在运行本项目前，你需要配置合适的 Python 环境，你需要下载提供的environment.yml文件，然后在Anaconda prompt中运行：\n>conda env create -f environment.yml\n\n该命令会自动新建一个默认名称为 rs_project 的 conda 环境并导入所需的包，之后别忘了激活这个环境，运行：\n>conda activate rs_project\n\n最后一步需要单独安装GPU版本的Pytorch，运行：\n>pip3 install torch torchvision --index-url https:\u002F\u002Fdownload.pytorch.org\u002Fwhl\u002Fcu126\n## 🚀 Usage\n在使用\u002Finterface中的外部接口之前，你需要先做以下准备：  \n>将main.py中的uvicorn.run函数参数修改为你自己的IP地址和端口号\n\n>将database.py中的数据库连接url修改为你自己的用户名、密码、数据库服务器IP和数据库名称（如果你使用的不是MySQL，你需要更换驱动）  \n\n修改后确定数据与我提供的csv文件或数据库格式一致（这样不容易出问题），之后运行\u002Finterface\u002Fmain.py，推荐系统就会部署在你提供的IP和端口上，之后按照 [API](##API) 的要求发送请求即可\n## 🔌 API\n### POST \u002Frecommend\n该接口基于用户ID及当前场景特征（如小时、是否周末、是否节假日）返回个性化推荐物品列表。适用于首页推荐、场景化推送等业务场景  \n\n**请求参数Body**  \n\n| 字段名        | 类型    | 必填 | 说明                     |\n|---------------|---------|------|--------------------------|\n| `user_id`     | string  | 是   | 用户唯一标识             |\n| `hour`        | integer | 是   | 当前小时（0–23）         |\n| `is_weekend`  | boolean | 是   | 是否为周末               |\n| `is_holiday`  | boolean | 是   | 是否为节假日             |\n  \n**响应体（成功）**\n\n| 字段名           | 类型            | 说明                         |\n|------------------|-----------------|------------------------------|\n| `status`         | string          | 状态，固定为 `\"success\"`     |\n| `user_id`        | string          | 对应请求中的用户ID           |\n| `recommendations`| array of string | 推荐的物品ID列表，顺序敏感   |\n| `request_id`     | string (UUID)   | 本次请求的唯一标识，用于追踪 |\n  \n**响应体（失败）**\n\n| HTTP 状态码 | 说明                             | 响应体示例                                                        |\n|-------------|----------------------------------|--------------------------------------------------------------|\n| `400`       | 请求参数缺失或格式错误           | `{\"status\": \"error\",\"message\":\"Missing request parameters\"}` |\n| `404`       | 用户不存在或无可用推荐模型       | `{\"status\": \"error\",\"message\":\"user doesn't exist\"}`         |\n\n### POST \u002Ffine_tuning\n该接口基于调用方传来的起止时间，从数据库中查询到新数据，并用该数据进行推荐系统模型微调，返回的是微调成功与否的状态信息\n\n**请求参数Body**  \n\n| 字段名          | 类型       | 必填 | 说明   |\n|--------------|----------|------|------|\n| `start_time` | datetime | 是   | 起始时间 |\n| `end_time`   | datetime | 是   | 终止时间 |\n  \n**响应体**\n\n| 字段名               | 类型            | 说明                                |\n|-------------------|-----------------|-----------------------------------|\n| `status`          | string          | 微调是否成功的标识，成功为'success',失败为'error' |\n| `message`         | string          | 对应于状态的补充信息                        |\n\n## 📄 License\n\n**Code:** The source code in this repository is licensed under the **MIT License**.  \n**Weights:** The pre-trained model weights (in the `\u002Fmodel_weights` directory) are also licensed under the **MIT License**.\n\nCopyright (c) 2026 ChendiLiu\n","本项目复现了工业界常用的推荐系统各模块，并将其全链路整合，提供外部调用API。核心功能包括召回、粗排、精排和重排四个模块，其中召回模块包含多种算法如UserCF、ItemCF、双塔模型等，以解决物品冷启动问题；粗排采用三塔模型平衡计算量与精度；精排使用多目标DCN模型进一步提升打分准确性；重排通过MMR算法增加推荐结果多样性。技术上利用Python实现，并基于FastAPI构建微服务接口，支持数据库的离线-在线协同架构。适合于需要个性化推荐的应用场景，如电商、社交媒体等，能够有效提升用户体验和系统性能。","2026-06-11 02:47:32","CREATED_QUERY"]