Как инди-разработчик, поддерживающий портфель local-first мобильных приложений, я всегда придерживался принципов скорости, полезности и экономичности. В TinyRecipe цель была простой: помочь людям не выбрасывать еду, создавая практичные пошаговые рецепты строго из продуктов, которые сейчас есть в холодильнике или кладовой.
Если подойти к делу небрежно, добавление генеративного ИИ в мобильный клиент быстро приводит к медленным ответам, непредсказуемому JSON и растущим расходам на API. Вот как я интегрировал Firebase AI Logic на базе Gemini в Vertex AI, чтобы получить быструю и структурированную генерацию рецептов при минимальных затратах.
Главная задача: удержать LLM в рамках
Если дать LLM полную свободу при составлении рецепта, сразу возникают три проблемы:
- Галлюцинации и странные сочетания: модель может предложить сварить суп из оливкового масла, соевого соуса и лимона.
- Нестабильность схемы: преобразование свободного текста или неструктурированного Markdown обратно в нативные компоненты мобильного интерфейса приводит к хрупким сбоям на стороне клиента.
- Высокий расход токенов: неограниченные ответы быстро расходуют бюджет токенов при многошаговых инструкциях.
Чтобы решить это, я использовал интеграцию 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.
