mardi 3 octobre 2017

Retour sur l'AI Summit de San Francisco - Voyage dans le futur proche

A l'issue de la première journée de la conférence, on a une sensation de  disruption émergente, à tel point que l'on se demande si l'on est pas en train de vivre une sorte d'avènement des robots "The Raise of the Robots".
Mais tout d'abord quelques chiffres sur cette conférence qui se tient au cœur de la région la plus innovante au monde, la Silicon Valley dans la région de San Francisco
c'est aussi une opportunité de rencontrer les acteurs majeurs du secteur dont beaucoup ont des bureaux en Californie
La conférence aborde également le sujet de la collaboration Humain - Robot et donc comment tirer partie de l'ensemble de l'écosystème à la fois software, hardware et plate forme pour faire de l'IA un atout majeur dans la production de valeur au travers notamment de gain de productivité encore jamais atteint.
On apprend d'entrée que l'IA nous emène dans un changement de paradigme total, qui va considérablement impacter notre métier et également le business sous jacent. Il faut donc tout d'abord explorer ce nouveau domaine et voir comment les entreprises peuvent en recueillir les bénéfices. Pour cela, une bonne approche va consister à se former sur le sujet au travers de lecture telles que
Au passage, on ne bypasser la réference de Francois Chollet sur le Deep Learning, dont la première partie est gratuite chez Manning en ligne

Et également par le biais de formation, de nombreuses possibilités existent avec Plurasight, mais aussi Microsoft qui produit gratuitement des formations et livres blancs sur la création d'agent conversationnels , le Machine/Deep Learning, l'utilisation du NLP etc. On notera également un ecosystème de ressources de training plus ou moins techno agnostique :
Plusieurs facteurs seront donc à prendre en considération pour démarrer avec de l'IA en entreprise
1 Le Leadership : La première question est qui porte l'IA dans l'entreprise, Le role de CDO (Chief Digital Officer) est il présent, qui gère les projets et la stratégie autour de l'intelligence artificielle?
2 La sélection des projets, avec par exemple pour une compagnie financière, l'utilisation du Machine Learning avec de l'analyse predictive et des simulations vont être un véritable challenge de scoping pour passer d'un Lab à la production
3 Pour finir, les compétences et les équipes qui seront en charge de ces implémentations, à savoir ai-je les compétences necessaires en interne?
Les entreprises devront se réorganiser quelque peu si elle veulent réaliser avec succès et efficacité leur transformation digitale basée sur de l'intelligence artificielle.
Pour ce qui concerne le driver, 70% des personnes interrogées considèrent que l'IA a le potentiel de faire que les humains pourront ce concentrer d'avantage sur du travail à forte valeur ajoutée. C'est l'essence de la promesse du RPA et également de tous les assistants conversationnels sensés nous faire gagner beaucoup de temps sur des taches  répétitives pour lesquelles nous sommes peu efficaces.
Coté Microsoft, David Smith (VP Microsoft AI & Research) argumente sur le fait que l'IA va permettre d'amplifier l'ingeniosité de l'être humain, voire de l'augmenter ce qui est tout à fait aligné avec la vision globale de Microsoft : "Permettre à toute personne et toute organisation sur la planète d'accomplir d'avantage"
David présentera l'ensemble de la plate forme Cognitive Microsoft ainsi que des démonstrations époustouflantes rendues possibles grace au capacité de Machine Learning et Deep Learning de Microsoft, comme la démo ci dessous
Chez Daisy, on est persuadé que l'IA va disrupter le monde de la grande distribution, avec l'arrivée d'Amazon et Ali Baba, les grands acteurs français vont devoir réagir rapidement au prix de se faire uberiser par ces nouveaux mutants. Daisy est un produit permettant d'utiliser l'IA pour d'optimiser la prise de décision concernant les promotions des magasins par exemple, basé sur du  Machine/Deep Learning, est déjà utilisé chez Lidl, Amazon, Wallmart etc.




Parmi les exposants du salon, on va retrouver des solutions entreprises complètes baties sur de l'IA avec DryIce par exemple de pnl. De telle solution nous font réaliser que la majeure partie des entreprises n'en sont encore qu'à l'age de Pierre, et on pourrait reprendre une illustration bien connue dans le monde de l'Agile, le manque de réactivité pour pivoter rapidement vers plus de productivité et de modernisation. Il faudra veiller à ne pas reproduire les erreurs du passé
En revanche pour le Machine / Deep learning le problème critique est le challenge créé par la qualité relative  et la structure des données, La réconciliation et l'harmonisation de données disparates à travers de multiples LOB en silo pose de réels problèmes de consistence et pertinence.Nous avons besoin de techniques de gestion effective de la données permettant de s'assurer que la donnée utilisée est à la fois comprise par l'humain et par la machine aux travers des algorithmes de MLpar exemple
La donnée est clé. La solution à ce problème dans le domaine de la finance par exemple résiderait dans l'utilisation d'ontologies au travers de la mise en place d'un standard commun de données gratuit et open source. Les ontologies permettent une harmonisation des données et l'alignememnt nécessaire pour une consolidation de données disparates basées sur un sens commun.
Les ontologies peuvent être utilisées pour transformer un contenu non structuré en une forme structurée pour du Machine Learning par exemple.
 Les recherches de l'université de Mannheim en Allemagne démontrent de plus que les ontologies peuvent aider le Machine learning à effectuer de la validation de données à minima 50 fois plus vite qu'en mode standard. 
En conclusion, pas de Machine Learning / Deep Learning performant/relevant sans ontologie
 Le Machine /Deep Learning c'est également le retour des mathématiques et statistiques avancées, ce qui va profondément changer notre métier dans les années à venir, qui vont voir considérablement augmenter les profils type Data Scientistes qui seuls aujourd'hui savent comprendre les notions d'algorithme du gradient stochastique ou la rétropropagation du gradient
Aujourd'hui, Les utilisateurs s'attendent à pouvoir communiquer avec leurs appareils, sites web en langage naturel. Les systèmes modernes doivent être conversationnels, humain et intelligent. Les récentes implémentations par google avec Google Home et Amazon Echo… en sont les meilleurs exemples

Face à cet enjeu, nous devons être capable de batir des agents conversationnels performant et conforme aux attentes des utilisateurs dans des temps de mise sur le marché courts à l'aide d'outils proposant des interfaces graphiques de conception, avec par exemple le Conversation Designer de Microsoft avec également  des capacités de déploiment multi canaux.
L'éthique en matière d'IA constitue un sujet clé, on entend parler par exemple pour les voitures autonomes d'éthique déontique ou éthique conséquensialiste qui sont par exmple deux modèles de prise de décision relarivement opposé en termes de résultats, le premier basé sur le droit commun soit le code de la route pour une voiture, le deuxième sur l'évaluation des conséquenses d'une décision sur par exemple l'espérance de vie humaine. Face à une situation critique, le véhicule ne prendra pas la même décision en fonction de son code éthique. Ce sujet a été abordé dans de multiples sessions de la conférence, ci dessous un exemple.


En conclusion de cet article : L'IA est là, les ressouces pour la développer également au travers de plate formes SAAS, Hardware avec notamment les GPUs (NVidia en tête), l'arrivée prochaine des calculateurs quantiques, des Frameworks de développements pour l'essentiel proposés par Microsoft, Amazon et Google. Il n'y a plus de raison de ne pas avancer sur ce sujet, que ce soit au travers de projets de productivité internes (RH, Finance, Recrutement etc…) ou bien encore d'applications métiers innovantes
Pour conclure ce premier article sur cette conférence voici le message délivré par Amazon: 

jeudi 27 juillet 2017

Bot Framework Part 5 - Déployer un Chatbot

Dans cet article, nous allons aborder toutes les étapes nécessaires à la mise en production d'un Chatbot

  • Enregistrer notre bot sur le portail Bot Framework
  • Déployer notre Chatbot sur une instance de site web dans Azure
  • Tester notre Chatbot
  • Emuler différents channels : Slack, Teams, Skype, Facebook Messenger etc.
Notre Chatbot est simplement une application web et de ce fait il est possible de l'héberger sur tout host permettant d'héberger une site web ASP.net (Azure, AWS etc.)
Pour enregistrer notre Bot, il suffit de se connecter au portail dev.botframework.com en s'authentifiant, puis cliquer sur l'onglet My Bots
Puis cliquer sur Register pour enregistrer notre Chatbot, nous complétons alors le nom du Chatbot, le Handle qui est à usage interne uniquement et ne doit pas contenir d'espaces et enfin une description du Chatbot
Pour la configuration, elle sera fournie par le portail, mais il faut tout de même en entrer une, nous pouvons mettre temporairement : https://blank-url.com puis cliquer sur  le  bouton Create Microsoft App ID
Nous sommes alors rediriger vers le portail de développement Microsoft avec la génération de l'ID
Cliquer sur le bouton générer Mot de passe, la fenêtre suivante s'affiche alors
Attention à bien copier l'App ID et le Password dans un endroit ou vous saurez le retrouver, nous en aurons besoin pour modifier la configuration du Chatbot ultérieurement. Il ne sera affiché qu'une seule fois tel qu'indiqué dans la fenêtre popup
Enfin, on renseigne l'adresse email Admin (notre compte LiveID) puis simplement cliquer le bouton Register
Nous devons maintenant configurer et déployer notre Chatbot, pour cela revenons dans Visual Studio, ouvrir le fichier Web config et complèter les variables App ID et Password avec les valeurs générées lors de l'enregistrement du Chatbot

Puis nous allons déployer le Chatbot sur une instance Web Azure, pour cela simplement lancer la commande Publish à partir du projet Chatbot et choisir la création d'une nouvelle Microsoft Azure App Service
Visual Studio, nous propose la fenêtre de création en renseignant à partir de nos données de profil, simplement cliquer sur le bouton Create
Une fois généré, nous récupérons l'URL du Chatbot afin de la remplacer dans la page de définition de notre bot et donc remplacer l'URL https://blank-url.com par celle générée.
Nous revenons dans le portail bot Framework et remplacons l'adresse sans oublier de la suffixer par : /api/messages et préfixer par https, puis cliquer sur Save Changes en bas de page




Dernière étape, tester le Chatbot, pour cela, simplement cliquer sur le bouton Test, une fenêtre de dialogue s'ouvre, le Chatbot devrait répondre tel qu'attendu : 
Pour terminer, nous savons qu'il n'est absolument pas une bonne idée de laisser des mots de passe ou identifiants dans le controle de code source, pour cela nous allons retirer l'App ID et le password du web.config pour le reporter dans la section App Settings de notre App service, en créeant simplement les 2 Clé valeurs comme montré ci dessous

Ne pas oublier de sauvegarder
Nous allons par exemple pouvoir l'intégrer dans Skype par exemple, à partir de la page de votre Bot, cliquer sur Skype
Puis cliquer sur Add to Contacts et lancer Skype
Ci dessous, la conversation avec le Bot intégrée dans Skype

Pour tous les autres logiciels conversationnels, il suffit de cliquer sur celui que l'on veut intégrer et simplement suivre la procédure


mercredi 26 juillet 2017

Bot Framework Part 4 - Optimisez l'Interaction avec l'utilisateur avec les Prompts

Un des objectifs clés d'un Chat Bot est la contribution de valeur  vis à vis de l'utilisateur, et ceci va passer notamment par des interfaces de dialogue performantes dont l'effet sera le gain de temps. Le premier vecteur va bien évidemment consister à limiter les échanges par texte obligeant l'utilisateur à utiliser son clavier tactile sur un téléphone par exemple ce qui est clairement peu productif et fastidieux pour l'utilisateur. Pour pallier à cela on trouvera des solutions très interessantes dans le Bot Framework tel que les Prompts qui vont permettre d'accèlérer la collecte d'informations sous la forme d'options à cliquer sous différentes forme, l'idée étant de minimiser au maximum la frappe au clavier au profit de boutons ou d'options à cliquer, l'idée est également de cadrer l'utilisateur afin qu'il ne se perde pas dans des conversations infructueuses avec le Chat Bot, on aura également le fait d'apporter de l'aide à l'utilisaeur pour connaitre les possibilités du Chat Bot et donc optimiser le service rendu à l'utilisateur.
Parmi les différents types de Prompts on aura : 
  • Des formulaires pour la collecte de texte
  • La détection de type de données : Nombres, Date - Heure
  • Des listes d'options pour des choix guidés
  • Des Media : images, vidéos par exemple pour des propositions d'hotels ou restaurants
Un des scenarios les plus courant est l'implémentation de la recherche, avec de manière générique les  étapes suivantes : 
  1. Détecter que l'utilisateur est à la recherche de quelque chose : en lui posant la question :)
  2. Recueillir de la part de l'utilisateur une requéte en text Prompt
  3. Proposer des options de réponses cliquables
  4. Afficher le résultat, potentiellement un carousel d'images avec du texte
Nous allons donc mettre en oeuvre ce scénario avec un exemple dans lequel nous recherchons des Profils dans GitHub et affichons la liste de résultats sous la forme d'un carrousel d'options cliquables pour accèder au profil 

Le code du Message Controller qui collecte les messages et répond à l'utilisateur est toujours le même :


using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;

namespace Bot_Application
{
    [BotAuthentication]
    public class MessagesController : ApiController
    {
        ///




        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        ///

        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
            }

            var response = Request.CreateResponse(HttpStatusCode.OK);
            return response;
        }
    }
}


Le code de RootDialog.cs ci dessous gère le déclenchement de la recherche dès que l'utilsateur aura entré le mot recherche au début de la conversation, si l'utilisateur tape une chaine commencant par le mot recherche suivi d'un espace ou de texte, on va gèrer le cas également comme montré ci dessous. Une fois la requète entrée, la recherche est lancée: 

using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace Bot_Application.Dialogs
{
    [Serializable]
    public class RootDialog : IDialog<object>
    {
        public Task StartAsync(IDialogContext context)
        {
            context.Wait(MessageReceivedAsync);

            return Task.CompletedTask;
        }

        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
        {
            var msg = await result as IMessageActivity;
            if (msg.Text.Equals(@"Recherche", StringComparison.OrdinalIgnoreCase))
            {
                PromptDialog.Text(context, QueryEntered, @"Que recherchez vous?");
            }
            else if (msg.Text.StartsWith(@"Recherche ", StringComparison.OrdinalIgnoreCase))
            {
                var query = msg.Text.Substring(7);
                await context.Forward<string, string>(new SearchDialog(), SearchComplete, query, default(CancellationToken));
            }
        }

        private async Task QueryEntered(IDialogContext context, IAwaitable<string> result)
        {
            await context.Forward<string, string>(new SearchDialog(), SearchComplete, await result, default(CancellationToken));
        }

        private async Task SearchComplete(IDialogContext context, IAwaitable<string> result)
        {
            var returnMessage = await result;
            if (!string.IsNullOrWhiteSpace(returnMessage)) await context.PostAsync(returnMessage);

            context.Wait(MessageReceivedAsync);
        }

    }
}

Nous avons également un client de recherche sommaire pour GitHub qui va nous retourner les informations de base d'un profil recherché sur GitHub, GitHubClient.cs: 


using Octokit;
using System;
using System.Threading.Tasks;
using gh = Octokit;

namespace Bot_Application
{
    public static class GitHubClient
    {
        private static readonly LazyGitHubClient> _client = new LazyGitHubClient>(() => new gh.GitHubClient(new ProductHeaderValue(@"MyBotApp")));

        public static TaskUser> LoadProfile(string username) => _client.Value.User.Get(username);

        public static TaskSearchUsersResult> ExecuteSearch(string query) => _client.Value.Search.SearchUsers(new SearchUsersRequest(query));
    }

}

Enfin, la classe SearchDialog.cs a pour responsabilité d'exécuter la recherche et de retourner une liste de cards sour la forme d'un carrousel de profils GitHub. On remarquera la facilité avec laquelle on crée la carte de profile avec la méthode CreateCard : 

using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace Bot_Application.Dialogs
{
    [Serializable]
    internal class SearchDialog : IDialog<string>
    {
        public Task StartAsync(IDialogContext context)
        {
            context.Wait<string>(MessageReceivedAsync);

            return Task.CompletedTask;
        }

        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<string> result)
        {
            var query = await result;

            var profiles = await GitHubClient.ExecuteSearch(query);

            var totalCount = profiles.TotalCount;

            if (totalCount == 0)
            {
                context.Done(@"Désolé, Pas de résultat trouvé.");
            }
            else if (totalCount > 10)
            {
                context.Done(@"Plus de 10 résultats trouvés. Pouvez vous filtrer plus précisément?");
            }
            else
            {
                // convert the results in to an array of cards for each user
                var userCards = profiles.Items.Select(item => CreateCard(item));

                var msg = context.MakeMessage();
                msg.AttachmentLayout = AttachmentLayoutTypes.Carousel;
                msg.Attachments = userCards.ToList();

                await context.PostAsync(msg);
                context.Done(default(string));
            }
        }

        private static Attachment CreateCard(Octokit.User profile) =>
            new ThumbnailCard()
            {
                Title = profile.Login,
                Images = new[] { new CardImage(url: profile.AvatarUrl) },
                Buttons = new[] { new CardAction(ActionTypes.OpenUrl, @"Cliquer pour consulter", value: profile.HtmlUrl) }
            }.ToAttachment();
    }
}

Voyons le résultat obtenu, on lance le Service Bot
Puis on lance l'émulateur Bot et on se connecte à l'URL : http://localhost:3979/api/messages
puis on entre le mot recherche pour déclencher la conversation avec le chat bot


On voit ici le résultat affiché sous la forme d'un carrousel de cartes, et si l'on clique sur consulter, on a accès à la fiche GitHub : 

Cet article nous a permis de montré que nous pouvons au travers d'un Chat Bot implémenter des scénarios ergonomiquement interessant et plus interactif en tirant parti des différents Prompts proposés par le Bot Framework.
Dans l'article suivant nous verrons comment déployer notre Bot afin de pouvoir le distribuer pour un usage en ligne

Cette gestion d'état et de persistence va permettre des interactions beaucoup plus riche avec le Chat Bot.
Vous retrouverez le code de cet exemple à l'adresse : Code Chatbot