Consumir API REST QnA Maker con Bot Framework V3

Yudner Tayson Paredes Flores
My Bots Latam
Published in
5 min readNov 2, 2018

Microsoft QnA Maker es un servicio que integra AI para responder las preguntas de los usuarios de una manera más natural y conversacional. QnA Maker es un servicio de preguntas y respuestas con una interfaz administrativa que permiten alimentar, entrenar, probar y desplegar.

Crear un proyecto Bot Application

File> New> Project> Bot Application

Actualizar Microsoft.Bot.Builder

Es importante separar las claves, con el fin de ser utilizadas en alguna u otra funcionalidad que pueda ser creada más adelante; en base a eso, en una carpeta “Constants” crearé una clase “QnaMakerConstants” donde estarán todas las credenciales necesarias para consumir el servicio QnA Maker.

Estas credenciales podemos obtenerlas más adelante al publicar el servicio de preguntas y respuestas en el portal de QnA Maker: https://www.qnamaker.ai

Crear y configurar el servicio QnA Maker en el portal Azure

Al crear el servicio cognitivo QnA Maker, adicionalmente se integrarán otros servicios como:

  • Azure Search
  • App Service Plan
  • App Service
  • App Insights (Opcional)
  1. En un grupo de recursos ya creado, agregar un recurso con la opción “Add”.
  2. Buscar el servicio QnA Maker > Crear.
  3. Ingresar los datos necesarios para crear el servicio.
Parte 2.

Es importante recalcar que el servicio “App Service Plan” define por defecto un nivel de facturación S1 (Standar) pero, puede ser modificada a un nivel Free (F1) si fuera necesario. 👇

Crear una Base de conocimiento en el portal QnA Maker

Ingresar a https://www.qnamaker.ai/ > Create a knowledge base > Ingresar los campos necesarios para crear la base de conocimiento. 🔽

El campo URL es opcional si se quiere incluir cierta página que contenga preguntas frecuentes y agregar como base de conocimiento. Sin embargo, si se quiere agregar preguntas manualmente desde cero, podemos dejar vacío dicho campo.

Es posible agregar, editar y eliminar las preguntas y respuestas que tenemos en el portal de administración. Es muy importante mencionar que cada vez que se agrega una o un conjunto de preguntas y respuestas, en necesario entrenar y publicar como se indica en la imagen. 👇

Al publicar la base de conocimiento, QnA Maker proporciona las credenciales que permitirán consumir una API REST desde código fuente.

Con estas credenciales podemos completar nuestra clase “QnaMakerConstants” creada anteriormente.
En la clase “QnaMakerConstants”, el campo AnswerNotFound contiene la respuesta por defecto que devuelve el servicio cuando no encuentra una respuesta válida de la base de conocimiento.

En base a la documentación oficial de QnA Maker, el servicio devuelve la información en un formato JSON con campos que contiene:
- Pregunta detectada (questions)
- Respuesta o posible respuesta (answer)
- Probabilidad de certeza de la respuesta (score)
- Origen de la base de conocimiento (source)
- Metadatos (metadata)

En tal sentido, transformamos este formato JSON a C# para poder manejar nuestros datos.
Por eso creamos una carpeta “Services”, dentro una carpeta “QnAMaker” y agregamos una clase “QnAMakerModel” que tendrá el modelo del formato JSON para ser deserializado.

En la carpeta “QnAMaker” agregamos una clase “QnAMakerService” para implementar el servicio que se consumirá.

Crearemos un método “GetAnswer” que recibirá una solicitud(pregunta del usuario) y en base a esa solicitud retornará un string, que será la respuesta que devuelva el servicio.

Para ejecutar la API REST, como elección personal utilizo la biblioteca completa de cliente HTTP llamada RestSharp.

El método “GetAnswer” contiene el formato de la URL del la API REST para ejecutar un POST, agregando las credenciales obtenidas por el servicio que guardamos en la clase “QnAMakerConstants”.

Finalmente agregamos una condición en base a los datos que retornan del servicio, si existe alguna respuesta válida contenida en la base de conocimiento y la puntuación de probabilidad es mayor de 0.4 (40%) se mostrará la respuesta, sino, retornará la respuesta por defecto cuando no se encuentra una respuesta válida.

En la clase “RootDialog” de la carpeta “Dialogs”, modificamos los métodos por defecto que trae Bot Application.

En el método “MessageReceivedAsync”, capturamos la solicitud (pregunta) del usuario en una variable “message”, luego instanciamos el servicio creado anteriormente para consumir y recibir una respuesta de la base de conocimiento de QnA Maker.
Condicionamos que, si retorna una respuesta inválida, mostramos una respuesta personalizada indicando que el Bot no puede entender la solicitud del usuario, sino mostramos la respuesta que devuelve el servicio.

Probar en el Emulador Bot Framework

Respuesta no encontrada en la base de conocimiento.
Respuesta encontrada en la base de conocimiento.
verificación de la respuesta en la base de conocimiento.

Código fuente:https://github.com/Yudner/ChatBotDeveloper (Ejemplo 9)

Vídeo del desarrollo: https://www.youtube.com/watch?v=y3es-bdkwHc&list=PL4QAOIojsrfAnLP2LuAh0FWG4D7QqJu06&index=13

Documentación QnA Maker: https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/overview/overview

--

--

Yudner Tayson Paredes Flores
My Bots Latam

Software Developer 💻 | Cognitive Services Specialist 🚀 | Soccer⚽ | Game 🎮