Come sviluppatore indie che gestisce un portfolio di app mobile local-first, la mia filosofia di base è sempre stata velocità, utilità ed efficienza dei costi. Con TinyRecipe l’obiettivo era semplice: aiutare gli utenti a eliminare lo spreco alimentare generando ricette pratiche, passo dopo passo, basate esclusivamente sugli ingredienti che hanno in frigorifero o in dispensa.
Aggiungere IA generativa a un client mobile può rapidamente portare a tempi di risposta lenti, payload JSON imprevedibili e costi API crescenti se non viene progettata con cura. Ecco come ho integrato Firebase AI Logic, basato su Gemini su Vertex AI, per offrire una generazione di ricette rapida e strutturata mantenendo i costi di esercizio minimi.
La sfida principale: tenere a bada l’LLM
Se si dà a un LLM piena libertà di costruire una ricetta, emergono subito tre problemi:
- Allucinazioni e abbinamenti strani: potrebbe suggerire di trasformare olio d’oliva, salsa di soia e un limone in una zuppa.
- Incoerenza dello schema: convertire testo libero o Markdown non strutturato in componenti nativi dell’interfaccia mobile porta a errori fragili lato client.
- Alto consumo di token: risposte senza limiti consumano rapidamente il budget di token per le istruzioni in più passaggi.
Per risolvere il problema ho usato l’integrazione backend di Firebase con Vertex AI per imporre istruzioni di sistema rigorose e l’analisi di un output strutturato.
1. Vincoli nel prompt di sistema e schema JSON obbligatorio
Invece di chiedere al modello una buona ricetta, il prompt di sistema lo vincola a un rigoroso contratto con uno schema 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"
}
]
}Due vincoli hanno reso la funzione molto più utile nella pratica:
- L’esenzione per gli ingredienti di base: gli utenti non dovrebbero dover spuntare sale, pepe, acqua del rubinetto o olio da cucina nell’elenco della dispensa. Il prompt di sistema consente esplicitamente questi ingredienti di base, mantenendo la selezione priva di attriti.
- Rigorosa limitazione agli ingredienti: il modello dà priorità agli ingredienti indicati come disponibili nella dispensa digitale dell’utente prima di suggerire aggiunte esterne.
2. Ottimizzazioni lato client: un’UX senza attriti
Nessuno vuole digitare “250 g di petto di pollo a cubetti” su una tastiera mobile in cucina.
[L’utente tocca i tag della dispensa] -> [Il client assembla l’array] -> [Richiesta a Firebase AI] -> [Rendering dell’interfaccia nativa]- Tag di categoria a selezione rapida: l’interfaccia presenta tag categorizzati e attivabili rapidamente per gli ingredienti comuni di frigorifero e dispensa.
- Cache locale: prima di inviare una richiesta a Firebase AI Logic, l’app calcola l’hash dell’array di ingredienti selezionati. Quando un utente richiede una ricetta con gli stessi ingredienti principali in un breve intervallo, TinyRecipe serve subito il risultato in cache, senza un’altra chiamata API.
3. Lezioni imparate e prossimi passi
Firebase AI Logic ha reso la scalabilità di una funzione di IA generativa sorprendentemente semplice per uno sviluppatore solitario. Imponendo schemi JSON rigorosi al confine del modello e mantenendo lo stato in locale, TinyRecipe ottiene:
- tempi di generazione inferiori a due secondi
- rendering lato client prevedibile, senza errori di parsing
- spreco di token API trascurabile
La funzione Dispensa con IA è ora disponibile sia su iOS sia su Android.
