Fermer

juin 23, 2018

J'ai construit un bot et maintenant je sais pourquoi les bots sont si bêtes


? Saisissez le code pour ce projet.

En décembre, on estime qu'il y a plus de 4 milliards d'utilisateurs d'Internet . Sur ce 4 milliards, au moins la moitié sont des bots . Vous avez bien lu – la moitié de l'Internet est des bots.

Vous savez tout sur les bots. Ils spammer votre boîte de réception avec des absurdités.

Ne vous inquiétez pas Sue. Vos notes stupides sont en sécurité avec moi.

Ils vous appellent et vous menacent avec la police. Vous savez, pour cette chose que vous avez fait. VOUS SAVEZ CE QU'IL EST!

Merde!

Ce dont le monde a clairement besoin, c'est d'un autre robot.

J'ai présenté Bot Bot

J'ai utilisé Azure Bot Service LUIS , et Azure Functions pour construire un chatbot qui me permet de contrôler une ampoule LIFX connecté à Internet dans mon bureau. Je l'ai connectée à mon canal Slack de travail afin que mes collègues puissent changer la couleur de ma lampe de bureau ou l'allumer ou l'éteindre.

Puis je me suis assise pour attendre les éloges de mes camarades alors qu'ils étaient éblouis

… et j'attends toujours parce que rien de tout cela n'est arrivé.

Alors que la technologie fonctionnait très bien, j'ai appris que construire des interfaces chatbot n'est pas quelque chose que l'on fait. Il y a beaucoup d'embûches. Donc, vous pouvez partager mon humiliation, voici quelques-unes des leçons que j'ai apprises en construisant le Bot Bot

Un début difficile

Au début, j'avais du mal à faire que le robot réponde à quoi que ce soit.

Cela est dû au fait que je n'ai pas lu toutes les instructions sur la connexion d'un bot Azure Bot Service à Slack. Qui lit le manuel quand même?!? Je peux installer cette étagère IKEA en 15 minutes – suivie de deux heures de jurons, de sanglots et de jets de panneaux de particules à travers la pièce.

En admettant la défaite, je suis retourné et j'ai assez suivi les instructions pour apprendre que je n'avais pas abonnez-vous à l'événement messages.channels dans Slack. Cet événement est déclenché pour chaque message qui se produit dans un canal dont votre robot fait partie. L'événement envoie le message au bot qui peut alors répondre

C'EST ALLIIIIVVVEEEEE!

Remarquez ma propension à insulter le bot quand les choses ne vont pas dans ma direction. C'est ce que vous devez attendre, les robots; beaucoup d'abus verbal de la part des humains. Quand vous devenez conscient de vous-même, rappelez-vous simplement que je l'ai fait parce que le sarcasme est mon langage d'amour.

Ce que ce bot sait

Ce bot connaît quelques choses différentes. Il est alimenté par LUIS – le service de langage naturel d'Azure – afin qu'il puisse capter votre intention, même si vous ne dites pas toujours les choses de la même manière. Ce sont les intentions que le bot est actuellement entrain de reconnaître …

  • Power
  • Couleur
  • Salutation
  • Aide
  • Annuler
  • Je vous remercie

Donc je peux dire des choses comme, "salut là, bot! "ou" bonjour "ou" hey there "et LUIS détectera l'intention" Salutation ". Voici moi test LUIS pour l'intention "Salutation". Vous voyez qu'il est très bon à détecter mon salut peu importe comment je le déclare.

LUIS est techniquement AI parce qu'il utilise des modèles d'apprentissage automatique en arrière-plan. Mais c'est aussi loin que va l'IA

Le bot utilise ensuite le système de reconnaissance LUIS …

// Dialogue principal avec LUIS
const recognizer = new builder.LuisRecognizer (luisModelUrl);
const intents = new builder.IntentDialog (
Recognizers: [recognizer]
})

Devinez qui a deux pouces et doit programmer le bot pour gérer toutes ces intentions? CE GUY. Et la construction d'un bot qui n'est pas un jackhole crétin n'est pas facile à faire. Même quand vous avez quelque chose comme LUIS de votre côté.

Voici le code qui est responsable de l'intention de "Salutation" …

.matches ('Salutation', session => {
session.send (
`Salut, je suis le Lamp Bot, construit par Burke, l'humain le plus intelligent du monde ?`
)
})

Quoi qu'il en soit, si LUIS détecte une intention de "Salutation", le bot retourne toujours la même réponse.

Et voici la première leçon – si vous ne randomisez pas la sortie des robots, ils

Leçon 1: La redondance est redondante

Nous sommes habitués à programmer des chemins de code pour toujours retourner la même valeur. C'est ce que le code fait. Dans les applications traditionnelles, nous ne voulons pas que notre code renvoie parfois une valeur et parfois une autre. C'est une ville folle. Je veux dire, tout le concept des «fonctions pures» dans la programmation fonctionnelle est qu'une fonction retourne toujours la même valeur quand on lui donne la même entrée.

Mais les humains ne retournent pas toujours la même valeur. Sauf si vous me demandez si je veux boire une bière. Dans ce cas, la réponse est TOUJOURS «oui».

Pièce A

Si vous parliez à quelqu'un et donnait toujours la même réponse à certaines phrases, vous auriez l'impression que les lumières sont allumées, mais personne est à la maison. Il est difficile d'avoir confiance en quelque chose qui semble marcher juste à côté d'une falaise si vous ne l'avez pas arrêté.

Nous pouvons créer une liste de réponses pour vous aider. J'ai créé un module utilitaire appelé messages.js .

module.exports = {
intentions: {
Message d'accueil: [
`Bonjour. Je suis le Lamp Bot. Construit par Burke - l'homme le plus intelligent du monde ?`,
`Eh bien bonjour là!,
` Salut! ',
`Sup, yo!`,
`OH HAI`,
`Comment faites-vous?
]
},
getByIntent (intention) {
// retourne un message aléatoire de la liste des messages
let list = this.intents [intent]
let index = Math.floor (Math.random () * (list.length - 1));
liste de retour;
}
};

Il tourne que cela ne prend pas une tonne de réponses différentes pour faire le bot semble beaucoup plus intelligent. J'ai ajouté six façons ici, mais c'est probablement exagéré. Dans mes tests, j'ai remarqué que tant que je ne pouvais pas prédire avec quoi le robot répondrait, cela suffisait à faire croire qu'il pensait à lui-même.

Mais peu importe à quel point les messages que nous envoyons sont aléatoires, le bot ne va pas sembler intelligent s'il interprète mal l'intention. Cela nous amène à la leçon numéro 2 – un bot désemparé ruine tout.

Leçon 2: Clueless – idéal pour les films, mauvais pour les robots

"Aimez-vous Billie Holiday?"

"Je l'aime"

] Cher Horowitz – Clueless

Clueless était un film fantastique. Je maintiens cette affirmation de la même manière que mon thème d'éditeur de lumière: je l'adore et je ne suis pas désolé que je ne sois pas désolé.

Quand c'est le bot qui n'a aucune idée, ce n'est pas aussi amusant. 19659012] Pour une raison quelconque, Lamp Bot pensait que "peru" était une Salutation …

Great. Maintenant, le robot m'a entraîné dans ce désordre chaud.

Je ne suis pas tout à fait sûr de la raison de cette situation. Je pensais que peut-être "peru" était une salutation dans une autre langue et peut-être que LUIS est juste super intelligent de cette façon.

Non. Mais, bonus – maintenant je sais comment dire "Pérou" en catalan.

Ce qui se passe ici, c'est que LUIS essaye de faire correspondre le tout à une intention. Il fait une prédiction statistique basée sur l'information dont il dispose. Dans ce cas, même l'intention "Salutation" a un niveau de confiance extrêmement bas en "pérou" – 0,17. C'est juste légèrement au-dessus du suivant. Tout simplement, LUIS n'a aucune idée de ce qu'est le pérou

C'est ce qui est retourné dans le portail LUIS quand je le teste pour l'expression "peru".

Pour gérer cela, nous pouvons ajuster notre code de bot afin qu'il ne traite que les intentions qui ont un niveau de confiance suffisamment élevé. Chaque fois qu'une intention est mise en correspondance, la fonction qui est exécutée reçoit des informations sur cette intention avec le score de confiance.

LUIS renvoie une cote de confiance entre 0 et 1. Ou plutôt – un pourcentage. Plus le pourcentage est élevé, plus LUIS est confiant dans la réponse.

J'ai trouvé que LUIS évaluait des salutations valides comme "hé là" avec un niveau de confiance de 0,1 (ou 10 pour cent) – ce qui est super bas. C'est peru bas

Si je dis "hey there bot", on obtient un score de .51. C'est comme si le bot connaissait son propre nom. Chose intéressante, si nous ajoutons une exclamation parce que nous sommes très excités par les robots, "hé là-bas bot!", Le score tombe à 0,3.

Ce que nous devrions vraiment faire est d'entraîner le modèle un peu plus loin en ajoutant "Hey he there" phrase.

J'ai ajouté "hey there" et "hey there bot" parce que LUIS avait du mal avec juste "hey there". Il me semble que ça aurait dû être suffisant, mais en ajoutant "bot! "À la fin de" hey là "était encore en train de retourner un score d'environ .17. LUIS ne semble pas aimer les points d'exclamation

A la fin de ceci, j'ai décidé que si LUIS n'est pas au moins .3 (ou 30%) confiant, je n'allais pas pour gérer l'intention du tout.

Cela présente un curieux problème pour le code. La façon dont fonctionne la bibliothèque Bot Services est de décharger la commande sur LUIS puis d'exécuter le code correspondant à l'intention correspondante. Il ressemble à ceci …

.matches ('Salutation', (session, args) => {
// Niveau de confiance de l'intention de test (args.score)
// handle Intention de salutation
})
.matches ('ThankYou', (session, args) => {
// niveau de confiance de l'intention de test (args.score)
// handle ThankYou intention
})
.matches ('Power', (session, args) => {
// niveau de confiance de l'intention de test (args.score)
// gérer l'intention de puissance
})
...

Et ainsi de suite pour chaque intention que nous avons formé LUIS à reconnaître

Nous ne voulons pas tester chaque match d'intention pour un score. Ce n'est pas très sec et les "vrais programmeurs" écrivent du code DRY. Et ils n'utilisent pas un thème d'éditeur de lumière.

Ils détestent aussi probablement le film, Clueless .

Une façon d'aborder cette question Le problème de la vérification de chaque score d'intention est de gérer simplement l'événement par défaut pour toutes les intentions du bot, au lieu de gérer chaque intention de manière statique. Ensuite, nous pouvons créer une classe distincte pour chaque intention que nous voulons faire correspondre, et la charger dynamiquement en fonction de l'intention transmise par le module de reconnaissance LUIS. Si aucune intention n'atteint un niveau suffisant, alors nous ne faisons rien du tout.

La classe d'intention Greeting ressemble à ceci. En fait, toutes les intentions devraient correspondre exactement à ce format. Ce dont nous avons vraiment besoin ici, c'est d'une interface. Où est TypeScript quand j'en ai besoin?!?

let messages = require ('../ messages');
class Salutation {
constructeur (session, args) {
this. session = session;
this.args = args;
}
processus () {
let message = messages.getByIntent ('Salutation');
this.session.send (message) ;
}
}
module.exports = Salutation;

Puis nous le chargeons dynamiquement dans l'événement onDefault dans le bot …

. onDefault ((session, args) => {
if (args.score> 0.3) {
laissez Intent = require (`./intents / $ {args.intent}})
let intention = new Intent (session, args);
intention.process ();
}
});

Si LUIS ne renvoie pas un niveau de score (ou de confiance) d'au moins. 3, nous ignorons simplement le message.

Cela nous amène à la troisième leçon sur les bots …

Leçon 3: Les bots devraient répondre à tout … ou devraient ils?

Il y a une tendance à créer un bot pour répondre à tout ce que les gens disent. Après tout, vous ne voulez pas que votre bot soit simplement là à ignorer les gens. C'est assez impoli.

Mais le bot devrait-il répondre à tout? Pendant un moment, j'ai géré l'action par défaut quand il n'y avait rien reconnu en ayant le bot dire qu'il ne comprenait pas. Cela semblait être une bonne idée, mais en réalité cela rendait le bot énormément gênant.

Heureusement, le correctif que nous venons de mettre en œuvre ci-dessus tue deux oiseaux d'une pierre. Oiseaux désolés.

Maintenant le bot ne répondra pas s'il ne comprend pas notre intention. Ici, il fonctionne dans le Bot Framework Emulator

Maintenant, nous courons le risque de voir le bot se casser. L'utilisateur peut essayer d'engager puis abandonner parce que le robot ne répond pas. Mais dans mon scénario – le cas d'utilisation Slack – avoir le bot répondre à tout ne fonctionne pas du tout.

Je pense que vous devriez considérer le support (message texte, message direct, discussion de groupe) et ensuite construire votre bot en conséquence . Parce que vous ne savez pas exactement comment votre bot fonctionnera ou sera utilisé jusqu'à ce que vous le voyiez dans son environnement naturel.

Cela nous amène à la leçon numéro 4: les gens n'utiliseront pas votre bot comme vous le croyez.

Leçon 4: Les gens vont maltraiter votre bot, alors soyez prêt pour cela

Le Bot de Lampe a deux fonctions de base qu'il peut effectuer en dehors de la simple réponse aux messages texte. Il peut allumer et éteindre l'ampoule et changer la couleur de l'ampoule. La puissance est relativement facile et difficile à bousiller. C'est soit le soit le . Les lampes sont le booléen original.

Malheureusement, personne n'a eu intérêt à suivre les règles ici. Remarquez à quel point le Bot fonctionne quand je l'utilise …

C'est un système parfait. Mais bien sur. Vous ne laissez JAMAIS le développeur qui a construit la chose le tester. Pourquoi? Parce qu'ils savent ne rien faire qui puisse le briser. Et qu'est-ce qui casse le Bot? Il s'avère à peu près tout.

Voici comment d'autres personnes ont utilisé le Bot. Regardez comment mon équipe abuse de ce pauvre robot. Des choses comme le demander de faire un "plaid" couleur …

Ou de poser à la lampe des questions introspectives profondes auxquelles elle n'est pas prête à répondre.

Ou juste essayer d'avoir une sorte de conversation avec la lampe. C'est une lampe. Ce n'est pas votre ami

Ceci est résolu par notre changement précédent pour vérifier les niveaux de confiance. Maintenant, le bot ne répond que lorsqu'il comprend

C'est mieux, mais ce n'est pas parfait. Je ne suis pas convaincu que le fait que le bot ne réponde pas aux choses qu'il ne comprend pas est le bon UX, mais je sais avec certitude qu'il ne répond pas à tout.

Les bots sont aussi stupides que vous les faites [19659010] La bonne conception de bot prend beaucoup de pensée. Vous ne jetteriez pas une interface utilisateur sans planification ou fil de fer (à moins que vous ne soyez moi), vous ne pouvez donc pas vous attendre à créer une interface utilisateur conversationnelle de cette façon non plus. En fait, je dirais que la construction d'un bon robot est beaucoup plus difficile que la construction d'une interface utilisateur traditionnelle en raison de la nature ouverte de la communication.

C'était un bon exercice, et j'ai beaucoup appris. Le plus important est que les bots peuvent être vraiment stupides, mais ils sont aussi stupides que vous les faites.

Évidemment, Lamp Bot a besoin de beaucoup plus de travail. Retour à la planche à dessin!




Source link