Un chatbot sencillo

Como parte del artículo sobre ChatGPT en la revista Rúbrica de radio UNAM se incluye este pequeño tutorial para programar un chatbot en Scratch.

Scratch es un lenguaje de programación visual y basado en bloques, enfocado a la enseñanza de la programación a jóvenes mayores de 8 años, pero en materia de aprendizaje la edad no importa. Si sabes poco o nada de programación, es un lenguaje muy útil para ver las cosas de forma sencilla. Como menciona el profesor Peter Van Roy "Los lenguajes de programación prácticos son complicados, pero las ideas importantes en programación son simples"[^1]. Aquí trataremos con eso, las ideas importantes.

Este tutorial está basado en uno en inglés, consultado en la página: https://www.create-learn.us/blog/make-chatbot-with-ai-in-scratch/

1. Usando Scratch desde internet

Para usar Scratch no necesitas instalar nada, puedes hacerlo todo desde tu explorador de internet. Entra a la página:

https://scratch.mit.edu/create

Si no aparece en español puedes ir a la esquina superior izquierda y dar clic en el símbolo de globo terráqueo, se abrirá un menú en el que puedes elegir el idioma español, o el de tu preferencia.

Seleccionando el idioma

Al entrar verás lo que parece la mesa de trabajo de una programadora, porque vamos a poner manos a la obra. En la columna del lado izquierdo encuentras los bloques con los que construirás tu chatbot, hay distintas categorías que iremos viendo. En la parte central está la mesa de trabajo, ahora en blanco salvo por un pequeño video tutorial en la parte inferior. Si gustas puedes verlo o dejarlo para otra ocasión si las ganas de hacer tu propio chatbot te desbordan. Del lado derecho aparecen tres ventanas, la superior donde se ve un gato feliz será la ventana de acciones, en la inferior de la izquierda se puede elegir al personaje de la ventana de acciones y las posibles animaciones, la inferior de la derecha es para elegir la escena de fondo.

Mesa de trabajo y herramientas

Puedes elegir el personaje que representará al chatbot o dejar al simpático gato, aquí puedes manejarlo a tu preferencia, también puedes elegir un fondo. Como llegaron a esta lectura por radio UNAM yo elegiré un radio a través del botón azul de la parte inferior izquierda, la que tiene la forma de la cabeza de un gato. En el segundo botón se puede elegir el fondo, en ambos casos se puede buscar el de tu preferencia, dibujar uno propio, elegir al azar o incluso subir desde archivo. Si no te gusta la elección se puede borrar y agregar nuevos.

2. Programando el chatbot con bloques para que inicie la interacción

Pero pasemos a la parte de la programación. Primero debes definir el inicio del programa. En la columna izquierda, la de los bloques, ve a la sección de Eventos (de color amarillo), elige el primer bloque al presionar bandera verde. Este es el inicio del programa. ¿Cuánto tiempo durará corriendo el programa? Pues mientras estemos jugando con él, más vale dejarlo por siempre: ve a la sección de control (naranja) y elije el bloque por siempre y embónalo justo abajo del bloque anterior.

¿Cómo empezará nuestro chatbot? Quizá parecerá un poco grosero, pero antes de saludar nos dirá qué podemos hacer para que responda, pídele que diga "Di algo o hazme una pregunta". Esto se hace a través de la sección Sensores, elige el bloque preguntar ___ y esperar y escribe la frase antes mencionada en la región en blanco.

Los primeros bloques para que nos pida decir algo

3. Definamos las variables para llevar la memoria de lo que se ha dicho

Las variables son una parte importante de todo programa, es la memoria de las operaciones o las acciones realizadas. En este caso las variables serán la memoria para sabe si la pregunta del usuario se ha encontrado en la lista/memoria y en qué posición de la lista está la respuesta.

Así como chatGPT utiliza cada nueva pregunta que se le hace para establecer relaciones entre los textos con los que contestará, tu chatbot relacionará las preguntas con las respuestas que tiene ya almacenadas.

Ve a la sección de los bloques llamada Variables (naranja más oscuro) y define las variables encontrado y posición. Por ahora sólo las definimos, más adelante las usaremos.

Definiendo variables Definiendo variables

4. Crear las listas de memoria

Una pregunta interesante es el cómo funciona nuestra memoria ¿tenemos almacenados conocimientos y los cotejamos con la información nueva? La respuesta es mucho más complicada, pero para este modelo sencillo podemos pensar que es así.

Las preguntas hechas al chatbot serán guardadas en una lista que definimos en la sección Variables, elegimos Crear una lista y la nombramos consultas. Para guardar las posibles respuestas creamos una segunda lista llamada respuestas.

Definiendo variables

En la ventana de acciones aparecerá, justo encima de tu personaje elegido, dos cuadros donde se almacenarán los objetos de la lista, es decir, la memoria de preguntas hechas y respuestas guardadas. ahí mismo puedes ver los valores de las variables, aho mismo vamos a inicializarlas.

5. Valores iniciales para las variables

Una vez que nuestro chatbot hace la pregunta da valores a las variables. Antes de recibir una respuesta inicializa las variables, por ello justo debajo del bloque de preguntar, dentro del ciclo por siempre inicializamos las variables encontrado y posición. En la columna izquierda vamos a la sección Variables y elegimos el bloque fijar a dos veces, uno debajo del otro como se muestra en la figura.

Inicialización de variables

En la pestaña del primero elegimos la variable encontrado y la fijamos a falso. Esta es una variable booleana, llamada así en honor al matemático George Boole, pionero del estudio de la lógica matemática. Sólo nos indicará si la pregunta fue encontrada, con un valor verdadero, o no con un valor falso partiendo de este último valor pues aún no hemos hecho pregunta alguna, así que no puede encontrar nada.

Para el segundo bloque fijar...* elegimos la variable posición y la inicializamos a 1, la primera respuesta estará en la posición 1 de la lista de memoria, este es nuestra variable para encontrar las preguntas y respuestas.

6. Revisar la lista de consulta cuando la usuaria pregunte

Ahora las listas están en blanco, pero el chatbot debe saber desde un inicio que hacer, por ello entrará a la lista consulta para buscar, entrada por entrada, si la pregunta del usuario ya está almacenada en su memoria. Para esto debemos elegir una condición de la sección Control, repetir __, justo debajo de las inicializaciones y dentro del ciclo por siempre. Este bloque indica que la acción dentro de ella debe repetirse la cantidad de veces mencionada, en este caso el número de veces estará dado por la longitud de la lista consultas. Dentro de la sección Variables, casi hasta abajo, se puede encontrar el bloque longitud de __, arrastramos el bloque para que embone en el espacio en blanco del bloque repetir__. Una vez ahí elegimos en la pestaña la lista consultas.

Ciclo para buscar en la lista **consultas**

Ya que le dijimos al chatbot que busque en la lista ¿qué hace si encuentra algo? Vamos a indicárselo a continuación.

De la sección de eventos tomaremos un bloque si entonces si no __ y lo encajaremos dentro del pasado bloque repetir. Como pueden observar en el bloque después del si hay un hueco donde encajaremos un operador de la sección Operadores (en color verde), vamos a elegir un bloque de búsqueda, el que dice ¿ contiene ? que como pueden ver tiene una forma hexagonal aunque algo alargada, justo como el hueco del bloque si entonces si no __ que acabamos de poner. Esto se debe a que el bloque espera un resultado booleano y justo los bloques de Operadores con forma hexagonal dan respuestas boolenas, es decir: verdadero o falso.

Nos llevamos el bloque y lo embonamos después del si del bloque si entonces si no __. En lugar del texto que aparece ahí pondremos, en el primer espacio en blanco, de la sección Sensores el bloque respuesta. ¿Recuerdas que el chatbot hizo una pregunta bloques arriba? Al hacerlo se queda esperando una respuesta de la usuaria, esa respuesta es guardada en una variable propia del sistema que se llama respuesta. Esta parte del si... revisará si la respuesta dada está en su memoria, si lo está hará algo, pero si no esta, el si no..., hará otra cosa.

¿Cómo vemos si la respuesta del usuario está en lista? Para eso necesitas un operador que irá en el segundo espacio en blanco del bloque ¿ contiene ?. Ese operador lo tomas de la sección variables, elemento de , en este caso después de elemento encajaremos la variable posición y después de de elegimos la lista consultas.

Viene un bloque largo, para buscar **respuesta** en la lista **consultas**

Todo lo anterior es para buscar la respuesta dada por el usuario dentro de la lista de consultas, recuerda que posición es una variable que nos sirve para identificar a los miembros de la lista consultas, dando las posiciones de lo guardado en la lista.

7. ¿Qué sucede si encuentra la respuesta?

En este momento el chatbot aún no está terminado, su memoria está en blanco, pero debes decidir que pasará cuando no lo esté, digamos que te adelantas en el tiempo. Si en el bloque si __ entonces... encuentra en su memoria en la posición indicada por la variable posición la respuesta, el chatbot tendrá un ¡Eureka! y nos responderá. ¿Cómo se traduce esto en el programa?

Si encuentra la pregunta y su respuesta relacionada en su memoria le dará a la variable encontrado el valor de verdadero (esto es el ¡eureka!), tomamos el bloque ya conocido fijar__a__, lo encajamos justo debajo del si... y antes del si no..., en la pestaña elegimos la variable encontrado y le damos el valor de verdadero.

Ya que se dio cuenta que tiene la respuesta, la dice. De la sección Apariencia elegimos el bloque decir__durante__segundos, sustituimos el primer espacio en blanco por el elemento en la posición dada por la variable posición de la lista de respuestas, es decir, tomamos el bloque elemento__de__ y sustituimos como se ha mencionado y como se muestra en la figura. Dejamos el tiempo en 2 segundos, pero puedes ampliarlo a unos pocos segundos más para que tengas tiempo de leer la respuesta.

¡Eureka! y respuesta

8. ¿Y si no la encuentra?

En el bloque repetir... vamos avanzando entrada por entrada de la lista, en cada entrada checa si la pregunta de la usuaria ya está en memoria y por ende tiene una respuesta asociada, si no es así, debe pasar a la siguiente entrada de memoria y hacer la misma revisión.

Entonces, de no encontrar la respuesta elegimos de la sección de Variables el bloque cambiar__en__, donde cambiaremos posición en 1, para así avanzar en la lista. Estas acciones se repetirán hasta encontrar una respuesta o acabar la lista.

En esta entrada no se halló nada, avanza a la que sigue

9. Ya recorrió toda la lista y no encontró nada

Si es el caso, entonces debes ahora sí enseñar al chatbot como responder. Realmente al correr por primera vez el programa esto es lo que va a suceder, ya que las listas estarán vacías, pero por la manera en que se programa nos hemos adelantado en el tiempo.

Si no encuentra la pregunta del usuario y ya se terminó la lista, se saldrá del bloque repetir__, justo debajo de el embonamos un nuevo bloque de Control llamado si__entonces. Nota que no es lo mismo que si__entonces__si no__, en este caso no hay condición si no. De nueva cuenta el bloque necesita un bloque hexagonal, de salida booleana, en este caso un bloque que nos responde si encontrado está valuado en falso, es decir, que la busqueda pasada no encontró la pregunta ni respuesta asociada.

Si no se encontró respuesta

Ahora el cahtbot sabe que no tiene la respuesta a la pregunta hecha, es bueno saber lo que se desconoce y es mejor aceptarlo. Guarda en su memoria la pregunta hecha, con el bloque añadir__a__, donde agregará respuesta a la lista de consultas.

Ahora le toca aprender. Para iniciar la enseñanza el chatbot nos dirá que no sabe la respuesta y nos pedirá consejo, una práctica muy saludable. Tomamos el ya conocido bloque preguntar__y esperar, donde el chatbot nos dirá "Disculpa, no sé como responder a eso aún ¿qué debería decir la próxima vez?" y esperará le demos consejo.

Al darle la respuesta de tu parte la almacenará en la lista de respuestas, como se muestra en la imagen esto se hace de nuevo con el bloque añadir__a__ sólo que esta vez se añadirá a la lista respuestas. Ten presente que la variable propia del sistema, respuestas, es una variable muy local, es decir, su valor es sólo válido para la última pregunta hecha, por eso es que en un principio respuesta contenía la pregunta que no podía responder y ahora contiene la respuesta sugerida.

Enseñando al *chatbot*

A entrenar al chatbot

Lo que resta es entrenar a tu chatbot. Corre el programa apretando la banderita verde justo arriba de la ventana de acciones. Tu personaje en la ventana de acciones te recibirá de forma un poco ruda, te pedirá que digas o preguntes algo y esperara a que respondas en la línea de abajo. Si te parece que la ventana es muy pequeña puedes maximizarla en la orilla superior derecha.

Ya en acción

Salúdalo, pregunta la hora, sobre el clima, pero recuerda que es un chatbot muy ignorante ahora, sólo puede saber como responder la pregunta precisa, si la parafraseas, cambias de minúsculas a mayúsculas, no pones todos los signos de puntuación, lo tomará como una pregunta nueva. Al sugerirle la respuesta recuerda escribirla como esperas que te responda, no sabe identificar los cambios de persona al hablar.

Juega por un rato con el chatbot y podrás tener de acuerdo al tiempo que le dediques un compañero de charla cada vez más capaz de conversar contigo.

No olvides guardar el código antes de cerrar la ventana, o perderás todo tu avance en enseñarlo. En la parte superior izquierda, en el botón de archivo selecciona Guardar en tu computador. Una vez guardado puedes salir de la página y la próxima vez quieras seguir enseñando a tu chatbot entras en la misma página y eliges Subir desde tu computador. En tu carpeta de descargas estará un archivo llamado Proyecto Scratch.sb3.

Guardando tu avance

Por último, un video de como quedaría ya trabajando:

[^2] Van Roy, Peter. “Programming paradigms for dummies: what every programmer should know.” (2009).