L'integrazione di modelli AI nelle applicazioni mobile sta diventando sempre più importante, ma spesso richiede connessioni tramite cloud, compromettendo la privacy degli utenti. Gemma, una famiglia di LLM lightweight sviluppati da Google, offre una soluzione innovativa a questi problemi, permettendo l’esecuzione di modelli AI direttamente sul dispositivo. Ma come integrare Gemma in un'app Flutter?
Progettati per funzionare direttamente su dispositivo e sviluppati da Google DeepMind insieme ad altri team di Google, i modelli Gemma utilizzano la stessa tecnologia dei modelli Gemini, ma sono ottimizzati per l'esecuzione locale, garantendo maggiore privacy, funzionalità offline e svincolandoci dal "peso" del cloud.
Gemma offre due varianti principali:
Il package flutter_gemma consente di integrare facilmente i modelli Gemma nelle tue applicazioni Flutter, fornendo API intuitive e strumenti di configurazione pronti all'uso. Supporta diverse tipologie di modelli, inclusi quelli standard, quelli ottimizzati per istruzioni (instruction-tuned) e quelli ulteriormente personalizzati (fine-tuned).
1 - Aggiungi flutter_gemma
sul tuo pubspec.yaml
1dependencies:
2 flutter_gemma: latest_version
2 - Ottieni un modello pre-addestrato di Gemma.
Puoi trovare tutti i modelli pre-addestrati sulla piattaforma Kaggle. Per questo progetto, scarica la versione LiteRT
del modello, in particolare i modelli gemma-2b, in quanto sono meno resource-intensive.
3 - Effettua i setup specifici per le varie piattaforme:
Per abilitare l'utilizzo della GPU per lavorare con il modello, è necessario aggiungere il supporto a OpenGL nel file manifest.xml. Se invece si vuole utilizzare esclusivamente la CPU, questo passaggio può essere tranquillamente ignorato.
1</application>
2 <uses-native-library
3 android:name="libOpenCL.so"
4 android:required="false"/>
5 <uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
6 <uses-native-library android:name="libOpenCL-pixel.so" android:required="false"/>
Abilita la condivisione file aggiungendo nel file info.plist
:
1<key>UIFileSharingEnabled</key><true/>
Cambia il tipo di collegamento dei pod in statico, sostituendo la riga use_frameworks!
nel file Podfile
con:
1use_frameworks! :linkage => :static
Aggiungi sul file index.html
:
1<script type="module">
2 import { FilesetResolver, LlmInference } from 'https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai';
3 window.FilesetResolver = FilesetResolver;
4 window.LlmInference = LlmInference;
5</script>
4 - Aggiungi il tuo modello agli assets.
1flutter:
2 uses-material-design: true
3 assets:
4 - assets/models/gemma-2b-it-gpu-int4.bin
5 - Carica e inizializza un modello:
1static Future<void> _initializeEngine(String modelPath) async {
2 await FlutterGemmaPlugin.instance.loadAssetModel(fullPath: modelPath);
3
4 await FlutterGemmaPlugin.instance.init(maxTokens: 2048, temperature: 0.5, topK: 40, randomSeed: 42);
5}
I parametri utilizzati nell'inizializzazione influenzano il comportamento del modello:
maxTokens (2048)
: controlla la lunghezza massima della risposta generatatemperature (0.5)
: regola la creatività delle risposte (0=conservative
, 1=creative
)topK (40)
: limita il numero di parole candidate per la prossima predizionerandomSeed (42)
: permette di ottenere risposte riproducibili usando lo stesso seed
Per inviare un prompt al LLM caricato tramite il plugin FlutterGemma, ci sono due metodi principali, ciascuno con un comportamento diverso:
Il primo, in maniera asincrona, restituisce la risposta direttamente, bloccando l'esecuzione fino al completamento della richiesta. Il secondo, restituisce uno stream di una stringa. Questo approccio consente di ricevere la risposta dal modello in modo incrementale, permettendo di ottenere dati parziali in tempo reale mentre il modello continua a generare la risposta. L'utilizzo di uno dei due metodi dipenderà dalle necessità dell'applicazione: se si desidera una risposta immediata o se è preferibile ricevere la risposta in più fasi, con un flusso continuo di dati.
Gemma offre un'ottima soluzione per sviluppatori che desiderano implementare modelli AI direttamente sui dispositivi, e tramite flutter_gemma, l'integrazione su Flutter diventa semplice e immediata.
Grazie alla capacità di funzionare offline e ottimizzare le risorse, permette esperienze utente rapide, sicure e altamente performanti. La flessibilità nei metodi di interazione con il modello consente agli sviluppatori di adattarsi facilmente a diverse esigenze, rendendo questa soluzione ideale per applicazioni scalabili e personalizzabili. Per saperne di più e vedere un esempio pratico, puoi consultare questo repository dove troverai una POC (Proof of Concept) che dimostra come integrare Gemma nelle tue applicazioni Flutter.
Appassionato di tecnologia, informatica, videogiochi, e di tutto quello che fa Beep Boop, smonta, monta e ripara (e rompe) oggetti sin dal 1997. Fiero proprietario di due stampanti 3D, un Commodore 64 e svariati monitor CRT, è uno sviluppatore Frontend.
Utilizza principalmente con Flutter, lo ama così tanto da cercare di convertire anche i Reactiani più fondamentalisti all’interno di Devmy. Si occupa anche di QA (forse perché è bravo a rompere tutto quello che smonta?). I suoi giochi preferiti, Super Metroid e Chrono Trigger e il suo sogno è possedere una Lamborghini Miura SV.
Hai in mente un nuovo progetto?
Anche se - semplicemente - vuoi prendere un caffè con noi o vedere la nostra collezione di Action Figures scrivici tramite questo form.