1. 项目背景与核心价值
在当今信息爆炸的时代,美食推荐系统已经成为解决"吃什么"这一日常难题的有效工具。传统的推荐系统往往基于简单的标签匹配或用户历史行为,而结合大语言模型的智能推荐系统能够理解更深层次的用户偏好和饮食需求。这个毕业设计项目正是利用Django框架构建后端,整合大语言模型的语义理解能力,打造一个能够进行智能对话和个性化推荐的美食系统。
从技术角度看,这个项目完美融合了多个前沿技术领域:
- Web开发框架:Django提供了稳定可靠的后端支持
- 大语言模型:赋予系统自然语言理解和生成能力
- 数据分析:对菜谱数据进行深度挖掘和特征提取
- 推荐算法:实现个性化的美食推荐
对于计算机专业的学生来说,这个项目涵盖了从数据采集、处理到模型集成、系统部署的完整流程,是检验综合能力的绝佳课题。它不仅符合当前AI应用落地的趋势,也解决了实际生活中的痛点问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 整体技术栈
系统采用典型的三层架构设计:
前端层:
- HTML/CSS/JavaScript基础Web技术
- Bootstrap等响应式框架确保多端适配
- 可能考虑Vue.js/React等现代前端框架增强交互性
后端层:
- Django作为核心Web框架
- Django REST framework构建API接口
- Celery处理异步任务(如模型推理)
- Redis作为缓存和消息代理
数据层:
- PostgreSQL/MySQL作为主数据库
- Elasticsearch提供全文检索能力
- 可能使用Milvus等向量数据库存储菜品特征
AI层:
- 预训练的大语言模型(如ChatGLM、LLaMA等)
- 微调后的推荐模型
- 传统机器学习算法辅助推荐
2.2 核心模块划分
-
用户管理模块:
- 注册/登录/个人资料
- 饮食偏好收集
- 历史行为记录
-
菜谱管理模块:
- 菜谱CRUD操作
- 多维度分类体系
- 营养成分分析
-
推荐引擎模块:
- 基于内容的推荐
- 协同过滤推荐
- 混合推荐策略
-
对话交互模块:
- 自然语言理解
- 意图识别
- 响应生成
-
数据分析模块:
- 用户行为分析
- 菜谱热度统计
- 推荐效果评估
3. 关键技术实现细节
3.1 Django项目配置与优化
创建Django项目的基础结构:
bash复制django-admin startproject food_recommendation
cd food_recommendation
python manage.py startapp recipes
python manage.py startapp users
python manage.py startapp recommendation
关键配置项(settings.py):
python复制# 数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'food_db',
'USER': 'food_user',
'PASSWORD': 'complexpassword',
'HOST': 'localhost',
'PORT': '5432',
}
}
# 缓存配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 静态文件配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
性能优化建议:
- 使用django-debug-toolbar识别性能瓶颈
- 对高频查询添加缓存装饰器
- 合理使用select_related和prefetch_related减少数据库查询
- 启用Gzip压缩和静态文件版本控制
3.2 大模型集成方案
针对毕业设计场景,推荐以下几种可行的模型集成方案:
方案一:本地部署轻量级模型
- 模型选择:ChatGLM-6B、LLaMA-7B等
- 硬件要求:至少16GB内存,NVIDIA显卡(如RTX 3060+)
- 部署方式:
python复制from transformers import AutoModel, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True) model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda() def generate_response(prompt): response, history = model.chat(tokenizer, prompt, history=[]) return response
方案二:API调用云端模型
- 服务提供商:OpenAI、文心一言、通义千问等
- 优点:无需本地计算资源
- 示例代码:
python复制import openai openai.api_key = "your-api-key" def get_recipe_suggestion(ingredients): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "你是一个专业厨师,能根据现有食材推荐合适的菜谱"}, {"role": "user", "content": f"我有这些食材:{ingredients},能做什么菜?"} ] ) return response.choices[0].message.content
方案三:微调专业美食模型
- 收集美食领域对话数据
- 使用LoRA等高效微调方法
- 部署微调后的模型
python复制from peft import LoraConfig, get_peft_model lora_config = LoraConfig( r=8, lora_alpha=16, target_modules=["query_key_value"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config)
3.3 推荐算法实现
基于内容的推荐
python复制from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def content_based_recommendation(user_preferences, recipes):
# 合并菜谱特征
recipe_texts = [f"{r['title']} {r['ingredients']} {r['tags']}" for r in recipes]
# 计算TF-IDF特征
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(recipe_texts)
# 计算用户偏好向量
user_vector = vectorizer.transform([user_preferences])
# 计算相似度
similarities = cosine_similarity(user_vector, tfidf_matrix)
# 返回最相似的菜谱
top_indices = similarities.argsort()[0][-5:][::-1]
return [recipes[i] for i in top_indices]
协同过滤推荐
python复制from surprise import Dataset, KNNBasic
from surprise.model_selection import train_test_split
def collaborative_filtering(ratings):
# 加载评分数据
data = Dataset.load_from_df(ratings[['user_id', 'recipe_id', 'rating']],
reader=Reader(rating_scale=(1, 5)))
# 划分训练测试集
trainset, testset = train_test_split(data, test_size=0.25)
# 使用KNN算法
algo = KNNBasic()
algo.fit(trainset)
# 为用户推荐
user_inner_id = algo.trainset.to_inner_uid(user_id)
user_neighbors = algo.get_neighbors(user_inner_id, k=5)
return [algo.trainset.to_raw_iid(i) for i in user_neighbors]
混合推荐策略
python复制def hybrid_recommendation(user_id, user_preferences, recipes, ratings):
# 获取内容推荐结果
content_recs = content_based_recommendation(user_preferences, recipes)
# 获取协同过滤结果
cf_recs = collaborative_filtering(ratings)
# 融合策略
recommendations = []
# 优先考虑协同过滤结果
for recipe_id in cf_recs:
recipe = next(r for r in recipes if r['id'] == recipe_id)
if recipe not in recommendations:
recommendations.append(recipe)
# 补充内容推荐结果
for recipe in content_recs:
if recipe not in recommendations:
recommendations.append(recipe)
return recommendations[:10]
4. 数据库设计与数据分析
4.1 核心数据模型
python复制# models.py
from django.db import models
class User(models.Model):
username = models.CharField(max_length=50, unique=True)
email = models.EmailField(unique=True)
password = models.CharField(max_length=128)
dietary_restrictions = models.JSONField(default=list)
favorite_cuisines = models.JSONField(default=list)
created_at = models.DateTimeField(auto_now_add=True)
class Recipe(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
ingredients = models.JSONField() # 存储结构化食材数据
steps = models.JSONField() # 存储步骤列表
cooking_time = models.PositiveIntegerField() # 分钟
difficulty = models.CharField(max_length=20)
cuisine_type = models.CharField(max_length=50)
meal_type = models.CharField(max_length=50) # 早餐/午餐/晚餐
nutritional_info = models.JSONField() # 卡路里、蛋白质等
image_url = models.URLField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class UserRating(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
rating = models.PositiveSmallIntegerField()
review = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
class UserBehavior(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
behavior_type = models.CharField(max_length=20) # view, save, share等
created_at = models.DateTimeField(auto_now_add=True)
4.2 数据分析流程
- 数据预处理:
python复制import pandas as pd
from sklearn.preprocessing import MinMaxScaler
# 加载数据
recipes = pd.read_sql('SELECT * FROM recipes_recipe', con=engine)
ratings = pd.read_sql('SELECT * FROM recipes_userrating', con=engine)
# 特征工程
# 标准化烹饪时间
scaler = MinMaxScaler()
recipes['normalized_cooking_time'] = scaler.fit_transform(recipes[['cooking_time']])
# 提取食材热度
ingredient_counts = {}
for ingredients in recipes['ingredients']:
for ing in ingredients:
ingredient_counts[ing] = ingredient_counts.get(ing, 0) + 1
# 添加食材热度特征
recipes['ingredient_popularity'] = recipes['ingredients'].apply(
lambda x: sum(ingredient_counts.get(ing, 0) for ing in x) / len(x) if x else 0
)
- 用户行为分析:
python复制# 计算菜谱热度
recipe_popularity = ratings.groupby('recipe_id')['rating'].agg(['count', 'mean'])
recipe_popularity.columns = ['rating_count', 'average_rating']
# 用户活跃度分析
user_activity = ratings.groupby('user_id').size().reset_index(name='rating_count')
active_users = user_activity[user_activity['rating_count'] > 5]
# 用户偏好分析
user_preferences = ratings.merge(recipes, left_on='recipe_id', right_on='id')
user_cuisine_pref = user_preferences.groupby(['user_id', 'cuisine_type'])['rating'].mean().unstack()
- 可视化分析:
python复制import matplotlib.pyplot as plt
import seaborn as sns
# 菜谱难度分布
plt.figure(figsize=(10, 6))
sns.countplot(data=recipes, x='difficulty')
plt.title('Recipe Difficulty Distribution')
plt.show()
# 烹饪时间与评分关系
plt.figure(figsize=(10, 6))
sns.scatterplot(data=recipes.merge(recipe_popularity, left_on='id', right_index=True),
x='cooking_time', y='average_rating', hue='difficulty')
plt.title('Cooking Time vs Average Rating')
plt.show()
# 用户评分分布
plt.figure(figsize=(10, 6))
sns.histplot(data=ratings, x='rating', bins=5)
plt.title('User Rating Distribution')
plt.show()
5. 系统部署与性能优化
5.1 生产环境部署方案
推荐使用Docker容器化部署:
dockerfile复制# Dockerfile
FROM python:3.9
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "4", "food_recommendation.wsgi:application"]
docker-compose.yml配置:
yaml复制version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
depends_on:
- redis
- db
environment:
- DJANGO_SETTINGS_MODULE=food_recommendation.settings.production
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_DB=food_db
- POSTGRES_USER=food_user
- POSTGRES_PASSWORD=complexpassword
redis:
image: redis:6
ports:
- "6379:6379"
celery:
build: .
command: celery -A food_recommendation worker -l info
depends_on:
- redis
- db
volumes:
- .:/app
environment:
- DJANGO_SETTINGS_MODULE=food_recommendation.settings.production
volumes:
postgres_data:
5.2 性能优化策略
-
数据库优化:
- 为常用查询字段添加索引
- 使用django.db.models.Index创建复合索引
- 定期执行ANALYZE和VACUUM
-
缓存策略:
- 视图缓存:使用django.views.decorators.cache.cache_page
- 模板片段缓存:
- 模型实例缓存:django-cacheops
-
异步任务处理:
- 耗时操作(如模型推理)交给Celery
- 使用django-celery-results存储任务结果
- 配置任务优先级和重试机制
-
静态文件优化:
- 使用WhiteNoise处理静态文件
- 配置CDN加速
- 启用HTTP/2和Brotli压缩
-
大模型服务优化:
- 使用vLLM加速推理
- 实现请求批处理
- 设置合理的超时和重试机制
6. 毕业设计扩展建议
6.1 论文写作要点
-
引言部分:
- 明确研究背景和意义
- 阐述美食推荐系统的现状和挑战
- 提出创新点和解决方案
-
相关工作:
- 综述传统推荐系统方法
- 分析大模型在推荐系统中的应用
- 比较现有美食推荐系统的优缺点
-
系统设计:
- 详细描述架构设计
- 解释关键技术选型依据
- 展示核心算法流程
-
实验评估:
- 设计合理的评估指标
- 对比不同推荐策略的效果
- 分析用户调研结果
-
结论与展望:
- 总结项目成果
- 讨论局限性
- 提出未来改进方向
6.2 答辩准备建议
-
PPT结构建议:
- 封面:项目名称、姓名、导师
- 目录:清晰的结构导航
- 背景与意义:1-2页
- 技术方案:3-5页(核心亮点)
- 系统演示:2-3页(截图+说明)
- 总结与展望:1页
-
演示技巧:
- 准备两套演示方案(完整版和精简版)
- 突出技术创新点
- 预想可能的问题并准备答案
- 控制时间,重点突出
-
代码展示:
- 选择最具代表性的代码片段
- 准备GitHub仓库供评委查看
- 展示关键算法实现
6.3 项目扩展方向
-
多模态扩展:
- 集成图片识别食材功能
- 添加视频菜谱支持
- 实现语音交互
-
个性化增强:
- 考虑用户健康数据(如体重、运动量)
- 结合天气、季节因素
- 支持多人用餐场景推荐
-
社交功能:
- 用户间菜谱分享
- 美食社区建设
- 厨师达人认证体系
-
商业化探索:
- 食材电商对接
- 付费高级功能
- 广告精准投放
-
技术深化:
- 强化模型微调
- 实现实时推荐
- 优化冷启动问题
在实际开发过程中,我建议采用迭代式开发方法,先实现核心功能再逐步扩展。同时要注意记录开发日志,这不仅能帮助排查问题,也是毕业论文写作的重要素材。对于大模型集成部分,本地部署和API调用各有优劣,需要根据实际硬件条件和项目需求做出权衡。
