tutoriales.com

Decodificando el Diálogo: Creación de Sistemas de Chatbot Orientados a Tareas con RASA

Este tutorial te guiará paso a paso en la creación de un chatbot conversacional orientado a tareas utilizando la potente plataforma RASA. Exploraremos los conceptos clave, desde la definición de intenciones y entidades hasta la configuración de diálogos y acciones personalizadas, permitiéndote construir asistentes virtuales inteligentes y funcionales.

Intermedio18 min de lectura10 views
Reportar error

🤖 Introducción a los Chatbots Orientados a Tareas y RASA

En la era digital actual, los chatbots se han convertido en una herramienta indispensable para mejorar la interacción entre usuarios y sistemas. Sin embargo, no todos los chatbots son iguales. Mientras algunos se limitan a responder preguntas frecuentes, otros, conocidos como chatbots orientados a tareas, son capaces de mantener una conversación estructurada para ayudar al usuario a lograr un objetivo específico, como reservar una mesa, pedir comida o resolver un problema técnico.

💡 Consejo: Un chatbot orientado a tareas se distingue por su capacidad de recordar el contexto de la conversación y guiar al usuario a través de una serie de pasos para completar una acción.

RASA es un framework de código abierto líder en el desarrollo de asistentes conversacionales que permite crear chatbots sofisticados y personalizados. A diferencia de otras plataformas basadas en reglas, RASA utiliza aprendizaje automático para comprender el lenguaje natural y gestionar el flujo del diálogo, lo que lo hace flexible y escalable.

¿Por qué elegir RASA para tu próximo Chatbot?

  • Código Abierto: Flexibilidad total y control sobre tus datos y modelos.
  • Potente NLU: Comprensión de lenguaje natural (NLU) avanzada para interpretar intenciones y extraer entidades.
  • Gestión de Diálogo Contextual: Maneja conversaciones complejas y recuerda el estado del usuario.
  • Acciones Personalizadas: Integración sencilla con sistemas externos a través de código Python.
  • Escalabilidad: Adecuado tanto para prototipos como para aplicaciones de producción de gran escala.

🛠️ Configuración del Entorno de Desarrollo

Antes de sumergirnos en la construcción de nuestro chatbot, necesitamos preparar el entorno. Asegúrate de tener Python 3.8 o superior instalado en tu sistema.

1. Instalación de RASA

El primer paso es instalar RASA y sus dependencias. Se recomienda usar un entorno virtual para evitar conflictos con otras librerías.

python -m venv rasa_env
source rasa_env/bin/activate  # En Linux/macOS
# rasa_env\Scripts\activate  # En Windows
pip install rasa

Verifica la instalación:

rasa --version

Deberías ver la versión de RASA instalada.

2. Creación de un Proyecto RASA Básico

Una vez instalado, podemos inicializar un nuevo proyecto de RASA. Esto creará una estructura de directorios con archivos de configuración básicos.

rasa init --no-prompt

El comando --no-prompt crea el proyecto sin hacer preguntas, utilizando las configuraciones por defecto. Si quieres el asistente interactivo, omite esa bandera. Esto generará la siguiente estructura de carpetas:

. # raíz del proyecto
├── actions # Carpeta para acciones personalizadas de Python
│   └── actions.py
├── data # Carpeta para datos de entrenamiento
│   ├── nlu.yml # Ejemplos de lenguaje natural (intenciones y entidades)
│   ├── rules.yml # Reglas para la gestión de diálogo
│   └── stories.yml # Ejemplos de diálogos (historias)
├── config.yml # Configuración de NLU y Core (modelos)
├── credentials.yml # Credenciales para integrar con canales externos
├── domain.yml # Definición del universo de nuestro chatbot (intenciones, entidades, slots, respuestas)
├── endpoints.yml # Configuración de servidores externos (acciones, trackers)
└── requirements.txt # Dependencias del proyecto

💬 Diseño de la Conversación: Intenciones, Entidades y Slots

El corazón de un chatbot RASA es su capacidad para entender lo que el usuario quiere (intención), extraer información clave (entidades) y recordar detalles durante la conversación (slots).

1. Intenciones: ¿Qué quiere el usuario?

Las intenciones representan el propósito detrás del mensaje del usuario. Por ejemplo, saludar, despedirse, reservar_mesa, pedir_pizza.

Editamos el archivo data/nlu.yml para definir nuestras intenciones. Aquí tienes un ejemplo:

version: "3.1"
nlu:
- intent: greet
  examples: |
    - hola
    - buenos días
    - qué tal
    - hey
- intent: goodbye
  examples: |
    - adiós
    - hasta luego
    - chao
- intent: affirm
  examples: |
    - sí
    - correcto
    - claro
    - de acuerdo
- intent: deny
  examples: |
    - no
    - para nada
    - incorrecto
- intent: ask_restaurant
  examples: |
    - quiero buscar un restaurante
    - dónde puedo comer
    - busca un lugar para cenar
    - necesito un restaurante
- intent: provide_cuisine
  examples: |
    - me gustaría comida [italiana](cuisine)
    - busco algo [mexicano](cuisine)
    - prefiero [china](cuisine)
    - que sea [francesa](cuisine)
📌 Nota: Cuantos más ejemplos, mejor aprenderá el modelo a identificar la intención correcta. Usa una variedad de frases.

2. Entidades: Información clave del mensaje

Las entidades son piezas de información relevante que extraemos del mensaje del usuario. En el ejemplo anterior, [italiana](cuisine) indica que "italiana" es una entidad de tipo cuisine.

Podemos definir diferentes tipos de entidades según las necesidades de nuestro chatbot. RASA puede detectar entidades automáticamente (por ejemplo, números, fechas) o entrenarse para reconocer entidades personalizadas.

3. Slots: Memoria del Chatbot

Los slots son la memoria de nuestro chatbot. Almacenan la información que el chatbot ha extraído de las entidades o que ha preguntado al usuario. Son cruciales para mantener el contexto de la conversación.

Definimos los slots en domain.yml. Por ejemplo, para nuestro chatbot de restaurante, podríamos necesitar slots para el tipo de cocina, el número de personas o la ubicación.

version: "3.1"

intents:
  - greet
  - goodbye
  - affirm
  - deny
  - ask_restaurant
  - provide_cuisine
  - inform

entities:
  - cuisine
  - num_people
  - location

slots:
  cuisine:
    type: text
    influence_conversation: true
    mappings:
      - type: from_entity
        entity: cuisine
  num_people:
    type: int
    influence_conversation: true
    mappings:
      - type: from_entity
        entity: num_people
  location:
    type: text
    influence_conversation: true
    mappings:
      - type: from_entity
        entity: location

responses:
  utter_greet:
  - text: "¡Hola! ¿En qué puedo ayudarte?"
  utter_goodbye:
  - text: "¡Hasta luego!"
  utter_ask_cuisine:
  - text: "¿Qué tipo de cocina te apetece?"
  utter_ask_num_people:
  - text: "¿Para cuántas personas sería?"
  utter_ask_location:
  - text: "¿En qué ciudad o zona buscas?"
  utter_no_restaurant_found:
  - text: "Lo siento, no he encontrado ningún restaurante con esas características."
  utter_offer_restaurant:
  - text: "He encontrado un restaurante de cocina {cuisine} para {num_people} personas en {location}."

sessions:
  store_entities_as_slots: true

Tipos de Slots Comunes:

Tipo de SlotDescripciónEjemplo
---------
textAlmacena cualquier texto.cuisine: italiana
boolVerdadero/Falso.is_vegetarian: true
---------
floatNúmeros decimales.price_range: 25.50
intNúmeros enteros.num_people: 4
---------
listLista de valores.allergens: [gluten, leche]
anyPuede contener cualquier tipo de valor.
⚠️ Advertencia: El atributo `influence_conversation: true` indica que este slot puede influir en el flujo del diálogo. Si un slot no debe afectar el diálogo, configúralo a `false`.

📝 Definiendo el Flujo del Diálogo: Stories y Rules

Una vez que nuestro chatbot puede entender lo básico, necesitamos enseñarle cómo mantener una conversación coherente para cumplir las tareas. Esto se logra a través de stories y rules.

1. Stories: Ejemplos de Diálogos Completos

Las stories son ejemplos de conversaciones reales entre un usuario y el asistente. Le muestran a RASA cómo debe responder en diferentes situaciones. Se definen en data/stories.yml.

version: "3.1"

stories:
  - story: happy path
    steps:
      - intent: greet
      - action: utter_greet
      - intent: ask_restaurant
      - action: utter_ask_cuisine
      - intent: provide_cuisine
        entities:
          - cuisine: "mexicana"
      - slot_was_set:
          - cuisine: "mexicana"
      - action: utter_ask_num_people
      - intent: inform
        entities:
          - num_people: 2
      - slot_was_set:
          - num_people: 2
      - action: utter_ask_location
      - intent: inform
        entities:
          - location: "centro"
      - slot_was_set:
          - location: "centro"
      - action: action_search_restaurants
      - action: utter_offer_restaurant
      - intent: goodbye
      - action: utter_goodbye

  - story: user denies search
    steps:
      - intent: greet
      - action: utter_greet
      - intent: ask_restaurant
      - action: utter_ask_cuisine
      - intent: deny
      - action: utter_goodbye
INICIO Usuario intent: greet Bot action: utter_greet Usuario intent: ask_restaurant Bot action: utter_ask_cuisine Usuario intent: provide_cuisine Bot action: utter_ask_num_people Usuario intent: inform [num_people] Bot action: utter_ask_location Usuario intent: inform [location] Bot action: action_search_restaurants Bot action: utter_offer_restaurant FIN

Cada steps representa un turno de la conversación: un intent del usuario o una action del bot. slot_was_set es útil para indicar que un slot ha sido rellenado, lo que puede influir en la siguiente acción.

2. Rules: Comportamientos Rígidos

Las rules son formas de definir comportamientos muy específicos y rígidos que el chatbot debe seguir. Son útiles para manejar saludos, despedidas, o cuando sabes exactamente cómo debe comportarse el bot en una situación específica, independientemente del contexto previo. Se definen en data/rules.yml.

version: "3.1"

rules:
  - rule: Say goodbye anytime the user says goodbye
    steps:
      - intent: goodbye
      - action: utter_goodbye

  - rule: Say "I am a bot" anytime the user asks for it
    steps:
      - intent: bot_challenge
      - action: utter_iamabot

Las rules tienen prioridad sobre las stories. Si una regla coincide con la conversación, se ejecutará. Esto asegura que ciertas interacciones críticas se manejen siempre de la misma manera.


⚙️ Acciones Personalizadas y Integraciones

Los chatbots orientados a tareas a menudo necesitan interactuar con sistemas externos: bases de datos, APIs, servicios web. RASA permite esto a través de acciones personalizadas, que son funciones de Python que el bot ejecuta.

1. Creación de Acciones Personalizadas

Las acciones personalizadas se escriben en el archivo actions/actions.py.

Supongamos que queremos una acción para buscar restaurantes basada en los slots de cuisine, num_people y location.

# actions/actions.py

from typing import Any, Text, Dict, List

from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk.events import SlotSet

class ActionSearchRestaurants(Action):

    def name(self) -> Text:
        return "action_search_restaurants"

    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

        cuisine = tracker.get_slot("cuisine")
        num_people = tracker.get_slot("num_people")
        location = tracker.get_slot("location")

        # Aquí iría la lógica para interactuar con una API de restaurantes
        # Por simplicidad, simularemos una búsqueda
        if cuisine and num_people and location:
            # Simular búsqueda exitosa
            dispatcher.utter_message(text=f"Buscando restaurantes de {cuisine} para {num_people} personas en {location}...")
            # Aquí llamarías a tu API y obtendrías resultados
            # ...
            # Por ahora, asumimos que siempre encontramos uno
            return [SlotSet("found_restaurant", True)] # Establecemos un slot para indicar que se encontró
        else:
            dispatcher.utter_message(text="Necesito más información para buscar restaurantes.")
            return [SlotSet("found_restaurant", False)]

2. Configuración del Servidor de Acciones

Para que RASA pueda ejecutar estas acciones, necesitamos iniciar un servidor de acciones. Abre un nuevo terminal y ejecuta:

rasa run actions

También debes asegurarte de que RASA sepa dónde encontrar este servidor. En endpoints.yml, descomenta y configura el puerto:

# endpoints.yml

action_endpoint:
  url: "http://localhost:5055/webhook"

Ahora, cuando una acción personalizada sea llamada en una story o rule, RASA enviará la solicitud al servidor de acciones, que ejecutará el código Python y devolverá una respuesta.


🧠 Entrenamiento y Pruebas del Chatbot

Con todos los componentes definidos, es hora de entrenar a nuestro chatbot y ponerlo a prueba.

1. Entrenamiento del Modelo

Desde la raíz de tu proyecto RASA, ejecuta el comando de entrenamiento:

rasa train

Este comando entrenará los modelos de NLU (para intenciones y entidades) y Core (para gestión de diálogo). RASA guardará los modelos entrenados en la carpeta models/.

Entrenamiento Completo

2. Pruebas Interactivas

La forma más sencilla de probar tu chatbot es a través de la línea de comandos en modo interactivo:

rasa shell

Esto iniciará una sesión de chat donde puedes interactuar con tu bot. Si tienes el servidor de acciones ejecutándose en otro terminal, el bot podrá usar tus acciones personalizadas.

🔥 Importante: Siempre asegúrate de que el servidor de acciones (`rasa run actions`) esté corriendo en un terminal separado antes de ejecutar `rasa shell` o `rasa run`.

3. Pruebas Automatizadas

RASA permite escribir tests automatizados para tus stories y NLU. Puedes crear un archivo tests/test_stories.yml y tests/test_nlu.yml.

Ejemplo de tests/test_stories.yml:

version: "3.1"

stories:
  - story: test happy path
    steps:
      - user: "hola"
        intent: greet
      - bot: "¡Hola! ¿En qué puedo ayudarte?"
      - user: "quiero buscar un restaurante"
        intent: ask_restaurant
      - bot: "¿Qué tipo de cocina te apetece?"
      - user: "mexicana"
        intent: provide_cuisine
        entities:
          - cuisine: "mexicana"
      - bot: "¿Para cuántas personas sería?"
      - user: "para 2"
        intent: inform
        entities:
          - num_people: 2
      - bot: "¿En qué ciudad o zona buscas?"
      - user: "en el centro"
        intent: inform
        entities:
          - location: "centro"
      - action: action_search_restaurants
      - bot: "He encontrado un restaurante de cocina mexicana para 2 personas en centro."
      - user: "adiós"
        intent: goodbye
      - bot: "¡Hasta luego!"

Para ejecutar los tests:

rasa test

Esto te dará un informe sobre la precisión de tu NLU y si tus stories se están siguiendo correctamente.


🚀 Despliegue del Chatbot

Una vez que tu chatbot está entrenado y probado, el siguiente paso es desplegarlo para que los usuarios puedan interactuar con él.

1. Ejecución del Bot en Modo Producción

Para ejecutar el chatbot y exponerlo a través de una API HTTP:

rasa run --enable-api --cors "*" --debug

Esto iniciará el servidor de RASA Core en el puerto por defecto (5005). El --enable-api permite interactuar con el bot a través de una API RESTful, --cors "*" habilita CORS para cualquier origen (útil para desarrollo web), y --debug proporciona logs detallados.

Recuerda mantener el servidor de acciones (rasa run actions) ejecutándose en paralelo.

2. Integración con Canales Externos

RASA ofrece integraciones con varios canales populares como Facebook Messenger, Slack, Telegram, Twilio, y otros. Las credenciales para estos canales se configuran en credentials.yml.

Por ejemplo, para integrar con un canal web simple, puedes usar el rasa-webchat o crear tu propia interfaz. Si utilizas el rasa-webchat, simplemente conecta su frontend a la API de tu bot RASA en http://localhost:5005/webhooks/rest/webhook.

Ejemplo de configuración para Webhook REST En `credentials.yml`: ```yaml rest: # No se requieren credenciales, solo activa el endpoint REST ```

3. Consideraciones para Producción

Para un despliegue en producción, considera lo siguiente:

  • Contenedores: Usa Docker y Docker Compose para empaquetar tu bot y sus dependencias, facilitando el despliegue y la escalabilidad.
  • Orquestación: Para deployments a gran escala, herramientas como Kubernetes pueden ser esenciales.
  • Seguridad: Implementa HTTPS y autenticación adecuada para tus APIs.
  • Monitoreo: Configura herramientas de monitoreo para rastrear el rendimiento del bot y los errores.
  • Mantenimiento: Planifica actualizaciones regulares de los modelos con nuevos datos de conversación para mejorar continuamente el rendimiento del bot.
Usuario Canales Web, Mobile, Slack, WhatsApp Nginx / Load Balancer Servidor RASA Core (API) Modelo NLU Gestión de Diálogo Servidor de Acciones Custom Actions (Python/SDK) Bases de Datos / APIs Tracker Store, Knowledge Base

✨ Consejos Avanzados y Buenas Prácticas

Construir chatbots robustos va más allá de lo básico. Aquí tienes algunos consejos para llevar tu sistema RASA al siguiente nivel:

1. Manejo de Desambiguación y Preguntas Incompletas

Cuando el bot no está seguro de la intención del usuario, puede pedir aclaración. RASA lo hace automáticamente si las confianzas de las intenciones son cercanas. Puedes mejorar esto con response_selector para respuestas de preguntas frecuentes.

2. Formas y Validaciones

Las formas (Forms) en RASA son una excelente manera de manejar la recolección de múltiples slots del usuario de manera estructurada. Son ideales para tareas que requieren una secuencia de preguntas para recopilar toda la información necesaria.

Ejemplo de Form en domain.yml ```yaml forms: restaurant_form: cuisine: - type: from_entity entity: cuisine num_people: - type: from_entity entity: num_people - type: from_intent intent: inform value: "" location: - type: from_entity entity: location

responses: utter_ask_cuisine:

  • text: "¿Qué tipo de cocina te apetece?" utter_ask_num_people:
  • text: "¿Para cuántas personas?" utter_ask_location:
  • text: "¿En qué ciudad o zona?"
</details>

También puedes agregar validaciones personalizadas en `actions.py` para asegurar que los slots contengan valores válidos (por ejemplo, `num_people` debe ser un número positivo).

### 3. Aumentación de Datos (Data Augmentation)

Para mejorar la robustez de tu NLU, puedes usar técnicas de aumentación de datos para generar más ejemplos de entrenamiento a partir de los existentes. Esto es especialmente útil cuando tienes un conjunto de datos pequeño.

### 4. Ciclo de Mejora Continua

El desarrollo de chatbots es un proceso iterativo. Un ciclo típico de mejora incluye:

1.  **Desplegar:** Poner el bot en producción.
2.  **Monitorear:** Recopilar conversaciones reales de usuarios.
3.  **Analizar:** Identificar dónde el bot falló (conversaciones donde no entendió o respondió incorrectamente).
4.  **Corregir:** Añadir nuevos ejemplos de NLU, refinar stories, o crear nuevas acciones.
5.  **Re-entrenar:** Actualizar el modelo con los nuevos datos.

<div class="timeline">
    <div class="timeline-item"><strong>Paso 1:</strong> Recopilación de datos de conversación (real o simulada)</div>
    <div class="timeline-item"><strong>Paso 2:</strong> Etiquetado de nuevas intenciones y entidades</div>
    <div class="timeline-item"><strong>Paso 3:</strong> Actualización de stories, rules y acciones</div>
    <div class="timeline-item"><strong>Paso 4:</strong> Re-entrenamiento del modelo RASA</div>
    <div class="timeline-item"><strong>Paso 5:</strong> Evaluación y despliegue del nuevo modelo</div>
</div>

### 5. Integración con Modelos de Lenguaje Grandes (LLMs)

Aunque RASA se centra en chatbots orientados a tareas, puedes integrarlo con LLMs (como GPT) para manejar respuestas a preguntas abiertas o enriquecer el diálogo cuando la tarea específica no está en juego. RASA actuará como el "cerebro" para la tarea, y el LLM como el "conocimiento general".

--- 

## ✅ Conclusión

En este tutorial, hemos recorrido el proceso completo para construir un chatbot orientado a tareas utilizando RASA. Hemos cubierto desde la configuración inicial y el diseño de intenciones y entidades, hasta la definición de diálogos con stories y rules, la implementación de acciones personalizadas, y finalmente, el entrenamiento y despliegue del bot.

Construir chatbots efectivos requiere una comprensión profunda de cómo los usuarios interactúan y una cuidadosa planificación del diálogo. RASA te proporciona las herramientas y la flexibilidad necesarias para crear asistentes conversacionales inteligentes que pueden resolver problemas reales y mejorar la experiencia del usuario.

¡Anímate a experimentar con RASA y a crear tu propio asistente conversacional!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!