En el fascinante mundo de la inteligencia artificial, los chatbots se han convertido en herramientas indispensables. Desde ofrecer atención al cliente hasta generar respuestas contextuales avanzadas, estas aplicaciones están transformando cómo interactuamos con la tecnología. En este artículo, te llevaré a través del desarrollo de un chatbot básico que utiliza FastAPI, LangChain, y la API de OpenAI, detallando las herramientas utilizadas y cómo se integraron para crear una solución funcional y elegante.
El Proyecto: Un Chatbot con Respuestas Contextuales
El objetivo era construir un chatbot funcional que:
- Recibiera mensajes de texto a través de una API REST.
- Utilizara un modelo de lenguaje preentrenado para generar respuestas.
- Mantuviera un historial de conversación para ofrecer respuestas contextuales.
- Incluyera características adicionales como soporte para respuestas en streaming y verificación del estado de la API.
Para lograr esto, utilizé una combinación poderosa de herramientas y tecnologías modernas. Veamos cómo encajan estas piezas.
Herramientas y Tecnologías Clave
FastAPI: La Base del Servidor
FastAPI fue la columna vertebral de nuestra API. Elegida por su rendimiento y diseño amigable, FastAPI es un framework moderno para construir aplicaciones web en Python. Entre sus muchas ventajas están:
- Soporte nativo para asincronía con async/await, lo que permite manejar múltiples conexiones de manera eficiente.
- Generación automática de documentación Swagger y OpenAPI.
- Fácil integración con bibliotecas de validación de datos como Pydantic.
Con FastAPI, implementé rutas que gestionan las solicitudes del cliente, procesan mensajes y devuelven respuestas generadas por el modelo de lenguaje.
LangChain: Simplificando la Interacción con Modelos de Lenguaje
LangChain es una biblioteca innovadora que hace que trabajar con modelos de lenguaje como los de OpenAI sea mucho más intuitivo. En este proyecto, LangChain me ayudó a:
- Organizar el historial de conversación en un formato estructurado con roles (usuario y asistente).
- Simplificar la invocación del modelo de OpenAI.
- Gestionar respuestas en streaming, lo que mejora la experiencia del usuario al recibir fragmentos de texto a medida que se generan.
LangChain abstrae muchas complejidades técnicas, permitiendo concentrarme en el flujo lógico de la conversación.
OpenAI API: La Inteligencia detrás del Chatbot
La API de OpenAI fue el núcleo del chatbot. Utilizé el modelo gpt-3.5-turbo, conocido por su capacidad para generar texto de alta calidad y responder a preguntas contextuales. Algunas de las ventajas clave de este modelo son:
- Versatilidad: Puede responder desde consultas simples hasta contextos complejos con múltiples mensajes.
- Soporte para streaming: Ideal para aplicaciones que requieren respuestas en tiempo real.
Para garantizar la seguridad, configuré la clave de la API como una variable de entorno en un archivo .env, lo que evita que quede expuesta en el código fuente.
Docker y Docker Compose: Portabilidad y Escalabilidad
Para garantizar que la aplicación sea fácil de implementar y reproducir, utilicé Docker. Con un Dockerfile cuidadosamente diseñado:
- Configuré un entorno limpio basado en python:3.11-slim, lo que minimiza el tamaño del contenedor.
- Instalé dependencias del sistema y de Python de manera eficiente.
- Añadí un HEALTHCHECK que supervisa el estado de la API, asegurando que el contenedor esté siempre listo para manejar solicitudes.
Además, con Docker Compose, simplifiqué la gestión de servicios y variables de entorno, especialmente útiles para configuraciones de desarrollo y producción.
Pruebas Automatizadas con pytest
Las pruebas son esenciales para cualquier proyecto robusto. Usé pytest para garantizar que nuestros endpoints funcionen correctamente:
- Simulé respuestas de OpenAI utilizando unittest.mock.patch, eliminando dependencias de servicios externos en las pruebas.
- Probé tanto el endpoint estándar /chat como el de streaming /chat/stream, asegurando que manejen casos esperados y excepcionales.
Al principio costó implementar el testing utilizando TestClient(y honestamente aún no se porque fallaba) pero luego busqué un camino alternativo que encontré en Stackoverflow y terminé implementándolo consiguiéndolo al implementar el fixture correcto y el mock que simula el llamado a la API de Openai.
Funcionalidades Clave
API REST para Comunicación
El endpoint /chat permite a los usuarios enviar mensajes y recibir respuestas contextuales. Gracias a Pydantic, validamos las entradas de los usuarios y aseguramos que el formato de las solicitudes sea siempre correcto.
Respuestas en Streaming
El endpoint /chat/stream mejora la experiencia del usuario al enviar respuestas fragmentadas en tiempo real, especialmente útil para mensajes largos. Adicionalmente implementé Streamlit para generar una interfaz donde poder usar el ctahbot como lo haría un usuario real.
Historial de Conversación
Para mantener el contexto, se almacena temporalmente el historial en memoria. Este enfoque fue práctico para la prueba técnica, aunque en un entorno de producción consideraría opciones como Redis para manejar múltiples usuarios.
Verificación de Salud
El endpoint /health ofrece un método sencillo para monitorear si la API está funcionando correctamente. Esto se complementa con el HEALTHCHECK del Dockerfile, asegurando que el contenedor se reinicie automáticamente en caso de problemas.
Reflexiones y Posibilidades Futuras
Este proyecto fue un estupendo ejercicio que combina las mejores prácticas en desarrollo de APIs, integración de inteligencia artificial y herramientas de contenedorización. Aunque el sistema actual es ideal para una aplicación pequeña o un prototipo, en un escenario de producción podríamos:
- Almacenar historiales de conversación en bases de datos como Redis o PostgreSQL.
- Implementar autenticación y límites de tasa para prevenir abusos.
- Mejorar el manejo de errores y agregar reintentos automáticos para las llamadas a OpenAI.
- Implementar login de usuarios
- etc.
Si estás buscando construir algo similar o necesitas inspiración para tu próximo proyecto, ¡este es un excelente punto de partida! Siéntete libre de comentar tus ideas o preguntas, estaré encantado de responder.
Aquí está el repo con el código por si quieres explorar y mejor aún, ¡Criticar!: https://github.com/gabinoguera/sesame_chatbot_test
Espero que este artículo te inspire a explorar el desarrollo de chatbots. ¡Nos leemos en el próximo post de GHEN! 😊