Статья

Умная кладовая на Firebase AI Logic и Gemini

Как TinyRecipe использует Firebase AI Logic и Gemini, чтобы быстро создавать структурированные рецепты из продуктов, которые уже есть на вашей кухне.

Умная кладовая на Firebase AI Logic и Gemini

Как инди-разработчик, поддерживающий портфель local-first мобильных приложений, я всегда придерживался принципов скорости, полезности и экономичности. В TinyRecipe цель была простой: помочь людям не выбрасывать еду, создавая практичные пошаговые рецепты строго из продуктов, которые сейчас есть в холодильнике или кладовой.

Если подойти к делу небрежно, добавление генеративного ИИ в мобильный клиент быстро приводит к медленным ответам, непредсказуемому JSON и растущим расходам на API. Вот как я интегрировал Firebase AI Logic на базе Gemini в Vertex AI, чтобы получить быструю и структурированную генерацию рецептов при минимальных затратах.

Главная задача: удержать LLM в рамках

Если дать LLM полную свободу при составлении рецепта, сразу возникают три проблемы:

  1. Галлюцинации и странные сочетания: модель может предложить сварить суп из оливкового масла, соевого соуса и лимона.
  2. Нестабильность схемы: преобразование свободного текста или неструктурированного Markdown обратно в нативные компоненты мобильного интерфейса приводит к хрупким сбоям на стороне клиента.
  3. Высокий расход токенов: неограниченные ответы быстро расходуют бюджет токенов при многошаговых инструкциях.

Чтобы решить это, я использовал интеграцию Firebase с Vertex AI для строгих системных инструкций и разбора структурированного вывода.

1. Ограничения в системном промпте и строгая JSON-схема

Вместо просьбы «составить хороший рецепт» системный промпт заставляет модель следовать строгому контракту JSON-схемы:

{
  "title": "String",
  "prep_time_minutes": "Number",
  "difficulty": "Easy | Medium | Hard",
  "matched_pantry_items": ["Array of Strings"],
  "missing_staples_required": ["Array of Strings"],
  "instructions": [
    {
      "step_number": 1,
      "text": "String"
    }
  ]
}

Два ограничения сделали функцию намного полезнее на практике:

  • Исключение для базовых продуктов: пользователям не нужно отмечать в списке кладовой соль, перец, воду из-под крана или растительное масло. Системный промпт прямо разрешает эти базовые продукты, поэтому выбор остаётся беспроблемным.
  • Строгая изоляция ингредиентов: модель отдаёт приоритет ингредиентам, отмеченным как имеющиеся в цифровой кладовой пользователя, прежде чем предлагать дополнительные.

2. Оптимизации на стороне клиента: UX без трения

Никто не хочет печатать «250 г нарезанной куриной грудки» на мобильной клавиатуре на кухне.

[Пользователь выбирает теги продуктов] -> [Клиент собирает массив] -> [Запрос Firebase AI] -> [Отрисовка нативного интерфейса]
  • Теги категорий для быстрого выбора: интерфейс показывает сгруппированные по категориям теги, которые можно быстро переключать, для типичных продуктов из холодильника и кладовой.
  • Локальное кэширование: перед отправкой запроса в Firebase AI Logic приложение вычисляет хеш выбранного массива продуктов. Если пользователь за короткое время запрашивает рецепт с теми же основными ингредиентами, TinyRecipe мгновенно отдаёт кэшированный результат без нового вызова API.

3. Выводы и следующие шаги

Firebase AI Logic сделал масштабирование функции генеративного ИИ на удивление простым для разработчика-одиночки. Благодаря строгим JSON-схемам на границе модели и локальному состоянию TinyRecipe обеспечивает:

  • генерацию менее чем за две секунды
  • предсказуемую отрисовку на клиенте без сбоев разбора
  • пренебрежимо малый перерасход токенов API

Функция «Умная кладовая» теперь доступна и на iOS, и на Android.