Персональная система подбора питания на основе векторного семантического поиска, коллаборативной фильтрации и LLM-объяснений (GigaChat). Разработана в рамках дипломной работы.
NutriRec рассчитывает индивидуальную суточную норму калорий по формуле Харриса-Бенедикта, учитывает уровень активности и цель пользователя, а затем автоматически составляет сбалансированный рацион на день или неделю — завтрак, перекус, обед и ужин.
Рацион подбирается через RAG-пайплайн (Retrieval-Augmented Generation):
- Семантический KNN-поиск по векторной базе из ~230 000 рецептов
- Строгая фильтрация по аллергенам
- Ранжирование по отклонению КБЖУ с асимметричным штрафом под цель пользователя
- Персонализированные LLM-объяснения от GigaChat (с fallback на шаблоны)
- BMR по формуле Харриса-Бенедикта (с учётом пола)
- TDEE = BMR × коэффициент активности
- Целевые калории: −15% (похудение), 0% (поддержание), +15% (набор массы)
- Расчёт ИМТ и его категории
- Векторный поиск через ChromaDB (in-memory, EphemeralClient)
- Эмбеддинги:
all-MiniLM-L6-v2(SentenceTransformers, ~80 MB) - Динамическое распределение остатков КБЖУ по приёмам пищи («рюкзак»)
- Гибкий баланс:
alpha·dist + (1−alpha)·penalty_КБЖУ
- User-based CF на базе оценок всех пользователей системы
- Метрика сходства: корреляция Пирсона (fallback: косинусное сходство)
- Fallback на агрегированный рейтинг при недостатке данных
- GigaChat (Сбер) — объясняет, почему блюдо подходит под цель и аллергии
- Автоматический fallback на умные шаблоны, если ключа нет или API недоступен
Молоко · Яйца · Орехи · Глютен · Рыба · Моллюски · Соя · Кунжут · Грибы · Горчица · Мёд · Красное мясо · Паслёновые
- Регистрация и авторизация с хешированием паролей PBKDF2-SHA256
- Личный кабинет: избранное ❤️, оценки ★, история рационов
- Сохранение и экспорт рационов (
.txt)
- Кольцевая диаграмма БЖУ (Plotly)
- Столбчатый график калорий по дням недели (Plotly)
- Прогресс-бары КБЖУ с цветовой индикацией отклонений
- Сводная таблица недели
- Адаптивный дизайн на Inter, тёмный сайдбар, карточки с hover-анимацией
| Слой | Технология |
|---|---|
| UI / Backend | Streamlit — Python 3.11+ |
| Vector DB | ChromaDB — EphemeralClient (in-memory) |
| Embeddings | sentence-transformers — all-MiniLM-L6-v2 |
| LLM | GigaChat (Сбер) + шаблонный fallback |
| Visualisation | Plotly |
| Data | Pandas, NumPy |
| Auth | PBKDF2-SHA256 (stdlib hashlib) |
| Env | python-dotenv |
git clone https://github.com/irisich/food-recommender.git
cd food-recommenderpip install -r requirements.txt
⚠️ torchтянет за собой ~2 GB. Если нужен только CPU-инференс, замени наtorch --index-url https://download.pytorch.org/whl/cpu.
Без ключа приложение работает полностью, но объяснения к рецептам будут генерироваться по шаблонам вместо GigaChat.
Скопируй шаблон и заполни:
cp .env.example .envGIGACHAT_API_KEY=твой_ключ_с_developers.sber.ruНа хостинге (Streamlit Cloud) добавь ключ в Settings → Secrets.
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.