Skip to content

Repository files navigation

🥗 NutriRec — Умный рекомендатор рационов питания

Персональная система подбора питания на основе векторного семантического поиска, коллаборативной фильтрации и LLM-объяснений (GigaChat). Разработана в рамках дипломной работы.


🌟 О проекте

NutriRec рассчитывает индивидуальную суточную норму калорий по формуле Харриса-Бенедикта, учитывает уровень активности и цель пользователя, а затем автоматически составляет сбалансированный рацион на день или неделю — завтрак, перекус, обед и ужин.

Рацион подбирается через RAG-пайплайн (Retrieval-Augmented Generation):

  1. Семантический KNN-поиск по векторной базе из ~230 000 рецептов
  2. Строгая фильтрация по аллергенам
  3. Ранжирование по отклонению КБЖУ с асимметричным штрафом под цель пользователя
  4. Персонализированные LLM-объяснения от GigaChat (с fallback на шаблоны)

🚀 Возможности

🧮 Расчёт КБЖУ

  • BMR по формуле Харриса-Бенедикта (с учётом пола)
  • TDEE = BMR × коэффициент активности
  • Целевые калории: −15% (похудение), 0% (поддержание), +15% (набор массы)
  • Расчёт ИМТ и его категории

🔍 Рекомендации (RAG)

  • Векторный поиск через ChromaDB (in-memory, EphemeralClient)
  • Эмбеддинги: all-MiniLM-L6-v2 (SentenceTransformers, ~80 MB)
  • Динамическое распределение остатков КБЖУ по приёмам пищи («рюкзак»)
  • Гибкий баланс: alpha·dist + (1−alpha)·penalty_КБЖУ

🤝 Коллаборативная фильтрация

  • User-based CF на базе оценок всех пользователей системы
  • Метрика сходства: корреляция Пирсона (fallback: косинусное сходство)
  • Fallback на агрегированный рейтинг при недостатке данных

🤖 LLM-объяснения

  • GigaChat (Сбер) — объясняет, почему блюдо подходит под цель и аллергии
  • Автоматический fallback на умные шаблоны, если ключа нет или API недоступен

🧂 Аллергены (13 групп)

Молоко · Яйца · Орехи · Глютен · Рыба · Моллюски · Соя · Кунжут · Грибы · Горчица · Мёд · Красное мясо · Паслёновые

👤 Пользователи и профили

  • Регистрация и авторизация с хешированием паролей PBKDF2-SHA256
  • Личный кабинет: избранное ❤️, оценки ★, история рационов
  • Сохранение и экспорт рационов (.txt)

📊 Аналитика и UI

  • Кольцевая диаграмма БЖУ (Plotly)
  • Столбчатый график калорий по дням недели (Plotly)
  • Прогресс-бары КБЖУ с цветовой индикацией отклонений
  • Сводная таблица недели
  • Адаптивный дизайн на Inter, тёмный сайдбар, карточки с hover-анимацией

🛠 Технологический стек

Слой Технология
UI / Backend Streamlit — Python 3.11+
Vector DB ChromaDB — EphemeralClient (in-memory)
Embeddings sentence-transformersall-MiniLM-L6-v2
LLM GigaChat (Сбер) + шаблонный fallback
Visualisation Plotly
Data Pandas, NumPy
Auth PBKDF2-SHA256 (stdlib hashlib)
Env python-dotenv

📦 Установка и запуск

1. Клонировать репозиторий

git clone https://github.com/irisich/food-recommender.git
cd food-recommender

2. Установить зависимости

pip install -r requirements.txt

⚠️ torch тянет за собой ~2 GB. Если нужен только CPU-инференс, замени на torch --index-url https://download.pytorch.org/whl/cpu.

3. Настроить API-ключ GigaChat (опционально)

Без ключа приложение работает полностью, но объяснения к рецептам будут генерироваться по шаблонам вместо GigaChat.

Скопируй шаблон и заполни:

cp .env.example .env
GIGACHAT_API_KEY=твой_ключ_с_developers.sber.ru

На хостинге (Streamlit Cloud) добавь ключ в Settings → Secrets.

4. Запустить

streamlit run app.py

Приложение откроется по адресу http://localhost:8501.


📁 Структура проекта

food-recommender/
├── app.py                # Streamlit UI: страницы, карточки, графики, экспорт
├── recommender.py        # RAG-пайплайн: поиск → фильтрация → ранжирование → объяснение
├── vector_db.py          # ChromaDB wrapper (EphemeralClient + SentenceTransformer)
├── collab_filter.py      # User-based Collaborative Filtering (Pearson CF)
├── llm_explainer.py      # GigaChat-клиент + шаблонный fallback
├── data_processing.py    # Загрузка, очистка и подготовка датасета
├── nutrition.py          # BMR / TDEE / ИМТ / цели по макронутриентам
├── auth.py               # Регистрация и авторизация (PBKDF2-SHA256)
├── profiles.py           # Профили пользователей: избранное, рейтинги, рационы
├── config.py             # Пути, константы, коэффициенты, аллергены
├── data/
│   └── recipes.csv       # Датасет ~230 000 рецептов (~6 MB)
├── profiles/             # JSON-профили пользователей (не в git)
├── .env.example          # Шаблон переменных окружения
└── requirements.txt      # Зависимости

⚙️ Переменные окружения

Переменная Описание Обязательно
GIGACHAT_API_KEY Авторизационный ключ GigaChat API Нет (есть fallback)

🔑 Безопасность

  • API-ключ никогда не хранится в коде — только в переменных окружения или st.secrets
  • Пароли хранятся как PBKDF2-SHA256 хеш с солью (260 000 итераций)
  • Профили пользователей исключены из git через .gitignore

📐 Алгоритм ранжирования

score = α · cosine_distance + (1 − α) · nutrient_penalty

nutrient_penalty = 0.4·Δcal + 0.3·Δprotein + 0.15·Δfat + 0.15·Δcarbs

# Асимметричный штраф (×5) под цель:
# «Похудение»           → штраф за ПЕРЕБОР калорий
# «Набор мышечной массы» → штраф за НЕДОБОР калорий

По умолчанию α = 0.2 — приоритет у точности КБЖУ.


📊 Датасет

data/recipes.csv — адаптированный публичный датасет (~230 000 рецептов).

Колонки: id, name, calories, protein, fat, carbs, ingredients, steps, description, allergens, text_for_embedding.

About

Умный рекомендатор рационов питания (Дипломная работа)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages