
De los Cómics a la Nube: Construyendo chatbots con Lex, Bedrock, S3 y OpenSearch.
¿Quién dijo que la nube no puede tener su lado geek? Todo gran villano necesita un asistente a su altura. En este artículo te contaré los secretos detrás de LuthorBot, un chatbot diseñado para el mismísimo Lex Luthor utilizando los superpoderes de Amazon Lex, Bedrock, S3 y OpenSearch.
El fin de semana pasado volví a ver la nueva versión de Superman y, aunque como en toda película de superhéroes cada quien tiene una opinión de como el protagonista representó al héroe, creo que todos estamos de acuerdo que ese fue un gran Lex Luthor.
Y recordando como en series, películas y comics, Lex Luthor siempre está lleno de tecnología super avanzada y práctica para su uso villanesco, me pregunté:
Si Lex Luthor tuviera un chatbot, ¿cómo sería ese chatbot?
No tenemos que quedarnos con la duda. Podemos utilizar los servicios de AWS para construir ese chatbot.
Las piezas de nuestro chatbot
Pero antes de hablar más de LuthorBot, hablemos de que lo que necesitamos saber para armar nuestro chatbot.
Bedrock es el servicio clave de AWS para poder construir y escalar aplicaciones de Inteligencia Artificial Generativa de forma sencilla y segura. En lugar de entrenar un modelo desde 0 podemos ocupar Bedrock como un hub para acceder a distintos modelos de distintos proveedores como Anthrophic, DeepSeek, etc.
Pero para que nuestro chatbot funcione y al conversar con él no explique otras cosas, necesitamos un componente clave: la base de conocimiento. En nuestro contexto esa base de compone de archivos .md sobre la información de distintos superhéroes (su ubicación, sus villanos, sus superpoderes, etc. ) pero en un contexto real se puede componer de distintos documentos como PDFs, DOCs, etc. Ocuparemos S3 para almacenar esos archivos y construir desde esa cubeta.
Ahora, ¿cómo transformamos el contenido de nuestros documentos en contexto para la base de conocimiento? Con embeddings. Un embedding (o incrustaciones) es, en palabras de la experta en IA y Community Builder Sairi Ávila ,
"un traductor que convierte palabras, imágenes o audios en listas de números. Imagina que es como un mapa: los conceptos con significados parecidos se agrupan juntitos, y los diferentes se alejan. Gracias a esto, la inteligencia artificial logra "entender" el contexto y el significado real de las cosas."
Entonces si por ejemplo, tenemos la frase "Superman es inmune a las balas", entonces eso en embeddings seria un vector con valores como [0.5, 0.7, ...] hasta el final de la oración.
Ahora necesitamos un modelo de embeddings para convertir la información de nuestros archivos a algo que Bedrock pueda utilizar. En nuestro caso vamos ocupar uno de los modelos Titan Embeddings que provee Amazon.
¿Y ahora, en donde terminan los embeddings de nuestra información? Utilizaremos OpenSearch como la base de datos de vectores en donde almacenaremos esos embeddings. En particular ocuparemos la versión serverless de OpenSearch, lo que nos permite, si quisieramos a futuro, escalar muchísimo más rápido e instantáneamente que si lo hicieramos en un servidor normal.
Y el servicio que une todo al final es Lex. Lex es el servicio de AWS que nos deja crear chatbots para interactuar con aplicaciones mediante texto y/o voz, y está creado con la misma que tecnología que da vida a Alexa.
Y técnicamente nos falta una parte en particular para nuestro bot, pero hablaremos de eso más adelante. Pero vayamos un paso la vez. Empezemos por lo primero: ¿cómo le decimos a LuthorBot lo que debe conocer?
Antes de continuar, si vas a replicar estos pasos ten en consideración de que necesitas una cuenta de IAM con permisos de administrador y/o con los permisos necesarios para los servicios mencionados, ya que esto no se puede realizar con la cuenta root. Otra cosa a considerar es de que este proyecto sí involucra un gasto asociado. Explicaremos más de eso al finalizar el proyecto.
La Base de Conocimiento de LuthorBot
Empecemos subiendo nuestros archivos a un nuevo bucket de S3 al que llamaremos
superhero-info-bucket. 
Ahora, en el menú de la consola de Bedrock>Compilación>Bases de Conocimiento es donde ocurre la segunda sección de la magia. Para fines de este proyecto, usaremos la opción "Unstructured Vector Store".

En la pantalla siguiente le damos un nombre a nuestra base de conocimientos (que llamaremos
luthortbot-knowledge-base), una descripción y creamos un nuevo rol de servicio de IAM para que pueda funcionar. 
Luego de esto seleccionamos como origen de datos S3.

Si lo deseamos, podemos agregar también otra cubeta de S3 en donde almacenar los logs de nuestra base de conocimiento.

Damos click en siguiente. En la nueva pantalla es donde, aparte de nombrar nuestro origen de datos (en este caso
luthorbot-knowledge-base-data-source) seleccionamos superhero-info-bucket y ocupamos como estrategia de análisis el analizador predeterminado de Bedrock (ya que este analizador por defecto lee los archivos .md del bucket).
De nuevo damos click en el botón de siguiente y en la pantalla que sigue debemos seleccionar dos cosas. Primero el modelo de embeddings a utilizar, que será Titan Embeddings V2 para este caso...

...y luego para la base vectorial seleccionamos el método de creación rápida y en almacén vectorial seleccionamos OpenSearch.

Damos click en siguiente, revisamos que todos los detalles sean correctos y finalmente damos click en el botón de Crear base de conocimientos. Esta parte tarda unos minutos, pero sabremos que está listo cuando veamos algo como lo siguiente en la pantalla:

¿Ves ese botón que dice "Ir a los orígenes de datos"? Es muy importante ir a ese menú antes de proseguir. Cada base de conocimiento tiene su propio menú para su data source, y en este menú, cada vez que agregemos nueva información a nuestra fuente (en este caso,
superhero-info-bucket), sincronizamos desde aquí para añadir esa data a la base de conocimiento y no tener que crear una nueva desde 0. 
Cuando el proceso termine, la base de conocimientos tendrá un ID de 10 caracteres alfanuméricos asociado, como
ABCDE12345. Ocuparemos ese ID más adelante para podernos referir a la base de conocimientos que creemos. Lo puedes observar haciendo click en el panel de la base recién creada del lado derecho del nombre.Lex: El núcleo de LuthorBot
Esta es la parte donde le empezamos a dar forma a LuthorBot. Para iniciar, nos vamos a la consola de Lex y en el menú de Bots hacemos click en el botón naranja de "Crear Bot". En el menú que aparece tenemos la opción de crear un bot desde 0, con un ejemplo, desde transcripciones o con IA Generativa, pero usaremos la opción "Crear un bot en blanco" para que entendamos mejor que es lo que estamos construyendo.

Seguimos añadiendo nombre al bot, descripción y los permisos de IAM mediante un nuevo rol o usando uno existente.

Luego, podemos activar o desactivar el registro de errores (por más villano que sea Luthor, no creo que él desactive sus logs), marcamos si nuestro bot se rige por la Ley COPPA y luego definimos el tiempo de espera en activo que tendrá nuestro bot.

Damos click en el botón de Siguiente y ahora escogemos el idioma que usará LuthorBot. También podemos agregar más idiomas o el modelo de interacción por voz para el mismo, pero no ocuparemos estas opciones para este caso.

Damos click en el botón de Terminado y, de momento, LuthorBot ha sido creado. Pero eso no signfica que ya funcione por sí solo. Mencioné arriba que nos faltaba hablar de una pieza para crear a LuthorBot. Esa pieza, o mejor dicho, piezas, son las intenciones.
La intención (y el modelo) es lo que cuenta
Las intenciones son, en pocas palabras, las configuraciones que podemos crear para las respuestas de nuestro chatbot. Podemos tener intenciones de saludos, despedidas, de espera de algún input del usuario, etc.
Y aunque podemos crear tantas como consideremos necesarias y tardarnos tanto como queramos, los planes malvados de un supervillano no tienen todo el tiempo del mundo!. Aquí es donde por fin conectamos
luthorbot-knowledge-base para que, junto a un modelo de IA que seleccionemos, LuthorBot por fin empiece a procesar y contestar en base a una intención conectada a Bedrock. Veamos como crear esta intención y otras dos más que necesitamos para que todo funcione como esperamos. Del lado izquiero del panel de nuestro bot hacemos click en la sección de Intenciones. Este menú nos mostrará que nuestro bot cuenta con dos intenciones default ya incluidas. WelcomeIntent, como su nombre lo dice, será para que nuestro bot pueda darle una bienvenida al usuario al empezarse a utilizar, mientras que FallbackIntent está pensado para activarse en caso de error, falla, etc.

Pero antes de configurar estas dos intenciones, vamos a crear la intención que se conecta al modelo de IA y a nuestra base de conocimiento. Damos click en el botón de "Agregar intención" y seleccionamos la opción de "Usar intención integrada". En este menú es donde se encuentra la intención integrada "Amazon.QnIntent", la cual se conecta a Bedrock para procesar las respuestas.
Añadimos un nombre (a saber,
BedrockIntent) y damos click en Agregar. 
En la pantalla que sigue veremos que el primer submenú que aparece en pantalla es "Detalles de intención", que es donde podremos cambiar el nombre, la descripción y, si lo consideramos, el nombre de usuario que se espera que use la intención.
Los ajustes que hacen que todo empiece a unirse ocurren en el submenú de "Configuración de QnA". Para esta parte hacemos lo siguiente
- Seleccionamos el proveedor y el modelo de IA que queramos ocupar. Considera que distintos modelos tienen diferentes costos, y dependiendo las región será su disponibilidad. Puedes leer más de esto aquí.
- Haciendo click en "Additional Model Settings" podemos cambiar el prompt que usará el modelo (submenú de "Solicitud Personalizada") o añadir barreras de protección preconfiguradas de Bedrock.
- Luego, elegimos la opción de Base de Conocimientos de Bedrock para conectar
luthorbot-knowledge-base**** (o el nombre de tu base de conocimiento). ¿Recuerdas el ID que se genera en tu base de conocimiento? Ese es ID que deberás añadir en esta sección. - Y, finalmente, si nos queremos poner más detallistas, podemos especificar si queremos o no una respuesta exacta al usar la base que hemos creado.

Hay más opciones que podemos añadir para las intenciones, como "Ejemplos de Enunciado" para intentar predecir cuando activar la intención, respuestas de cumplimiento, respuestas de cierre, o incluso ganchos de código, pero para nuestros fines dejaremos esto como default y hacemos click en el botón de "Guardar Intención". Si necesitamos modificar algo posteriormente, siempre podemos regresar a esa intención a hacerlo.
Como recomendación adicional, te sugiero modificar el WelcomeIntent con algunos ejemplos de enunciado para poder inicializar el bot con frases como "Hola", o "¿Quién eres?" para obtener respuestas del tipo "LuthorBot a su servicio, amo Luthor.", etc. Considera que Lex cobra por uso del bot, y en consecuente del uso del modelo y de Bedrock. Te dejo este artículo de Steph Gooch sobre los costos de saludar a un modelo de IA.
¿Eso significa que LuthorBot ya funciona? Ya casi, hay que ponerlo a prueba. Pero antes de eso debemos integrar las intenciones a nuestro bot. Si vemos en la parte de arriba de la pantalla tendremos un aviso que dice "Spanish (LATAM) no ha creado cambios" (o con el idioma sobre el que estás modificando) junto a 3 botones: Analyze, Crear, Prueba. Donde pondremos nuestra atención será en estos dos últimos:

- Crear nos permite integrar las intenciones al bot. No se hacen en automático, por lo que siempre es necesario dar click en este botón para aplicar los cambios.
- Prueba nos permite poner a prueba en una ventana lateral nuestro bot. Podemos analizar las respuestas, ver que intenciones se activan según fluya la conversación, etc.

Y después de tanto ajuste, bases de conocimiento, intenciones, bases vectoriales y etc. de cosas...¿ya le podemos preguntar a LuthorBot cómo derrotar a Batman?
LuthorBot, ¿cómo derroto a Batman?
Si, la respuesta es que si, ahora si podemos hacer esa pregunta. Hacemos click en el botón de prueba que mencionabamos recién para abrir la ventana lateral de pruebas y, después de muchas integraciones, finalmente podemos decirle a nuestro chatbot:
LuthorBot, ¿cómo derroto a Batman?
Para evitar llenar de imágenes, pondré ahora la conversación que resultó. Mis mensajes están marcados como L (como si Lex Luthor los hubiera enviado realmente) mientras que los mensajes de LuthorBot los marcaré como LB:
L: LuthorBot, ¿cómo derroto a Batman?
LB: Para derrotar a Batman, las estrategias más efectivas incluyen explotar sus traumas emocionales, como el asesinato de sus padres o la pérdida de sus aliados, para desestabilizarlo psicológicamente. También es efectivo forzar un agotamiento físico sostenido, como hizo Bane, atacando continuamente para debilitar sus capacidades. Neutralizar su tecnología (gadgets, comunicaciones, sistemas de vigilancia) lo deja en desventaja. Manipular sus fuentes de información o lanzar ataques coordinados múltiples puede sobrecargar su capacidad de respuesta. Finalmente, amenazas masivas a civiles o el uso de control mental/químico (como con las toxinas de Scarecrow) han demostrado ser métodos que funcionan temporalmente.
L: ¿Qué cosas han servido para derrotarlo previamente?
LB: Los planes que han funcionado contra Batman incluyen: Bane rompiéndole la espalda tras agotarlo físicamente; el Joker m****ndo a Jason Todd, causando un daño emocional profundo; Ra's al Ghul liberando un virus en Gotham y obligándolo a elegir entre su misión y salvar vidas; Hush manipulando su círculo cercano para exponer vulnerabilidades emocionales; y Scarecrow neutralizándolo temporalmente con toxinas que explotan sus traumas y miedos.
L: ¿Que tal si usamos el gas del miedo de Scarecrow para hacerle creer que sus aliados se pusieron en su contra?
LB: El uso del gas del miedo de Scarecrow para hacerle creer que sus aliados se volvieron contra él es una táctica efectiva, ya que las toxinas de Scarecrow están diseñadas para explorar los traumas de Batman y paralizarlo temporalmente con sus peores pesadillas. Esto explota sus vulnerabilidades emocionales y ha demostrado ser una de las pocas formas de someterlo temporalmente.
Respuestas tan villanescas como el villano que las pidió, ¿no lo crees? Siguiendo la conversación un poco más eventualmente llegamos al mensaje "La intención FallbackIntent se ha cumplido", lo que significa que llegamos al punto en donde LuthorBot no sabe que más contestar. Pero eso es parte de lo que queriamos que pasara! Esto nos da pie a ajustar más a detalle a nuestro bot, haciendolo más robusto en cuanto a información, intenciones, secuencias de conversación, etc.
Desplegar el bot es algo que se sale de este artículo-tutorial, pero puedes revisar este repositorio para ver un ejemplo de interfaz web en donde puedes desplegar un proyecto como este. Pero quien sabe, quizá haya una segunda parte casi lista para aprender a hacerlo...
Actualización al 11/Agosto/2026: Hola AWS Summit México 2026! Es un honor haberlos tenido por aqui! Esta actualización es solo para incluir
El costo del proyecto
Y al finalizar, ¿cuál fue el costo final de este experimento? Si realmente fueramos Lex Luthor, esto nos costaría aproximadamente una milésima de segundo de lo que genera LuthorCorp en una hora, así que nada. Pero como somos humanos, aquí te van unas estimaciones con base a lo que yo realicé y dejé activo durante 36 horas, incluyendo ajustes y pruebas extras que yo realicé. Con menos pruebas y/o con otros modelos de IA, probablemente puedas reducir estos gastos:
- OpenSearch Service: $2.87 (97.16%) - Horas de instancia.
- Claude Sonnet 4.6 (Amazon Bedrock Edition): $0.043 - Uso de inferencia del modelo
- Amazon Bedrock: $0.019 (0.65%) - Invocaciones adicionales de modelos.
- Amazon Lex: $0.011 (0.38%) - Uso de chatbot/IA conversacional
- Amazon S3: $0.0001 (~0.00%) - Cargos mínimos por almacenamiento
- Total: ~$2.95 USD ~= $51.3 MXN
Nada mal para un bot malvado, ¿no lo crees? Para no incurrir en costos puedes probar la capa gratuita de AWS con hasta $200 USD créditos de nube y/o recordar eliminar todo lo creado para no incurrir en gastos adicionales:
- Deberás eliminar las cubetas de donde la base de conocimiento toma información y la de los logs (recordemos, en mi caso eran
superhero-info-bucketyluthorbot-kb-logs) desde la consola de S3. - Deberás borrar la base de conocimiento (
luthorbot-knowledge-baseen mi caso) desde la consola de Bedrock>Compilación>Bases de Conocimiento. - Deberás borrar la base de datos vectorial (
bedrock-knowledge-base-2q32f2en mi caso, nombre generado automáticamente) en la consola de OpenSearch>Serverless>Collections. - Deberás borrar tu bot desde la consola de Lex (se eliminan todas las intenciones junto al bot)
- Y, para no tener roles extra, es buena idea borrar los roles extra que se pudieron haber creado en el proceso de construcción del bot.
Agradecimientos y algo más
Este proyecto no solo está inspirado en mi nerdez, si no también en el gran tutorial de Tiny Tech Tutorials que puedes ver haciendo click aquí . Decidí juntar ambos mundos, actualizarlos un poco, y hacer algo más con ello. Solo esperemos que si en el gran multiverso de la vida existe verdaderamente un Lex Luthor, ¡no aprenda a hacer su chatbot por culpa mia!
Aparte de este artículo-tutorial, di esta sesión como parte de un Meetup virtual del Student Builder Group que dirijo, el SBG UNAM , puedes ver la grabación un poco del how-to de LuthorBot haciendo click aquí .
¡Gracias por leer/acompañarme y nos vemos en el que sigue!
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article