Bot Framework – Arkano Bot

Bot Framework – Arkano Bot

Introduction

Lately, Artificial Intelligence and particularly Speech Recognition have seen tremendous advancements. Microsoft has made a big bet on this type of software. The best possible example is Cortana, though there are other ones such as Microsoft CNTK or Azure Cognitive Services. From these tools arises the proposal of Conversation as a Platform, trying to revolutionize the ordinary user interface. Instead of using forms for the user to fill in, an interface allowing information exchange in a more fluent and understandable way for the user is sought.
In order to achieve this goal, Microsoft introduced its Bot Framework. These bots can be connected to several communication channels, such as Facebook, Messenger, Skype, Slack, Telegram, among others, to hold a conversation with the user and offer him/her services.

Practical Example

A basic user example on how to use the Bot Framework together with the voice recognition service Azure LUIS was carried out. An Expert System was created. The projects on which an Arkano team member has worked can be retrieved in Spanish. Arkano Bot finds a list of the projects worked on by the team member.
The Bot is available to add to Skype in the following link.

Technical Solution

Pre-requisites:

  1. Visual Studio 2015 update 1 or later versions
  2. Updated extensions
  3. Bot Template for Visual Studio
  4. Bot Emulator

Procedure:

When creating a Bot with the template, a controller to manage the messages from other users is automatically created. This controller is an ASP.NET Web API Controller and there is nothing special to its name. It is important to know that the messages are received through POST and the stored parameters are received and stocked in the body of the message.

public async Task Post([FromBody]Activity activity)

Firstly, we need to obtain a connection to the channel from which the message is obtained. Something very powerful from the Bot Framework is that for the developer the communication channel is transparent:

ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));

Another very important feature of the Framework is its ability to scale. To do so, the web service representing it must be stateless and must be able to keep the context of a conversation. E.g.: which the last question asked was.
To do this, there is a service where to store context information.

StateClient state = activity.GetStateClient();

To obtain information stored in the context the following code is used:

BotData userData = await state.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);

In order to store data:


BotData userData = await state.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
userData.SetProperty("ClaveDeInformacionQueQuieroGuardar", true);
await state.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);

Finally, to send an answer an instance of the Activity sort is created and that uses the connector to send it through the channel. E.g.:


Activity reply = activity.CreateReply("Answer");
await connector.Conversations.ReplyToActivityAsync(reply);

_______________________________________________________________________________________________

Introducción

En los últimos tiempos, la Inteligencia Artificial y en particular la tecnología aplicada al entendimiento del habla han visto un avance vertiginoso. Tal es así que Microsoft ha apostado fuerte al Software aplicado a ella. El mayor ejemplo es posiblemente Cortana, aunque también existen otros como ser Microsoft CNTK o Azure Cognitive Services.
A partir de estas herramientas, nace la propuesta de Conversation as a Platform, buscando revolucionar las interfaces de usuario tradicionales. En lugar de utilizar formularios en los que el usuario deba completar información se busca una interfaz que permita el intercambio de información de forma más fluida y entendible para el usuario.
Para lograr este cometido se introduce Microsoft Bot Framework. Estos bots se pueden conectar a diversos canales de comunicación como Facebook Messenger, Skype, Slack, Telegram entre otros, para mantener una conversación con el usuario y brindarle servicios.

Ejemplo Práctico

Se realizó un ejemplo de uso básico en el que se utiliza el Bot Framework en conjunción con el servicio de reconocimiento de voz de Azure LUIS. Se creó un Sistema Experto al cual se le pueden pedir, en idioma español, los proyectos en los que ha trabajado un integrante del equipo de Arkano. Arkano Bot retorna una lista de los proyectos trabajados por el integrante del equipo solicitado.
El Bot se encuentra disponible para agregar a Skype en el siguiente vínculo.

Solución Técnica

Pre-requisitos:

  1. Visual Studio 2015 Update 1 o superior
  2. Extensiones actualizadas
  3. Bot Template para Visual Studio
  4. Bot Emulator

Procedimiento:

Al crear un Bot con el template, se crea automáticamente un controlador para manejar los mensajes que llegan desde los usuarios. Este controlador es un Controller de ASP .NET Web API y el nombre no tiene nada de especial. Lo que es importante saber es que los mensajes se reciben por POST y se reciben los parámetros almacenados en el cuerpo del mensaje.

public async Task Post([FromBody]Activity activity)

Lo primero es obtener la conexión al canal desde el cual se obtuvo el mensaje. Algo muy poderoso del Bot Framework es que para el desarrollador es transparente el canal de comunicación. Para obtener la conexión se utiliza la siguiente línea:

ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));

Una característica importante de un Bot es la posibilidad de Escalar. Para esto, el servicio web que lo representa debe ser stateless y debe poder mantener el contexto de una conversación. Por ejemplo: cuál fue la última pregunta que se le hizo. Para esto existe un servicio en el que se puede almacenar información de contexto.

StateClient state = activity.GetStateClient();

Para obtener información guardada en el contexto se utiliza el siguiente código:

BotData userData = await state.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);

Por otra parte para guardar:


BotData userData = await state.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
userData.SetProperty("ClaveDeInformacionQueQuieroGuardar", true);
await state.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);

Por último, para enviar una respuesta, se crea una instancia de la clase Activity y se utiliza el conector para enviarlo por el canal. Por ejemplo:


Activity reply = activity.CreateReply("Respuesta");
await connector.Conversations.ReplyToActivityAsync(reply);

Share This