Documentos de Académico
Documentos de Profesional
Documentos de Cultura
AI en acción
En tres estudios de caso técnicos
se muestra cómo los desarrolladores
utilizan Azure AI para crear la próxima
generación de aplicaciones
Contenido 2
01 / 02 / 03 /
Introducción Estudio de caso técnico: Estudio de caso técnico:
Three (Reino Unido) Powel (Europa)
04 / 05 / 06 /
Estudio de caso técnico: Conclusión ¿Qué viene a continuación?
NAVITIME (Japón)
Introducción 3
Estudio de
caso técnico:
Three
Estudio de caso técnico:
Febrero LoremThree
ipsum dolor sit amet, consectetur 6
2018 adipiscing elit
El proveedor
y telecomunicaciones Three ha
experimentado informalmente con varios
de Internet
servicios de bot de chat en una variedad de
plataformas, pero busca garantizar la mayor
Three mejora
reutilización de código que sea posible
y reducir la sobrecarga de mantenimiento.
la atención
Su chat web existente ha demostrado tener
mucho éxito, pero aún hay consultas del
al cliente con
usuario sin resolver a través de esta interfaz.
Para resolver este problema, Three trabajó
un bot de chat
con Microsoft para crear un bot que guíe
a los usuarios a través de varios escenarios
de autoservicio
de autoservicio (que no requieran un agente
humano), como activar una tarjeta SIM
y responder preguntas generales, con el fin
Lilian Kasem
de comenzar rápidamente su producción.
13 de junio de 2017
Perfil del
Tecnologías clave
cliente:
• Microsoft Bot Framework
(Node.js)
• Microsoft QnA Maker
• Language Understanding
Intelligent Service (LUIS)
• Función Web Apps de Azure
App Service
• Azure Application Insights
Three es un proveedor
de telecomunicaciones y servicios
de Internet que opera en el Reino
Unido. La compañía comenzó en marzo
de 2003 como la primera red móvil
de video comercial del Reino Unido.
Ofrece servicios de 3G y 4G a través
de su propia infraestructura de red.
Declaración Soluciones
del problema y pasos
Durante los últimos 18 meses,
Requisitos previos
la funcionalidad de chat web existente
de Three ha demostrado ser muy exitosa,
• Instalar el código de Visual Studio
pero aún hay consultas del cliente
• Instalar Node.js
no resueltas a través de este interfaz
• Obtener las claves de Cognitive Services
existente. Estas incluyen las siguientes:
• Obtener una suscripción a Azure
Solución y arquitectura
La solución final en el hackfest fue un bot
de chat 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 (de la cual se encarga QnA Maker).
◦◦ Por ejemplo: "¿Qué es 3G?"
• Usar texto libre para indicarle al bot que haga algo (lo que activa el diálogo correspondiente).
◦◦ Por ejemplo: "Quiero migrar mi número".
• Simplemente puede hacer clic en un botón para activar el diálogo correspondiente.
◦◦ Por ejemplo: hacer clic en el botón "Activar SIM".
Todos los diálogos del bot incorporan la telemetría (mediante el uso de Azure Application Insights)
para hacer un seguimiento de dónde están navegando los usuarios dentro del flujo conversacional
del bot: qué tipos de preguntas hacen y cuánto tiempo toma completar una solicitud.
Los botones
(Nodo) seleccionados (Nodo)
Diálogo activan diálogos Diálogo Telemetría Azure
de bienvenida pertinente Application
con opciones. activado Insights
Texto Texto
** Todos los formularios pasan a través de
Reconoci- Entidades
miento de la de los "commonFormIntro.js" que:
(QnAMaker) entidad LUIS campos del 1. Pregunta al usuario si desea completar
Diálogo de formulario el formulario a través de un recurso HTML
bienvenida o mediante el bot.
con opciones. 2. Si elige la opción del bot, se le presentan
al usuario antes de que se ejecute
el formulario para asegurarse de tener
todos los datos necesarios.
Los principales flujos que Three quiso desarrollar durante el lanzamiento de la solución inicial
del bot fueron:
• Activar SIM
• Migrar un número
• Cancelar o actualizar un contrato
Estudio de caso técnico: Three 17
Entrega técnica
En esta sección se describen los detalles de implementación de la solución.
• ActivateSIM
• ActivateSIMForm
• CommonFormIntro
• ActivateSIMSubmit
ActivateSIM
Primero se pregunta a los usuarios cuál es el perfil que más se ajusta a ellos; esto ayudará al bot
de Three a completar el formulario correcto según el tipo de cliente con quien interactúe. Esto
se hace a través de un sistema de opciones. Según la respuesta del usuario, se llama a diferentes
diálogos, como CommonFormIntro o ActivateSIMForm. En muchos de los siguientes diálogos,
se utilizarán preguntas similares, como se muestra a continuación, para guiar a los usuarios.
Estudio de caso 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}
)
Estudio de caso técnico: Three 19
ActivateSIMForm
En este diálogo se hacen a los usuarios diversas preguntas que deben responder para completar
el formulario necesario a fin de activar la SIM. Este es un método útil para crear fácilmente
un formulario en el marco del 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]
Estudio de caso técnico: Three 20
CommonFormIntro
ActivateSIMSubmit
Se llama a este diálogo una vez que se ha completado ActivateSIMForm y se envía el formulario
a Three usando la solicitud para hacer una llamada REST POST a la API de Three. En la siguiente
imagen se muestra lo que ve el usuario después de haber enviado correctamente un formulario.
Migrar un número
Este diálogo es muy similar al de ActivateSIMForm y le hace al usuario las preguntas necesarias
para enviar un formulario que permitirá la migración del número del cliente. El envío también
se hace mediante 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?'},
Estudio de caso 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
Estudio de caso técnico: Three 24
Cancelar o actualizar
• Actualizar o Cancelar
• Cancelar
• Actualizar
Actualizar o Cancelar
Este diálogo simplemente pregunta a los usuarios si desean actualizar o cancelar; luego, se llama al
diálogo correspondiente según la elección del usuario. Esto se implementa con un sistema de opciones.
Cancelar
Este diálogo pregunta a los usuarios, mediante un sistema de opciones, si desean un código
PAC o conocer la fecha de finalización de su contrato. Según cuál sea la respuesta, responde
con el número de teléfono para llamar o el sitio web al que deben dirigirse.
Estudio de caso técnico: Three 25
Estudio de caso técnico: Three 26
Actualizar
Este diálogo hace lo mismo que el diálogo "Cancel" (Cancelar). Solicita el tipo de contrato y, luego,
según la respuesta, le da al usuario la página web que necesita para realizar la actualización.
Estudio de caso técnico:
Febrero LoremThree
ipsum dolor sit amet, consectetur 27
2018 adipiscing elit
En este proyecto, nos basamos principalmente en el uso de regex para determinar la intención
del usuario. Sin embargo, también quisimos utilizar Microsoft Language Understanding Intelligent
Service (LUIS) como respaldo en caso de que el usuario decida ingresar consultas de texto libre.
Creamos un modelo LUIS para manejar las intenciones de los tres flujos que creamos en este bot
(activar SIM, migrar un número, cancelar o actualizar).
Modelo de LUIS
A continuación, configuramos acciones de activación para cada diálogo del flujo principal, de modo
que si el modelo de 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 interpreta como una
intención ActivateSIM, que luego activaría el inicio del diálogo ActivateSIM porque la intención
coincide con la palabra clave triggerAction (ver a continuación). También configuramos
intentThreshold del activador de intención de LUIS para que solo las coincidencias superiores
a una clasificación de confianza de 0,5 activen el diálogo.
.triggerAction({
matches: 'ActivateSIM',
intentThreshold: 0.5
})
Estudio de caso técnico:
Febrero LoremThree
ipsum dolor sit amet, consectetur 28
2018 adipiscing elit
Puede aprender fácilmente cómo crear su propio modelo de LUIS en el sitio web de LUIS.
Estudio de caso técnico:
Febrero LoremThree
ipsum dolor sit amet, consectetur 29
2018 adipiscing elit
QnA Maker
Three usó el servicio QnA Maker de Microsoft Cognitive Services para responder a las preguntas
simples del cliente que se encuentran disponibles en línea (página de preguntas frecuentes de Three).
Esto se implementó rápidamente y permitió separar las consultas simples del cliente de la asistencia
humana directa.
Este es el diálogo de QnA que maneja todas las preguntas frecuentes. Llamamos a endDialog
para que el bot regrese al diálogo anterior en el que estaba el usuario cuando se 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
}
}
A continuación, se llama a este diálogo a través de UniversalBot. Esto significa que QnA Maker
aparece a nivel global en todo el bot. Si LUIS o cualquiera de las expresiones de regex no reconoce
la consulta del usuario, se enviará al diálogo de QnA.
La funcionalidad de QnA Maker también se activa cuando el usuario dice help (ayuda), quit (salir),
problem (problema) o support (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 registrar que el usuario
visitó el diálogo. Por ejemplo:
A continuación, podemos recuperar los resultados del seguimiento dentro del portal de Analytics
en Azure Application Insights:
Para rastrear cuánto tiempo tomó el envío de un formulario, se usó el siguiente código:
Conclusión Desafíos
Aprendizajes
Los mensajes de bienvenida no funcionan con Slack
Si inicia el diálogo de QnA, no hay salida obvia de este flujo de diálogo. El usuario se quedaría atascado
utilizando el servicio de QnA y no podría continuar usando los otros diálogos del bot, a menos que use
el comando restart (reinicio) global. La solución es llamar a la API de QnA directamente y finalizar
el diálogo una vez respondida la pregunta. De esta manera, los usuarios pueden hacer una pregunta
en medio de cualquier otro diálogo, obtener una respuesta a través del servicio de QnA y, luego,
continuar con el diálogo en el que estaban. Puede encontrar la implementación en la sección "Entrega
técnica" de este documento (en QnA Maker) o en este repositorio de GitHub de ejemplo.
Mediante el uso de regex y acciones, podemos configurar comandos globales que los usuarios
pueden utilizar en cualquier momento en el bot. Esto permite a los usuarios regresar de un diálogo
cuando se atascan en un flujo conversacional.
intents
.matches('LUIS_Intent', '/dialog')
.matches('LUIS_Intent', '/dialog')
.onDefault(builder.DialogAction.send("I'm sorry. I didn't
understand."));
Descubrimos que era mucho más fácil hacer coincidir las intenciones de LUIS con los diálogos
a través de triggerActions (que simplemente se agrega al final de un diálogo). Esto también nos
permitió descubrir que puede configurar un umbral que deben alcanzar las intenciones de LUIS
antes de que se activen mediante el uso de intentThreshold. La opción predeterminada es activar
acciones incluso si la confianza de la coincidencia es menor que 0,1.
.triggerAction({
matches: 'ActivateSIM',
intentThreshold: 0.5
})
También puede agregar un intentThreshold a nivel global, para que se aplique a todas las
coincidencias de LUIS:
Hemos desarrollado una manera clara de hacer preguntas a los usuarios para completar
un formulario mediante recursividad del diálogo.
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?'}
]
Planes de producción
El plan para este bot es atravesar una prueba A/B en las próximas semanas, para que
lo puedan evaluar clientes reales. Después de esta prueba A/B de una semana, el plan
es pasar este bot a producción en el término de meses.
Desde una perspectiva más lejana, Three reconoce que puede brindar una experiencia más
enriquecedora mediante lo siguiente:
• En lugar de que haya vínculos a recursos en el sitio web de Three, el usuario puede
hacerle preguntas al bot sobre el tema de la página y recibir respuestas según el
contenido de esta.
• Integración con las API: hay API basadas en la red sobre problemas de interrupción
y cobertura, así como sobre notificación de problemas, que se podrían incluir en una
experiencia de bot.
• Publicación en formularios: por ejemplo, solicitar una SIM o migrar un número a Three
se puede facilitar mediante el bot.
Recursos Documentación:
Microsoft Bot Framework
Código:
Ejemplo de indicación única de QnA para el SDK
de Node.js
Ejemplo de llenado de formulario simple para el SDK
de Node.js
Equipo Microsoft:
Lilian Kasem, evangelizadora técnica
Simon Michael, evangelizador técnico sénior
Bill Barnes, ingeniero principal de desarrollo de software
Three:
Justin Beasley, gerente principal de desarrollo digital
Nick Bishop, gerente de desarrollo digital
Stuart Brown, gerente de desarrollo digital
Thomas Barton, líder de Scrum
Dimos Fountoukos, desarrollador de software
Estudio de caso técnico: Powel 41
Estudio de
caso técnico:
Powel
Estudio de caso técnico:
Febrero LoremPowel
ipsum dolor sit amet, consectetur 42
2018 adipiscing elit
el bot asistente
un nuevo bot llamado André. El objetivo
del hackfest fue crear un bot de chat
impulsado por
impulsado por voz que podría ayudar a los
ingenieros de campo en las redes eléctricas
voz, para mejorar
a responder preguntas y proporcionar
funcionalidades de informes durante las
la inspección
inspecciones para que ellos no tuvieran
que usar las manos. La solución se creó con
en el lugar
herramientas de Microsoft que hacían uso
de bots de chat y conversaciones como
plataforma (CaaP).
Pedro Dias y Anders Gill
19 de junio de 2017
Estudio de caso técnico: Powel 43
• Tor Hovland,
• Automatización de pruebas ingeniero de software
• Escenarios de integración continua/
entrega continua (CI/CD) • Simen Karlsen,
activador de red inteligente
El hackfest tuvo lugar después de varias • Øystein Askeland,
llamadas en las que se desmitificó el área diseñador de interacción
problemática y se establecieron las
metas del hackfest. Microsoft
• Pedro Dias,
evangelizador técnico sénior
• Anders Gill,
evangelizador técnico
Estudio de caso técnico: Powel 44
Resumen
de la solución
Powel prevé un futuro en el cual los El objetivo fue ser capaces de diseñar dos
ingenieros del lugar puedan usar su voz diálogos de conversación muy diferentes
natural para acceder al soporte asistido con las suficientes funcionalidades
por computadora durante las inspecciones para probarse en el campo. En función
de las instalaciones de energía. Durante de estos diálogos, Powel habrá acumulado
la inspección de una estación eléctrica suficiente experiencia con CaaP para
o línea de energía, André, una aplicación enriquecer André y diseñar aplicaciones
de telefonía basada en Xamarin, permitirá conversacionales similares para usar
que los ingenieros tengan las manos en otras áreas.
libres, lo que proporcionará un proceso
más fluido que el tener que completar Utilizamos Xamarin.Forms, Microsoft Bot
un formulario de papel o registrar Framework, LUIS y Cognitive Services
datos en una aplicación del dispositivo. para desarrollar un bot que permitiría que
Mediante el uso de las capacidades los ingenieros le hablen a la aplicación
de un dispositivo portátil, como un de Android Xamarin.Forms. La aplicación
teléfono móvil, la aplicación entenderá utiliza el motor de reconocimiento de voz
automáticamente qué instalación se está de Google para convertir audio en texto;
inspeccionando al obtener la ubicación a continuación, el texto se enviaría
GPS del usuario y proporcionará las listas a LUIS para determinar la intención
de verificación necesarias y los diálogos del usuario en cualquier momento
correspondientes a esa instalación. durante la conversación. En función
de las intenciones y entidades detectadas,
El hackfest se centró en dos objetivos Bot Framework enviaría la respuesta
distintos de la inspección: correspondiente de nuevo a la aplicación
del cliente que leería la respuesta
• Centrales eléctricas al ingeniero, ayudándolo a permanecer
• Tendido eléctrico seguro al no tener que usar las manos.
Estudio de caso técnico: Powel 45
Una característica en particular que realmente amplía la utilidad de este bot es la integración de Bot
Framework en el sistema de back-end de Powel. Integramos correctamente el bot a los sistemas
que, por ejemplo, permitirían a los ingenieros extraer información valiosa, como, por ejemplo:
Como resultado, un ingeniero debe recordar Una inspección podría constar de varias
qué tiene que verificar, qué problemas etapas: desde evaluar las instalaciones
potenciales podría haber, si se realizó y brindar datos sobre los tipos de
otro tipo de mantenimiento en este poste problemas descubiertos (actualmente
o esta estación en particular, qué tipos basados en una lista de verificación) hasta
de soluciones permiten resolver cualquiera realmente resolver los problemas. Algunos
de los problemas descubiertos, entre otras de los problemas comunes varían desde
cuestiones. Con estos datos, el ingeniero pájaros carpinteros que picotean los postes
tiene que dirigirse nuevamente a la oficina o grafitis hasta problemas más graves,
principal para entregar la información a sus como fallas en componentes eléctricos
colegas o digitalizarla él mismo. Durante de alta tensión.
este período, se podría perder información
valiosa y contextos específicos que En resumen, el bot de chat podrá
se reunieron durante la inspección. realizar las siguientes tareas:
Powel requiere de una solución que permita • Permitirá evitar problemas de seguridad
a los ingenieros no usar las manos mientras al no usar las manos.
siguen sumando valor a la conversación. • Proporcionará información específica
Un bot de chat activado por un simple relacionada con instalaciones
"Hola, André" podría posiblemente aliviar en particular.
al ingeniero de tener que recordar todas • Gestionará la entrega de notas
las tareas que debe ejecutar durante de la inspección actual para que
la inspección. Lo bueno de un bot de chat no se pierda ninguna información
de este tipo es que se podría conectar durante la inspección.
a todos los otros sistemas que son relevantes • Respaldará al ingeniero con otra
y, de esta manera, podría proporcionar información relevante que podría ser
al ingeniero toda la información que importante conocer o que podría haber
necesita. Este fue uno de nuestros objetivos olvidado durante la inspección.
para el hackfest: poder desarrollar un
bot de chat simple que pueda transmitir
diálogos a sistemas externos y devolver
información valiosa que pueda aumentar
la eficiencia durante una inspección.
Estudio de caso técnico: Powel 48
Solución
Como trabajador de campo, quisiera
poder enviar las inspecciones correctas
y pasos
a un bot para no tener que llenar un
formulario para tal fin.
Panel de Kanban
El bot de chat de PoC actual permite al ingeniero de campo ejecutar una inspección iniciando una
conversación a través de su voz natural, preguntar sobre sus capacidades, seleccionar una subestación
y registrar una discrepancia de un tipo específico con un comentario. Esto satisface el sistema de
retroalimentación al enviar datos directamente al back-end de Powel para que el ingeniero de campo
ya no tenga que estar presente físicamente en las oficinas a fin de registrar la misma información.
Diagrama de la arquitectura
Estudio de caso técnico: Powel 52
Entrega técnica
Ahora tiene todo lo que necesita para crear
una aplicación de bot. Para obtener una
referencia completa sobre cómo empezar
con Bot Builder, consulte el SDK de Bot
Builder para .NET.
Configuración del
entorno de desarrollo Día de logros 1
André es una aplicación de Xamarin.Forms,
Para empezar con el proyecto, tuvimos
por lo que tuvimos que implementar los
que instalar y configurar lo siguiente:
servicios nativos para que la aplicación
móvil escuchara y hablara a través
Visual Studio
de la interfaz de reconocimiento de voz
de Google. También comenzamos
• Instale Visual Studio 2017 (Visual Studio
a trabajar en los componentes de chat
2015 también funciona) Nota: Asegúrese de
de la aplicación.
que Xamarin se incluya en la instalación de Visual
Studio para desarrollar la aplicación André.
Con LUIS, hicimos 10 intentos descritos
y probados con enunciados. Comenzamos
• Descargue e instale el emulador de Bot
a escribir diálogos imaginarios entre
Framework
un usuario y la aplicación para comprender
mejor cómo fluiría la conversación.
• Descargue e instale la plantilla del bot
También empezamos a experimentar con
para Visual Studio para C#
entidades de LUIS y logramos que las
intenciones reconocieran y utilizaran estas
Language Understanding Intelligent
entidades.
Services (LUIS)
Día de logros 2
Concluimos la conexión directa mediante el uso de la biblioteca de clases portátiles (PCL)
WebSockets, pero al final optamos por HTTP, porque no pudimos lograr que PCL funcionara.
Esto se debió en gran parte al desafío de conseguir que WebSockets funcionara en Android; en este
punto, no estábamos seguros si habíamos logrado una solución rápida, así que, por cuestiones
de tiempo, dejamos de intentarlo y centramos nuestros esfuerzos en conseguir que todo funcione.
Conectamos las API del back-end de Powel a través de algunos paquetes de NuGet
internos de Powel y llamamos a los métodos en los objetos que están dentro.
Fue fácil acceder a estos paquetes de NuGet a través de Visual Studio Team Services
para CI. Debido a la sensibilidad del código, no podemos compartir ejemplos de código
específicos, pero en esencia usamos las API para obtener identificadores de instalación
por ubicación de GPS (longitud/latitud) y para enviar los datos del informe.
Conectamos la aplicación móvil al bot y logramos que funcionara. También destinamos un tiempo
a diseñar la aplicación Xamarin.Forms y a asegurarnos de que la interfaz y la experiencia del usuario
fueran buenas.
Estudio de caso técnico: Powel 55
La siguiente imagen es un bosquejo básico inicial de la interfaz de diseño que hicimos con
PowerPoint Storyboarding.
También trabajamos para incluir los paquetes de NuGet de las API principales de Powel
(específicamente, la API Condition Monitoring) en la compilación para el bot. Trabajamos
en algunos planes de flujo de conversación para una posterior implementación y pasamos más
tiempo trabajando con las intenciones y capacitando a LUIS para que las reconociera.
Estudio de caso técnico: Powel 56
Pasamos mucho tiempo en los objetos PromptDialog porque nos olvidamos de establecer
la implementación del diálogo como [Serializable].
Algunos problemas con la versión de .NET Framework que no coincidía con Bot Framework
WebApiConfig de la plantilla del bot hizo que todos los nombres de parámetros quedaran con
mayúsculas y minúsculas estilo JSON. La API interna de Powel no lo aceptó, lo que nos tomó
un tiempo descubrir.
La configuración inicialmente era algo como esto.
Día de logros 3
La última parte del hackfest fue la configuración de la automatización de la compilación del
proyecto Xamarin.Forms mediante el uso de Visual Studio Mobile Center, además de descubrir
las posibilidades para lograr que una conversación fluya por diferentes diálogos.
En el siguiente diagrama se muestra el flujo final del bot de chat PoC. (Lamentablemente,
no implementamos la traducción del texto debido a las limitaciones de tiempo, pero
sí incluimos esa parte en la siguiente imagen).
Un trabajador de campo le habla a André (la aplicación móvil) en su idioma natural. El motor
de reconocimiento de voz de Google transforma la voz en texto y lo regresa a la aplicación
móvil. La aplicación envía el texto para su traducción y recibe un texto completamente traducido
a cambio. A continuación, la aplicación pasa el texto traducido a LUIS, que capta la intención
y las entidades para devolver la respuesta a la aplicación móvil. La aplicación móvil envía
la intención y las entidades detectadas (incluido el id. del trabajador de campo) a Bot Framework,
que envía una solicitud al back-end de Powel. La respuesta adecuada se devuelve a la aplicación
móvil, que traduce el texto al idioma del trabajador de campo y dice el texto en voz alta.
Estudio de caso técnico: Powel 58
Gestión de diálogos
En Bot Framework, un diálogo funciona como el "cerebro" del bot de chat.
Por ejemplo, cuando LUIS reconoce la intención del usuario como "happy" (feliz), Bot Framework
procederá a ese método en particular con la intención y proporcionará la respuesta adecuada.
[LuisIntent("happy")]
public async Task Happy(IDialogContext context, LuisResult result)
{
await context.PostAsync("That's so kind of you!");
context.Wait(MessageReceived);
}
Estudio de caso técnico: Powel 59
Otro ejemplo es 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);
}
Estudio de caso técnico: Powel 60
También se desarrollaron diálogos más complejos en los que Bot Framework se comunica con
el back-end correspondiente de Powel y menciona los tipos de discrepancia posibles entre los
cuales el ingeniero puede elegir.
[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 recoger las entradas de
un usuario. Este tipo de solicitud se usó durante todo el proyecto del bot, como cuando André
le pregunta al ingeniero de campo si está satisfecho con la inspección y desea terminar. Esto
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, al ingeniero de campo se le pide que confirme con "Sí" o "No" (presionando
el botón correspondiente o usando su voz natural para responder), pero se pueden elegir muchos
otros tipos de entradas de colección de datos:
FormFlow
Como hemos visto, los diálogos funcionan como un poderoso mecanismo para guiar una
conversación, pero pueden volverse complejos cuando el rompecabezas tiene muchas piezas
pequeñas, como ordenar un sándwich. Para simplificar una conversación guiada, Bot Framework
ofrece una forma mucho más fácil de crear un diálogo, denominada FormFlow. Un diálogo FormFlow
guía al usuario para completar el formulario mientras le brinda ayuda y orientación en el transcurso.
El diálogo del formulario se usa cuando el ingeniero de campo necesita enviar una discrepancia, para
la cual debe completar los campos restantes, incluidos el tipo de discrepancia y el comentario.
[Serializable]
public class DiscrepancyFormDialogBuilder
{
public string DiscrepancyType;
public string Comment;
Connector
Bot Framework Connector es un componente que proporciona una sola API para que el bot
se comunique a través de varios servicios del cliente, como Skype, correo electrónico y Slack.
Debido a que ya estábamos usando Slack para la comunicación en el hackfest, decidimos configurar
la integración con Slack para que podamos hablar con el bot eficazmente (lea sobre los pasos para
configurar los canales del bot en la sección "Configuración de canales" de Introducción a Connector).
En la siguiente imagen, puede ver cómo se prueba una conversación con Slack.
if (string.IsNullOrEmpty(settingValue))
settingValue = GetByLocalJsonFile(index);
return settingValue;
}
}
if (!json.HasValues)
return string.Empty;
return json[index].Value<string>();
}
Estudio de caso técnico: Powel 66
Esto nos permite crear un nuevo objeto LuisModelAttribute por el que pasamos la appId
y la appKey en el controlador de mensaje.
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);
}
Dado que hay demasiado código para mostrar y explicar en este informe, puede encontrar
todo el código fuente para el hackfest en el repositorio de GitHub
readyforchaos/Powel-power-station-inspection-bot.
Estudio de caso técnico: Powel 67
Conclusión
Los resultados del hackfest fueron empezar. Una vez que haya entendido
sorprendentes; además, es fascinante pensar cómo hacerlo, pasará la mayor parte del
que los desarrolladores de Powel pasaron de tiempo diseñando flujos conversacionales
no saber nada sobre Bot Framework a crear y menos tiempo creando códigos.
satisfactoriamente un bot de chat integrado
que pudiera gestionar conversaciones en Poder acceder a toda la información dentro
varios sistemas y proporcionar información del back-end de Powel a través de la voz
muy necesaria para los ingenieros de natural en una aplicación impulsa a los
campo. Powel está dedicado a continuar ingenieros a tomar decisiones basadas
con el desarrollo del bot de chat durante en conocimientos que simplemente pueden
los próximos meses para incluir los análisis y obtener mediante la aplicación, lo que deriva
la vista histórica de partes específicas antes en informes de inspección más precisos.
de su lanzamiento. Además, se dedica a
ampliar el concepto a áreas y dominios de Poder registrar discrepancias de inmediato,
aplicación de Powel más allá del segmento solicitar detalles de inspección y obtener
de negocios de la energía. otra información relacionada permite a
los ingenieros no tener que usar papeles
Desde el punto de vista de un desarrollador, durante las inspecciones. De este modo, hay
todas las piezas necesarias están ahí, menos probabilidades de que se olviden
e integrarlas para crear una solución un punto de inspección; además, no tienen
pareció demasiado fácil. Los obstáculos el trabajo extra de tener que regresar
que encontramos no se relacionaron a la oficina a digitalizar sus hallazgos.
directamente con el propio Bot Framework,
sino más específicamente con los desafíos Lo bueno de este hackfest es que pudimos
de Xamarin. crear algo que realmente funciona y que
podríamos comenzar con su producción
Los lineamientos proporcionados para ahora mismo. Con LUIS y Bot Framework,
Bot Framework y LUIS tienen el potencial ahora podemos darle al trabajador de
de mejorar, pero es suficiente como para campo el soporte que necesita cuando
lo necesita y sin que use las manos.
Estudio de caso técnico: Powel 69
Progreso
No pudimos incluir todas las características que esperábamos en el hackfest de tres días.
Las características previstas que no se incluyeron fueron las siguientes:
• Traducir el texto
• Cargar imágenes desde la aplicación del cliente
• Activar André mediante voz natural en lugar de usar un botón
• Descubrir el PCL de WebSockets y solucionarlo
Powel tiene como objetivo resolver estas cuestiones en breve después del hackfest para producir
un prototipo que funcione y que se pueda probar en el campo lo antes posible.
Recursos adicionales
¿Desea probar Bot Framework ahora mismo? Comience aquí:
Microsoft Bot Framework
Estudio de
caso técnico:
NAVITIME
Estudio de caso técnico:
Febrero LoremNAVITIME
ipsum dolor sit amet, consectetur 71
2018 adipiscing elit
NAVITIME agrega
únicas, pero encontrar comida local,
excursiones y afines puede ser todo
bots de chat
un desafío. Con las aplicaciones de viaje
típicas, los viajantes pueden encontrar
para mejorar
restaurantes y lugares famosos, pero
no información local. Entonces, los
la experiencia
viajantes preguntan a la gente local,
lo que puede ser difícil por las barreras
en aplicaciones
del idioma. Por ejemplo, muchos viajantes
conocen el sushi como comida japonesa,
de viaje
pero no conocen excelentes comidas
locales como shirasu-don y motsu-yaki.
Tecnologías usadas:
• Language Understanding Intelligent • Azure Cosmos DB (anteriormente
Service (LUIS) llamado DocumentDB)
• API Bing Spell Check • Azure Search
• API Bing Images Search • Azure Storage
• Custom Vision Service • Power BI
• API Text Analytics
• Microsoft Bot Framework
• API Direct Line
• Azure Web Apps
• Azure Functions
• API Management
Solución y pasos
Arquitectura
Direct
Line
Usamos Bot Framework para implementar un bot de chat y también usamos la API Direct Line para
comunicarnos con el bot de chat de nuestra aplicación iOS. (Las aplicaciones de Android y Windows
también pueden usar Direct Line). Para extraer las intenciones y las entidades de las entradas del
usuario, usamos LUIS. Proporcionamos compatibilidad con la corrección ortográfica mediante
el uso de la API Bing Spell Check antes de pasar el texto a LUIS. Después de extraer las intenciones
y las entidades, llamamos a Azure Search para obtener información sobre comidas locales
y excursiones almacenadas en Cosmos DB.
Estudio de caso técnico: NAVITIME 75
Los usuarios pueden ingresar texto libremente, lo que significa que a veces LUIS no puede
identificar entidades. Por este motivo, también usamos la API Text Analytics para obtener la frase
clave. (Consulte Cómo detectar opiniones, frases clave e idiomas en la Guía de inicio rápido
de Azure Text Analytics). A continuación, pasamos la frase clave a Azure Search.
Los usuarios también pueden comunicarse con el bot mediante fotos. Para respaldar este escenario,
implementamos el reconocimiento de imágenes mediante el uso de la API Bing Images Search
y la API Custom Vision.
DevOps y la mejora continua también son importantes cuando se desarrollan bots. Para administrar
las versiones del bot, utilizamos API Management. Para almacenar el registro de entrada del
usuario, llamamos a Azure Functions y guardamos los datos en Cosmos DB. También usamos Azure
Search, Azure Storage y Power BI para monitorear los términos de búsqueda. Podemos recibir las
solicitudes de los usuarios de los registros de texto y pulir el bot una y otra vez.
1. Cuando un usuario ejecuta la aplicación por primera vez, aparece un mensaje de notificación
que dice: "¡Bienvenido! No dude en pedirme sugerencias de viaje e información de lugares".
Los usuarios pueden presionar el botón de chat (el cuarto desde la izquierda) en la lista del menú
para iniciar la comunicación con el bot de chat. Los usuarios pueden ingresar texto libre en inglés
y japonés, como "Quiero comer soba". El bot responde: "¿Desea...?" y recomienda un restaurante.
La aplicación también muestra un menú en el cual los usuarios pueden seleccionar la próxima acción.
Estudio de caso técnico: NAVITIME 77
El usuario puede presionar "Ver más resultados" para ver otra recomendación o "Probar con otra
palabra clave" para ingresar palabras clave diferentes. Presionando el botón de mapa, aparece
un mapa; presionando "Ir al lugar (Obtener dirección)", el usuario puede ver el mapa y cómo llegar
a la ubicación. Dado que NAVITIME tiene su propia tecnología de enrutamiento, el bot redirige
al usuario a la aplicación web de enrutamiento NAVITIME.
Estudio de caso técnico: NAVITIME 78
El usuario puede presionar "Ver más resultados" para ver otra recomendación o "Probar con otra
palabra clave" para ingresar palabras clave diferentes. Presionando el botón de mapa, aparece
un mapa; presionando "Ir al lugar (Obtener dirección)", el usuario puede ver el mapa y cómo llegar
a la ubicación. Dado que NAVITIME tiene su propia tecnología de enrutamiento, el bot redirige
al usuario a la aplicación web de enrutamiento NAVITIME.
Estudio de caso técnico: NAVITIME 79
Los viajantes suelen subir fotos a los servicios de redes sociales, como Instagram y Facebook.
Cuando otros usuarios ven esas fotos, quieren ir a ese lugar o comer esa comida, pero no saben
dónde está o cómo conseguirla. Los usuarios pueden enviar fotos a nuestro bot, lo que ayuda
a reconocer imágenes e indica a los usuarios qué es y cómo conseguirlo.
Estudio de caso técnico: NAVITIME 80
Entrega técnica
MultiDialogSample en GitHub. Debido
a que queríamos lanzar una aplicación iOS,
utilizamos la API Direct Line.
En esta sección se describe cómo
implementar un bot similar mediante Extraer la intención y
el uso de Bot Framework, Cognitive
Services y Azure.
las entidades con LUIS
y la API Bing Spell Check
Requisitos previos Para la extracción de intenciones y entidades
de los mensajes del usuario, usamos LUIS.
• Instale Visual Studio y el SDK de Bot
Dado que los usuarios a veces escriben
Builder siguiendo los pasos en el
de forma incorrecta y LUIS no puede extraer
tutorial Cree un bot con el SDK de Bot
la intención, también utilizamos la API Bing
Builder para .NET.
Spell Check para detectar y corregir errores
• Instale el emulador de Bot Framework;
antes de enviar mensajes a LUIS mediante
consulte Cómo depurar bots con
los pasos siguientes.
el emulador de Bot Framework para
obtener más detalles.
1. Desde el portal de Azure, agregue
• Cree una cuenta gratuita de Azure
la API Bing Spell Check.
si aún no tiene una.
2. En el menú de LUIS, elija Mis claves.
• Cree una aplicación con LUIS que
3. Elija Claves externas y Agregar nueva
se ajuste a su escenario y llámela desde
clave para agregar una clave de la API
el bot (consulte el enlace de acción
Bing Spell Check a LUIS.
de LUIS para aplicaciones web).
4. Vaya a la aplicación LUIS y elija Publicar
aplicación en el menú de la izquierda.
Desarrollar un bot con 5. En la parte inferior, seleccione el botón
Bot Framework Agregar asociación de clave para
vincular la API Bing Spell Check con LUIS.
Después de los pasos de requisitos previos, 6. Seleccione Habilitar verificación
comenzamos a implementar nuestro ortográfica de Bing, lo que cambia
propio bot mediante el uso del código la URL del punto de conexión. Use
esta URL para llamar a LUIS con
la API Bing Spell Check.
Estudio de caso técnico: NAVITIME 81
Si desea obtener información sobre cómo inicializar Cosmos DB y escribir código para ello,
comience con el tutorial Azure CosmosDB: desarrolle con la API DocumentDB en .NET. Debe
importar datos para pruebas y producción siguiendo las instrucciones en 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&";
Puede utilizarlo desde Bot Framework con el siguiente código. Si desea ver un proyecto de ejemplo,
vaya a ryanvolum/AzureSearchBot en GitHub. En este proyecto se describe cómo configurar Azure
Search y Cosmos DB, además de cómo llamar a Azure Search desde un bot.
Si bien Bing Image Search nos ayuda a encontrar lugares famosos y comidas, es difícil reconocer
las comidas y los lugares locales o poco conocidos. Por lo tanto, decidimos utilizar Custom Vision
Service. Para crear, probar y usar esta API, comenzamos con el documento de introducción Crear un
clasificador mediante "machine learning" de Custom Vision Service.
Estudio de caso técnico: NAVITIME 86
Para guardar las búsquedas de los usuarios, llamamos a las funciones de Azure y almacenamos
los datos en Cosmos DB. Las funciones de Azure son compatibles nativamente con los enlaces
de Cosmos DB y pueden guardar los datos utilizando solo un pequeño código, como el siguiente.
Mejorar el rendimiento
de respuesta
Usuarios
finales
La aplicación
se comunica entre
Japón y EE. UU. ida
y vuelta.
Estudio de caso técnico: NAVITIME 88
Conclusión
Los viajeros quieren tener una experiencia única de viaje, pero les resulta difícil encontrar comidas
locales, excursiones turísticas y mucho más con una aplicación normal. También son difíciles
de encontrar comunicándose con la gente local debido a la barrera del idioma.
El bot de chat se encuentra activo en la aplicación Kamakura Travel Guide (Guía de viaje
de Kamakura). Los usuarios pueden encontrar información local conocida y desconocida
mediante el uso de la aplicación y el bot integrado.
"Es difícil hacer la lógica de NLP en varios idiomas, pero LUIS soluciona este
problema. LUIS es muy bueno para descubrir las intenciones en el mensaje".
Ikuo Odanaka
Gerente de desarrollo, NAVITIME JAPÓN
mundo centrado en la
2.
Datos y AI para
experiencia del cliente cada desarrollador.
y que las compañías
Los desarrolladores desean aumentar sus
buscan nuevas formas aplicaciones con AI de la mejor manera para
ellos. Para aprovechar AI al máximo, desean
de obtener una ventaja integrarla en sus aplicaciones mediante
competitiva. Para el uso de una amplia gama de lenguajes
de programación y de la elección entre una
aprovechar al máximo variedad de fuentes de datos.
¿Qué viene a
continuación?
Lo invitamos a explorar Azure AI Services a
través de los siguientes enlaces:
Copyright © 2018 Microsoft, Inc. Todos los derechos reservados. Este contenido tiene
únicamente fines informativos. Microsoft no realiza garantías, expresas o implícitas,
con respecto a la información que aquí se presenta.