Développer une application mobile est souvent la solution à laquelle on pense le plus naturellement : l’utilisateur va avoir une application mobile pour faire telle ou telle chose etc. Et, puis c’est parti. On ne pense plus qu’à la manière dont va fonctionner l’appli… Et pourtant, il est parfois hyper intéressant de réfléchir à tirer parti d’une solution qui est déjà présente sur les mobiles de vos utilisateurs comme WhatsApp par exemple. Pourquoi ? Pour tout un tas de raison que l’on va exposer dans cet article : vos utilisateurs y sont habitués, vous évitez le téléchargement (donc vous diffusez plus vite) etc.
Nous allons donc détailler les deux options car elles présentent des avantages et des inconvénients, et la décision dépend largement de vos objectifs, de votre budget et de l’expérience utilisateur que vous souhaitez offrir !
Pourquoi développer une application mobile dédiée ?
Expérience utilisateur personnalisée
Développer une application mobile dédiée permet de créer une expérience sur mesure, adaptée aux besoins spécifiques de chaque type d’utilisateur. Imaginons par exemple qu’une entreprise de transport souhaite devenir une place de marché entre des donneurs d’ordres (qui souhaitent donc faire livrer des colis) et des chauffeurs indépendants. Une application pourrait fournir des fonctionnalités telles que la gestion des courses, le suivi en temps réel, l’optimisation des trajets et des notifications personnalisées. Une application dédiée pourrait également intégrer des systèmes de paiement et des cartes GPS, offrant ainsi un contrôle total sur l’expérience utilisateur… bref, on est bien parti sur une grosse application mobile (à suivre dans la deuxième partie…).
Image de marque et professionnalisme
Une application mobile dédiée contribue à renforcer votre image. Les utilisateurs ont accès à une interface bien conçue et peuvent facilement naviguer dans les fonctionnalités proposées. Cela permet également de renforcer la crédibilité de votre entreprise en montrant votre engagement à offrir une solution sur mesure.
Contrôle total sur les données
En développant votre propre application, vous avez un contrôle total sur la collecte, la gestion et l’analyse des données générées par les utilisateurs. Cela est crucial si vous avez besoin de suivre des indicateurs de performance spécifiques ou de garantir la sécurité et la confidentialité des informations sensibles.
Donc, le développement d’une application serait idéal ? Pas sûr, car il y a quand même quelques inconvénients :
Coûts de développement élevés : Développer une application mobile nécessite un investissement initial important, ainsi que des coûts de maintenance réguliers pour assurer la compatibilité avec les dernières versions des systèmes d’exploitation.
Complexité technique : Les mises à jour fréquentes et la nécessité de gérer la sécurité des données sont des défis permanents qui exigent des ressources techniques importantes.
Et pourquoi ne pas réfléchir à une intégration avec WhatsApp ?
Evidemment, tous les business ne s’y prêtent pas. Mais c’est une bonne option si vous devez par exemple solliciter une large audience qui n’est pas obligée d’utiliser votre application ou bien si vous devez essentiellement “pousser” des informations à votre cible…
Mise en œuvre rapide et familiarité
WhatsApp est une plateforme largement adoptée et facile à utiliser. Son intégration est donc un moyen rapide de mettre en place une solution de communication entre utilisateurs, sans avoir à développer une application complète. Si l’on reprend notre exemple précédent, Pour des utilisateurs tels que des chauffeurs indépendants, recevoir des commandes via WhatsApp permet une adoption quasi immédiate, car ils sont déjà familiers avec l’interface. Toutes les notifications pour le bon déroulé de l’enlèvement et de la livraison peuvent être effectuées dans cette application. Alors, l’application mobile ne semble plus si indispensable !
Coûts réduits
En plus, l’intégration de WhatsApp est beaucoup moins coûteuse que le développement d’une application mobile dédiée. Vous n’avez pas à payer pour le développement initial, l’hébergement, ni la maintenance. Cela en fait une option intéressante pour les entreprises qui souhaitent tester une idée ou lancer un produit minimum viable (MVP) avant d’investir davantage.
Automatisation possible via l’API
WhatsApp propose des API qui permettent l’automatisation des échanges, comme l’envoi de confirmations de commande ou le suivi des chauffeurs en temps réel. Cela peut aider à rendre le processus plus fluide sans devoir investir dans un développement technique important.
Inconvénients de l’intégration de WhatsApp
Limitations en termes de personnalisation : WhatsApp reste une solution générique et ne permet pas de personnaliser l’expérience utilisateur. Il est impossible d’ajouter des fonctionnalités spécifiques ou de concevoir une interface qui reflète votre image de marque.
Dépendance à une plateforme tierce : En utilisant WhatsApp, vous dépendez de l’infrastructure et des règles de Meta. Cela signifie que des changements imprévus dans leurs politiques peuvent avoir un impact sur votre service.
Quelle solution choisir ?
Le choix entre une application mobile dédiée et l’intégration de WhatsApp dépend de plusieurs facteurs, notamment de vos objectifs à court et long terme, de votre budget, et, évidemment, du type d’expérience que vous souhaitez offrir à vos utilisateurs.
Si vous cherchez à valider rapidement une idée : L’intégration de WhatsApp est une excellente option pour tester le marché sans un investissement initial important. Elle permet de lancer rapidement une solution fonctionnelle tout en minimisant les risques financiers. Elle peut aussi vous permettre de développer une première communauté d’utilisateurs plus rapidement.
Si votre objectif est de proposer une solution personnalisée : Développer une application mobile dédiée est plus adapté. Cela vous permet de concevoir une interface sur mesure, de contrôler les données utilisateurs et de garantir une expérience fluide, même avec une grande base d’utilisateurs.
En conclusion, l’intégration de WhatsApp peut être un point de départ rapide et économique, idéal pour les premières étapes du développement d’un service. À mesure que votre projet évolue et que vos besoins se précisent, le développement d’une application mobile dédiée pourrait s’avérer nécessaire pour répondre à des exigences plus complexes et offrir une expérience utilisateur optimale. Ne partez pas trop vite dans une application dédiée !
Retards constants dans les livraisons de projets ? Systèmes informatiques obsolètes et instables ? Pressions croissantes de la direction ? Dans le livre “The Phoenix Project”, la mise en place des principes du DevOps telles que l’intégration continue, le déploiement automatisé ou bien encore l’amélioration de la communication entre les équipes permet aux équipes de stabiliser les applications, d’accélérer les livraisons et finalement à redresser la situation financière de l’entreprise !
« Le DevOps n’est pas une technologie, c’est une culture. » – Gene Kim
Evidemment, la rapidité et la qualité des livraisons logicielles sont des facteurs déterminants pour le succès des projets voire d’une entreprise. Alors, cet article explore l’intégration du DevOps dans l’organisation de vos projets, en fournissant des étapes concrètes pour simplifier cette transition.
Pour rappel, le DevOps est une approche qui vise à unifier le développement logiciel (Dev) et les opérations informatiques (Ops) afin d’améliorer la collaboration et la productivité. En intégrant le DevOps dans votre méthodologie de projet, vous pouvez non seulement accélérer vos cycles de livraison, mais espérer aussi améliorer la qualité de vos produits ou réduire les coûts.
Qu’est-ce que le DevOps ?
Le DevOps est né de la nécessité de réduire le fossé entre les équipes de développement et les équipes de production. Historiquement, ces deux équipes travaillaient souvent de manière isolée, ce qui entraînait des retards, des inefficacités et une qualité logicielle fluctuante. Le terme « DevOps » a été popularisé depuis plusieurs années, alors que les entreprises cherchaient des moyens d’accélérer les cycles de développement tout en maintenant des standards élevés de qualité et de fiabilité.
Aussi les principes sont les suivants :
Collaboration et communication : Favoriser une culture de collaboration entre les équipes de développement et d’opérations.
Automatisation : Automatiser les tâches répétitives pour réduire les erreurs humaines et augmenter la vitesse des processus.
Intégration continue et déploiement continu (CI/CD) : Mettre en place des pipelines automatisés pour tester et déployer le code de manière continue.
Surveillance et feedback continus : Utiliser des outils de surveillance pour obtenir un retour d’information en temps réel et améliorer les processus.
L’adoption du DevOps nécessite aussi un changement de mentalité au sein de l’organisation. Il s’agit de promouvoir une culture où la responsabilité est partagée et où les équipes travaillent ensemble pour atteindre des objectifs communs. Cette transition est d’ailleurs souvent le facteur clé de succès de l’intégration du DevOps dans les projets.
Quelques avantages de l’adoption du DevOps
Livraisons plus rapides
DevOps permet d’accélérer le cycle de développement grâce à l’automatisation des tests et des déploiements. Les équipes peuvent ainsi livrer de nouvelles fonctionnalités et correctifs plus rapidement, répondant ainsi aux besoins changeants des utilisateurs.
Amélioration de la qualité logicielle
Grâce à l’intégration continue et aux tests automatisés, DevOps réduit le nombre de bugs et d’erreurs dans le code. Cela se traduit par des produits plus fiables et de meilleure qualité, ce qui augmente la satisfaction des utilisateurs finaux.
Meilleure collaboration
DevOps élimine les silos entre les équipes de développement et d’opérations, favorisant une meilleure communication et une collaboration plus étroite. Cela permet de résoudre les problèmes plus rapidement et d’améliorer l’efficacité globale des équipes.
Scalabilité et flexibilité
Les pratiques DevOps permettent aux équipes de s’adapter rapidement aux changements et de gérer la croissance de manière efficace. Les infrastructures automatisées et les processus flexibles facilitent l’expansion sans compromettre la performance.
Réduction des coûts
En optimisant les ressources et en réduisant les erreurs, DevOps permet de diminuer les coûts opérationnels. L’automatisation des tâches répétitives libère du temps pour les équipes, leur permettant de se concentrer sur des tâches à plus forte valeur ajoutée.
Défis de l’Intégration DevOps
Résistance au changement
L’un des principaux obstacles à l’adoption de DevOps est la résistance au changement. Les équipes habituées à des méthodes classiques peuvent être réticentes à adopter de nouvelles pratiques et outils. Encouragez des réunions régulières et maintenez des canaux de communication ouverts entre les équipes. Utilisez des outils de collaboration comme Slack ou Microsoft Teams pour faciliter les échanges et la résolution rapide des problèmes.
Compétences et formation
La mise en œuvre des principes de DevOps nécessite des compétences clés, notamment en automatisation, en gestion des outils CI/CD et en surveillance. Il est possible d’investir dans la formation des équipes pour assurer une transition réussie.
Intégration des outils
Choisir et intégrer les bons outils peut être complexe. Il faut à la fois sélectionner des outils compatibles avec votre infrastructure existante et s’assurer qu’ils répondent aux besoins spécifiques de votre organisation.
Sécurité
L’intégration de la sécurité dans le pipeline DevOps, souvent appelée DevSecOps, est essentielle pour protéger les applications contre les menaces. Adoptez des approches comme le shift-left security pour identifier et corriger les vulnérabilités dès les premières phases de développement, plutôt que de les traiter en fin de cycle.
Mesure de la performance
Définir et suivre les indicateurs clés de performance (KPIs) pertinents est nécessaire pour évaluer l’efficacité des pratiques DevOps. Cela permet d’identifier les domaines d’amélioration et d’assurer une optimisation continue.
Étapes pour Intégrer DevOps dans Votre Méthodologie de Projet
Évaluation initiale
Commencez par analyser l’état actuel de vos processus de développement et d’opérations. Identifiez les domaines où DevOps pourrait apporter des améliorations significatives, comme les délais de livraison, la qualité du code ou la collaboration inter-équipes.
Définition des objectifs
Établissez des objectifs clairs et mesurables pour l’intégration de DevOps. Par exemple, réduire le temps de déploiement ou augmenter la couverture des tests automatisés… Gardez cependant les besoins des utilisateurs finaux au cœur des décisions de développement. Utilisez des feedbacks utilisateurs pour guider les priorités de développement et assurer que les livrables répondent réellement aux attentes des utilisateurs.
Choix des outils
Sélectionnez les outils de CI/CD, de gestion de configuration, de monitoring, etc., qui répondent le mieux à vos besoins. Des outils populaires incluent Jenkins, GitLab CI, Docker, Kubernetes, et Prometheus.
Automatisation des processus
Automatisez les tâches répétitives tout en gardant une flexibilité pour les interventions humaines lorsque nécessaire. Par exemple, automatisez les tests unitaires et les déploiements, mais gardez la supervision humaine pour les revues de code et les décisions critiques. L’automatisation est au cœur de DevOps et permet de libérer du temps pour des tâches à plus forte valeur ajoutée.
Mise en œuvre progressive
Adoptez DevOps de manière itérative. Commencez par des projets pilotes pour tester les nouvelles pratiques et ajuster votre approche en fonction des retours d’expérience. Encouragez par exemple les équipes à chercher constamment des moyens d’améliorer les processus. Utilisez des rétrospectives régulières pour identifier les points d’amélioration et mettre en œuvre des changements itératifs.
Surveillance et feedback
Mettez en place des mécanismes de suivi et de feedback pour évaluer l’efficacité des pratiques DevOps. Utilisez des dashboards et des outils de monitoring pour obtenir une visibilité en temps réel sur les performances et identifier les points d’amélioration.
Conclusion
L’intégration de DevOps dans votre méthodologie de projet peut transformer radicalement la manière dont vos équipes collaborent et livrent vos projets. En accélérant les cycles de livraison, en améliorant la qualité des produits et en favorisant une meilleure collaboration, le DevOps offre de nombreux avantages. Cependant, cette transformation n’est pas sans défis. La résistance au changement, le besoin de nouvelles compétences et l’intégration des outils appropriés sont autant de barrières à surmonter.
Pour réussir cette transition, il est important de définir des objectifs clairs, de choisir les bons outils, de former vos équipes et de promouvoir une culture d’amélioration continue. En adoptant une approche progressive et en apprenant des expériences d’autres entreprises, vous pouvez maximiser les bénéfices de DevOps et assurer le succès de vos projets.
Le DevOps évolue constamment avec l’émergence de nouvelles pratiques comme GitOps, l’Infrastructure as Code (IaC) et l’intégration de l’intelligence artificielle pour optimiser les pipelines de développement.
Laravel est bien plus qu’un simple framework PHP ; c’est aussi toute une communauté qui joue un rôle essentiel dans son évolution et son succès. Cette communauté se distingue par son engagement, ses contributions, et ses ressources éducatives qui facilitent l’adoption et l’utilisation du framework. Dans cet article, nous explorerons quelques aspects de la communauté Laravel : les événements, les contributeurs notables, et les nombreuses ressources disponibles pour les développeurs.
Laracon : La Conférence Internationale de Laravel
Laracon est l’événement phare de la communauté Laravel. Cette conférence se tient deux fois par an, historiquement aux États-Unis et en Europe, bien que des éditions en ligne aient eu lieu ces dernières années en raison de la crise sanitaire. Laracon rassemble des développeurs du monde entier pour discuter des dernières nouveautés du framework, partager des expériences et apprendre de nouveaux concepts.
Les sujets abordés lors de Laracon vont au-delà de Laravel et couvrent des thèmes variés du développement web. C’est un lieu de rencontre où les développeurs peuvent non seulement améliorer leurs compétences techniques mais aussi nouer des relations professionnelles et personnelles. L’édition en présentiel de 2024 à Amsterdam a marqué un retour très attendu à une interaction en face-à-face, renforçant encore la cohésion de la communauté.
La prochaine étape à Dallas, Texas, prévue en août 2024 est déjà complète, et nous attendons avec impatience le Laraconn EU 2025 !
Spatie : Un Pilier de l’Open Source Laravel
Spatie est une société belge qui s’est distinguée par la création de nombreux paquets open-source pour Laravel. Ces paquets sont reconnus pour leur qualité et leur utilité, et sont largement utilisés dans la communauté. Parmi les paquets les plus populaires de Spatie, on trouve :
spatie/laravel-permission : Ajoute facilement des rôles et des permissions à une application Laravel.
spatie/image-optimizer : Optimise les images pour améliorer les performances des sites web.
spatie/laravel-activitylog : Enregistre les actions des utilisateurs pour un suivi précis de l’activité.
spatie/laravel-backup : Simplifie la mise en place de sauvegardes complètes de l’application.
spatie/laravel-medialibrary : Permet d’associer des fichiers médias aux modèles Eloquent.
Laracasts est une plateforme éducative dédiée au développement web, avec un focus particulier sur Laravel. Elle propose des screencasts et des tutoriels couvrant une large gamme de sujets, allant de Laravel et PHP à JavaScript, Vue.js, et bien d’autres technologies pertinentes.
Jeffrey Way, le fondateur de Laracasts, est lui-même un contributeur actif à la communauté Laravel. Ses vidéos sont réputées pour leur clarté et leur pédagogie, rendant l’apprentissage de Laravel accessible même aux débutants. Laracasts est devenu une ressource incontournable pour de nombreux développeurs souhaitant approfondir leurs connaissances et rester à jour avec les meilleures pratiques du développement Laravel.
Laravel News
Le blog le plus complet autour de Laravel ! Laravel News est un incontournable pour les développeurs qui utilisent le framework Laravel. Il propose un large contenu autour des actualités de Laravel, que ce soit la présentation de paquets, la mise en avant d’événements, la centralisation de ressources documentaires, ou encore la description détaillée de toutes les nouvelles versions du framework disponibles. Une newsletter hebdomadaire est disponible, recensant les nouveautés et les meilleures informations de la semaine. Laravel News est une aubaine pour tous ceux qui veulent faire une veille active autour de l’éco-système Laravel.
Conclusion
Le dynamisme de la communauté Laravel explique aussi le succès de ce framework. Les événements comme Laracon, les ressources éducatives de Laracasts et les nombreux paquets open-source disponibles montrent l’engagement et la passion des développeurs pour améliorer et étendre Laravel. Que vous soyez débutant ou développeur expérimenté, la communauté Laravel offre toutes les ressources pour bien développer. TheCodingMachine est spécialisé sur Laravel depuis 2025, vous avez un projet en Laravel ? Contactez-nous.
À l’heure où la réduction de l’empreinte écologique numérique devient une priorité, le concept d’éco-conception s’impose comme un enjeu clé pour les entreprises et les développeurs. Dans ce contexte, WordPress, le CMS le plus utilisé au monde, se retrouve au cœur des débats. Bien que puissant et flexible, WordPress peut parfois être énergivore en termes de ressources, que ce soit par l’utilisation de thèmes lourds, d’extensions mal optimisées ou de pratiques de développement inefficaces.
L’éco-conception WordPress vise à réduire cette consommation d’énergie tout en maintenant une expérience utilisateur optimale. Dans cet article, nous examinerons dix optimisations concrètes qui permettent de concevoir des sites WordPress plus respectueux de l’environnement, tout en garantissant performance et accessibilité.
Optimiser vos images
Sur un site vitrine classique, les images représentent souvent 50 % du poids d’une page. Il y a trois moyens de diminuer l’impact des images :
Les compresser et adapter leur format, le format WebP est recommandé. Pour cela, vous pouvez utiliser des plug-ins dédiés comme WebP Express pour WordPress.
Ne pas charger toutes les images systématiquement. Par exemple dans le cas d’un slider, faire en sorte que l’image ne se télécharge que si l’utilisateur clique sur la flèche pour voir l’image suivante.
Limiter tout simplement le nombre d’images sur votre site.
Mettre en place du cache
Les systèmes de cache permettent d’éviter de recharger des éléments déjà téléchargés (ex : des images, des données, …). Ceci permet d’alléger ou d’éviter les requêtes auprès des serveurs.
Les navigateurs des visiteurs gèrent leur propre cache. A part quelques options configurables par l’utilisateur, le fonctionnement de ce cache est défini par les paramètres du serveur. Pour des sites vitrines, de nombreuses solutions et plug-ins existent.
Toutefois, mettre en place un système de cache peut être technique et cela dépend du niveau de complexité de votre application : calculs et algorithmes avancés, traitement et envoi d’un grand nombre de données, … Dans ce cas, il s’agira d’un sujet à traiter à part avec votre prestataire dans une logique d’arbitrage coût / bénéfice.
Mettre en place du lazy loading
Le lazy loading ou chargement différé est une technique qui permet de charger les ressources d’un site web en différant le chargement des ressources non critiques, non essentielles, au début du temps de chargement d’une page.
Il s’agit d’une technique qui peut être utilisée pour empêcher un navigateur de charger des ressources non critiques sur une page web lorsqu’il commence à générer la page. Par exemple, cela ne sert à rien de charger à l’arrivée de l’utilisateur une image tout en bas de la page, elle sera téléchargée lorsque l’utilisateur descendra.
Le lazy loading est aussi à rapprocher de la notion de First Contentful Paint expliquée par l’illustration ci-dessous.
Le First Contentful Paint (FCP) mesure le temps entre le clic sur le lien d’un site Internet et le moment où il affiche le premier bit de contenu de la page. Le FCP a été défini par Google comme une donnée de référence de son algorithme de référencement. Mettre en place du lazy loading est donc aussi important pour votre référencement.
Mettre en place du lazy loading n’est pas toujours évident, il s’agit de faire des arbitrages entre ce qui est considéré comme du contenu critique ou non. Sur WordPress, il existe néanmoins des plugins pour mettre en place un lazy loading simple comme par exemple LazyLoad.
Minimiser le code HTML, CSS et JS
Minimiser du code signifie optimiser du code pour gagner de l’espace sans en altérer la fonctionnalité. Concrètement il s’agit de supprimer tous les espaces blancs inutiles, les commentaires, les caractères de nouvelle ligne et tout ce qui rendait initialement le code lisible. Ainsi, une fois qu’il a été minifié, le code devient presque illisible à l’œil nu.
La minification du code est possible dans toutes les technologies de programmation de base, notamment HTML, CSS et JavaScript. Cependant, le processus n’est pas instantané. Un certain travail est nécessaire pour rendre le code plus compact tout en le gardant fonctionnel. Pour vous aider, il existe des outils de minification spécifique à chaque langage. Vous trouverez une première liste d’outils dans cet article.
Limiter les animations Javascript sur votre site
Evitez les bibliothèques et les frameworks Javascript volumineux, privilégiez des alternatives légères et n’incluez que les parties nécessaires de bibliothèques ou frameworks pour réduire la taille finale du bundle.
Dans le code, évitez aussi les manipulations fréquentes du DOM qui peuvent ralentir votre application. Utilisez des techniques de manipulation de DOM efficaces, comme l’agrégation de modifications avant une mise à jour du DOM ou l’utilisation de Virtual DOM dans des frameworks modernes.
Éviter ou optimiser l’usage de la vidéo
Dans la mesure du possible, il est préférable de ne pas utiliser de vidéo. En revanche si son usage est nécessaire du point de vue de la compréhension du message alors il est très important de l’optimiser.
Au-delà de la possibilité de compresser cette vidéo pour avoir une qualité adaptée au web, il est également possible de questionner la nature de la vidéo. A-t-elle besoin de faire plus d’une minute alors que de nombreux utilisateurs ont tendance à scroller sans regarder la vidéo dans son intégralité ? Bref, une vidéo plus courte et mieux ciblée permet une meilleure attention de l’utilisateur et réduit la consommation énergétique.
Il est aussi important de se demander si la vidéo doit se lancer de manière automatique. En effet, il est préférable pour l’expérience utilisateur et l’impact écologique de la page d’insérer une fonction ‘play’ pour que l’utilisateur puisse la lancer seulement si cela est pertinent pour lui.
Désactiver ou optimiser les CRON
CRON est une abréviation de crontab, elle-même une abréviation de chrono table qui signifie table de planification.
Issu du monde Unix, le programme CRON, lancé au démarrage d’un système d’exploitation, permet de planifier l’exécution automatique de tâches avec une certaine fréquence ou à un moment donné. Parmis les tâches les plus régulièrement exécutées via des CRON :
Planification d’un job de sauvegarde de votre site (extension BackWPup pour WordPress par exemple).
Planification de l’optimisation de la base de données (extension WP-Optimize pour WordPress par exemple).
Mise à jour automatique de votre version (de WordPress ou autre),
Bien que la plupart de ces actions restent recommandées, l’exécution de chacune de ces tâches consomme des ressources. Il est donc important de se demander quelle doit en être la bonne fréquence ou s’il est préférable de gérer cela manuellement.
Eviter les iFrames qui s’affiche directement au chargement de la page
Une iframe est un élément HTML qui permet d’intégrer une page web dans une autre page web. Cette méthode permet par exemple d’intégrer une vidéo hébergée sur une plateforme tierce en l’affichant directement sur votre site web. L’exemple le plus répandu est celui d’une vidéo Youtube.
Fonctionner à travers des Iframes ne permet pas d’avoir le contrôle total sur le contenu de l’autre page qui sera affichée. Il est donc possible de se retrouver à charger des fonctionnalités et du contenu inutiles. Dans le cas des vidéos, il est ainsi recommandé de les héberger vous même sur votre propre site comme expliqué dans cet article. Enfin, il est important de faire en sorte que les Iframes ne soient affichés et chargés qu’à la demande de l’utilisateur (dans la mesure du possible).
Limiter le recours direct à des services tiers complexes pour des usages simples (ex : Google Map)
GoogleMap est l’exemple le plus répandu. Bien souvent, une simple image / capture d’écran avec votre adresse sur une carte suffira amplement à votre utilisateur. D’autant que, désormais, de nombreux téléphones permettent la reconnaissance automatique d’une adresse dans un texte et l’ouverture automatique de Google Map via un simple clic.
De manière plus générale, pour vous inscrire dans une démarche d’éco-conception, il est nécessaire de vous demander si toutes les fonctionnalités d’un service tiers sont utiles pour le parcours utilisateur visé.
Pour réutiliser l’exemple de GoogleMap : est-il nécessaire d’avoir les fonctionnalités de calcul d’itinéraire, de gestion des avis ou de géolocalisation si le but est simplement d’afficher une adresse ?
La multiplication des services tiers, des solutions SAAS et la démocratisation des API a néanmoins rendu complexe une telle approche. Il n’est pas toujours évident de savoir et de maîtriser toutes les fonctionnalités d’une application tierce d’autant qu’elles évoluent potentiellement à chaque mise à jour.
Bref, dans une démarche d’éco-conception, une des meilleures solutions semble être encore de limiter au maximum l’usage de ces solutions.
Enfin, certains types d’API, comme GraphQL par exemple, permettent de personnaliser les requêtes afin de ne récupérer que les données nécessaires au besoin de votre utilisateur.
Choisir un hébergeur éco-responsable et bien dimensionner son hébergement
Comme expliqué précédemment, la performance écologique de votre service numérique va en grande partie se traduire par une consommation d’électricité côté client (téléphone et PC de vos utilisateurs) et côté serveur. Pour connaître les émissions associées à celle-ci, il est donc nécessaire d’analyser l’origine de l’électricité consommée.
Si il est difficile de savoir si vos utilisateurs chargent leur téléphone avec des panneaux solaires, il vous est en revanche possible d’agir côté serveur en choisissant un hébergeur “green”. Ces hébergeurs utilisent de l’électricité d’origine renouvelable et effectue différentes actions à impact positif (planter des arbres par exemple). Attention toutefois au Green Washing, vous trouverez une approche du sujet dans cet article. Les différentes normes ISO en lien avec l’environnement (ISO 14 001 et ISO 50 001) sont de bonnes preuves de sérieux de la part d’un hébergeur.
En résumé
L’éco-conception WordPress est bien plus qu’une tendance, elle représente un engagement envers une approche plus responsable et durable du développement web. En optimisant l’utilisation de WordPress grâce à des pratiques telles que la réduction du poids des pages, la gestion intelligente des plugins ou encore l’optimisation des médias, il est possible de créer des sites à faible impact environnemental, sans compromettre la qualité. À l’heure où les utilisateurs sont de plus en plus sensibles aux questions écologiques, adopter ces bonnes pratiques peut non seulement améliorer la performance de votre site, mais aussi renforcer l’image éthique et durable de votre marque.
Aujourd’hui, TypeScript a le vent en poupe grâce à la consistance et la cohérence que le typage permet d’apporter au code JavaScript. Toutefois, il n’est pas si simple d’exploiter pleinement le potentiel de TypeScript et de son typage.
En effet, une mauvaise implémentation de votre typage et des règles qui lui sont associées entraînent une non-détection des erreurs par le compilateur ainsi qu’un code complexe, difficilement maintenable et refactorable.
Dans cet article, le cofondateur de TheCodingMachine, David Négrier, vous donne ses astuces et outils pour exploiter pleinement le potentiel du typage et éviter les erreurs.
Bref, facilitez-vous la vie avec un code simple, bien construit et facile à retravailler !
Typer, mais pourquoi faire ?
Éviter les régressions: en cas de changements du code (refactoring, correction de bugs, ajout de fonctionnalité etc…), le compilateur vous alertera des incohérences ou oublis
Gagner du temps: grâce au typage l’IDE est plus pertinent dans ses suggestions d’autocomplétion.
Un paquet qui prend tous les typages codés par défaut (JSON.parse(), …) et remplace le typage any par un typage unknown.
Ceci permet d’être plus stricte dans l’analyse des types et donc remonter une erreur sur ce type de code:
const user = JSON.parse('{"id": 1, "firstName": "John"}')
console.log(user.firstName) // 'user' is of type 'unknown'.
Sans ts-reset aucune erreur ne sera remontée car tout est autorisé sur any. Alors qu’avec le développeur est forcé de vérifier le typage:
const user = JSON.parse('{"id": 1, "firstName": "John"}')
if (
user instanceof Object
&& 'firstName' in user
&& typeof user.firstName === 'string'
) {
console.log(user.firstName) // 'user.firstName' is a string.
}
– Créer une interface
Il est important de créer des interfaces pour définir la structure d’un objet avec ses différents champs.
interface User {
id: number;
firstName: string;
}
// On ajoute `as User` pour indiquer que cette variable est de type User
const user = JSON.parse('{"id": 1, "firstName": "John"}') as User
console.log(user.firstName) // Affiche "John"
Mais que se passe-t-il si le format change dans le JSON d’origine ?
Par exemple, si on remplace firstName par first_name dans le fichier JSON, un bug est créé et on retrouve ”undefined” dans nos logs (sans message d’erreur).
Cela est dû au fait que la vérification ne s’effectue pas lors de l’exécution, mais uniquement lors de la compilation. Les interfaces disparaissent dans le code compilé.
L’erreur provient de l’utilisation de as User, le mot clé as en TypeScript permet de définir un “Type Assertion” et donc de forcer, du point de vue du compilateur, le type d’une variable. Si le type est faux, l’analyse faite par TypeScript devient incorrecte. L’erreur est humaine et le compilateur a tendance à faire moins d’erreurs. En particulier, lorsque une application complexe évolue au cours du temps. Donc un as dans TypeScript doit toujours être un sujet de vigilance !
interface User {
id: number;
firstName: string;
}
// On définit un type predicate de la forme `parameterName is Type`
function isUser(user: any): user is User {
return user
&& typeof user.id === 'number'
&& typeof user.firstName === 'string'
}
const user = JSON.parse('{"id": 1, "firstName": "John"}')
if (! isUser(user)) { // On appelle le predicate
throw new Error('Invalid user')
}
console.log(user.firstName) // Ici on est sûr d'avoir un User
Avec ce code, si firstName devient first_name on aura une erreur “Invalid user” au runtime. En effet, le type predicate est conservé et exécuté.
Toutefois, implémenter des types predicate c’est fastidieux et repose toujours sur la responsabilité du développeur qui doit l’implémenter dans son code de manière proactive.
Il faut aussi être vigilant lors de l’écriture du type predicate pour ne pas faire d’erreur à ce moment-là et bien penser à le mettre à jour lorsqu’on modifie le type lié.
Zod est une libraire qui écrit des types predicate pour nous. Grâce à elle nous pouvons remplacer le type predicate isUser et définir une variable UserSchema qui est un objet zod:
interface User {
id: number;
firstName: string;
}
const UserSchema = z.object({
id: z.number(),
firstName: z.string(),
})
const maybeUser = JSON.parse(...)
const user = UserSchema.parse(maybeUser)
// À partir d'ici user est de type `{ id: number, firstName: string }
Zod peut aussi déduire l’interface à partir du Type Guard et on peut donc se passer d’écrire l’interface :
type User = z.infer<typeof UserSchema>
Lors de l’exécution, Zod affichera une erreur détaillé s’il y a un soucis:
Dans les projets Front qui utilisent des inputs venant de l’extérieur, en particulier d’API.
dans les projets Back qui utilisent Node.JS, en cas d’input HTTP, d’upload de fichier, d’input CLI ou de réponse d’API, …
Il est néanmoins inutile d’utiliser Zod pour un service qui utilise déjà des données validées (données en provenance d’un Controller par exemple). Dans ce cas, les interfaces peuvent suffir… ou alors il est possible d’utiliser l’inférence propre à TypeScript. Une autre librairie similaire est valibot.
– Type Inference
TypeScript fait de l’inférence de type. C’est-à-dire qu’en analysant les contraintes appliquées à chaque variable il peut en déduire son type. Ceci évite de devoir tout typer tout le temps :
const a = 1 // a est de type number
const b = [0, 1, null] // b est de type (number | null)[]
const c = a // c est de type number
const d = { id: 1, firstName: "John" } // d est de type { id: number; firstName: string; }
window.onmousedown = function (e) { /* ... */ }; // e est de type MouseEvent
Il est donc possible de se passer d’interface la plupart du temps. Nous recommandons fortement de s’appuyer sur l’inférence de type et utiliser Zod là où c’est nécessaire pour gagner en efficacité et en maintenabilité de votre code !
L’utilisation de Zod et TypeScript peut être synonyme de verbosité. En effet, pour être correcte nous devrions ré-écrire les structures des objets renvoyés par l’api dans notre code front. Le travail est fait 2 fois: en back et en front.
Contrairement à du JSON, GraphQL définit un schéma, or cela va typer l’API correctement.
Le paquet graphql-codegen est un outil qui va scanner votre code TypeScript et va trouver les requêtes GraphQL à l’intérieur.
Puis, à partir de ces requêtes et du schéma généré par le serveur, graphql-codegen va générer automatiquement des types TypeScript.
Néanmoins, mettre en place graphql-codegen nécessite un peu de travail notamment en CI/CD.
– Swagger/OpenAPI (via API Platform)
Dans la même idée, certains framework (type API Platform) permettent de générer les interfaces typescript en fonction des retours des endpoints REST.
Il existe aussi des générateurs pour les standards Swagger/OpenAPI.
Il s’agit d’un framework Node.Js dans lequel on définit côté serveur une procédure qui prend un type Zod en input puis côté client on appelle la fonction ce qui permet un typage fort des deux côtés.
Il s’agit de faire des appels RPC entre le serveur et le client. Hono propose aussi ce genre de fonctionnalité.
Solution plus bas niveau, il s’agit d’un mécanisme de Serialization, un peu comme du JSON mais fortement typé.
On définit des types Protobuf qui génèrent des interfaces TypeScript.
Particulièrement utile pour optimiser les performances car les messages sont compressés de manière binaire.
– No Front, l’approche JS Less
Solution la plus radicale, mais sans Front, la question ne se pose plus ! On appelle cela le JS Less et de nombreuses solutions existent, vous pouvez lire notre article sur le sujet.
Gérer un grand nombre de sites internet peut vite devenir un casse-tête, surtout lorsque chaque site nécessite des mises à jour régulières, une maintenance continue et une sécurité renforcée. Cependant, des solutions existent pour simplifier cette gestion ! Dans cet article, nous allons explorer trois approches différentes pour gérer efficacement un ensemble de sites web, que ce soit pour une petite agence web ou une grande entreprise.
Solution 1 : Utiliser un outil d’administration centralisée
La première solution consiste à utiliser un outil d’administration qui permet de centraliser la gestion de nombreux sites internet. Par exemple, pour WordPress, parmi les outils disponibles sur le marché, WP Umbrella se distingue par sa simplicité d’utilisation et ses nombreuses fonctionnalités.
Pourquoi choisir WP Umbrella ?
WP Umbrella est un service en ligne qui facilite la maintenance et la gestion d’un ensemble de sites WordPress à partir d’un seul tableau de bord. Ce type d’outil est particulièrement utile pour les agences web ou les freelances qui gèrent plusieurs sites pour différents clients.
Voici quelques avantages clés de WP Umbrella
Centralisation des mises à jour : Avec WP Umbrella, vous pouvez mettre à jour tous vos sites WordPress en un clic, qu’il s’agisse des plugins, des thèmes ou du core de WordPress. Cette centralisation permet de gagner un temps précieux et d’éviter les oublis qui peuvent compromettre la sécurité de vos sites.
Surveillance de la performance : WP Umbrella propose également un suivi des performances de chaque site. Vous pouvez surveiller le temps de réponse, la disponibilité, et recevoir des alertes en cas de problème. Cela permet d’intervenir rapidement avant que les utilisateurs finaux ne soient impactés.
Gestion des sauvegardes : La gestion des sauvegardes est un autre atout majeur de WP Umbrella. Vous pouvez planifier des sauvegardes régulières et les stocker sur un service de cloud sécurisé. En cas de problème, la restauration d’un site se fait en quelques clics.
Sécurité renforcée : En utilisant un outil comme WP Umbrella, vous pouvez automatiser des tâches de sécurité telles que le scan de malwares ou la vérification des failles de sécurité. Cela permet de réduire les risques d’attaques sur vos sites.
Limitations
Bien que WP Umbrella soit une solution puissante, elle est spécifiquement conçue pour les sites WordPress. Si vous gérez des sites utilisant d’autres CMS ou des technologies différentes, cette solution ne pourra pas centraliser l’administration de tous vos sites.
Solution 2 : Utiliser une image Docker standardisée
La deuxième solution consiste à utiliser une image Docker standardisée pour déployer et gérer vos sites avec un outil CMS unique (WordPress ou autre). Docker est une technologie de conteneurisation qui permet d’isoler chaque application dans un environnement léger et portable. En créant une image Docker standardisée, vous pouvez simplifier le déploiement et la gestion de vos sites.
Avantages d’une image Docker standardisée
Uniformité des environnements : Une image Docker permet de garantir que tous vos sites fonctionnent dans un environnement identique, indépendamment de la machine ou du serveur sur lequel ils sont déployés. Cela élimine les problèmes liés aux différences de configuration entre les environnements de développement, de test et de production.
Facilité de mise à jour : En mettant régulièrement à jour votre image Docker, vous pouvez rapidement déployer ces mises à jour sur tous vos sites. Pour WordPress par exemple, cela inclut les mises à jour du core, des plugins et des thèmes. En automatisant ce processus, vous réduisez le risque d’oublis ou d’erreurs humaines.
Scalabilité : Docker permet de scaler vos sites très facilement. Vous pouvez déployer de nouvelles instances de vos sites en quelques secondes, sans avoir à reconfigurer manuellement chaque serveur. Cela est particulièrement utile lorsque vous devez gérer un grand nombre de sites ou lorsque vous anticipez une augmentation de trafic.
Isolation et sécurité : Chaque conteneur Docker est isolé des autres, ce qui renforce la sécurité. Si un site est compromis, les autres restent protégés. De plus, cette isolation facilite le debugging en cas de problème.
Inconvénients
Cependant, une image Docker standardisée pour WordPress ne permet pas la gestion de sites multi-tenant (multi-locataires). Cela signifie que chaque site doit être déployé dans un conteneur séparé, ce qui peut augmenter les coûts en termes de ressources serveur si vous gérez un très grand nombre de sites.
Solution 3 : Opter pour une solution multi-tenant avec Prismic par exemple
La troisième solution consiste à utiliser une véritable architecture multi-tenant pour gérer un grand nombre de sites. Prismic, un CMS headless populaire, offre une telle solution, permettant de gérer plusieurs sites web à partir d’une seule instance.
Avantages de Prismic pour une gestion multi-tenant
Centralisation des contenus : Prismic permet de centraliser la gestion de contenu pour plusieurs sites. Cela signifie que vous pouvez gérer toutes les pages, articles, et autres contenus depuis une seule interface, tout en les distribuant vers différents sites.
Flexibilité et personnalisation : Avec une solution multi-tenant, chaque site peut avoir sa propre identité visuelle et ses propres fonctionnalités, tout en partageant la même base de contenu. Cela permet de personnaliser l’expérience utilisateur en fonction des besoins spécifiques de chaque marque ou entité.
Références solides : Prismic est utilisé par des entreprises de renommée mondiale comme la Fédération Française de Tennis (FFT) ou LVMH, ce qui démontre sa capacité à gérer des déploiements complexes avec une exigence élevée en termes de performance et de fiabilité.
Sécurité et scalabilité : En tant que solution headless, Prismic offre une séparation claire entre le backend (gestion du contenu) et le frontend (affichage du contenu). Cela permet de renforcer la sécurité et de faciliter la scalabilité. Vous pouvez gérer des centaines de sites sans compromettre la performance.
Limitations
L’une des principales limitations de Prismic réside dans son coût, qui peut être plus élevé que les solutions précédentes, surtout pour les petites entreprises ou les projets à budget limité. De plus, la mise en œuvre d’une solution multi-tenant nécessite une certaine expertise technique, ce qui peut impliquer un temps de mise en place plus long.
Conclusion
Gérer un grand nombre de sites web est parfois complexe, mais les solutions existent pour simplifier cette tâche tout en garantissant une performance optimale. Que vous choisissiez d’utiliser un outil d’administration centralisée comme WP Umbrella, de déployer vos sites via des images Docker standardisées, ou d’opter pour une solution multi-tenant avec Prismic, il est essentiel de bien évaluer vos besoins spécifiques avant de prendre une décision.
Chacune de ces solutions présente des avantages et des inconvénients, mais toutes peuvent vous aider à gérer efficacement un grand nombre de sites, à améliorer leur sécurité, et à assurer leur performance sur le long terme. Le choix de la solution dépendra principalement de votre environnement technologique, de la complexité de vos sites, et de vos ressources disponibles.
Avec l’émergence des solutions Headless, pas facile de disposer d’un front-end rapidement alors de nouvelles solutions arrivent pour vous simplifier la vie. Chez TheCodingMachine on commence à être fan des solutions Front-End As a service… Découvrez pourquoi :
Le problème d’une plateforme Headless est qu’elle est … Headless !
Lorsque l’on met en œuvre une solution Headless (parce qu’ils présentent de nombreux avantages), difficile de disposer d’un Front-end rapidement ! C’est même le principe… Malheureusement, investir dans le développement d’une interface Front-end entièrement sur-mesure représente un coût souvent assez important : prestation d’un designer, développement HTML et CSS, optimisation du SEO et du responsive design, … Est-ce que cela veut dire que les meilleures solutions du marché sont hors de portée pour les entreprises qui ne disposent pas de budgets conséquents ?
Il est parfois aussi tout simplement difficile de se projeter en partant d’une feuille totalement blanche. C’est particulièrement risqué dans un secteur où une partie des usages sont ancrés et associés à un certain nombre de bonnes pratiques (gestion du panier, des favoris, parcours d’achat,…).
Pour remédier à cela, la plupart des solutions Headless proposent un Front-end basique. C’est le cas de Sylius, par exemple, qui propose une interface Front-end de base reposant sur Twig (moteur de templating basé sur PHP). Bien que cette version standard soit parfaitement adaptée pour des boutiques simples, elle est moins optimisée qu’une vitrine reposant uniquement sur des pures technologies Front-end comme Vue.Js ou React.Js. Ainsi, à moins d’investir sur des développements spécifiques, ce thème standard peut vite atteindre des limites en termes de performances à la fois techniques et SEO.
Bref, il est difficile d’avoir le meilleur des deux mondes ! C’est-à-dire un Front-End (votre vitrine) pouvant évoluer séparément de votre Back-End (votre arrière-boutique) sans développements supplémentaires et des performances optimales.
Heureusement des solutions Front End As a Service émergent …
C’est la problématique à laquelle Alokai (anciennement Vue Storefront) répond. Ce type de solutions sont appelées Front-End As a Service. Le principe du Headless est de pouvoir connecter tous les composants de votre e-commerce (Front, Paiement, ERP, Gestion des stocks,…) à travers des API. Alokai propose donc un Front-end “clé en main” prêt à être connecté au reste de votre éco-système via des API prêtes à l’emploi et respectant toutes les bonnes pratiques.
Les avantages sont nombreux :
Déploiement rapide et sécurisé. La séparation du Front-End et du Back-End permet des mises à jour et des améliorations indépendantes, réduisant ainsi les temps d’arrêt et les risques d’erreurs ;
Migration progressive de votre e-commerce, plus besoin de tout bouleverser pour simplement changer de vitrine. Redonnez le pouvoir à vos équipes marketing ! Vous pouvez même offrir des expériences utilisateur personnalisées en utilisant des données comportementales et de navigation pour adapter le contenu ;
Optimisation conséquente des performances techniques avec l’usage de technologies adaptées comme Vue.Js et Nuxt.Js qui permettent par exemple un chargement asynchrone ou le lazy loading ou bien encore l’optimisation des images voire la gestion simplifiée de la logique de cache ;
Un mode Progressive Web Application directement disponible afin d’améliorer le responsive design et l’expérience mobile ;
L’optimisation du SEO grâce à la génération côté Front.
Chez TheCodingMachine nous sommes assez convaincus par ces solutions Front-End as a Service et c’est pourquoi nous avons décidé de faire un socle technique (Sylius + Alokai) prêt à l’emploi. On peut alors aller vite, très vite pour le déploiement d’une solution toute nouvelle.
Et, cerise sur le gâteau, ces solutions peuvent aussi fonctionner si l’on a envie de cacher des vieilleries (vous n’auriez pas un Drupal ou un Magento 1 qui trainent ?)…
Lors d’un échange avec l’un de nos clients, la question de l’automatisation des requêtes SQL est rapidement devenue un sujet de discussion. Notre client nous a fait part du gain de temps potentiel en adoptant une approche où les requêtes SQL pourraient être générées à partir de questions formulées en langage naturel. Intrigués par cette perspective, nous avons décidé d’explorer cette piste.
Afin d’utiliser des LLM (Grand modèle de langage) tout en ayant une structure modulaire et évolutive, notre choix s’est naturellement porté sur le framework Langchain qui semble être l’étoile montante des frameworks IA.
Langchain est une bibliothèque qui utilise le traitement du langage naturel (NLP) qui permet en partie de convertir des phrases en requêtes SQL. Cette approche promet de simplifier l’accès aux données pour les utilisateurs non techniques, tout en améliorant l’efficacité des processus d’analyse de données.
Chez The Coding Machine, nous avons exploré différentes options afin d’automatiser et simplifier nos workflows liés à la gestion des données, notamment dans le cas de multiples statistiques sur une base de données client. Après avoir examiné les avantages potentiels de Langchain, nous avons décidé de mettre ce framework à l’épreuve en utilisant la base de données open source Chinook. Cet article a pour ambition de vous guider à travers notre expérience, en détaillant comment nous avons configuré notre environnement de travail avec Google Colab et Jupyter Notebook.
Notre objectif est de partager cette expérience afin que d’autres puissent tirer parti de ces outils pour améliorer leurs propres processus d’analyse et de gestion des données. Que vous soyez analyste de données, ingénieur ou simplement curieux des nouvelles technologies, cet article vous fournira des outils pratiques pour optimiser votre utilisation des bases de données.
Chinook_DB est une base de données open source largement utilisée dans l’enseignement et les exemples pratiques de gestion de bases de données relationnelles. Initialement conçue pour représenter un magasin de musique en ligne, Chinook_DB offre une structure de données réaliste et plus ou moins complexe, idéale pour simuler des scénarios réels d’interrogation et d’analyse de données.
Cette base de données comprend plusieurs tables interconnectées représentant divers aspects d’une entreprise de vente de musique. Voici quelques-unes des principales tables et leurs relations :
Albums : Contient des informations sur les albums disponibles à la vente.
Artistes : Liste des artistes associés à chaque album.
Clients : Informations sur les clients qui ont acheté des albums.
Commandes : Détails de chaque commande effectuée par les clients.
Pistes audio : Liste des pistes audio disponibles à la vente, avec des informations telles que le nom, la durée et l’album auquel elles appartiennent.
Employés : Détails sur les employés de l’entreprise.
Chinook_DB est structurée de manière à refléter les relations typiques entre les entités dans une plateforme e-commerce de musique.
2. Utilité de Chinook_DB
Chinook_DB est particulièrement utile pour les démonstrations et les apprentissages pratiques dans le domaine de la gestion de bases de données relationnelles. En raison de sa structure bien définie et de ses données réalistes, Chinook_DB permet aux utilisateurs d’explorer des requêtes SQL et de simuler divers scénarios d’analyse de données. Dans le cadre de notre exploration de Langchain et la génération de requêtes SQL, Chinook_DB offre un environnement idéal pour illustrer l’efficacité et la précision de Langchain dans la transformation des questions en langage naturel en requêtes SQL fonctionnelles.
3. Modèle de données
Environnement de développement
La mise en place d’un environnement de développement est important afin d’explorer efficacement les capacités de Langchain dans la génération de requêtes SQL à partir de langage naturel. Dans cette partie, nous détaillerons les étapes pour configurer votre environnement de travail avec Google Colab et Jupyter Notebook, deux plateformes populaires pour le développement interactif en Python.
1. Choix de l’environnement
Google Colab (cloud) : Google Colab est un service de notebook Jupyter hébergé par Google qui permet d’écrire et d’exécuter du code Python dans le cloud, sans nécessiter de configuration locale. Il offre un accès gratuit à des processeurs et de la RAM pour des calculs intensifs, ce qui peut être avantageux pour le traitement de données volumineuses.
Jupyter Notebook (local) : Jupyter Notebook est une application web open source qui vous permet de créer et de partager des documents contenant du code, des équations, des visualisations et du texte explicatif. Il est idéal pour le développement interactif et l’analyse de données.
En optant pour Google Colab et Jupyter Notebook, nous avons choisi des outils qui non seulement facilitent le développement et le débogage, mais qui améliorent aussi la documentation, la collaboration. Ces plateformes offrent des avantages significatifs par rapport à l’utilisation de fichiers Python séparés, rendant le processus de test et de mise en œuvre de Langchain plus efficace et plus convivial.
2. Installation des outils
Pour commencer, assurez-vous d’avoir un compte Google pour utiliser Google Colab et d’avoir installé Python sur votre machine pour Jupyter Notebook. Voici les étapes générales pour configurer votre environnement :
Google Colab
1. Ouvrez un navigateur web et accédez à Google Colab 2. Créez un nouveau notebook ou importez un notebook existant depuis Google Drive ou GitHub
Avantages :
– Python est disponible en dernière version et il est très simple d’installer des librairies (“!pip install langchain” par exemple)
– Pas besoin d’un environnement local
– Partage et collaboration simplifié
Jupyter Notebook
1. Installez Jupyter Notebook en utilisant pip si ce n’est pas déjà fait (Les frameworks populaire tel que JetBrains ou Visual Studio ont des modules pour Jupyter) 2. Jupyter pourra alors être complètement intégré à votre IDE
Avantages :
– Pas de dépendance au cloud
– Moins de déconnexion intempestive
– Un environnement local plus souple et maîtrisable
Pratique : Mise en place technique
Dans cette partie, nous allons voir comment utiliser Langchain concrètement étape par étape. L’objectif de cet article est d’arriver à un résultat où nous pourrons poser une question naturelle et le modèle devra nous répondre une requête SQL fonctionnelle puis l’exécuter directement afin d’avoir le résultat.
Notez que nous allons aborder une infime partie de ce que propose Langchain cependant nous ne pouvons pas couvrir la totalité dans cet article, si ce framework vous intéresse, rendez-vous sur la documentation officielle.
⚠️ Attention ⚠️ Comme le précise Langchain, connecter une base de données de production à un LLM n’est pas sans risque, des instructions DML pourraient sans doute être exécutées par une personne malveillante. Il est donc très important de mettre en place une stratégie de sécurité : – Dupliquer la base de données avec une lecture seule (Master / slave par exemple) – Anonymiser les informations critiques tels que les users (Données personnelles, mots de passes, etc.) ou les API key
Avant d’aller plus loin, voici les éléments que nous allons aborder :
Un toolkit est un ensemble de tools qui permettent d’exécuter un groupe de fonction mis à disposition. Dans notre exemple, le Toolkit SQL Database va nous permettre d’avoir un ensemble de fonctions pré paramétré et notamment avec des prompts déjà mis en place.
L’agent, dans notre contexte, est un module proposé par Langchain qui agit comme un intermédiaire entre l’utilisateur et la base de données. Il est capable de comprendre des requêtes en langage naturel, de les traduire en requêtes SQL en suivant les fonctions mise à disposition par le Toolkit.
LangSmith va nous permettre d’avoir une visibilité sur l’utilisation de Langchain, nombres de tokens par requête, coûts, organisation des fonctions, input, output, etc. Cela permet de déboguer plus facilement du code.
Pour la suite de cet article nous allons utiliser Google Colab, ce qui permettra de vous partager le Notebook de cet article
Installation des paquets
Cette ligne installera tous les paquets nécessaires au code que nous allons utiliser.
Note : Le ! devant pip dans Google Colab est utilisé pour exécuter des commandes de shell directement depuis une cellule du notebook. En mettant !pip, vous dites à Google Colab d’exécuter la commande pip
Variable d’environnement
Google Colab met à disposition un gestionnaire de clés, vous pouvez donc renseigner de façon sécurisée vos secrets et les appeler directement dans le code.
# Getting env variables from Google Colab secrets
from google.colab import userdata
import os
# OpenAI key
os.environ["OPENAI_API_KEY"] = userdata.get('OPENAI_API_KEY')
# LangSmith
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = userdata.get('LANGCHAIN_API_KEY')
Initialisation de la base de données
Nous allons vérifier que la base de données existe car Colab supprime très régulièrement les données. Si vous souhaitez persister vos données, regardez l’intégration Colab de Google Drive.
from langchain.sql_database import SQLDatabase
db_path = "[path]/chinook_data.db"
if not os.path.exists(db_path):
raise FileNotFoundError("Database file not found.")
db = SQLDatabase.from_uri(f"sqlite:///{db_path}")
Nous allons maintenant instancier notre classe Chat model afin de traiter la demande de l’utilisateur. LangChain va maintenant nous permettre de créer un agent, celui-ci pourra appeler à de multiples reprises le chat model ainsi que la base de données.
from langchain_openai import ChatOpenAI
from langchain_community.agent_toolkits import create_sql_agent
# Instanciate the class ChatOpenAI
chat_model = ChatOpenAI(model_name='gpt-4o', temperature=0.5)
# Create a new sql agent
agent_executor = create_sql_agent(model, db=db, agent_type="openai-tools", verbose=True)
# Run the user query
agent_executor.invoke("How much artists are in the db ?")
Nous sommes maintenant prêts à réaliser quelques tests. Le paramètre “verbose” va nous permettre de consulter le chemin parcouru par notre Toolkit pour arriver à un résultat. Notez qu’il est également possible (et recommandé) de consulter ce parcours sur LangSmith.
Nous allons prendre pour exemple un cas simple pour l’instant, nous voulons savoir combien d’artistes sont présents dans la base de données.
Notre question sera donc : How many artists are in the db ?
Note : Les tests semblent montrer que les requêtes peuvent être écrites en Français mais nous le ferons en anglais dans cet article
La question est simple, si nous reprenons notre modèle de données, il n’y aucune relation, voici donc la requête :
SELECT COUNT(*) FROM artists;
Lançons maintenant le script :
> Entering new SQL Agent Executor chain...
Invoking: `sql_db_list_tables` with `{}`
albums, artists, customers, employees, genres, invoice_items, invoices, media_types, playlist_track, playlists, tracks
Invoking: `sql_db_schema` with `{'table_names': 'artists'}`
CREATE TABLE artists (
"ArtistId" INTEGER NOT NULL,
"Name" NVARCHAR(120),
PRIMARY KEY ("ArtistId")
)
/*
3 rows from artists table:
ArtistId Name
1 AC/DC
2 Accept
3 Aerosmith
*/
Invoking: `sql_db_query_checker` with `{'query': 'SELECT COUNT(*) as artist_count FROM artists;'}`
```sql
SELECT COUNT(*) as artist_count FROM artists;
```
Invoking: `sql_db_query` with `{'query': 'SELECT COUNT(*) as artist_count FROM artists;'}`
[(275,)]There are 275 artists in the database.
> Finished chain.
{
'input': 'How much artists are in the db ?',
'output': 'There are 275 artists in the database.'
}
Le résultat est cohérent et celui attendu. Nous pouvons voir les différentes fonctions utilisées par notre toolkit. Pour aller plus loin, allons jeter un oeil sur LangSmith.
Sans rentrer dans les détails, cela fera peut être l’objet d’un article sur ce sujet, mais nous pouvons constater que 4 différentes fonctions avec des tâches bien précises sont appelées.
1. sql_db_query
Cette fonction a pour objectif de recevoir une requête SQL correcte (syntaxiquement parlant) et de l’exécuter. Dès lors que l’exécution de celle-ci renvoie une erreur, le prompt précise qu’il doit essayer de réécrire la requête.
Si un problème de “Unknown column” est présent, alors il faut rappeler la fonction “sql_db_schema” afin de vérifier le schéma.
Dans le cas où l’exécution de la requête est un problème de syntaxe SQL, alors il rappelle “sql_db_query_checker” et tente de réécrire la requête.
2. sql_db_schema
Cette fonction a pour objectif de recevoir en entrée une liste de tables séparées par des virgules. La sortie est le schéma et les lignes d’exemples des tables de l’entrée.
Une vérification peut être faite afin de vérifier que les tables existent en appelant “sql_db_list_tables”
3. sql_db_list_tables
Renvoie toutes les tables de la base de données.
4. sql_db_query_checker
Cette fonction est appelée avant l’exécution de la requête SQL afin de vérifier sa syntaxe.
Note : Il faut bien comprendre ici que les Tools (ou fonctions) sont appelées par le LLM. Il est capable de comprendre une question et/ou un problème et donc d’appeler un tool en fonction du problème rencontré.
Allons un peu plus loin maintenant, si nous analysons notre modèle de données, l’idéal serait d’avoir une demande qui recherche dans plus de trois tables différentes pour ajouter un peu de complexité.
Imaginons que nous souhaitions connaître les clients les plus éclectiques, cherchons ceux qui ont acheté des pistes dans plus de 9 genres musicaux différents et calculons combien ils ont dépensé au total. Idéalement, nous souhaiterions avoir les clients avec le plus de genres affichés en premier.
Voici le prompt : Identify customers who purchased tracks from more than nine different genres, calculate the total amount spent by these customers and sort the result by highest number of genre
Voici l’output de l’agent :
> Entering new SQL Agent Executor chain...
Invoking: `sql_db_list_tables` with `{}`
albums, artists, customers, employees, genres, invoice_items, invoices, media_types, playlist_track, playlists, tracks
Invoking: `sql_db_schema` with `{'table_names': 'customers, genres, invoice_items, invoices, tracks'}`
CREATE TABLE customers (
"CustomerId" INTEGER NOT NULL,
"FirstName" NVARCHAR(40) NOT NULL,
"LastName" NVARCHAR(20) NOT NULL,
"Company" NVARCHAR(80),
"Address" NVARCHAR(70),
"City" NVARCHAR(40),
"State" NVARCHAR(40),
"Country" NVARCHAR(40),
"PostalCode" NVARCHAR(10),
"Phone" NVARCHAR(24),
"Fax" NVARCHAR(24),
"Email" NVARCHAR(60) NOT NULL,
"SupportRepId" INTEGER,
PRIMARY KEY ("CustomerId"),
FOREIGN KEY("SupportRepId") REFERENCES employees ("EmployeeId")
)
/*
3 rows from customers table:
CustomerId FirstName LastName Company Address City State Country PostalCode Phone Fax Email SupportRepId
1 Luís Gonçalves Embraer - Empresa Brasileira de Aeronáutica S.A. Av. Brigadeiro Faria Lima, 2170 São José dos Campos SP Brazil 12227-000 +55 (12) 3923-5555 +55 (12) 3923-5566 luisg@embraer.com.br 3
2 Leonie Köhler None Theodor-Heuss-Straße 34 Stuttgart None Germany 70174 +49 0711 2842222 None leonekohler@surfeu.de 5
3 François Tremblay None 1498 rue Bélanger Montréal QC Canada H2G 1A7 +1 (514) 721-4711 None ftremblay@gmail.com 3
*/
CREATE TABLE genres (
"GenreId" INTEGER NOT NULL,
"Name" NVARCHAR(120),
PRIMARY KEY ("GenreId")
)
/*
3 rows from genres table:
GenreId Name
1 Rock
2 Jazz
3 Metal
*/
CREATE TABLE invoice_items (
"InvoiceLineId" INTEGER NOT NULL,
"InvoiceId" INTEGER NOT NULL,
"TrackId" INTEGER NOT NULL,
"UnitPrice" NUMERIC(10, 2) NOT NULL,
"Quantity" INTEGER NOT NULL,
PRIMARY KEY ("InvoiceLineId"),
FOREIGN KEY("TrackId") REFERENCES tracks ("TrackId"),
FOREIGN KEY("InvoiceId") REFERENCES invoices ("InvoiceId")
)
/*
3 rows from invoice_items table:
InvoiceLineId InvoiceId TrackId UnitPrice Quantity
1 1 2 0.99 1
2 1 4 0.99 1
3 2 6 0.99 1
*/
CREATE TABLE invoices (
"InvoiceId" INTEGER NOT NULL,
"CustomerId" INTEGER NOT NULL,
"InvoiceDate" DATETIME NOT NULL,
"BillingAddress" NVARCHAR(70),
"BillingCity" NVARCHAR(40),
"BillingState" NVARCHAR(40),
"BillingCountry" NVARCHAR(40),
"BillingPostalCode" NVARCHAR(10),
"Total" NUMERIC(10, 2) NOT NULL,
PRIMARY KEY ("InvoiceId"),
FOREIGN KEY("CustomerId") REFERENCES customers ("CustomerId")
)
/*
3 rows from invoices table:
InvoiceId CustomerId InvoiceDate BillingAddress BillingCity BillingState BillingCountry BillingPostalCode Total
1 2 2009-01-01 00:00:00 Theodor-Heuss-Straße 34 Stuttgart None Germany 70174 1.98
2 4 2009-01-02 00:00:00 Ullevålsveien 14 Oslo None Norway 0171 3.96
3 8 2009-01-03 00:00:00 Grétrystraat 63 Brussels None Belgium 1000 5.94
*/
CREATE TABLE tracks (
"TrackId" INTEGER NOT NULL,
"Name" NVARCHAR(200) NOT NULL,
"AlbumId" INTEGER,
"MediaTypeId" INTEGER NOT NULL,
"GenreId" INTEGER,
"Composer" NVARCHAR(220),
"Milliseconds" INTEGER NOT NULL,
"Bytes" INTEGER,
"UnitPrice" NUMERIC(10, 2) NOT NULL,
PRIMARY KEY ("TrackId"),
FOREIGN KEY("MediaTypeId") REFERENCES media_types ("MediaTypeId"),
FOREIGN KEY("GenreId") REFERENCES genres ("GenreId"),
FOREIGN KEY("AlbumId") REFERENCES albums ("AlbumId")
)
/*
3 rows from tracks table:
TrackId Name AlbumId MediaTypeId GenreId Composer Milliseconds Bytes UnitPrice
1 For Those About To Rock (We Salute You) 1 1 1 Angus Young, Malcolm Young, Brian Johnson 343719 11170334 0.99
2 Balls to the Wall 2 2 1 None 342562 5510424 0.99
3 Fast As a Shark 3 2 1 F. Baltes, S. Kaufman, U. Dirkscneider & W. Hoffman 230619 3990994 0.99
*/
Invoking: `sql_db_query_checker` with `{'query': 'SELECT c.CustomerId, c.FirstName, c.LastName, COUNT(DISTINCT t.GenreId) AS GenreCount, SUM(i.Total) AS TotalSpent\nFROM customers c\nJOIN invoices i ON c.CustomerId = i.CustomerId\nJOIN invoice_items ii ON i.InvoiceId = ii.InvoiceId\nJOIN tracks t ON ii.TrackId = t.TrackId\nGROUP BY c.CustomerId, c.FirstName, c.LastName\nHAVING GenreCount > 9\nORDER BY GenreCount DESC\nLIMIT 10;'}`
responded: To identify customers who purchased tracks from more than nine different genres and calculate the total amount spent by these customers, I need to join several tables and perform the necessary aggregations.
Here's the plan:
1. Join the `customers`, `invoices`, `invoice_items`, and `tracks` tables to get the necessary data.
2. Group by `CustomerId` and count the distinct `GenreId` for each customer.
3. Filter out customers who purchased from more than nine different genres.
4. Calculate the total amount spent by these customers.
5. Sort the results by the highest number of genres.
Let's write and check the query.
```sql
SELECT c.CustomerId, c.FirstName, c.LastName, COUNT(DISTINCT t.GenreId) AS GenreCount, SUM(i.Total) AS TotalSpent
FROM customers c
JOIN invoices i ON c.CustomerId = i.CustomerId
JOIN invoice_items ii ON i.InvoiceId = ii.InvoiceId
JOIN tracks t ON ii.TrackId = t.TrackId
GROUP BY c.CustomerId, c.FirstName, c.LastName
HAVING GenreCount > 9
ORDER BY GenreCount DESC
LIMIT 10;
```
Invoking: `sql_db_query` with `{'query': 'SELECT c.CustomerId, c.FirstName, c.LastName, COUNT(DISTINCT t.GenreId) AS GenreCount, SUM(i.Total) AS TotalSpent\nFROM customers c\nJOIN invoices i ON c.CustomerId = i.CustomerId\nJOIN invoice_items ii ON i.InvoiceId = ii.InvoiceId\nJOIN tracks t ON ii.TrackId = t.TrackId\nGROUP BY c.CustomerId, c.FirstName, c.LastName\nHAVING GenreCount > 9\nORDER BY GenreCount DESC\nLIMIT 10;'}`
[(57, 'Luis', 'Rojas', 12, 415.6200000000001), (45, 'Ladislav', 'Kovács', 11, 446.6200000000003), (3, 'François', 'Tremblay', 10, 338.62000000000006), (14, 'Mark', 'Philips', 10, 334.6200000000001), (17, 'Jack', 'Smith', 10, 352.62000000000035), (24, 'Frank', 'Ralston', 10, 378.6200000000001), (34, 'João', 'Fernandes', 10, 352.62000000000035), (37, 'Fynn', 'Zimmermann', 10, 388.6200000000001)]Here are the customers who purchased tracks from more than nine different genres, along with the total amount they spent, sorted by the highest number of genres:
1. **Luis Rojas** - Purchased from 12 genres, Total Spent: $415.62
2. **Ladislav Kovács** - Purchased from 11 genres, Total Spent: $446.62
3. **François Tremblay** - Purchased from 10 genres, Total Spent: $338.62
4. **Mark Philips** - Purchased from 10 genres, Total Spent: $334.62
5. **Jack Smith** - Purchased from 10 genres, Total Spent: $352.62
6. **Frank Ralston** - Purchased from 10 genres, Total Spent: $378.62
7. **João Fernandes** - Purchased from 10 genres, Total Spent: $352.62
8. **Fynn Zimmermann** - Purchased from 10 genres, Total Spent: $388.62
Ce cas est très intéressant, car la réponse n’est pas bonne.
Notez qu’il y a une subtilité, dans cette base de données les informations financières sont gérées dans deux tables différentes, invoices et invoice_items.
Invoice_items correspond à l’achat d’une piste. Si un client achète 2 pistes, nous aurons alors 2 lignes liées à invoices.
Pour illustrer cet exemple, prenons un cas concret de la base de données, la facture id 1 a deux lignes rattachées donc un client a acheté 2 pistes pour un prix unitaire de 0,99 €. Nous avons donc 1,98 € dans la colonne du total de la ligne invoices.
Lorsque nous réalisons une requête, si nous ne regroupons pas les résultats (GROUP BY), nous aurons alors les lignes invoices dupliquées autant de fois qu’il y a de ligne invoice_items rattachées. Utiliser alors la fonction SUM ne donnera pas le bon résultat, ce qui est notre problème actuellement.
Si j’exécute cette requête nous pouvons constater ce résultat
SELECT i.* FROM invoices i
LEFT JOIN invoice_items ii ON i.InvoiceId=ii.InvoiceId
WHERE i.InvoiceId=1
Faire un SUM sur Total n’est pas absolument pas la bonne solution.
Si nous reprenons le résultat de notre requête SQL nous pouvons constater que Luis Rojas a dépensé 415,62 €. Ce montant provient de cette fonction SUM(i.Total) AS TotalSpent
Le fait d’avoir écrit the total amount spent by, le LLM se base donc sur la colonne total.
Nous ne pouvons pas maîtriser parfaitement l’interprétation du LLM et c’est d’ailleurs tout son intérêt, nous avons donc trouvé une solution afin de corriger ce petit problème.
L’agent utilisé est “create_sql_agent » et il prend en paramètre un suffixe. Nous pouvons donc créer un prompt complémentaire qui ajoute des instructions spécifiques.
Nous pouvons ajouter le code suivant :
[...]
suffix = """
Here is some additionnal information about the database,
there are two tables that deal with the subject of financial amount.
The 'Invoices' table and the 'Invoice_items' table. You must always
rely on the 'quantity' and 'UnitPrice' columns in order to make
calculations relating to a financial aspect. You should NEVER
use the 'Total' column of the 'Invoices' table. Use this information
only when necessary.
"""
agent_executor = create_sql_agent(model, db=db, agent_type="openai-tools", verbose=True, suffix=suffix)
[...]
Nous précisons au LLM la subtilité de cette base en ce qui concerne l’aspect financier de la demande. A présent, dès lors que nous demanderons au LLM une information financière, il utilisera cette fonction SUM(ii.UnitPrice * ii.Quantity)
Après avoir relancé le même prompt avec ce changement, voici notre résultat, qui lui est correct !
1. **Luis Rojas** - Purchased from 12 genres, Total Amount Spent: $46.62
2. **Ladislav Kovács** - Purchased from 11 genres, Total Amount Spent: $45.62
3. **François Tremblay** - Purchased from 10 genres, Total Amount Spent: $39.62
4. **Mark Philips** - Purchased from 10 genres, Total Amount Spent: $37.62
5. **Jack Smith** - Purchased from 10 genres, Total Amount Spent: $39.62
6. **Frank Ralston** - Purchased from 10 genres, Total Amount Spent: $43.62
7. **João Fernandes** - Purchased from 10 genres, Total Amount Spent: $39.62
8. **Fynn Zimmermann** - Purchased from 10 genres, Total Amount Spent: $43.62
Conclusion
Les résultats sont plutôt bons, les requêtes sont construites de manière cohérente. Cependant, il faut prendre en compte le nom des tables ainsi que des colonnes de la base de données.
En effet, le modèle de langage interprète les demandes et recherche des cohérences dans le nom des tables et des colonnes. Si les tables sont mal nommées, cela ne fonctionnera pas.
Modifier ces éléments dans une base de données existante peut se révéler assez complexe. Comme vu précédemment, il est donc possible d’ajouter du contexte au LLM afin de créer une logique entre les tables et les colonnes.
Il devient donc très intéressant de travailler par itération sur une base de données existante et les résultats pourront être satisfaisants.
Merci d’avoir suivi cet article, afin de tester par vos propres moyens, vous trouverez le lien ci-dessous afin de tester par vous même.
Puisque que les entreprises doivent gérer des données de plus en plus complexes et qu’il devient nécessaire d’y accéder de manière rapide et simple, on a conduit plusieurs tests pour voir s’il était possible de laisser les utilisateurs faire des requêtes en langage naturel. On s’est dit que cela pouvait faire un super article !
Donc, dans cet article, nous montrons comment l’intégration de l’API d’OpenAI permet vraiment d’ouvrir l’accès aux données aux utilisateurs non-experts.
Note : Nous utilisons le modèle GPT4 de OpenAI mais d’autres modèles capables de générer du code sont disponibles tel que Mistral.
1. La data encore la data
L’accès à des données précises et pertinentes permet de prendre des décisions ou d’optimiser des processus. Pourtant, l’accès et l’interrogation des bases de données restent souvent complexes. Les requêtes SQL peuvent être difficiles à maîtriser parce qu’elles nécessitent des compétences techniques.
Les utilisateurs finaux, souvent non familiers avec les langages de requête et les structures de bases de données, peuvent peiner à interpréter les résultats. Alors, pour surmonter ces défis, les entreprises investissent dans des solutions de BI qui simplifient l’accès aux données et automatisent l’analyse.
Les outils de visualisation de données permettent aux décideurs de tous niveaux de comprendre et d’exploiter les informations sans nécessiter une expertise technique approfondie. Mais il y a encore des limites, par exemple, on ne peut évidemment manipuler que les données qui sont intégrées et y connecter de nouveaux outils n’est pas forcément simple. La personnalisation des requêtes peut être complexe (sans parler du coût de ces outils).
Bref, on peut encore faire des progrès ! Et, une bonne piste est l’IA…
2. L’API d’OpenAI pourrait bien être une révolution dans l’accès aux données
L’API d’OpenAI représente une avancée majeure dans le domaine du traitement du langage naturel (NLP), offrant des capacités impressionnantes pour comprendre et générer du texte en langage humain. Cette API permet aux utilisateurs de poser des questions et de recevoir des réponses dans un langage clair et naturel, rendant les interactions avec les systèmes beaucoup plus simples.
L’API peut même transformer la manière dont les utilisateurs interagissent avec les bases de données en permettant de convertir des questions en langage naturel en instructions SQL.
Prenons un exemple complexe : un utilisateur pourrait vouloir obtenir des informations sur les tendances de vente et de retour de produits dans une entreprise. En langage naturel, l’utilisateur pourrait demander : « Quels sont les cinq produits les plus vendus et les plus retournés au cours des six derniers mois, et quelle est la différence moyenne de revenus entre les ventes et les retours pour ces produits ? ». Si, on lui a préalablement donné le modèle de données, l’API ChatGPT est capable de traduire cette demande en une série de requêtes SQL :
WITH TopProducts AS (
SELECT product_id,
SUM(quantity_sold) AS total_sales,
SUM(quantity_returned) AS total_returns
FROM sales
WHERE sale_date >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 5
)
SELECT p.product_name, tp.total_sales, tp.total_returns,
(tp.total_sales * p.sale_price - tp.total_returns * p.return_price) / 6 AS average_revenue_difference
FROM TopProducts tp
JOIN products p ON tp.product_id = p.product_id;
Bon, c’est pas mal mais comment l’intégrer dans mon application ?
3. “Call Me”
Non, ce n’est pas pour parler de Blondie (oui, j’ai des réfs de vieux) mais OpenAi vient de développer un mode “function calling” particulièrement intéressant.
Le « function calling » permet au LLM (Large Language Model) modèle d’identifier quand une tâche requiert une exécution de fonction et d’appeler directement une fonction définie dans l’application de l’utilisateur. Cette fonctionnalité permet de donner la possibilité au modèle d’exécuter des actions que nous allons définir comme envoyer un e-mail, d’interroger des bases de données, de récupérer des informations, et bien plus encore…
Donc, on peut développer une solution qui marcherait selon le principe suivant :
Pas mal non ? L’avantage est que l’on donne pas ses données à OpenAi.
4. Enjeux de sécurité
Il y a deux risques avec ce type de développement. Le premier est que si quelqu’un réussit à tromper OpenAi, il pourrait faire une requête INSERT ou DELETE (voire DROP) au lieu d’une requête SELECT. L’autre serait de réussir à sortir de son « domaine » (la liste des données que l’on a le droit de lire).
Donc, l’approche est bonne si l’on est administrateur et qu’on a le droit de tout voir, mais si l’on n’a le droit de voir qu’une partie des données, il est très difficile de garantir que la requête générée ne retournera pas des données confidentielles.
Dans ces conditions, il faudrait mettre en place un parseur de requêtes qui ajoute des filtres à la volée. Cela n’est pas trivial, mais c’est possible.
D’autres modèles que OpenAi peuvent aussi répondre au problème de sécurité des données. Des modèles comme Mistral peuvent tourner en local et sont plutôt bons pour la génération de code.
Une autre solution (proposée par nos équipes à Lyon) serait d’avoir une base de données répliquée et étanche. Dans ce cas là, plus de problème pour la manipulation des données (mais il reste quand même le second risque sur la confidentialité de certaines données).
Bref, à défaut d’avoir une connexion directe avec la BDD, l’API d’OpenAi peut quand même aider pour rédiger/corriger une requête SQL ce qui peut déjà faire gagner beaucoup de temps !
Conclusion
On ne va pas se mentir, la question de laisser l’IA accéder aux données peut vous rendre frileux, on le comprend. Mais on pense quand même que c’est une opportunité sans précédent pour transformer la manière dont les entreprises interagissent avec leurs données. En simplifiant l’accès aux données et en rendant les requêtes plus intuitives, cette manière d’exploiter l’IA est un vrai use case de l’IA (pour une fois ?).
Deux questions se posent rapidement lorsque l’on parle d’IA : que faire et comment faire ! Déjà le « que faire » n’est pas si évident parce nous sommes habitués à réfléchir en termes de processus ou de données et assez peu de manière globale. Alors, même si vous pouvez trouver beaucoup de uses case sur le web, difficile de les faire correspondre à sa problématique.
Ensuite, le « comment faire » n’est pas si évident non plus. Faire de la recherche pure n’est pas à la portée de toutes les bourses ! Heureusement, de nombreux outils se développent et vous permettent d’intégrer l’IA de plus en plus facilement.
Alors cet article vous propose de répondre à ces questions de manière très pratique. Vous allez savoir quoi faire et comment le faire !
La génération de contenus
La génération de contenu est l’application la plus répandue de l’IA. Grâce à des modèles avancés comme GPT-3.5 et GPT-4, vous pouvez automatiser la création de textes, d’images, et autres formats de contenu à partir de simples prompts.
Que faire :
Recherchez ce que vous produisez comme contenu, avec par exemple : marketing (articles ou publication sur les réseaux sociaux), RH (les fiches de poste par exemple), eCommerce (descriptions de produits)…
Comment faire :
OpenAI GPT : Offrant une API, les modèles GPT peuvent générer du contenu textuel de haute qualité. GPT-3.5 Turbo et GPT-4o sont accessibles gratuitement via ChatGPT pour des tests, permettant aux développeurs de se familiariser avec les capacités de ces modèles avant une intégration complète.
Mistral AI : Ce modèle propose une variété de versions open source et commerciales. Les modèles open source tels que Mistral 7B sont idéaux pour les projets nécessitant un haut niveau de personnalisation sans coût élevé.
La reconnaissance vocale et la synthèse vocale
La reconnaissance vocale permet d’améliorer l’accessibilité et l’interaction utilisateur. Elle effectue la transcription automatique de discours, la commande vocale, et l’ajout de sous-titres.
Que faire ?
Soit vous souhaitez améliorer l’accessibilité de vos outils (et c’est une très bonne intention mais c’est un peu limité), soit vous souhaitez permettre aux utilisateurs de contrôler des applications ou des appareils par la voix. Et ça, on peut dire que c’est un domaine tout neuf ! On pourrait tout à fait imaginer remplacer un fastidieux formulaire de rapport d’intervention (avec un gros formulaire au format mobile) par une vraie discussion vocale homme-machine :
“ Bonjour Jean-Paul, vous êtes bien à tel endroit ? (le mobile est géolocalisé)
Oui,
Vous avez effectué un remplacement du moteur auxiliaire ? (l’application dispose de la liste des interventions)
Finalement, non, il y avait juste un fusible à changer
….”
On n’est plus si loin de la Science-fiction !
Comment faire ?
Google speech-to-text ou text-to-speech : Avec une API supportant 165 langues, ce service est parfait pour les applications globales. Il propose des modèles spécialisés pour différents types d’audio, comme les appels téléphoniques ou le secteur médical.
Whisper : Ce modèle open source de reconnaissance vocale offre une API flexible et fonctionne avec des fichiers et des prompts optionnels, facilitant son intégration dans divers systèmes.
TTS (Text-to-Speech) : Ce modèle propose des API pour convertir des textes courts (jusqu’à 4096 caractères) en audio, avec plusieurs choix de voix, idéal pour les notifications ou les assistants personnels.
Analyse de documents
L’IA peut automatiser l’analyse et l’extraction de données à partir de documents, c’est pas mal lorsque vous devez traiter une grande quantité de documents.
Que faire ?
Automatiser l’extraction de données de factures, contrats, et autres documents peut considérablement réduire les erreurs et le temps de traitement si vous devez les intégrer dans votre système de gestion.
l’IA peut aussi faciliter la recherche d’informations spécifiques dans une grande base de documents (vous pouvez aussi réfléchir à comment générer des documents spécifiques – cf partie 1).
Outils pour l’analyse de documents
Document AI : Un outil spécialisé dans l’extraction de données et la classification de documents. Il permet d’automatiser des tâches répétitives et de gagner du temps dans la gestion des documents.
Un exemple concret
Un exemple concret d’intégration de l’IA est la réalisation d’une application de gestion de documents, (projet imaginé par OpenAI). Cette application utilise l’IA pour remplir automatiquement les informations des documents téléchargés (nom, description, type, mots clés) et dans une version avancée, elle pourrait permettre de rechercher des informations sur l’ensemble des fichiers, offrant une gestion documentaire intuitive et efficace :
Remplissage automatique : Utilisation de l’IA pour extraire et remplir les informations des documents téléchargés.
Requête et recherche : Capacité à rechercher et à requêter des informations spécifiques à travers tous les documents, facilitant ainsi la gestion et l’accès aux données.
Conclusion
Intégrer l’IA dans votre projet web présente de nombreux avantages : génération de contenu, reconnaissance et synthèse vocale et analyse de documents. L’IA peut non seulement vous procurer des gains de productivité mais aussi améliorer l’expérience utilisateur. Ces outils se développent très vite et de plus en plus d’API sont disponibles : Google, OpenAI, et Mistral AI…
« Vers l’infini et au-delà ! » En route vers de nouveaux projets !