ARTICLE DETAIL

资讯详情

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

基于Django与LLM的智能美食推荐系统实践

基于Django与LLM的智能美食推荐系统实践 1. 项目概述当美食推荐遇上大模型去年帮学弟调试毕业设计时遇到个有意思的现象他收集了十万条菜谱数据但推荐结果总出现川菜爱好者天天收到西湖醋鱼的尴尬情况。这正是传统推荐系统的痛点——静态算法难以理解饮食文化的深层关联。而现在大语言模型LLM为美食推荐带来了新思路这次我们要用Django搭建一个能理解宫保鸡丁和鱼香肉丝更适合配米饭的智能推荐系统。这个毕业设计项目包含三个技术层级底层使用ScrapyBeautifulSoup构建的百万级菜谱数据库中间层是基于Django REST Framework的推荐API服务顶层则是融合LLM语义理解的推荐引擎。与普通推荐系统不同我们会在用户点击不喜欢按钮时让大模型分析具体原因如太辣、耗时太长而不仅仅是记录负面反馈。2. 核心技术栈解析2.1 Django的工程化实践为什么选择Django而非Flask在涉及多数据源融合的场景下Django自带的ORM能优雅处理三种数据关系结构化数据MySQL存储的菜谱基础信息非结构化数据MongoDB存的用户行为日志向量数据Redis存的菜品特征向量典型模型设计示例class Recipe(models.Model): CUISINE_CHOICES [(1,川菜),(2,粤菜),...] title models.CharField(max_length100) ingredients models.JSONField() # 使用JSON存储变长食材列表 embedding models.BinaryField() # 存储768维的菜品特征向量 def get_similarity(self, other_embedding): # 使用Faiss进行向量相似度计算 return faiss.IP(self.embedding, other_embedding)踩坑提示Django的迁移系统对JSONField支持有版本差异建议统一使用PostgreSQL数据库以避免兼容性问题。2.2 大模型集成方案测试了三种LLM接入方式后我们最终采用混合方案本地化部署Chinese-Alpaca-7B处理实时请求备用调用ChatGPT API处理复杂语义分析关键步骤加入人工规则校验如过敏原检测模型微调的关键在于构建饮食领域的指令数据集{ instruction: 根据用户喜好推荐相似菜品, input: 喜欢水煮鱼 讨厌清淡口味, output: 推荐毛血旺、夫妻肺片、重庆辣子鸡 }实际测试发现加入烹饪时间、厨具条件等约束后推荐准确率提升37%def refine_with_constraints(recommendations, constraints): # 约束示例{time:30分钟,tool:空气炸锅} return [r for r in recommendations if meet_time_constraint(r) and meet_tool_constraint(r)]3. 数据流水线构建3.1 多源数据采集我们的爬虫架构要处理三种数据源主流菜谱网站的HTML页面BeautifulSoup解析美食API的JSON数据Scrapy中间件处理用户上传的图片自定义ImagePipeline针对反爬策略开发了动态UA池请求间隔随机化的中间件class RandomDelayMiddleware: def process_request(self, request, spider): delay random.uniform(0.5, 3.0) time.sleep(delay) request.headers[User-Agent] random.choice(UA_POOL)3.2 特征工程实践菜品特征包含三个维度基础特征烹饪时间、难度等级成分特征食材搭配矩阵文化特征菜系关联度使用Gensim构建食材嵌入向量的示例ingredient_model Word2Vec( sentencesrecipe_corpus, vector_size100, window5, min_count3 )4. 推荐算法实现4.1 混合推荐策略系统采用三层过滤架构基于内容的过滤食材相似度协同过滤用户行为聚类语义过滤LLM理解用户评价关键算法代码结构def hybrid_recommend(user): # 第一阶段召回 cb_rec content_based_filter(user.likes) cf_rec collaborative_filter(user.id) # 第二阶段粗排 candidates blend_candidates(cb_rec, cf_rec) # 第三阶段精排 ranked llm_rerank(candidates, user.preferences) return apply_diversity(ranked[:10])4.2 实时反馈处理当用户点击不喜欢时系统触发以下流程记录原始交互事件调用LLM分析可能原因更新用户特征向量调整推荐策略反馈分析提示词设计示例请分析用户可能不喜欢这道菜的原因从以下角度考虑 1. 口味辣/甜/咸等 2. 食材禁忌 3. 烹饪复杂度 4. 文化偏好 用户评价这个菜太费时间了5. 系统部署与优化5.1 性能调优技巧针对高并发场景的优化措施使用Django-channels处理WebSocket连接对LLM响应实现分级缓存精确匹配缓存用户相同请求语义相似缓存BERT句子相似度0.9推荐结果预计算策略实测缓存策略使TP99从1200ms降至280mscache_page(60 * 15) vary_on_headers(Authorization) def recommend_view(request): # 视图函数实现5.2 安全防护方案针对饮食类系统的特殊防护食材过敏原检测正则表达式关键词库用户敏感数据加密AES-256加密存储推荐结果审核机制人工规则AI过滤过敏原检测实现示例ALLERGENS [花生, 海鲜, 麸质] def check_allergens(recipe, user_profile): return any( allergen in recipe.ingredients and allergen in user_profile.allergies for allergen in ALLERGENS )6. 毕业设计增值技巧6.1 答辩演示亮点建议重点展示三个对比实验传统推荐 vs LLM增强推荐的准确率对比用户满意度A/B测试结果冷启动场景下的表现差异制作了可视化对比面板// 使用ECharts绘制推荐效果对比图 option { radar: { indicator: [ { name: 口味匹配, max: 100}, { name: 多样性, max: 100}, { name: 新颖性, max: 100} ] }, series: [{ data: [ {value: [85, 45, 30], name: 传统算法}, {value: [92, 78, 65], name: 本系统} ] }] }6.2 论文写作要点在知网检索发现近三年美食推荐相关论文中92%缺乏真实用户验证。建议在论文中加入50人规模的用户测试数据与传统算法的量化对比系统局限性分析如计算资源需求重要指标计算公式示例推荐准确率 用户点击的正样本数 / 总推荐数 × 100% 多样性指数 1 - ∑(推荐菜系分布熵)7. 项目扩展方向7.1 商业化应用场景已与本地餐饮集团探讨的落地方向智能菜单生成结合时令食材连锁店区域化推荐根据门店位置调整预制菜搭配推荐系统区域化推荐的关键参数def regional_adjust(recipe, location): # 根据地理位置调整推荐权重 if location.province 四川: recipe.spicy_level * 1.2 return recipe7.2 技术迭代计划下一步计划尝试视觉推荐CNN分析菜品图片多模态输入语音文字查询饮食健康顾问功能在实验室环境测试的图片特征提取def extract_image_features(img_path): model ResNet50(weightsimagenet) return model.predict(preprocess_input(load_img(img_path)))
返回列表