Varios usuarios de Rasa han migrado desde plataformas de desarrollo de chatbot como LUIS, Wit.ai, o desde la que hemos visto en mayor porcentaje, DialogFlow (anteriormente Api.ai). Es seguro decir que podemos ver una tendencia en la que cada vez más desarrolladores comienzan a construir sus asistentes usando plataformas alojadas como DialogFlow, pero eventualmente enfrentan limitaciones de desarrollo y toman la decisión de cambiar a una solución de código abierto: Rasa Stack.

Estas son las razones principales por las que los desarrolladores eligen Rasa Stack sobre las plataformas alojadas:

Es de código abierto.

  • Puedes personalizar todo. Puedes sintonizar los modelos, integrar nuevos componentes o incluso personalizar todo el marco para adaptarlo mejor a tus necesidades.
  • Eres el dueño de tus datos. Puedes elegir dónde deseas alojar tus aplicaciones y tienes plena posesión de quién puede acceder a los datos de tu aplicación.

Gestión de diálogo con motor de aprendizaje automático.

  • El asistente utiliza el aprendizaje automático para aprender los patrones de conversaciones reales. Eso significa que no hay reglas predefinidas ni similares.
  • No necesitas grandes cantidades de datos de entrenamiento para comenzar. Puedes crear un primer asistente escalable desde una muestra de datos muy pequeña.

La migración de DialogFlow a Rasa es una de las solicitudes más comunes de la comunidad Rasa . En esta publicación veremos paso a paso cómo migrar un asistente DialogFlow existente a Rasa.

Puedes encontrar el código del asistente de ejemplo utilizado en este tutorial.

Tabla de contenidos

Outline

  • El asistente de DialogFlow
  • Paso 1: exportar el asistente de DialogFlow
  • Paso 2: entrenamiento del modelo Rasa NLU utilizando datos exportados
  • Paso 3: contextos de migración y entrenamiento del modelo Rasa Core
  • Paso 4: tu asistente de DialogFlow ahora se ejecuta en Rasa. ¿Que sigue?
  • Recursos útiles

El asistente DialogFlow

Como dijimos, el objetivo de esta publicación es mostrar un proceso paso a paso sobre cómo migrar un asistente DialogFlow existente a Rasa.

Para ilustrar el proceso, vamos a usar un ejemplo: un asistente de búsqueda personalizado llamado place_finder, capaz de buscar lugares como restaurantes, tiendas, bancos dentro del radio especificado por el usuario, y proporcionar detalles sobre el entorno como dirección, clasificación y horario de apertura del lugar. El asistente obtiene todos estos detalles utilizando un webhook para realizar llamadas a la API de Google Places.

A continuación hay una conversación de ejemplo con el asistente de place_finder:

Si deseas replicar este tutorial, puedes encontrar los archivos de datos y el código webhook del asistente place_finder dentro del directorio dialog-assistant del repositorio de este tutorial. Alternativamente, puedes seguir esta guía utilizando tu propio chatbot y ajustar que verás a continuación.

Cualquiera que sea la opción que elijas, en este punto deberías tener tu asistente de DialogFlow: ¡ahora es el momento de migrarlo a Rasa!

Consejo: si quieres jugar con el asistente de place_finder, debes obtener una clave API de Google Places y colocarla dentro del archivo credentials.yml de estos repositorios.

Paso 1: exportar el asistente DialogFlow

Recomendamos comenzar con la migración de la parte NLU del asistente DialogFlow.

Para migrarlo a Rasa, lo único que tienes que hacer es exportar los archivos del proyecto y usarlos para capacitar al modelo Rasa NLU; no se necesitan datos ni cambios de formato. Está diseñado para ser lo má fácil posible.

  1. Puedes exportar los datos del proyecto navegando a la pestaña de configuración de tu agente y seleccionando la pestaña ‘Exportar e Importar’.

2. En la pestaña ‘Exportar e Importar’, elije la opción ‘Exportar como ZIP’. Esto exportará los datos del proyecto como un archivo zip y lo descargará en tu ordenador.

3. Una vez descargado, puedes descomprimir el paquete e inspeccionar los archivos. El directorio del proyecto DialogFlow consta de los siguientes archivos y directorios:

  • entidades : un directorio que contiene archivos json de las entidades con las que se capacitó al asistente.
  • intents — un directorio que contiene los archivos json de las intents con las que tu asistente fue entrenado en DialogFlow.
  • agent.json — un archivo que contiene la configuración del asistente de DialogFlow
  • package.json — un archivo que contiene la información sobre el software utilizado para construir el asistente

Estos archivos se pueden usar directamente para entrenar el modelo Rasa NLU. Solo necesitas definir un archivo de configuración de canalización NLU y pasarlo al script de tren Rasa NLU. Eso se soluciona en el paso que veremos a continuación. Consulta el siguiente paso de este tutorial para ver las instrucciones detalladas.

Paso 2: entrenamiento del modelo Rasa NLU utilizando datos exportados

Rasa NLU permite la personalización completa de los modelos. Antes de entrenar el modelo NLU, debes definir una configuración de tu pipeline. Una canalización de proceso define cómo se analizan los ejemplos de formación y cómo se extraen las características. La configuración debe guardarse como un archivo .yml dentro del directorio del proyecto. A continuación te muestro un ejemplo de pipeline que podrías emplear en tu proyecto:

Archivo: rasa-assistant / config.yml

language: "en"pipeline:    - name: "nlp_spacy"    - name: "tokenizer_spacy"    - name: "ner_crf"    - name: "intent_featurizer_spacy"   - name: "intent_classifier_sklearn"   - name: "ner_duckling"    dimensions: ['number']

Una vez que hayas definido la canalización, puedes entrenar el modelo NLU siguiendo los pasos que muestro a continuación:

  1. Para entrenar al modelo, usa el siguiente comando que llama a la función de tren Rasa NLU, carga la configuración de la pipeline y los archivos de datos de entrenamiento y guarda el modelo entrenado dentro de un proyecto llamado ‘actual’:
python -m rasa_nlu.train -c config.yml — data data/place_finder -o models — project current — verbose

Puedes probar el modelo entrenado ejecutándolo como un servidor Rasa que puedes ejecutar utilizando el siguiente comando:

python -m rasa_nlu.server --path ./models

La función anterior iniciará un servidor local en un puerto 5000.

2. Ahora puedes emular los resultados del modelo Rasla NLU enviando solicitudes como la siguiente. Pasará el mensaje ‘Hello’ al modelo Rasa NLU y devolverá la respuesta.

curl 'localhost:5000/parse?q=Hello&project=current'

La respuesta del modelo Rasla NLU incluye los resultados de la clasificación de intención y la extracción de entidad. Por ejemplo, el mensaje “Hello” se clasificó como una intención “Default Welcome Intent” con la confianza de 0,83. Aquí hay una respuesta completa devuelta por el modelo NLU:

{   "intent":{   "name":"Default Welcome Intent",  "confidence":0.8342492802420313   },  "entities":[      ],  "intent_ranking":[    {   "name":"Default Welcome Intent",  "confidence":0.8342492802420313   },   {   "name":"thanks",  "confidence":0.09805256693160122   },   {   "name":"goodbye",  "confidence":0.05392708191432759   },   {   "name":"address",  "confidence":0.003986386948676723   },   {   "name":"place_search",  "confidence":0.0037102872949153686   },   {   "name":"rating",  "confidence":0.003059348479049656   },   {   "name":"opening_hours",  "confidence":0.0030150481893980153   }   ],  "text":"Hello",  "project":"current",  "model":"model_20180827-110057"  }

¡Y LISTO! ¡Acabas de migrar la parte NLU del asistente de DialogFlow a Rasa!

Consejo: El formato de datos exportado por DialogFlow es diferente del que utiliza Rasa NLU . Si deseas mejorar su modelo Rasa NLU después de la migración, puedes tomar un archivo de datos producido dentro del directorio del modelo después de que finalice la capacitación inicial (en este ejemplo, la ruta a este archivo es rasa-assistant / models / current / model_xxxxxxx / trainingdata.json), agrega nuevos ejemplos y vuelva a entrenar el modelo NLU que señala la train fuction del archivo.

Paso 3: Migración de contextos y capacitación del modelo Rasa Core

Nota: Si tu asistente DialogFlow personalizado no usa contextos o webhooks, puedes omitir esta parte del tutorial e ir directamente al punto cuatro.

Pero si los usas, tendrás que seguir los siguientes pasos:

  1. Para migrar la parte restante del asistente — manejo de contexto y acciones personalizadas — necesitas algunos datos de entrenamiento. DialogFlow lleva a cabo la gestión del diálogo a través del concepto de “contextos”, mientras que Rasa utiliza el aprendizaje automático para predecir qué acciones debe realizar un asistente en el estado específico de la conversación en función de acciones previas y detalles extraídos. Significa que para entrenar el modelo Rasa Core, necesitas algunos datos de entrenamiento en forma de historias. Dado que la gestión de diálogo de DialogFlow es un enfoque basado en reglas, no puedes exportar ningún dato de entrenamiento que puedas usar directamente para entrenar el modelo de diálogo Rasa Core. La buena noticia es que tienes acceso al historial de conversaciones en DialogFlow y puedes usarlo como base para generar datos de capacitación para el modelo Rasa Core. Aquí hay una conversación de ejemplo en DialogFlow:

Para convertir esta conversación en una historia de entrenamiento de Rasa Core, debes convertir las entradas del usuario a las intenciones y entidades correspondientes, mientras que las respuestas del agente deben expresarse como acciones. Así es como se vería la conversación anterior como una historia de Rasa:

Archivo: rasa-assistant / data / stories.md

## story_01    * Default Welcome Intent    utter_greet    * place_search{“query”:”restaurant”, “radius”:”600”}   action_place_search    slots{“place_match”:”one”}    slots{“address”:”Ars Vini in Sredzkistraße 27, Hagenauer Straße    1, Berlin”}    slots{“rating”:”4.4”}    slots{“opening_hours”:”true”}    * opening_hours    utter_opening_hours    * rating    utter_rating

Para entrenar el modelo necesitarás algunas historias adicionales que representen diferentes turnos de conversación.

2. Crea el dominio de tu asistente que define todos los intentos, entidades, ranuras, plantillas y acciones con las que el asistente debe estar familiarizado. Por ejemplo, las plantillas del asistente de place_finder se ven así:

Archivo: domain.yml

templates:   utter_greet:    — “Hello! How can I help?”    utter_goodbye:    — “Talk to you later!”    utter_thanks:    — “You are very welcome.”    utter_what_radius:    — “Within what radius?”    utter_rating:    — “The rating is {rating}.”    utter_address:    — “The address is {address}.”    utter_opening_hours:    — “The place is currently {opening_hours}.”    utter_no_results:    — “Sorry, I couldn’t find anything.”

Consejo: Todos los intentos y entidades definidos en el archivo de dominio deben coincidir con los nombres definidos en los ejemplos de capacitación.

3. Define acciones personalizadas. Si bien podemos escribir respuestas de texto simples dentro del archivo de dominio (al igual que en el fragmento de archivo de dominio anterior), las acciones más complicadas, como realizar una llamada API o conectarse a la base de datos para recuperar algunos datos, deben incluirse como una clase de acción personalizada. En DialogFlow, place_finder tenía un webhook para recuperar los datos de la API de Google Places, por lo que para migrarlo a Rasa, debes convertirlo en una clase de acción personalizada como la siguiente:

Esta clase asigna el nombre a esta acción personalizada, realiza la llamada API, recupera los datos solicitados, genera una respuesta que debe enviarse de vuelta al usuario y establece los detalles que deben mantenerse a lo largo de la conversación como espacios.

from rasa_sdk import Action, Tracker  from rasa_sdk.events import SlotSet, AllSlotsReset  import requests  import json  from random import randint  import datetime  import os  import yaml    class ActionPlaceSearch(Action):      def name(self):          #define the name of the action	          return 'action_place_search'        def run(self, dispatcher, tracker, domain):          #retrieve slot values		          query = tracker.get_slot('query')          radius = tracker.get_slot('number')		            #retrieve google api key	          with open("./ga_credentials.yml", 'r') as ymlfile:              cfg = yaml.load(ymlfile)          key = cfg['credentials']['GOOGLE_KEY']  		          #get user's current location		          get_origin = requests.post(              "https://www.googleapis.com/geolocation/v1/geolocate?key={}".format(key)).json()          origin_lat = get_origin['location']['lat']          origin_lng = get_origin['location']['lng']  				          #look for a place using all the details          place = requests.get('https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={},{}&radius={}&type={}&key={}'.format(origin_lat, origin_lng, radius, query, key)).json()          if len(place['results'])==0:              dispatcher.utter_message("Sorry, I didn't find anything")              return [SlotSet('location_match', 'none')]          else:              for i in place['results']:                  if 'rating' and 'vicinity' in i.keys():				                      name = i['name']                      rating = i['rating']                      address = i['vicinity']                      if i['opening_hours']['open_now']==True:                          opening_hours = 'open'                      else:                          opening_hours = 'closed'                      break              speech = "I found a {} called {} based on your specified parameters.".format(query, name)              dispatcher.utter_message(speech) #send the response back to the user	              return [SlotSet('location_match', 'one'), SlotSet('rating', rating), SlotSet('address', address), SlotSet('opening_hours', opening_hours)] #set returned details as slots

4. Eso es todo lo que necesitas para entrenar el modelo Rasa Core que predecirá cómo debe responder el asistente a las entradas del usuario. ¡Ahora es el momento de entrenarlo!

Puedes entrenarlo utilizando el siguiente comando que llamará a la train fuction de rasa, cargará los archivos de datos de entrenamiento de dominio e historias y almacenará el modelo entrenado dentro del proyecto ‘actual’:

python -m rasa_core.train -d domain.yml -s data/stories.md -o models/current/dialogue --epochs 200

5. Y esto es todo: ¡has migrado con éxito un asistente de DialogFlow a Rasa! Ahora puedes probarlo localmente. Al ejecutar el siguiente comando, iniciará las acciones personalizadas webhook:

python -m rasa_core_sdk.endpoint — actions actions

Ahora, puedes cargar el agente usando el siguiente comando que cargará los modelos Rasa NLU y Rasa Core e inicie el asistente en la consola para que pueda chatear:

python -m rasa_core.run -d models/current/dialogue -u models/current/nlu_model --endpoints endpoints.yml

Paso 4: tu asistente de DialogFlow ahora se está ejecutando en Rasa. ¿Que sigue?

Como se suele decir, “Sky is the limit” si hablamos de las posibildiades que ofrece Rasa a la hora de desarrollar tus chatbots. Puedes personalizar los modelos, integrar componentes adicionales o conectarlo al mundo exterior utilizando los conectores de las plataformas de mensajería más populares. ¡Incluso puedes conectarlos a otros marcos y herramientas geniales para hacerlo aún más divertido!

Si has migrado tu asistente a Rasa, ¡nos encantaría conocer tu experiencia! ¡Únete al foro de la comunidad de Rasa y cuéntanos tu experiencia!

Recursos útiles

Por Justina Petraitytė

Data scientist, desarrollador de inteligencia artificial conversacional y educador con la pasión por crear excelentes aplicaciones y convertir los datos en conocimientos significativos y productos innovadores. Tengo más de 5 años de experiencia en la industria en la implementación de soluciones de aprendizaje automático para diversos problemas comerciales (predicción de retención de usuarios, agrupación en clústeres, motores de recomendación, PNL, IA conversacional), consulta de datos y gestión de datos, análisis de datos, informes y visualización de datos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *