Llama de Meta. Ces trois familles de modèles sont d’ailleurs open-source. Plus étonnant, on trouve également des outils comme PicoLLM qui permettent de compresser les modèles !
Évidemment, tout ce que je raconte au-dessus changera avec le temps. Il y aura de nouveaux appareils, des nouvelles versions d’OS, des LLMs, etc. Un prochain rendez-vous que l’on peut prévoir : mai et juin pour les keynotes d’Apple et de Google, puis quelques temps après la sortie des nouvelles majeures d’OS.
Actuellement, pour créer des fonctionnalités augmentées par l’IA dans une application mobile, il faut interagir avec un modèle. On va créer des prompts adaptés à nos cas d’utilisations puis interpréter la réponse. Une réponse que l’on aura forcée dans un standard (du JSON par exemple).
Pour que notre application communique avec un modèle, nous avons plusieurs options.
C’est actuellement un des choix les plus répandus et les plus efficaces. Les applications mobiles ont déjà l’habitude de discuter avec des serveurs, on aura simplement de nouvelles routes pour obtenir des inférences. Notre serveur fait la passerelle vers OpenAI par exemple, et ce sont ces derniers qui hébergent le modèle.
Les intérêts sont multiples. On peut cibler tous les appareils (puissant ou entrée de gamme, récent ou vieux) et tous les systèmes (Android, iOS) peu importe la version (la toute dernière comme la plus vieille). Eh oui, il ne s’agit là que de requêtes HTTP et de stream de données.
On s’assure au passage d’avoir le même comportement entre les différents appareils et systèmes, puisque c’est le même modèle qui est utilisé en bout de chaîne. Les règles métiers et prompts sont aussi partagées. On pourra facilement et rapidement les modifier à distance sans mettre à jour les applications mobiles.
D’ailleurs, on peut changer le modèle utilisé par un autre (une nouvelle version ou un concurrent) sans devoir redéployer notre application. Tout comme on pourrait utiliser plusieurs modèles en parallèle.
Le coût sera cependant élevé. La charge principale viendra de l’utilisation d’un service tiers comme OpenAI. Le coût augmentera selon deux vecteurs : le nombre d’utilisateurs et le nombre d’usages. En effet, les API tiers facturent au nombre de token généré pour l’utilisation de leurs LLMs.
C’est d’autant plus important que notre serveur agisse en tant qu’intermédiaire : une communication directe entre les applications et le service tier impliquerait d'exposer en public nos clés d’APIs. Il serait alors très facile pour une personne d’utiliser nos clés, augmentant ainsi notre facture.
Quelques solutions : OpenAI, Anthropic, Gemini. On peut ajouter Firebase qui est une rare solution à proposer un accès direct (sans serveur) sécurisé à une LLM (Gemini en l’occurrence).
Le second choix qui est également très répandu est celui d’héberger soi-même un modèle sur nos serveurs. On garde ainsi les avantages de passer par notre serveur (compatibilités avec tous les appareils, facilité de changement du modèle, utilisation de plusieurs modèles, …) tout en ayant plus de contrôle.
Un des aspects les plus intéressant concerne les données. En hébergeant un modèle open-source, on s’assure un meilleur contrôle sur nos données et la manière dont elles sont utilisées, et surtout par qui.
Le coût sera aussi maîtrisé différemment. Exit un prix au token via une API tierce, cette fois on paie l’hébergement du modèle.
Maintenant, comment choisir entre utiliser une API tierce et héberger un modèle ? Quelques insight possibles pour décider :
Quelques solutions : Mistral qui est open-source et français, se balader sur le marketplace de Hugging Face.
Il existe aujourd’hui des modèles plus légers qui peuvent fonctionner sur nos ordinateurs et nos téléphones, et certains appareils les intègrent par défaut. On peut donc les utiliser directement pour faire des inférences « __on-device__ ».
Il y a plusieurs avantages à cette exécution locale. Premièrement, le coût. Il n’y en a tout simplement pas. Pas besoin de payer un service tiers ou d’héberger une solution existante, le modèle est déjà présent sur le téléphone. En fait, c’est l’utilisateur qui porte le coût : c’est la puissance de son smartphone, via sa puce et sa batterie, qui réalisera toutes les opérations. On pensera alors à ménager sa batterie.
Deuxièmement, la confidentialité. Le modèle étant sur l’appareil, les données sensibles n’ont pas besoin de transiter sur internet ou d’être lues par un serveur tiers. C’est une des promesses phares de ces modèles. On restera méfiant tout de même s’il faut utiliser des données très sensibles - l’inférence est peut-être locale, mais des logs et données pourraient très bien remonter à des serveurs.
La rapidité est un potentiel troisième avantage. L’inférence locale s’oppose à une inférence sur un serveur distant qui nécessite des aller-retour sur internet. La communication réseau prenant du temps, on tient là un gain intéressant. Je parlerais d’ailleurs plutôt de meilleure latence de réponse. D’une certaine manière, les serveurs d’OpenAI (par exemple) sont bien plus puissants que les puces de nos smartphones. Ce n’est pas l’inférence qui est plus rapide, mais plutôt le délai pour obtenir les réponses (grâce à des étapes en moins) - à condition bien sûr d’avoir un smartphone haut de gamme.
Tient-on alors la solution parfaite ? Aujourd’hui en tout cas, on en est loin. On est très limité en termes de cibles compatibles. Il n’y a rien sur iOS, Apple ne permet pas de prompter avec son Apple Intelligence. C’est réalisable seulement sur Android, et même là, les smartphones disposant d’une solution intégrée (Gemini Nano) sont peu nombreux, récents, et chers. Le pourcentage d’utilisateurs que l’on pourrait atteindre est faible.
C’est également toujours marqué par Google comme expérimental, et selon les smartphones, le modèle n’est pas pleinement intégré par défaut, il faut effectuer quelques actions.
Un point d’attention qu’il faudra garder en tête le jour où les modèles embarqués seront plus répandus : leurs différences. Apple et Google proposeront chacun leurs solutions, et il sera difficile (impossible ?) de reproduire avec certitude les mêmes comportements.
scope.launch {
// Single string input prompt
val input = "I want you to act as an English proofreader. I will provide you
texts, and I would like you to review them for any spelling, grammar, or
punctuation errors. Once you have finished reviewing the text, provide me
with any necessary corrections or suggestions for improving the text: These
arent the droids your looking for."
val response = generativeModel.generateContent(input)
print(response.text)
// Or multiple strings as input
val response = generativeModel.generateContent(
content {
text("I want you to act as an English proofreader. I will provide you texts
and I would like you to review them for any spelling, grammar, or
punctuation errors.")
text("Once you have finished reviewing the text, provide me with any
necessary corrections or suggestions for improving the text:")
text("These arent the droids your looking for.")
}
)
print(response.text)
}
En attendant qu’une grande majorité des appareils Android et iOS embarquent au sein de leurs systèmes des modèles accessibles aux développeurs, une solution pour avoir une exécution locale serait d’intégrer soi-même un modèle existant dans l’application.
Ainsi, on peut théoriquement cibler bien plus d’appareils et de systèmes / versions ; tant que ceux-ci sont assez puissants. On garderait alors la plupart des avantages d’une inférence locale : la rapidité sur les bons appareils, la confidentialité, et le coût réduit.
Réduit, mais pas inexistant. Le modèle n’étant pas embarqué dans le système de l’appareil, il faut le rendre téléchargeable… et donc l’héberger. On aura un coût de stockage et de bande passante. La bonne nouvelle, c’est que le téléchargement ne doit se faire qu’une seule fois par l’utilisateur au moment où l’application en aura besoin. Chaque usage sera ensuite totalement local et n’aura pas d’impact sur les coûts.
Cette contrainte a un second désavantage : elle requiert un effort pour l’utilisateur. Il devra télécharger un modèle. Même si l’application fait tout le travail, l’utilisateur va devoir patienter - un modèle étant lourd. Il devra aussi réserver de la place sur son appareil pour stocker ce modèle. Modèle qui ne fonctionnera que sur cette application.
Imaginons que plusieurs applications optent pour cette solution, cela représenterait des gigaoctets de téléchargement et de stockage. Ce n’est pas viable.
Quelques solutions : Gemma de Google, Phi de Microsoft, Llama de Meta. PicoLLM pour la compression.
final gemma = FlutterGemmaPlugin.instance;
// Async response
String response = await gemma.getResponse(prompt: 'Tell me something interesting');
print(response);
// Stream response
gemma.getAsyncResponse(prompt: 'Tell me something interesting').listen((String? token) => print(token));
Les LLMs ne sont plus seulement utilisés à travers des applications de chat où l’utilisateur écrit des prompts. On est dans une phase d’exploration où beaucoup de possibilités restent à être imaginée et testée, mais des premiers usages existent déjà au sein d’applications mobiles.
Et cela va très vite. Les idées fusent, les PoC se multiplient, et les appareils avec des modèles on-device vont se répandre. Les fonctionnalités augmentées par l’IA pourraient devenir un incontournable. Il nous est déjà possible d’en créer, il ne tient qu’à nous d’explorer.