基于SpringBoot与深度学习的饮食推荐平台设计与实现
发布时间:2026/9/28 15:04:53来源:尧图网络
1. 这个项目到底解决了什么问题先想清楚再动手先说点实际的。每年毕业季计算机相关专业的同学都会陷入一个困境选题太简单答辩时工作量撑不起来选题太难做到最后又交不了差。饮食计划推荐与交流分享平台这个组合恰好踩在了一个比较舒服的位置上——它既有算法层面的深度又有工程层面的完整度而且需求边界非常清晰不像纯算法课题那样要有很强的数学底子也不像纯管理系统那样容易被评委说成“没有技术含量”。我在带这个项目的时候第一件事不是写代码而是把整个系统的边界画清楚。它本质上是一个“推荐系统社区产品”的二合一推荐端负责根据用户的身体数据、饮食习惯和口味偏好生成个性化的饮食计划社区端负责让用户之间可以分享食谱、点赞收藏、评论互动。这两部分不是简单堆在一起的而是有数据闭环的——用户在社区里的每一条浏览、点赞、收藏记录都会成为推荐系统判断用户口味的输入信号推荐出去的饮食计划被用户采纳之后又会产生新的历史订单反馈回来。项目的技术选型也对应这个定位。SpringBoot负责整个后端服务承载用户管理、社区互动、饮食计划生成这些业务逻辑深度学习部分负责推荐算法这一层。我见过很多同学把“深度学习”理解成必须训练一个复杂到不行的大模型实际上在这个场景里用得最多的是Embedding加多层感知机的匹配模型或者对用户的历史行为序列建模核心目的是判断“这个用户会不会喜欢这个食谱”。下面这张表是我整理出来的功能地图看完你就能对整个系统有个清晰的认知模块核心功能数据来源算法/技术要点用户管理与画像注册登录、身高体重录入、饮食偏好收集、过敏原标记用户主动填写规则匹配、画像标签化食谱数据模块食谱分类、食材解析、营养成分计算、菜系标签数据采集与清洗中文分词、TF-IDF、食材字典推荐引擎用户召回、食谱排序、营养约束过滤历史行为画像特征协同过滤深度学习排序社区互动食谱发布、点赞、评论、收藏、关注用户UGC内容文本敏感词过滤、热度排行数据分析面板用户留存、热门食谱、推荐点击率行为日志汇总Redis缓存、定时统计对毕设而言这套架构的妙处在于每一块都可以拆出来单独讲答辩的时候不会被一个“推荐算法怎么调的”这种问题逼到墙角因为你能讲的东西足够多——系统设计、数据表结构、算法选型、工程优化、测试结果每块都有实实在在的产出。2. 推荐引擎的三个核心层次召回、排序和营养约束2.1 不要一上来就堆深度学习模型先把召回层做好很多初学者做推荐系统第一反应就是“我直接用神经网络训练一个模型不就完了吗”。这个思路在工业界是走不通的在毕业设计里也容易翻车。原因很简单用户行为数据一开始非常稀疏一个新用户登录进来可能只有三五条浏览记录你拿这点数据去训练神经网络模型根本学不到任何有效特征。所以在我的设计里推荐引擎分成了三层召回层、排序层、重排层。召回层解决“从几万条食谱里挑出几百条可能感兴趣的”排序层负责“把这几百条按预测的喜爱程度精排”重排层则把营养学规则嵌进去。这个思路其实是参考了工业界广告推荐和电商推荐通用的“漏斗”架构放在这个场景里同样成立。召回层我用的是双通道策略。第一个通道是ItemCF基于物品的协同过滤加上热度兜底——先按食谱类别计算物品间的相似度矩阵找出用户历史喜欢食谱的相似食谱同时保留一部分热门食谱作为补充防止推荐结果太单一。第二个通道是基于内容的匹配利用食材和菜系标签做向量化召回主要覆盖没有历史行为的新食谱。具体到ItemCF的相似度计算我直接用共现矩阵的余弦相似度先统计用户对食谱的行为浏览、收藏、点赞构建“用户-食谱”矩阵然后计算食谱两两之间的余弦相似度。这一步的时间复杂度是O(N^2)当食谱数到几万条的时候计算压力会明显上来所以我在实现里做了一步处理只统计被至少两个用户同时产生过行为的食谱对把数据剪枝之后再算相似度矩阵离线算好存到Redis里线上直接读取响应时间基本可以稳定在毫秒级。// 伪代码示意ItemCF核心逻辑实际项目中会用Spark或离线脚本计算 public class ItemCFRecommender { // 输入所有用户的历史行为记录 uid - set(recipeId) // 输出每个食谱的TopN相似食谱 public MapInteger, ListSimilarItem calculateSimilarity( MapInteger, SetInteger userBehavior) { // 第一步构建食谱被哪些用户喜欢过的倒排索引 MapInteger, SetInteger itemUsers new HashMap(); userBehavior.forEach((uid, itemSet) - { itemSet.forEach(itemId - { itemUsers.computeIfAbsent(itemId, k - new HashSet()).add(uid); }); }); // 第二步统计共现矩阵只统计同时被多个用户喜欢的食谱对 MapString, Integer coCount new HashMap(); for (SetInteger users : itemUsers.values()) { if (users.size() 2) continue; // 剪枝共现次数太少的直接跳过 ListInteger list new ArrayList(users); for (int i 0; i list.size(); i) { for (int j i 1; j list.size(); j) { Integer a list.get(i); Integer b list.get(j); int min Math.min(a, b); int max Math.max(a, b); coCount.merge(min _ max, 1, Integer::sum); } } } // 第三步用余弦相似度计算Item之间的相似度 // 后面会把结果缓存在Redis里线上直接读 MapInteger, ListSimilarItem result new HashMap(); // ... 省略具体相似度归一化逻辑 return result; } }这里有段代码我特意没有写全保留了核心思想你在真正实现的时候可以按这个思路补完。我的经验是这一步不要过度设计能算出相似食谱能存到Redis召回层面就已经及格了。2.2 排序层的深度学习模型特征组合比网络深度更关键排序层是这个项目体现“深度学习”成色的地方。我用的是一个类似Wide Deep思想的匹配模型结构并不复杂但特征工程做了比较多的打磨。具体来说模型输入分为三组特征第一组是用户侧特征用户的性别、年龄段、BMI分层、目标类型减脂、增肌、保持健康、已填写的口味偏好向量、最近30天的行为统计平均点赞数、收藏数、浏览时长。第二组是食谱侧特征食谱所属分类、主要食材集合、每百克热量区间、蛋白质/脂肪/碳水比例、口味标签向量。第三组是交叉特征用户历史上对该类食谱的点击率、用户对该食谱作者的其他食谱的交互情况、当前时段早中晚餐。网络结构是这样的用户侧Embedding和食谱侧Embedding分别过两层全连接然后拼接到一起过两层全连接最终输出一个点击概率。训练数据来自平台上线后积累的日志——用户对推荐结果的点击、收藏、不感兴趣行为都要记录下来。注意训练的时候要过采样正样本、负采样负样本一般按1:2到1:3的比例来做否则模型会严重偏向把概率压低。损失函数用交叉熵优化器用Adam学习率设1e-4batch size用128。我实测下来数据集在两三万条行为日志时AUC可以稳定到0.78到0.85之间这个指标对毕设来说已经足够拿出来讲了。重要的是你要能说清楚模型的每一层在做什么参数为什么这么设。深度学习的部分在整篇文章里是最占篇幅的但我想强调的是模型本身不要做得太重。一个Embedding加三层MLP的模型在一台普通机器上训练只要十几分钟推理时间在毫秒级完全够用。很多同学一上来就想用Transformer或者注意力机制结果数据量不够不说答辩时被问“为什么用这个结构”也解释不清楚自己给自己挖坑。2.3 重排层把营养学规则变成长硬约束重排层是饮食推荐这个场景区别于一般美食推荐的核心。用户要的不是“你最爱的麻辣火锅”而是一天之中早中晚餐合理的搭配。我在设计重排规则的时候把营养学知识做成了可计算的约束条件每一餐的卡路里控制在当日剩余额度的30%到50%之间避免早中晚餐热量分配失衡。蛋白质、脂肪、碳水的供能比例接近 4:2:4即碳水化合物占比较大这符合普通人的日常饮食结构。如果用户填写了过敏原比如花生、海鲜包含对应食材的食谱必须直接从候选集里删除且不允许出现在任何后补数列中。同一推荐周期内不同餐次之间食材尽量差异化避免“连续三顿都有土豆”这种尴尬情况。重排层本质是一个带约束的资源分配问题食谱数量不多的时候我用贪心策略实现先按排序模型得分从高到低遍历候选食谱每选择一个食谱就更新剩余热量和营养配额检查下一个候选是否满足约束不满足就跳过选满三餐或者不能再选为止。这个环节虽然代码不多但建议在论文里单独列一节写清楚因为它是“饮食计划推荐”区别于“美食推荐APP”的核心差异点也是评委最可能追问的地方。3. SpringBoot工程落地模块划分与数据库设计实战3.1 服务模块划分别把所有代码塞进一个包SpringBoot项目最怕的就是一上来controller-service-mapper分包然后几百个类全部堆进去。我建议按业务域分模块Maven的module不要拆得太碎控制在三个以内比较稳妥第一个模块是common模块放统一的返回结果封装、全局异常处理器、JWT工具类、敏感词过滤工具。第二个模块是core模块承载主体业务逻辑包括用户管理、食谱管理、社区互动、推荐引擎的接口与实现。第三个模块是model模块放实体类、Mapper接口、DTO和VO。这里特别注意Mapper和实体类不要分散到各个module里否则MyBatis的扫包配置会乱成一团调试的时候相当折腾。依赖管理我用的是SpringBoot 2.7.x版本搭配MyBatis-Plus 3.5.x。之所以不用3.x版本是因为SpringBoot 3对JDK要求更高有些老旧的依赖会出现不兼容问题毕设场景求稳为第一原则。下面是我整理好的核心pom依赖dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt/artifactId version0.9.1/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency dependency groupIdcom.alibaba/groupId artifactIdfastjson/artifactId version2.0.25/version /dependency /dependencies注意Redis这里重启之后缓存是空的推荐系统第一次请求会比较慢如果觉得等不了可以加一个定时任务服务启动后自动预加载召回层的相似度矩阵到Redis。3.2 数据库核心表九张表足够撑起整个系统数据库设计我总共用到了九张核心表这里把最重要的几张贴出来给你做个参考user表主键、用户名、密码BCrypt加密、性别、出生年份、身高、体重、目标类型、口味偏好JSON、过敏原JSON、注册时间。recipe表主键、名称、分类、食材列表JSON、口味标签JSON、热量、蛋白质、脂肪、碳水含量、作者ID、封面图URL、状态。behavior表主键、用户ID、食谱ID、行为类型1浏览、2点赞、3收藏、4不喜欢、时间戳。这张表是推荐系统的重要数据来源所以索引设计很关键需要建(user_id, behavior_type, recipe_id)的联合索引。diet_plan表主键、用户ID、计划日期、早/中/晚餐食谱ID、总热量、状态。post表社区帖子主表包括内容、图片、点赞数、收藏数、评论数、发布时间。comment表评论内容、评论人、所属帖子ID、父评论ID。follow表用户关注关系。admin表管理员账号。operation_log表操作日志审计用。分享一个血的教训主键千万不要用UUID字符串排序和索引性能都不理想直接用MyBatis-Plus的ASSIGN_ID模式生成雪花ID就行。另外所有时间字段统一用 datetime不要用timestamp避免MySQL服务器的时区问题和前端显示时的各种奇奇怪怪偏移。3.3 社区分享模块的几个隐藏难点社区模块看着就是简单的CRUD真正做起来有几个不是那么好处理的点。一个是帖子热度排序不能简单ORDER BY like_count否则老帖子永远霸榜新内容没有曝光机会。我用的热度公式是热度 点赞数 * 0.6 收藏数 * 0.3 评论数 * 0.1然后除以帖龄的小时数加2的N次幂作为衰减因子。这个公式不必追求精确但你要能在代码里讲清楚为什么要做时间衰减——这样新帖子才有机会被更多人看到整个社区才有活力。另一个是敏感词过滤。用户发布的食谱介绍和帖子正文都要过一遍敏感词库我用的工具是HanLP分词配合自定义敏感词库做匹配。不要把敏感词库硬编码在代码里要放在数据库表里支持动态维护这样真遇到问题可以远程修复不用重新打jar包。帖子发布时的图片上传我用的方案是本地文件存储加Nginx映射访问。这个方案在毕设级别最简单可控视频教程也多。如果你有兴趣也可以集成MinIO做对象存储但配置项会多不少遇到问题排查时间也会变长。我的原则一直是能满足需求的方案里选最不容易出问题的那个。3.4 深度学习模型的Java端部署两种给方案对比模型训练是在Python环境里做的但整个平台是SpringBoot的Java应用这就涉及模型怎么接进来的问题。我测试过两种方案都给实际跑通了这里有真实的对比数据第一种是我强烈推荐的方案Python侧训练完模型后把特征工程和推理封装成一个FastAPI服务SpringBoot通过HTTP调用它。这样做的好处是工程上完全解耦——Python环境只需要安装torch、numpy这类基础依赖Java侧不用引入任何复杂依赖两边各管各的调试起来非常清晰。坏处是多了一个网络调用的开销但实测下来一次推理加上HTTP传输也就10到30毫秒对这个场景完全够用。第二种方案是用ONNX Runtime把模型导出后直接用Java API加载推理省掉Python服务这一层。但这个方案的坑在于特征预处理的不一致——你在Python里做的标准化、归一化、Embedding查表Java侧都要重新写一遍只要有一个细节对不上出来的预测结果就微妙地不对。排查这种问题非常痛苦对毕设来说时间成本太高。我最后的落地选择是第一种FastAPI封装模型SpringBoot做远程调用。这里给一段FastAPI的封装示例from fastapi import FastAPI from pydantic import BaseModel import torch import numpy as np app FastAPI() class FeatureInput(BaseModel): user_feat: list # 用户侧特征提前在Java侧拼好 item_feat: list # 食谱侧特征 cross_feat: list # 交叉特征 # 推理时把模型切到eval模式记得用torch.no_grad() model torch.load(recommend_model.pt, map_locationcpu) model.eval() app.post(/predict) def predict(feat: FeatureInput): with torch.no_grad(): user_tensor torch.tensor([feat.user_feat], dtypetorch.float32) item_tensor torch.tensor([feat.item_feat], dtypetorch.float32) cross_tensor torch.tensor([feat.cross_feat], dtypetorch.float32) prob model(user_tensor, item_tensor, cross_tensor) return {score: float(prob.item())}SpringBoot这边就用RestTemplate或者Hutool的HttpUtil去调用注意设置连接超时和读取超时我建议都设在3秒以内。如果调用失败要做兜底逻辑——直接使用召回层的分数来排序不要让用户看到报错。这一点评委很在意你答得到就能加分。4. 推荐效果怎么评估离线指标与实际调参经验4.1 搭建离线评估流程不然你都不知道模型有没有变好我见过很多同学训练完模型跑了一版结果说“感觉差不多”然后就没有然后了。这种心态在毕设里很危险因为评委一定会问“你的推荐效果如何验证”。没有数据支撑的回答会被认为没有说服力。我的做法是搭建一个离线评估管道从行为日志数据里按时间切分训练集和测试集前80%的时间段做训练后20%做测试。每个用户的测试集里只保留他真实点击或收藏的食谱作为正样本。然后在每个用户的候选集里加入若干没有交互过的食谱做负样本统计TopK推荐中命中正样本的比例。核心指标我用四个Hit Rate10推荐列表前10个里有用户真实点击过的食谱的比例。Precision10前10个推荐里命中数量除以10。Recall10前10个推荐里命中数量除以用户真实交互总数。排序相关度MRR用户真实交互的食谱在推荐列表里排名的倒数均值。不用搞得太复杂这四个指标已经能说明问题。我实际跑出来的基准数据是纯ItemCF的Hit Rate10在0.45左右加了深度学习排序层之后能提升到0.58左右这个提升幅度写进论文是完全站得住脚的。4.2 冷启动问题新用户和新食谱的两套处理方案冷启动是所有推荐系统的命门饮食推荐也不例外。一个刚注册的用户没有任何历史行为你给他推荐什么都是盲猜。我的处理方式分两套对新用户注册流程里增加一个“饮食偏好采集”步骤。用户在选填身高体重、目标类型的同时还要勾选自己常吃的口味和忌口的食材。这些信息转化成画像标签后直接映射到食谱的标签体系上用基于规则的匹配生成第一版推荐。这里不用上模型因为模型在没有行为数据的时候一样无能为力规则反而靠谱。对新食谱问题出在它没有任何交互记录Collaborative Filtering算不出它的相似物品。解决方案是做基于内容特征的冷启动新食谱发布时后台强制要求填食材分类和口味标签然后和已有的食谱做标签向量相似度计算找到最相似的几个老食谱用老食谱的推荐位置去带新食谱。等新食谱积累了五到十条行为数据后再进入正常的协同过滤流程。这些方案之外还有一个很多教程不会提的细节负反馈一定要处理干净。用户点了“不感兴趣”的食材或者食谱要在重排层强制过滤掉。因为饮食推荐和其他推荐场景最大的不同是推荐错了只是浪费一个点击但在饮食场景里可能直接踩中用户的过敏原或者禁忌习惯这是对用户信任的严重透支必须从系统设计层面严肃对待。4.3 线上性能优化从300ms优化到80ms的实测记录毕设系统通常不会面对高并发但答辩现场演示的时候如果界面卡顿观感会很差。我在联调阶段做了一次性能优化从最初的接口中间耗时300ms优化到了80ms左右整个过程很有代表性。第一步是排查慢查询。发现推荐详情页会查食谱表、行为表、作者信息三张表链路很长。调整策略是把食谱基本信息缓存进Redis设置合理过期时间然后行为表的查询按用户ID走索引避免全表扫描。第二步是减少序列化开销。SpringBoot默认返回JSON用的是Jackson在字段很多的情况下效率不差但如果我们返回的VO里带着大字段的JSON字符串序列化和传输耗时都会上来。我调整了返回结构把食谱封面图URL和营养成分计算放到前端异步加载核心接口只返回必要字段。第三步是推荐列表的分页加载。刚开始是一次性把推荐结果全量返回数据量一大接口自然慢。改成推荐结果本身就按餐次分组存储前端按餐次请求每次只返回四到六个食谱。这样不仅响应快用户在产品体验上也更符合直觉。优化完我把前后的压测数据记录了下来优化前单接口平均耗时约300ms优化后平均耗时约80ms接口吞吐量提升了两倍多。这些数据在论文的测试章节里非常有说服力。5. 全流程调试经验从环境搭建到线上运行的避坑指南5.1 开发环境准备与远程调试配置这个项目的开发环境我建议统一成一套配置避免团队协作或者答辩演示时出现“我的机器能跑你的不能跑”的尴尬。JDK用1.8版本SpringBoot 2.7.xMySQL 5.7以上Redis 6.xPython 3.8以上。这些版本组合非常成熟网上任何一个报错都能搜到解决方案。远程调试是一个比较务实的需求很多人习惯在本机开发但项目最终要部署在服务器上演示或测试。SpringBoot的远程调试其实就一行启动参数的事java -jar diet-platform.jar --spring.profiles.activeprod --server.port8080 -agentlib:jdwptransportdt_socket,servery,suspendn,address5005然后在本机IDEA里配置Remote JVM DebugHost填服务器IPPort填5005就可以像本地调试一样打断点了。注意生产环境千万不要开着调试端口暴露在公网演示完马上关掉。这个操作对排查线上问题非常重要尤其是那些只在特定环境才出现的bug。5.2 模型集成过程中的三个经典坑第一个坑是Python环境和Java环境之间的数据格式坑。Python端的numpy float32在转JSON时会变成一串很长的浮点数而Java端用BigDecimal接收的时候如果不做精度控制偶尔会有诡异的误差。我的处理方式是在Python端统一转float()之后再进JSONJava侧统一用Float接收不要用Double。第二个坑是模型的版本管理。训练出来的模型文件命名不要只写v1、v2这种一定要带上训练日期和数据集的hash值。不然改了几次特征工程之后你很可能分不清线上跑的是哪个版本的模型万一推荐效果异常排查起来是无底洞。第三个坑是内存和依赖冲突。PyTorch CPU版本装在服务器上大概会占1GB左右内存如果你服务器的内存只有2GB再同时跑MySQL和Redis就会很吃力。我的建议是模型推理服务放到测试环境时本地PyTorch用CPU版本就够了模型尽量精简到10MB以内。Java侧的依赖冲突主要集中在jackson版本上多个依赖库可能会带进来不同版本的Jackson一定要在Maven里做好排除。5.3 一份能省的坑都省掉的排错清单我把开发过程中遇到的高频报错整理成了一份排查清单每一条都是我实际踩过的坑报错现象产生原因排查与解决方向启动时报“Failed to configure a DataSource”application.yml配置没生效或redis连接失败检查配置文件路径、数据库账号密码、Redis服务是否启动MyBatis-Plus查询条件不生效实体类字段名与数据库列名映射不符合驼峰规则确认map-underscore-to-camel-case配置以及TableName注解上传图片后访问404本地存储路径没配置为静态资源映射注册WebMvcConfigurer加addResourceHandlers中文乱码MySQL连接字符集配置缺失在jdbcUrl后加characterEncodingutf8mb4模型调用返回500FastAPI服务进程崩溃或超时查看Python侧日志检查模型加载是否完整、显存/内存是否不足推荐接口偶发超时Redis缓存穿透导致大量请求打到数据库用布隆过滤器或短时间空值缓存兜底定时任务不执行启动类漏加EnableScheduling注解检查启动类注解这张表直接打印出来贴在你电脑前面绝对能省掉很多百度的时间。6. 论文架构与答辩准备怎么把你做的东西讲出体系感6.1 论文目录结构六章刚刚好论文的章节规划我建议按下面这个结构来写每一章都能对得上实际做的工作第一章绪论重点写清楚选题背景和国内外研究现状。国内外研究现状一定要检索真实文献不要自己编至少引用十五篇以上。第二章需求分析把用户角色、功能需求、非功能需求写完整最好配上用例图。第三章系统设计包括总体架构图、技术选型说明、数据库E-R图和数据表结构。第四章推荐算法设计这是论文核心章节写推荐引擎的三层架构、特征工程细节、深度学习模型结构和训练流程。第五章系统实现按功能模块逐一描述实现过程配关键代码和界面截图。第六章系统测试包括功能测试用例、性能测试数据、推荐效果离线评估结果。写论文的时候有个很重要的小技巧不要把完整代码贴进去只贴关键算法的伪代码或者核心片段约二三十行即可。论文查重对完整代码的处理非常不友好而且篇幅太大会稀释核心内容的表达力。6.2 答辩演示的准备工作答辩演示的时候我建议演示流程控制在十分钟以内顺序是先演示普通用户的注册登录和饮食偏好采集页面然后生成一份饮食计划展示推荐结果。接着切到一个有历史行为数据的测试账号展示推荐结果和冷启动账号之间的差异这里最能体现推荐系统的感知能力。最后进入社区页面展示帖子发布、点赞收藏的完整交互。时间有多余的话再切到管理后台的统计面板。除此之外再准备一套备用的部署环境。答辩现场投影仪的接口经常出问题本机演示也可能因为网络波动连不上服务器。多准备一台笔记本电脑或者提前把接口录制一遍关键时候能救你一命。这是真话我见过太多人在讲台上卡半小时的场景。6.3 评委经常问的问题清单提前把这些问题都回答一遍答辩的时候你心里会稳得多深度学习模型相比传统协同过滤提升在哪里答排序精度提升能利用更多用户交互特征。冷启动怎么处理的答规则匹配加内容相似度牵引行为积累后进入协同过滤。营养约束规则怎么和推荐结果融合的答排序后再做重排防止不满足热量和过敏原约束的食谱进入最终推荐。数据量多大数据集能跑答当前积累了约三万条有效行为日志离线评估稳定。系统安全性上做了哪些考虑答密码BCrypt加密、JWT鉴权、敏感词过滤、XSS过滤、SQL预编译。我做完整套项目之后最深的体会是推荐系统的落地难度根本不在模型结构多复杂而是在于数据链路的构建和每一步的取舍权衡。模型算法只占用整个项目里非常小的部分真正花时间的是用户行为的收集、数据清洗、特征对齐、线上推理和评估闭环。这些才是评分和答辩时最能体现工程能力的地方。最后再分享一个小技巧把行为日志从第一天就完整记录下来后端每次推荐请求都打印一个唯一请求ID。这不仅对你的推荐模型训练有帮助答辩演示的时候你可以现场打开日志文件让评委看到真实用户请求的完整链路这种细节比任何话术都更能证明这个项目是真刀真枪跑过的。
网站建设高端定制企业官网