AI-нутрициолог. Небольшой pet-проект по анализу состава продуктов

AI-нутрициолог. Небольшой pet-проект по анализу состава продуктов

Каждый поход в магазин для меня был квестом. Стоишь у полки, вертишь в руках упаковку и пытаешься расшифровать состав, написанный мелким шрифтом. Что такое «фосфат калия»? Насколько вреден «сорбит»? Это вообще съедобно? Мне надоело постоянно гуглить каждый ингредиент.

Я решил, что соберу себе личного AI-нутрициолога, который будет жить в Telegram и делать всю эту скучную работу за меня. Так родился Foody Scan — мой pet-проект, который из простой идеи превратился в сервис с AI-анализом, базой данных и даже монетизацией через Telegram Stars.

И самое интересное — я собрал его практически целиком на no-code/low-code стеке, разместив на собственном хостинге. Ниже я покажу, как он устроен под капотом, какие инженерные костыли пришлось изобретать и почему этот опыт оказался ценнее любого ютуб-ролика по подобным штукам.

Дисклаймер

А теперь давайте сразу о главном. Я не питаю иллюзий насчет этого проекта и не считаю его коммерческим успехом. Изначально я просто хотел сделать MVP, которое могло бы жить за счет средств, получаемых от пользователей, а не сжигать мой личный бюджет.

Каждый запрос на обработку фото через LLM/vLLM обходился мне примерно в 3-4 рубля. Даже с бесплатным лимитом в 3 анализа в день, если бы бот внезапно «хайпанул» и им начали пользоваться хотя бы 100 человек, я бы улетел в минус за пару дней.

Поэтому монетизация через Telegram Stars — это не попытка заработать, а, по сути, решение для самоокупаемости. Простая страховка от случайного успеха.

Выбор инструментов

Я не хотел писать бэкенд с нуля. Моей целью было максимально быстро проверить гипотезу, поэтому я выбрал инструменты, которые позволяют сосредоточиться на логике, а не на бойлерплейте.

  • n8n — визуальный бэкенд. Это основа проекта. Вместо сотен строк кода на Python или Node.js, вся логика бота — это один большой воркфлоу, который я могу видеть и отлаживать. Самостоятельный хостинг дал мне полный контроль и убрал лимиты облачных версий.
  • Supabase — база данных. Мне нужно было где-то хранить пользователей, их баланс «сканирований», списки исключений и историю платежей. Supabase — это, по сути, готовый бэкенд с базой данных Postgres, простым API и щедрым бесплатным тарифом. Идеально для pet-проекта.
  • Telegram Bot API — по сути фронтенд. Зачем делать свое приложение, если у всех уже есть Telegram? Его API позволяет принимать не только текст, но и фото, обрабатывать инлайн-кнопки и возможность принимать платежи через Telegram Stars.
AI-нутрициолог. Небольшой pet-проект по анализу состава продуктов

Как это работает: Путь одной фотографии от пользователя до отчета

Давайте по шагам разберем, что происходит, когда пользователь отправляет боту фотографию этикетки.

AI-нутрициолог. Небольшой pet-проект по анализу состава продуктов

Шаг 1. Регистрация и проверка.

Когда пользователь впервые пишет боту, Telegram Trigger в n8n ловит это событие. Сценарий первым делом идет в Supabase и проверяет: есть ли такой user_id в базе? Если нет — создает новую запись с базовым балансом сканирований. Если есть — просто обновляет время последней активности. Стандартная, но обязательная рутина.

AI-нутрициолог. Небольшой pet-проект по анализу состава продуктов

Шаг 2. Запрос на анализ и проверка баланса.

Пользователь отправляет фото. Воркфлоу проверяет, что это именно фото, а не текст, и снова лезет в Supabase, чтобы посмотреть поле usage_limit. Если баланс позволяет (например, больше 10 «пончиков» 🍩, это местная валюта в боте), процесс идет дальше. Если нет — пользователю вежливо предлагается пополнить баланс командой /topup.

AI-нутрициолог. Небольшой pet-проект по анализу состава продуктов

Шаг 3. OCR (Распознавание) с помощью Vision-модели.

Это первый и самый важный этап AI-анализа.

  1. Фото скачивается с серверов Telegram и проходит через ноду Edit Image для стандартизации размера (например, 1024x1024), чтобы модели было проще с ним работать.
  2. Подготовленное изображение уходит в мультимодальную LLM (после долгих тестов я остановился на qwen2.5-vl-72b-instruct через OpenRouter).
  3. Единственная задача этой модели — быть роботом-OCR. Я дал ей строгий системный промпт: «Найди на картинке название продукта, состав, БЖУ и условия хранения. Верни результат только в виде JSON вот такой структуры. Если чего-то не нашел — так и напиши в соответствующем поле».
  4. Ответ от модели проходит через ноду Structured Output Parser, которая проверяет, что на выходе действительно валидный JSON. Если нет — это ошибка, и процесс останавливается.
AI-нутрициолог. Небольшой pet-проект по анализу состава продуктов

Шаг 4. Анализ и оценка с помощью текстовой LLM.

Теперь у нас есть чистые, структурированные данные. Их мы отправляем во вторую, уже чисто текстовую модель (google/gemini-2.0-flash-001), которая получает гораздо более сложную роль.

  1. Ее системный промпт — это целая инструкция: «Ты — опытный нутрициолог. Проанализируй вот этот JSON. По каждому ингредиенту дай оценку (✅ Полезно, ⚠ Нейтрально, ❌ Вредно) и краткое пояснение. Сравни состав с персональным списком исключений пользователя (этот список я подтягиваю из Supabase и добавляю в промпт). Сделай общую оценку продукта по 10-балльной шкале и дай рекомендации».
  2. Ответ от этой модели также парсится в JSON для дальнейшей обработки.

Шаг 5. Форматирование и отправка отчета.

Полученный от второй LLM JSON — это еще не готовый отчет. Он содержит данные, но не форматирование. Поэтому последним шагом идет нода Code, в которой простой JavaScript-код собирает из этого JSON красивое, отформатированное HTML-тегами сообщение для Telegram, расставляет эмодзи, выделяет заголовки жирным и формирует инлайн-кнопки («Показать полный состав»).

AI-нутрициолог. Небольшой pet-проект по анализу состава продуктов

Уроки, выученные на своей шкуре (и с помощью костылей)

На бумаге все выглядело просто, но на практике я наступил на все возможные грабли.

Урок №1: Telegram Stars

Я решил попробовать новую фичу Telegram — оплату «звездами». И тут же выяснилось, что в n8n нет и, скорее всего, не будет готовых нод для этого.

  • Проблема: Как выставить счет и проверить оплату? Как сделать возврат?
  • Решение: Пришлось закопаться в документацию Telegram Bot API и реализовать все вручную через базовую ноду HTTP Request. Я формировал JSON-тело запроса для sendInvoice и answerPreCheckoutQuery, отправлял его POST-запросом, а все операции по платежам с payload и charge_id аккуратно логировал в отдельную таблицу в Supabase. Это был настоящий low-code: без написания сервера, но с пониманием, как работает API.
AI-нутрициолог. Небольшой pet-проект по анализу состава продуктов

Урок №2: Выбор LLM-моделей

Я наивно полагал, что одна большая модель решит все мои задачи. Как же я ошибался.

  • Проблема: Модели, которые отлично анализировали текст, выдавали полную чушь при распознавании картинки, и наоборот. Попытка сделать всё в одном промпте приводила к нестабильным результатам.
  • Решение: Тот самый двухступенчатый пайплайн, о котором я рассказал выше. Разделение задач на «тупой, но зоркий OCR-робот» и «умный, но слепой нутрициолог» оказалось ключевым для стабильности.

Урок №3: Агония ожидания и UX

Мощные модели работают медленно. Анализ одного фото занимал от 60 до 120 секунд. Для пользователя это вечность, за которую он успеет подумать, что бот сломался, и уйти.

  • Проблема: Как удержать внимание пользователя во время долгой обработки?
  • Решение: Промежуточные сообщения. Как только пользователь нажимает кнопку «Анализировать», бот тут же редактирует сообщение на «⏳ Начинаю обработку...». После успешного OCR — «✅ Состав распознан, начинаю анализ...». Это создает ощущение, что процесс идет, и бот не завис. Но я всё равно считаю, что получилось всё "не очень".
AI-нутрициолог. Небольшой pet-проект по анализу состава продуктов

Урок №4: Мой собственный Retry

LLM API иногда «моргают»: возвращают ошибку сети, невалидный JSON или просто тайм-аут. Встроенные в n8n ретраи не всегда помогали, так как ошибка могла быть на уровне данных, а не соединения.

  • Проблема: Как сделать систему отказоустойчивой?
  • Решение: Я построил собственную систему ретраев для AI-запросов. Это простой, но эффективный цикл из нод Set, If и Wait. Сценарий пытается выполнить запрос. Если ошибка — он увеличивает счетчик retry на 1, ждет 5 секунд и пробует снова. После 3 неудачных попыток он сдается и отправляет пользователю сообщение об ошибке.

Урок №5: "Бесплатный" Supabase

Supabase, а точнее — особенность его бесплатного тарифа, о которой я знал, но не придал значения. Если к вашему проекту нет обращений в течение 7 дней, Supabase ставит его на паузу. База данных просто отключается.

Да, они присылают email-предупреждение, но в потоке сотен писем его легко пропустить. Для пользователя это выглядит как полная поломка сервиса. Для меня это означало панический забег в админку Supabase, чтобы вручную нажать кнопку "Restore project" и ждать, пока он "проснется".

  • Проблема: Что делать, чтобы база supabase не отключалась?
  • Решение: Либо переход на платный тариф, либо просто создание "ping" решения (каждые 2 часа делается запрос к базе). Вообще supabase можно разместить на своём собственном хостинге, как и n8n, но он очень прожорлив по требованиям к железу.

Этот проект — живое доказательство того, что n8n — это лучший MVP и худший продакшн. Я подробно разбирал эту дилемму в отдельной заметке, где собрал основные "боли", с которыми сталкивается сообщество, и четко разграничил, когда n8n — идеальный выбор, а когда нужно сразу смотреть в сторону кода.

Заключение: Собрать AI-продукт проще (и интереснее), чем кажется

Проект Foody Scan научил меня главному: порог входа в создание реальных AI-продуктов стал прозрачней. Немного не по себе представлять, что больше не нужна команда из 10 человек и несколько недель на разработку MVP. С помощью инструментов вроде n8n, Supabase и готовых LLM-моделей можно в одиночку за несколько вечеров собрать, протестировать и запустить работающий сервис. Не сказать, что идеальный, но самое главное – работающий.

Если захотите сделать нечто подобное, то вы как и я столкнетесь с проблемами. Вам придется придумывать кастомные решения, подбирать модели и мириться с их ограничениями. Но это и есть самое интересное!

А какие pet-проекты вы собирали на подобных стеках? Сталкивались с похожими проблемами? Поделитесь в комментариях!

14
4
13 комментариев