Documentos de Académico
Documentos de Profesional
Documentos de Cultura
IA en acción
Tres casos prácticos técnicos muestran
cómo los desarrolladores están usando
la IA de Azure para crear la siguiente
generación de aplicaciones
Índice 2
01 / 02 / 03 /
Introducción Caso práctico técnico: Three Caso práctico técnico:
(Reino Unido) Powel (Europa)
04 / 05 / 06 /
Caso práctico técnico: Conclusión Siguientes pasos
NAVITIME (Japón)
Introducción 3
Caso
práctico
técnico:
Three
Caso práctico técnico:
Febrero Lorem
Threeipsum dolor sit amet, consectetur 6
2018 adipiscing elit
El proveedor
de telecomunicaciones e Internet,
ha experimentado informalmente con
varios servicios de chatbot en diferentes
de Internet plataformas, pero está interesado
en garantizar la mayor reutilización
Perfil del
Tecnologías clave
cliente:
• Microsoft Bot Framework
(Node.js)
• Microsoft QnA Maker
• Language Understanding
Intelligent Service (LUIS)
• Característica Web Apps de
Azure App Service
• Azure Application Insights
Solución y arquitectura
La solución final en el hackfest fue
un chatbot que:
El bot comienza con un mensaje de bienvenida que se activa cuando un usuario agrega un bot a sus
contactos o abre una conversación con el bot. Desde aquí el usuario puede:
• Usar texto libre para hacer una pregunta (que la administra QnA Maker).
◦◦ Por ejemplo: "¿Qué es 3G?".
• Usar texto libre para decirle al bot que haga algo (lo que activa el diálogo correspondiente).
◦◦ Por ejemplo: "Quiero portar mi número".
• Hacer clic en un botón para activar el diálogo correspondiente.
◦◦ Por ejemplo: clic en el botón "Activar SIM".
Todos los diálogos del bot incorporan telemetría (mediante Azure Application Insights) para
realizar el seguimiento de por dónde navegan los usuarios en el flujo de conversación del bot:
qué tipo de preguntas hacen y cuánto tiempo tarda en completarse una solicitud.
Los botones
(Nodo) seleccionados (Nodo)
Diálogo de activan diálogos Diálogo Telemetría Azure
bienvenida relevante Application
con opciones. activado Insights
Texto Texto
**Todos los formularios se pasan por
Reconoci- Entidades
miento de para campos "commonFormIntro.js", que:
(QnAMaker) entidad LUIS de formulario 1. Pregunta al usuario si desea rellenar el formulario
Diálogo de a través del recurso HTML o el bot.
bienvenida 2. Si elige la opción de bot se presentan al usuario
con opciones. antes de que se inicie el formulario para que
pueda confirmar que tiene todos los datos
necesarios.
Los flujos principales que Three quería crear durante el hack para la solución inicial de bot eran:
• Activar la SIM
• Portar un número
• Cancelar o actualizar un contrato
Caso práctico técnico: Three 17
Ejecución técnica
En esta sección se describen los detalles de implementación de la solución.
• ActivateSIM
• ActivateSIMForm
• CommonFormIntro
• ActivateSIMSubmit
ActivateSIM
En primer lugar, se pregunta a los usuarios qué perfil se adapta mejor a ellos, lo que ayudará al bot
de Three a rellenar el formulario correcto en función del tipo de cliente con el que interactúa. Esto
se hace mediante una solicitud de elección. Según la respuesta del usuario, se llaman diferentes
diálogos como CommonFormIntro o ActivateSIMForm. Muchos de los siguientes diálogos usarán
una solicitud similar, como se muestra a continuación, para guiar a los usuarios.
Caso práctico técnico: Three 18
builder.Prompts.choice(
session,
'OK\n which of these best describes you?',
[
'I ordered a replacement for a missing or broken SIM',
'I ordered a different size SIM',
'I have just upgraded',
'I am a new customer'
],
{listStyle: builder.ListStyle.button}
)
Caso práctico técnico: Three 19
ActivateSIMForm
Este diálogo hace a los usuarios una serie de preguntas que son necesarias para completar
el formulario necesario con el fin de activar su SIM. Es un método útil para crear fácilmente
un formulario en el marco de bot.
session.dialogData.entityData[questions[session.dialogData.index].fiel
d])
builder.Prompts.confirm(session, prompt)
} else {
// If the entityData exists but the property for this question
doesn't, send a text prompt
builder.Prompts.text(session,
questions[session.dialogData.index].question)
}
} else {
// If there is no entityData, proceed as normal
builder.Prompts.text(session,
questions[session.dialogData.index].question)
}
},
function (session, results, next) {
// Check if the user responding via a Confirm or Text prompt
if (results.response === true) {
// If the confirm prompt is true then we save the entity to the
form object and increment the index
var field = questions[session.dialogData.index++].field
session.dialogData.form[field] =
session.dialogData.entityData[field]
} else if (results.response === false) {
// If the confirm prompt is false then we delete the entity from
the entityData object but we do NOT increment the index
field = questions[session.dialogData.index].field
delete session.dialogData.entityData[field]
Caso práctico técnico: Three 20
CommonFormIntro
ActivateSIMSubmit
Este diálogo se llama una vez que se ha completado ActivateSIMForm y envía el formulario
a Three mediante la solicitud para completar una llamada REST POST a la API de Three. La imagen
siguiente muestra lo que el usuario ve después de enviar correctamente un formulario.
Portar un número
Este diálogo es muy similar a ActivateSIMForm y le hace al usuario las preguntas necesarias para
enviar un formulario para portar el número del cliente. El envío también se hace con una llamada
POST a Three.
var questions = [
{field: 'mobileNumber', question: 'What is the
existing number you want to keep?'},
{field: 'mobileNumber2', question: 'What is your
temporary new Three number?'},
{field: 'pac', question: 'What is your PAC
number?'},
{field: 'emailPayMonthly', question: 'What is your
email address?'},
{field: 'fullName', question: 'What is your full
name?'},
{field: 'dob', question: 'What is your birthday
(e.g. 01/01/1901)?'},
{field: 'address1', question: 'What is the first
line of your address?'},
{field: 'postcode', question: 'What is your
postcode?'}
];
builder.Prompts.text(session,
questions[session.dialogData.index].question);
},
function (session, results) {
{field: 'dob', question: 'What is your birthday
(e.g. 01/01/1901)?'},
{field: 'address1', question: 'What is the first
line of your address?'},
Caso práctico técnico: Three 23
{field: 'postcode', question: 'What is your
postcode?'}
];
builder.Prompts.text(session,
questions[session.dialogData.index].question);
},
function (session, results) {
// Save users reply
var field = questions[session.dialogData.index+
+].field
session.dialogData.form[field] = results.response
Caso práctico técnico: Three 24
Cancelar o actualizar
• UpgradeOrCancel
• Cancel
• Upgrade
UpgradeOrCancel
Este diálogo pregunta a los usuarios si desean actualizar o cancelar y, a continuación, llama al diálogo
correspondiente en función de la elección del usuario. Esto se implementa mediante una solicitud
de elección.
Cancel
Pregunta a los usuarios, mediante una solicitud de elección, si quieren un código PAC o saber la
fecha de finalización de su contrato. Dependiendo de la respuesta, contesta con el número de
teléfono al que se debe llamar o el sitio web al que se debe ir.
Caso práctico técnico: Three 25
Caso práctico técnico: Three 26
Upgrade
Este diálogo hace lo mismo que el diálogo "cancel". Pide el tipo de contrato y, a continuación,
según la respuesta, le indica al usuario el sitio web al que debe ir para actualizarse.
Caso práctico técnico:
Febrero Lorem
Threeipsum dolor sit amet, consectetur 27
2018 adipiscing elit
Inteligencia de bot
LUIS
En este proyecto, nos hemos basado principalmente en el uso de expresiones regulares para
determinar la intención del usuario. Sin embargo, también queríamos utilizar Microsoft Language
Understanding Intelligent Service (LUIS) como alternativa en caso de que el usuario decidiera
introducir consultas de texto libre. Creamos un modelo LUIS para controlar los intentos de los tres
flujos que habíamos integrado en este bot (activar SIM, portar un número o cancelar o actualizar).
Modelo LUIS
A continuación, establecimos acciones de activación para cada diálogo de flujo principal, de modo
que si el modelo LUIS reconocía la intención, activaría el diálogo requerido.
Por ejemplo, si el usuario dice: "Quiero activar mi tarjeta SIM", LUIS lo interpretaría como un intento
ActivateSIM, que activaría el inicio del diálogo ActivateSIM porque el intento coincide con la palabra
clave de triggerAction (consulta más adelante). También establecimos intentThreshold para el
activador de intención de LUIS de modo que solo las coincidencias superiores a un valor de confianza
de 0,5 activarían el diálogo.
.triggerAction({
matches: 'ActivateSIM',
intentThreshold: 0.5
})
Caso práctico técnico:
Febrero Lorem
Threeipsum dolor sit amet, consectetur 28
2018 adipiscing elit
En el sitio web de LUIS puedes aprender fácilmente a hacer tu propio modelo LUIS.
Caso práctico técnico:
Febrero Lorem
Threeipsum dolor sit amet, consectetur 29
2018 adipiscing elit
QnA Maker
Three usó el servicio QnA Maker de Microsoft Cognitive Services para responder a preguntas
sencillas de los clientes que están disponibles online (página de preguntas frecuentes de Three).
La implementación fue rápida y ayudó a separar las consultas simples de los clientes y la asistencia
humana directa.
El diálogo QnA se ocupa de todas las preguntas frecuentes. Llamamos a endDialog para que el bot
vuelva al diálogo en el que estaba el usuario cuando hizo la pregunta.
module.exports = function () {
bot.dialog('QnA', (session, results) => {
console.log(process.env)
var client = restify.createJsonClient('https://
westus.api.cognitive.microsoft.com')
var options = {
path: '/qnamaker/v2.0/knowledgebases/' + process.env.QNA_KB_ID +
'/generateAnswer',
headers: {
'Ocp-Apim-Subscription-Key': process.env.QNA_SUBSCRIPTION_KEY
}
}
Este diálogo se llama a través de UniversalBot. Esto significa que QnA Maker está presente en todo
el bot. Si la consulta del usuario no la reconocen LUIS ni una de las expresiones regulares, se enviará
al diálogo de QnA.
La funcionalidad de QnA Maker también se activa cuando el usuario dice ayuda, salir, problema
o soporte, y no quiere el menú principal:
global.telemetryModule = require('./telemetry-module')
const appInsights = require('applicationinsights')
appInsights.setup(process.env.APPINSIGHTS_INSTRUMENTATION_KEY).start()
global.appInsightsClient = appInsights.getClient()
Por último, creamos diferentes objetos de telemetría en cada diálogo para realizar el seguimiento
del usuario que ha visitado el diálogo. Por ejemplo:
Para realizar el seguimiento del tiempo que se ha tardado en enviar un formulario, se utilizó
el siguiente código:
Conclusión Dificultades
Aprendizaje
Los mensajes de bienvenida no funcionan con Slack
Si inicia el diálogo de QnA, no hay una salida evidente de este flujo de diálogo. El usuario se quedaría
bloqueado usando el servicio QnA y no podría continuar usando los demás diálogos del bot,
a menos que se use el comando global restart. La solución es llamar directamente a la API de QnA
y finalizar el diálogo después de responder a la pregunta. De esta manera, los usuarios pueden hacer
una pregunta en medio de otro diálogo, obtener su respuesta mediante el servicio QnA y, después,
continuar en el último diálogo en el que estaban. La implementación de esto se puede encontrar
en la sección "Ejecución técnica" de este documento (en QnA Maker) o en este repositorio de GitHub
de ejemplo.
Con las expresiones regulares y las acciones, podemos configurar comandos globales que los usuarios
pueden usar en cualquier punto del bot. De este modo, los usuarios pueden volver de un diálogo
cuando se queden bloqueados en un flujo de conversación.
En lugar de usar el método habitual de establecer coincidencias con las intenciones de LUIS:
intents
.matches('LUIS_Intent', '/dialog')
.matches('LUIS_Intent', '/dialog')
.onDefault(builder.DialogAction.send("I'm sorry. I didn't
understand."));
Averiguamos que era mucho más limpio establecer las coincidencias de las intenciones de LUIS
con los diálogos mediante triggerActions (que simplemente se agrega al final de un diálogo).
Esto también nos llevó a descubrir que se puede establecer un umbral que deben cumplir las
intenciones de LUIS para que se activen mediante intentThreshold. El valor predeterminado es
activar acciones aunque la confianza de la coincidencia sea inferior a 0,1.
.triggerAction({
matches: 'ActivateSIM',
intentThreshold: 0.5
})
También se puede añadir intentThreshold a nivel global, de modo que se aplique a todas las
coincidencias de LUIS:
Desarrollamos una forma limpia de hacer preguntas a los usuarios para rellenar un formulario
mediante la recursión de diálogos.
var questions = [
{field: 'mobileNumber', question: 'What is the existing number you
want to keep?'},
{field: 'mobileNumber2', question: 'What is your temporary new
Three number?'},
{field: 'pac', question: 'What is your PAC number?'},
{field: 'emailPayMonthly', question: 'What is your email
address?'},
{field: 'fullName', question: 'What is your full name?'},
{field: 'dob', question: 'What is your birthday (e.g.
01/01/1901)?'},
{field: 'address1', question: 'What is the first line of your
address?'},
{field: 'postcode', question: 'What is your postcode?'}
]
Después, se recorre cada pregunta llamando al mismo diálogo y pasándole un índice de contador;
después de que se conteste cada pregunta se guarda la respuesta del usuario:
Planes de producción
El plan para este bot es implementarlo en pruebas A/B en las próximas semanas para poder
probarlo con clientes reales. Después de la prueba A/B de una semana, el plan es poner este
bot en producción en unos meses.
De cara al futuro, Three reconoce que puede proporcionar una experiencia más
enriquecedora si cumple con lo siguiente:
• En lugar de establecer el enlace con los recursos del sitio web de Three, el usuario puede
hacer las preguntas al bot en función del tema de la página y recibir respuestas en función
de su contenido.
• Integración con las API: existen API basadas en red para resolver problemas de cobertura
e interrupciones, así como para informar de un problema, que podrían incorporarse
en una experiencia de bot.
“Gracias a @microsoft-simon
y a todos los amigos de MS.
Lo pasamos muy bien
y aprendimos mucho".
Stuart Brown
Director de desarrollo digital
Caso práctico técnico: Three 40
Recursos Documentación:
Microsoft Bot Framework
Código:
Ejemplo de solicitud individual de QnA para el SDK
de Node.js
Ejemplo simple del SDK de Node.js para rellenar
un formulario
Equipo Microsoft:
Lilian Kasem: evangelista técnica
Simon Michael: evangelista técnico sénior
Bill Barnes: ingeniero principal de desarrollo de software
Three:
Justin Beasley: director jefe de desarrollo digital
Nick Bishop: director jefe de desarrollo digital
Stuart Brown: director jefe de desarrollo digital
Thomas Barton: maestro Scrum
Dimos Fountoukos: desarrollador de software
Caso práctico técnico: Powel 41
Caso
práctico
técnico:
Powel
Caso práctico técnico:
Febrero Lorem
Powelipsum dolor sit amet, consectetur 42
2018 adipiscing elit
Uso de CaaP
de Microsoft en Lysaker, Noruega,
Microsoft se asoció con Powel para crear
y André, el
un nuevo bot llamado André. El objetivo del
hackfest era crear un chatbot controlado
bot asistente
por voz que pudiera ayudar a los ingenieros
de campo de las redes eléctricas a responder
controlado por
preguntas y proporcionar capacidades
de informe durante las inspecciones para
voz, para mejorar
que tuvieran libres las manos. La solución
se creó con herramientas de Microsoft
la inspección in situ
y aprovechando las tecnologías de chatbots
y conversaciones como plataforma (CaaP).
• Pedro Dias,
evangelista técnico sénior
• Anders Gill,
evangelista técnico
Caso práctico técnico: Powel 44
Información general
de la solución
Powel prevé un futuro en el que los El objetivo era poder diseñar dos diálogos
ingenieros in situ puedan utilizar la voz de conversación claramente diferenciados
como principal impulsor del soporte con suficiente funcionalidad para probarse
asistido por ordenador durante las en el campo. Basándose en estos diálogos,
inspecciones de las centrales eléctricas. Powel habría acumulado suficiente
Durante la inspección de una estación experiencia con CaaP como para enriquecer
eléctrica o de una línea eléctrica, el uso André e idear aplicaciones de conversación
de André, una aplicación telefónica basada similares para usarse en otras áreas.
en Xamarin, liberará las manos de los
ingenieros, proporcionando un proceso más Usamos Xamarin.Forms, Microsoft Bot
fluido que el hecho de tener que rellenar Framework, LUIS y Cognitive Services
un formulario en papel o registrar datos para desarrollar un bot que permitiera
en una aplicación de dispositivo. Mediante al ingeniero hablar con la aplicación
las capacidades de un dispositivo portátil, Android Xamarin.Forms. La aplicación
como un teléfono móvil, la aplicación utiliza el motor de reconocimiento de
sabrá automáticamente qué instalación voz de Google para transformar el audio
se está inspeccionando al obtener la en texto; el texto se envía a LUIS para
ubicación GPS del usuario y proporcionará determinar la intención del usuario
las listas de puntos de control y los diálogos en cualquier momento de la conversación.
necesarios apropiados para esa instalación. Basándose en la intención y las
entidades detectadas, Bot Framework
El hackfest se centró en dos objetivos envía la respuesta apropiada de vuelta
de inspección distintos: a la aplicación cliente, la cual le lee
la respuesta al ingeniero, ayudándole
• Centrales eléctricas a mantener su seguridad ya que
• Líneas eléctricas no tiene las manos ocupadas.
Caso práctico técnico: Powel 45
Una característica concreta que realmente amplía la utilidad de este bot fue la integración de Bot
Framework en el sistema de back-end de Powel. Integramos correctamente el bot en los sistemas
que, por ejemplo, permitirían a los ingenieros extraer información valiosa, como
y pasos
Como trabajador de campo, quería
poder enviar inspecciones que fueran
correctas a un bot para no tener que
rellenar un formulario al efecto.
Pedro inició el hackfest y presentó Bot
Framework al equipo, mostrando ejemplos Definimos las características y tareas para
de un bot en funcionamiento, explicando facilitar la distribución del trabajo entre
las características y asegurándose de que el equipo. Creamos dos repositorios: uno
todo el equipo estuviera al día antes para la aplicación ASP.NET bot y otro para
de que empezáramos el desarrollo. la aplicación Xamarin.Forms. También
configuramos CI en Bot Framework,
El objetivo del hackfest de tres días era para que se compilara e implementara
crear una aplicación cliente en Xamarin. en Microsoft Azure después de cada
Forms para Android que pudiera visualizar confirmación.
la conversación que el ingeniero tendría
usando Bot Framework con LUIS y
Cognitive Services. Creamos una historia
de usuario en Visual Studio Team Services
que consistía en múltiples tareas.
Caso práctico técnico: Powel 49
Panel Kanban
El chatbot PoC actual permite al ingeniero de campo llevar a cabo una inspección iniciando una
conversación con la voz, preguntar por sus capacidades, seleccionar una subestación y registrar
una discrepancia de un tipo específico con un comentario. De este modo se satisface el bucle
de comentarios enviando los datos directamente al back-end de Powel para que el ingeniero de
campo ya no tenga que estar físicamente presente en las oficinas para registrar la misma información.
Diagrama de la arquitectura
Caso práctico técnico: Powel 52
Ejecución
Ahora tienes todo lo que necesitas para
crear una aplicación de bot. Para obtener
técnica
una referencia completa sobre cómo
comenzar a usar Bot Builder, consulta SDK
de Bot Builder para .NET.
Configuración del
entorno de desarrollo Logros día 1
André es una aplicación Xamarin.Forms, por
Para empezar con el proyecto, tuvimos que
lo que necesitábamos implementar servicios
instalar y configurar lo siguiente:
nativos para que la aplicación móvil
escuchara y hablara a través de la interfaz
Visual Studio
de reconocimiento de voz de Google.
También empezamos a trabajar en los
• Instalar Visual Studio 2017 (Visual Studio
componentes de chat de la aplicación.
2015 también sirve)
Nota: Asegúrate de que Xamarin está incluido
Con LUIS, tuvimos 10 intentos descritos
en tu instalación de Visual Studio para
y entrenados con expresiones. Empezamos
desarrollar la aplicación André.
a escribir diálogos imaginarios entre
un usuario y la aplicación para entender
• Descargar e instalar el emulador de Bot
mejor cómo fluiría la conversación.
Framework
También comenzamos a experimentar con
entidades de LUIS y que se reconocieran las
• Descargar e instalar la plantilla de bot
intenciones y se usaran estas entidades.
para Visual Studio para C#
Logros día 2
Finalizamos la conexión directa mediante la biblioteca de clases portátil (PCL) WebSockets
pero acabamos usando HTTP porque no pudimos hacer funcionar la PCL. Esto se debió en gran
medida a la dificultad de conseguir que WebSockets funcionara en Android: no estábamos
seguros de si teníamos una solución rápida, así que, en aras del tiempo, optamos por no hacerlo
y centramos nuestros esfuerzos en hacer que todo funcionara.
Conectamos correctamente la aplicación de bot con el back-end de Powel (una API llamada
Condition Monitoring) mediante el uso de las API.
Conectamos las API de back-end de Powel mediante algunos paquetes NuGet internos
de Powel y llamamos a los métodos en los objetos que contenían.
Fue muy sencillo obtener acceso a estos paquetes NuGet a través de Visual Studio
Team Services para CI. Debido a la confidencialidad del código, no podemos compartir
ejemplos de código específicos, pero, en esencia, utilizamos las API para obtener los
identificadores de instalación mediante ubicación GPS (longitud/latitud) y para enviar
los datos de informe.
Conectamos la aplicación móvil al bot y la hicimos funcionar. También pasamos algún tiempo
diseñando la aplicación Xamarin.Forms y asegurándonos de que la interfaz y la experiencia
de usuario fueran buenas.
Caso práctico técnico: Powel 55
Además, trabajamos para conseguir que los paquetes NuGet de las API principales de Powel
(específicamente, la API de supervisión de estado) se incluyeran en la compilación del bot.
Trabajamos en algunos planes de flujo de conversación para su posterior implementación
y dedicamos tiempo a trabajar en los intentos y a entrenar a LUIS para que los reconociera.
Caso práctico técnico: Powel 56
Dedicamos mucho tiempo a los objetos PromptDialog porque nos olvidamos de establecer
la implementación del diálogo como [Serializable].
Logros día 3
La parte final de la configuración del hackfest fue la automatización de la compilación del proyecto
Xamarin.Forms utilizando Visual Studio Mobile Center, así como la búsqueda de posibilidades para
crear una conversación que fluyera en diferentes diálogos.
El siguiente diagrama muestra el flujo final del chatbot PoC. (Lamentablemente, no implementamos
la traducción de textos debido a limitaciones de tiempo, pero incluimos esa parte en la siguiente
imagen).
Un trabajador de campo habla con André (la aplicación móvil) en su lenguaje natural. El motor
de reconocimiento de voz de Google transforma la voz en texto y la devuelve a la aplicación móvil.
La aplicación envía el texto a traducir y recibe el texto totalmente traducido. A continuación,
la aplicación pasa el texto traducido a LUIS, que captura la intención y las entidades, y devuelve
la respuesta a la aplicación móvil. La aplicación móvil envía la intención y las entidades detectadas
(incluido el identificador del trabajador de campo) a Bot Framework, que envía una solicitud al
back-end de Powel. Se devuelve la respuesta apropiada a la aplicación móvil, que traduce el texto
al idioma del trabajador de campo y dice el texto en voz alta.
Caso práctico técnico: Powel 58
Un ejemplo: cuando LUIS reconoce la intención del usuario de ser feliz, Bot Framework irá a ese
método concreto con la intención y ofrecerá la respuesta apropiada.
[LuisIntent("happy")]
public async Task Happy(IDialogContext context, LuisResult result)
{
await context.PostAsync("That's so kind of you!");
context.Wait(MessageReceived);
}
Caso práctico técnico: Powel 59
Otro ejemplo sería cuando LUIS reconoce que el usuario quiere seleccionar una subestación.
[LuisIntent("selectSubstation")]
public async Task SelectSubstation(IDialogContext context, LuisResult
result)
{
AssetService assetService = new AssetService(new
AssetRepository());
string extractedName;
string message = "I'm sorry, I didn't catch the name of the
substation.";
await context.PostAsync(message);
context.Wait(MessageReceived);
}
Caso práctico técnico: Powel 60
También se desarrollaron diálogos más complejos en los que Bot Framework se comunica con
el back-end de Powel apropiado y enumera los posibles tipos de discrepancia entre los que puede
elegir el ingeniero de campo.
[LuisIntent("getDiscrepancyType")]
public async Task SelectControlPoints(IDialogContext context,
LuisResult result)
{
if (String.IsNullOrEmpty(substationName))
{
await context.PostAsync($"You need to tell what substation you
want to select.");
context.Wait(MessageReceived);
}
else
{
DiscrepancyTypeService discrepancyService = new
DiscrepancyTypeService(new DiscrepancyTypeRepository(new
InspectionRepository(new AssetRepository()), new AssetRepository()));
AssetService assetService = new AssetService(new
AssetRepository());
InspectionService inspectionService = new
InspectionService(new InspectionRepository(new AssetRepository()));
var asset = await assetService.GetByName(substationName);
var inspection = await
inspectionService.GetNotPerformedByAssetId(asset.ObjectId);
var discrepancyTypes = await
discrepancyService.Get(asset.ObjectId, inspection.Id);
Diálogo de solicitud
Bot Framework incluye varias solicitudes incorporadas que pueden obtener información de un usuario.
Este tipo de solicitud se utilizó a lo largo de todo el proyecto del bot, por ejemplo, cuando André
pregunta al ingeniero de campo si está satisfecho con la inspección y quiere terminar. Se basa en el
reconocimiento de una intención de LUIS de assetAllGood.
[LuisIntent("assetAllGood")]
public async Task AssetAllGood(IDialogContext context, LuisResult
result)
{
if (String.IsNullOrEmpty(substationName))
{
await context.PostAsync($"You need to tell what substation you
want to select.");
context.Wait(MessageReceived);
}
else
{
PromptDialog.Confirm(context, AfterConfirmAsync, "Are you sure
that you want to finish this inspection?");
await Task.FromResult<Object>(null);
}
}
En el escenario anterior, se le pide al ingeniero de campo que confirme con "Sí" o "No" (ya sea
tocando el botón apropiado o usando la voz para responder), pero se pueden elegir otros muchos
tipos de entradas de recopilación de datos:
FormFlow
Como hemos visto, los diálogos funcionan como un mecanismo potente para guiar una
conversación, pero pueden volverse complejos cuando el rompecabezas tiene muchas piezas
pequeñas, como pedir un bocadillo. Para simplificar una conversación guiada, Bot Framework
ofrece FormFlow, una forma mucho más fácil de construir un diálogo. Un diálogo FormFlow guía
al usuario por el proceso de rellenar el formulario, a la vez que le proporciona ayuda y orientación
a lo largo del proceso. Se utilizó el diálogo de formulario cuando el ingeniero de campo necesita
enviar una discrepancia, para lo cual tiene que rellenar los campos restantes, incluido el tipo
de discrepancia y el comentario.
[Serializable]
public class DiscrepancyFormDialogBuilder
{
public string DiscrepancyType;
public string Comment;
Connector
El componente Connector de Bot Framework proporciona una única API para que el bot se
comunique a través de varios servicios de cliente, como Skype, correo electrónico y Slack. Debido
a que ya estábamos usando Slack para la comunicación durante el hackfest, decidimos configurar
la integración con Slack para que pudiéramos hablar con el bot de un modo eficiente (lee los
pasos para configurar canales de bot en la sección "Configuración de canales" de Introducción al
conector).
En la siguiente imagen, puedes ver el aspecto que tiene la prueba de la conversación usando Slack.
if (string.IsNullOrEmpty(settingValue))
settingValue = GetByLocalJsonFile(index);
return settingValue;
}
}
if (!json.HasValues)
return string.Empty;
return json[index].Value<string>();
}
Caso práctico técnico: Powel 66
Esto nos permite crear un nuevo objeto LuisModelAttribute al pasar appId y appKey
en el controlador de mensajes.
static MessagesController()
{
var settings = new SettingsReader();
var appId = settings["LUIS:AppId"];
var appKey = settings["LUIS:AppKey"];
var model = new LuisModelAttribute(appId, appKey);
_service = new LuisService(model);
}
Debido a que hay demasiado código para mostrar y explicar en este informe, puedes encontrar
todo el código fuente del hackfest en el repositorio de GitHub readyforchaos/Powel-power-station-
inspection-bot.
Caso práctico técnico: Powel 67
Conclusión
Los resultados del hackfest fueron tiempo diseñando flujos de conversación y
brillantes y es fascinante pensar que menos tiempo codificando.
los desarrolladores de Powel pasaron
de no saber nada sobre Bot Framework El hecho de poder obtener acceso a toda
a compilar correctamente un chatbot la información del back-end de Powel
integrado que pudiera gestionar con la voz desde una aplicación permite
conversaciones en varios sistemas al ingeniero tomar decisiones basadas
y proporcionar conocimiento muy en la información que puede solicitar
necesario a los ingenieros de campo. simplemente a través de la aplicación,
Powel continuará el desarrollo del chatbot lo que produce informes de inspección
durante los próximos meses para incluir más precisos.
análisis y vistas de historial de partes
específicas antes de pasar a producción, La posibilidad de registrar discrepancias
pero también para ampliar el concepto sobre la marcha, solicitar detalles
a áreas y dominios de aplicación de Powel de la inspección y obtener otra información
distintos del segmento del negocio relacionada permite a los ingenieros
energético. no hacer uso del papel durante las
inspecciones, de modo que es menos
Desde el punto de vista del desarrollador, probable que se olviden de un punto
todas las partes necesarias están ahí de inspección y no tienen el gasto
y su integración para crear una solución adicional de tener que volver a la oficina
parece casi demasiado fácil. Las para digitalizar las conclusiones después
dificultades que encontramos no estaban de su labor.
relacionadas directamente con Bot
Framework en sí, sino específicamente con Lo bueno de este hackfest es que logramos
los desafíos relacionados con Xamarin. crear algo que realmente funciona y que
podría ponerse en producción en muy
La guía proporcionada para Bot Framework poco tiempo. Con LUIS y Bot Framework,
y LUIS tiene el potencial de mejorar, pero ahora podemos dar al trabajador de campo
es suficiente para empezar y, una vez el soporte que necesita cuando lo necesita
que aprendas pasarás la mayor parte del y sin usar las manos.
Caso práctico técnico: Powel 69
De cara al futuro
No conseguimos incluir todas las características que habíamos previsto para el hackfest de tres días.
Las características previstas que se omitieron fueron las siguientes:
• Traducción de texto
• Carga de imágenes desde la aplicación cliente
• Activación de André por voz en vez de usar un botón
• Determinación y corrección de la PCL de WebSockets
Powel tiene la intención de resolver estos problemas poco después del hackfest para producir
un prototipo funcional que se probará en el campo lo antes posible.
Recursos adicionales
¿Quieres probar Bot Framework ahora mismo? Empieza aquí:
Microsoft Bot Framework
Caso
práctico
técnico:
NAVITIME
Caso práctico técnico:
Febrero Lorem
NAVITIME
ipsum dolor sit amet, consectetur 71
2018 adipiscing elit
NAVITIME
pero encontrar comida local, lugares de
interés, etc., puede ser todo un reto. Con
agrega chatbots
las aplicaciones de viaje típicas, los viajeros
pueden encontrar restaurantes y lugares
para mejorar
famosos, pero no información local. Así
que los viajeros preguntan a los lugareños,
la experiencia
lo cual puede ser difícil dadas las barreras
del idioma. Por ejemplo, muchos viajeros
de la aplicación
conocen el sushi como comida japonesa,
pero desconocen la buena comida local
de viajes
como el shirasu-don y el motsu-yaki.
Tecnologías utilizadas:
• Language Understanding Intelligent • Azure Cosmos DB (antes se llamaba
Service (LUIS) DocumentDB)
• API de Bing Spell Check • Búsqueda de Azure
• API de Bing Images Search • Azure Storage
• Custom Vision Service • Power BI
• API de Text Analytics
• Microsoft Bot Framework
• API de Direct Line
• Azure Web Apps
• Azure Functions
• API Management
Para B2B, ofrece aplicaciones de navegación para empresarios, consultoría para transporte
y publicidad. Para B2C, ofrece aplicaciones de navegación para viajar en tren, autobús, coche,
bicicleta o a pie y comenzó un negocio de viajes llamado NAVITIME Travel.
Solución y pasos
Arquitectura
Direct
Line
Usamos Bot Framework para implementar un chatbot y también usamos la API de Direct Line para
comunicarnos con el chatbot desde nuestra aplicación iOS (las aplicaciones Android y Windows
también pueden usar Direct Line). Para extraer la intención y las entidades de la entrada del usuario,
usamos LUIS. Admitimos la corrección ortográfica con la API de Bing Spell Check antes de pasar
el texto a LUIS. Después de extraer la intención y las entidades, llamamos a Búsqueda de Azure para
obtener información sobre la comida local y los lugares turísticos almacenados en Cosmos DB.
Caso práctico técnico: NAVITIME 75
Los usuarios pueden introducir texto libremente, lo que significa que a veces LUIS no puede
identificar las entidades. Por este motivo, también utilizamos la API de Text Analytics para obtener
la frase clave. Consulta Detectar sentimientos, frases clave e idiomas en la Guía de inicio rápido
de Azure Text Analytics. Luego pasamos la frase clave a Búsqueda de Azure.
Los usuarios también pueden comunicarse con el bot usando fotos. Para respaldar este escenario,
implementamos el reconocimiento de imágenes utilizando la API de Bing Images Search y la API
de Custom Vision.
DevOps y la mejora continua también son importantes a la hora de desarrollar bots. Para
administrar las versiones de bot, utilizamos API Management. Para almacenar el registro
de la entrada de usuario, llamamos a Azure Functions y guardamos los datos en Cosmos DB.
También utilizamos Búsqueda de Azure, Azure Storage y Power BI para supervisar los términos
de búsqueda. Podemos obtener las demandas de los usuarios a partir de los registros de texto
y repasar el bot una y otra vez.
1. Cuando un usuario inicia la aplicación por primera vez, el mensaje de notificación dice:
"¡Bienvenido! No dudes en pedirme consejos de viaje e información sobre lugares.".
Los usuarios pueden tocar el botón de chat (el cuarto desde la izquierda) en la lista de menú
para iniciar la comunicación con el chatbot. Los usuarios pueden introducir texto libre en inglés
y japonés, por ejemplo, "Quiero comer soba". El bot responde "¿Quieres...?" y recomienda un
restaurante. La aplicación también muestra un menú en el que los usuarios pueden seleccionar
la siguiente acción.
Caso práctico técnico: NAVITIME 77
El usuario puede tocar "Ver más resultados" para ver otra recomendación o "Probar otra palabra
clave" para introducir otras palabras clave. Al tocar el botón "Mapa" se muestra un mapa; al pulsar
"Ir al lugar (obtener indicaciones)" el usuario puede ver el mapa y cómo llegar al lugar. Como
NAVITIME tiene su propia tecnología de enrutamiento, el bot redirige al usuario a la aplicación
web de enrutamiento de NAVITIME.
Caso práctico técnico: NAVITIME 78
El usuario puede tocar "Ver más resultados" para ver otra recomendación o "Probar otra palabra
clave" para introducir otras palabras clave. Al tocar el botón "Mapa" se muestra un mapa; al pulsar
"Ir al lugar (obtener indicaciones)" el usuario puede ver el mapa y cómo llegar al lugar. Como
NAVITIME tiene su propia tecnología de enrutamiento, el bot redirige al usuario a la aplicación
web de enrutamiento de NAVITIME.
Caso práctico técnico: NAVITIME 79
Los viajeros tienden a cargar fotos en servicios de redes sociales como Instagram y Facebook.
Cuando otros usuarios ven las fotos, quieren ir a ese lugar o comer esa comida, pero no saben
dónde está ni cómo conseguirla. Los usuarios pueden enviar fotos a nuestro bot, lo que ayuda
a reconocer las imágenes e indicar a los usuarios qué es y cómo obtenerlo.
Caso práctico técnico: NAVITIME 80
Ejecución
MultiDialogSample en GitHub. Como
queríamos lanzar una aplicación iOS,
técnica
usamos la API de Direct Line.
Si quieres aprender a inicializar Cosmos DB y escribir código para la base de datos, empieza con
el tutorial Azure CosmosDB: desarrollar con la API de DocumentDB en .NET. Debes importar datos
para las pruebas y la producción siguiendo las instrucciones de Cómo importar datos a Azure
Cosmos DB para la API de DocumentDB.
[Serializable]
public class AzureSearchService
{
private static readonly string QueryString = $"https://
{WebConfigurationManager.AppSettings["SearchName"]}.search.windows.net
/indexes/{WebConfigurationManager.AppSettings["IndexName"]}/docs?api-
key={WebConfigurationManager.AppSettings["SearchKey"]}&api-
version=2015-02-28&";
Puedes usarlo desde Bot Framework con el siguiente código. Si deseas ver un proyecto
de muestra, ve a ryanvolum/AzureSearchBot en GitHub. Este proyecto describe cómo configurar
Búsqueda de Azure y Cosmos DB, y cómo llamar a Búsqueda de Azure desde un bot.
Aunque Bing Image Search nos ayuda a encontrar lugares y comidas famosos, es difícil reconocer
los lugares y los alimentos locales o menos conocidos. Por lo tanto, decidimos utilizar Custom Vision
Service. Para compilar, probar y utilizar esta API, comenzamos con el documento de introducción
Crear un clasificador utilizando el machine learning de Custom Vision Service.
Caso práctico técnico: NAVITIME 86
Para guardar las búsquedas de usuario, llamamos a Azure Functions y almacenamos los datos en
Cosmos DB. Azure Functions admite de forma nativa los enlaces de Cosmos DB y puede guardar
datos con poco código, como el siguiente.
#r "Newtonsoft.Json"
Puedes utilizar Power
using System; BI para acceder a los
using System.Net;
datos en Cosmos DB
using Newtonsoft.Json;
según la información
public static HttpResponseMessage Run(HttpRequestMessage req, de Orígenes de datos en
TraceWriter log, out string outputDocument)
Power BI Desktop. Para
{
log.Info($"Webhook was triggered!"); analizar los registros
string jsonContent = req.Content.ReadAsStringAsync().Result; de búsqueda, consulta
//Store Data in Cosmos DB
Análisis de los datos con
outputDocument = jsonContent;
Power BI.
dynamic data = JsonConvert.DeserializeObject(jsonContent);
Mejorar el rendimiento
de la respuesta
Usuarios
finales
La aplicación se
comunica entre
Japón y EE. UU. con
flujos de ida y vuelta.
Caso práctico técnico: NAVITIME 88
Conclusión
Los viajeros quieren tener una experiencia única del viaje, pero es difícil encontrar comida
local, lugares de interés, etc., con una aplicación normal. También resulta difícil encontrar esta
información comunicándose con los lugareños debido a la barrera del idioma.
El chatbot está ahora activo en la aplicación Kamakura Travel Guide. Los usuarios pueden encontrar
información local famosa y difícil de hallar usando tanto la aplicación como su bot incorporado.
“Es difícil crear lógica NLP en varios idiomas, pero LUIS resuelve
este problema. LUIS es realmente bueno en obtener las intenciones
del mensaje".
Ikuo Odanaka
Director de desarrollo, NAVITIME JAPAN
“Es el proyecto más fácil para mí. PaaS como Cosmos DB y Búsqueda
de Azure pueden ayudarnos a crear cosas nuevas rápidamente".
Shinichi Tanabe
Desarrollador de software sénior, NAVITIME JAPAN
Conclusión 89
en un mundo enfocado
2.
Datos e IA para
en la experiencia del cada desarrollador.
cliente y a medida
Los desarrolladores quieren aumentar sus
que las empresas aplicaciones con IA de la mejor manera
para ellos. Para sacar el máximo partido de
buscan nuevas formas la IA, quieren integrarla en sus aplicaciones
de obtener una ventaja utilizando una amplia gama de lenguajes
de programación, así como elegir entre
competitiva. Para una amplia variedad de orígenes de datos.
aprovechar al máximo
estas oportunidades, los
desarrolladores buscan:
3. Una plataforma
abierta y flexible.
Siguientes pasos
Copyright © 2018 Microsoft, Inc. Todos los derechos reservados. Este contenido solo tiene
fines informativos. Microsoft no ofrece ninguna garantía, expresa o implícita, con respecto
a la información que aquí se ofrece.