Skip to content

Crear un chatbot de Streamlit con modelos LLM: Inicio rápido

¿Alguna vez te has preguntado cómo funcionan Siri, Alexa o tu chatbot de servicio al cliente? Bueno, estás a punto de echar un vistazo tras el telón. En este artículo, echamos un vistazo rápido al mundo de los chatbots, esas útiles herramientas alimentadas por AI que están revolucionando la comunicación digital. Están en todas partes, desde el servicio al cliente hasta las experiencias interactivas, y están cambiando la forma en que nos comunicamos y accedemos a la información.

Pero aquí está la parte interesante: no estamos hablando de cualquier chatbot. Nos enfocamos en construir un chatbot usando Streamlit, un marco de aplicación de código abierto que es un éxito entre los entusiastas del aprendizaje automático y la ciencia de datos. Y eso no es todo, también vamos a explorar cómo integrarlo con LangChain y varios modelos de lenguaje, incluidos los modelos LLM. Así que prepárate, porque estamos a punto de crear un chatbot que sea eficiente y respete la privacidad del usuario.

¿Qué es Streamlit?

Streamlit es una herramienta de código abierto rápida, fácil y divertida para construir aplicaciones web. Está diseñado para ayudar a los ingenieros de aprendizaje automático y científicos de datos a construir aplicaciones web interactivas en torno a sus proyectos sin necesidad de tener conocimientos de desarrollo web. La simplicidad y rapidez de Streamlit lo convierten en una excelente opción para construir una IU de chatbot.

¿Qué es un chatbot?

Un chatbot es una aplicación de software diseñada para llevar a cabo conversaciones de chat en línea a través de texto o texto a voz, en lugar de proporcionar un contacto directo con un agente humano en vivo. Diseñados para simular de manera convincente la forma en que un humano se comportaría como compañero de conversación, los sistemas de chatbot suelen requerir ajustes y pruebas continuas, y muchos en producción no pueden conversar adecuadamente ni superar el estándar de prueba de Turing de la industria.

Construyendo un chatbot con Streamlit

Configuración del entorno

Antes de sumergirnos en el proceso real de construcción de nuestro chatbot, primero necesitamos configurar nuestro entorno de desarrollo con las bibliotecas y herramientas necesarias. Esto garantiza que nuestro código se pueda ejecutar correctamente y que nuestro chatbot funcione según lo previsto. El archivo requirements.txt contiene una lista de bibliotecas y herramientas necesarias para este proyecto. Esto es lo que incluye:

  • streamlit: Esta biblioteca nos ayuda a crear aplicaciones web interactivas para proyectos de aprendizaje automático y ciencia de datos.
  • streamlit_chat: Este componente de Streamlit se utiliza para crear la interfaz de usuario del chatbot.
  • langchain: Este es un marco para desarrollar aplicaciones impulsadas por modelos de lenguaje. Proporciona una interfaz estándar para cadenas, muchas integraciones con otras herramientas y cadenas de extremo a extremo para aplicaciones comunes.
  • sentence_transformers: Esta biblioteca nos permite utilizar modelos de transformadores como BERT, RoBERTa, etc., para generar representaciones semánticas de texto (es decir, embeddings), que utilizaremos para nuestra indexación de documentos.
  • openai: Esta es la biblioteca oficial de OpenAI que nos permite utilizar sus modelos de lenguaje, como GPT-3.5-turbo, para generar texto similar al de un ser humano.
  • unstructured y unstructured[local-inference]: Se utilizan para el procesamiento de documentos y la gestión de datos no estructurados.
  • pinecone-client: Este es el cliente para Pinecone, un servicio de base de datos vectorial que nos permite realizar búsquedas de similitud en datos vectoriales.

Para instalar todas estas bibliotecas, puedes ejecutar el siguiente comando en tu terminal:

pip install -r requirements.txt

Este comando le indica a pip (el instalador de paquetes de Python) que instale las bibliotecas mencionadas en el archivo requirements.txt.

Indexación de documentos

El siguiente paso en nuestro viaje para construir el chatbot implica preparar e indexar los documentos que nuestro chatbot utilizará para responder consultas. Para esto, utilizamos el script indexing.py.

Cargando documentos desde un directorio con LangChain

El primer paso en el script indexing.py implica cargar los documentos desde un directorio. Utilizamos la clase DirectoryLoader proporcionada por LangChain para lograr esto. Esta clase acepta un directorio como entrada y carga todos los documentos presentes en él.

from langchain.document_loaders import DirectoryLoader
 
directory = '/content/data'
 
def load_docs(directory):
 loader = DirectoryLoader(directory)
 documents = loader.load()
 return documents
 
documents = load_docs(directory)
len(documents)

División de documentos

Después de cargar los documentos, el script procede a dividir estos documentos en fragmentos más pequeños. El tamaño de los fragmentos y la superposición entre ellos se pueden definir por el usuario. Esto se hace para asegurarse de que el tamaño de los documentos sea manejable y que no se pierda información relevante debido a la división. Para esto se utiliza la clase RecursiveCharacterTextSplitter de LangChain.

from langchain.text_splitter import RecursiveCharacterTextSplitter
 
def split_docs(documents,chunk_size=500,chunk_overlap=20):
 text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
 docs = text_splitter.split_documents(documents)
 return docs
 
docs = split_docs(documents)
print(len(docs))

Creando embeddings

Una vez que se dividen los documentos, necesitamos convertir estos fragmentos de texto en un formato que nuestro modelo de IA pueda entender. Esto se logra creando embeddings del texto utilizando la clase SentenceTransformerEmbeddings proporcionada por LangChain.

from langchain.embeddings import SentenceTransformerEmbeddings
 
embeddings = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")

Almacenamiento de embeddings en Pinecone

Después de crear las incrustaciones, deben almacenarse en un lugar desde donde se puedan acceder y buscar fácilmente. Pinecone es un servicio de base de datos de vectores que es perfecto para esta tarea. El código de muestra es el siguiente:

from langchain.pinecone import PineconeIndexer
 
def index_embeddings(embeddings, docs):
    indexer = PineconeIndexer(api_key='tu-clave-api-de-pinecone', index_name='tu-nombre-de-indice')
    indexer.index(embeddings, docs)
 
index_embeddings(embeddings, docs)

Este script crea un índice en Pinecone y almacena las incrustaciones junto con el texto correspondiente. Ahora, cuando un usuario hace una pregunta, el chatbot puede buscar en este índice el texto más similar y devolver la respuesta correspondiente.

Creación de la interfaz de chatbot con Streamlit

Con nuestros documentos indexados y listos para ser buscados, ahora podemos centrarnos en construir la interfaz de chatbot. Streamlit proporciona una forma sencilla e intuitiva de crear aplicaciones web interactivas, y es perfecto para nuestra interfaz de chatbot.

Componente de chat de Streamlit

El componente de chat de Streamlit es una nueva forma de crear chatbots. Proporciona una interfaz similar a una aplicación de chat, lo que hace que un chatbot implementado en Streamlit tenga una IU genial. Para usar este componente, debes instalarlo por separado utilizando pip:

pip install streamlit-chat

Después de instalarlo, puedes importarlo en tu aplicación de Streamlit:

import streamlit as st
from streamlit_chat import chat
 
@st.cache(allow_output_mutation=True)
def get_chat():
    return chat()
 
chat = get_chat()

Este código crea una nueva interfaz de chat en tu aplicación de Streamlit. Puedes agregar mensajes a este chat utilizando el método add_message:

chat.add_message("Hola, ¿cómo puedo ayudarte hoy?", "bot")

Integración del chatbot con LangChain

LangChain es un marco de trabajo para desarrollar aplicaciones impulsadas por modelos de lenguaje. Proporciona una interfaz estándar para cadenas, muchas integraciones con otras herramientas y cadenas de extremo a extremo para aplicaciones comunes. Para integrar nuestro chatbot con LangChain, necesitamos modificar la función load_chain en main.py.

from langchain import LangChain
 
def load_chain():
    chain = LangChain(api_key='tu-clave-api-de-openai')
    return chain
 
chain = load_chain()

Este código crea una nueva instancia de LangChain con tu clave de API de OpenAI. Puedes utilizar esta instancia para generar respuestas a las consultas de los usuarios.

Construye una aplicación de visualización de datos sin código con PyGWalker

PyGWalker (opens in a new tab) es otra herramienta impresionante sin código. Puedes utilizar fácilmente esta Biblioteca de Python de código abierto para crear aplicaciones de visualización de datos en Streamlit.

Demo en línea de PyGWalker + Streamlit (opens in a new tab)

PyGWalker (opens in a new tab) es una biblioteca de Python que te ayuda a incrustar fácilmente una interfaz similar a Tableau en tu propia aplicación de Streamlit sin esfuerzo.

¡Mira este increíble video producido por Cómo explorar datos con PyGWalker en Python (opens in a new tab) que muestra los pasos detallados para potenciar tu aplicación de Streamlit con esta potente Biblioteca de visualización de datos en Python!


Un agradecimiento especial a Sven y su gran contribución (opens in a new tab) a la comunidad de PyGWalker.

Además, también puedes consultar estos recursos:

Visualize Data in Streamlit with PyGWalker (opens in a new tab)

Funciones para proteger la privacidad

En la era digital de hoy, los riesgos de violaciones de datos y las preocupaciones de privacidad son más frecuentes que nunca. Es crucial asegurarse de que nuestro chatbot no solo brinde una experiencia de usuario fluida, sino que también respete la privacidad del usuario. Entonces, ¿cómo logramos esto?

En primer lugar, podemos asegurarnos de que nuestro chatbot no almacene ningún dato personal del usuario. El componente de chat de Streamlit está diseñado teniendo en cuenta la privacidad; no almacena ningún dato del usuario de forma predeterminada. Esto significa que cualquier conversación que tengas con el chatbot se mantiene entre tú y el bot, sin que se almacene o se utilice datos con otros fines.

Pero podemos ir un paso más allá. Podemos utilizar modelos de lenguaje que preserven la privacidad para asegurarnos de que nuestro chatbot no memorice información sensible. Estos modelos están entrenados de manera que evitan retener datos sensibles. Por ejemplo, GPT-3.5-turbo de OpenAI es un modelo de lenguaje diseñado para generar texto similar al humano sin retener ninguna información sensible de la entrada que se le proporciona. Esto significa que incluso si un usuario comparte involuntariamente información sensible, el modelo no recordará ni utilizará esta información en futuras interacciones.

Conclusión

Construir un chatbot con Streamlit y LangChain es un proceso sencillo que implica configurar el entorno, indexar documentos, crear la interfaz de chatbot y garantizar funciones de privacidad. Con el poder de los modelos LLM y las herramientas de código abierto, puedes crear un chatbot que no solo sea eficiente y fácil de usar, sino que también respete la privacidad del usuario.

Preguntas frecuentes

  1. ¿Cómo se crea un chatbot en Streamlit? Hacer un chatbot en Streamlit implica varios pasos, incluyendo la configuración de tu entorno de desarrollo, la indexación de tus documentos, la creación de la interfaz del chatbot y garantizar características de privacidad. Este artículo proporciona una guía completa sobre cómo construir un chatbot con Streamlit.

  2. ¿Para qué se utiliza el chat de Streamlit? El chat de Streamlit se utiliza para crear una interfaz de chatbot fácil de usar en tu aplicación de Streamlit. Proporciona una interfaz similar a una aplicación de chat, lo que hace que tu chatbot sea más interactivo y atractivo para los usuarios.

  3. ¿Cuál es el chatbot de IA más avanzado? Los chatbots de IA más avanzados utilizan modelos de lenguaje sofisticados como GPT-3.5-turbo de OpenAI. Estos chatbots pueden generar texto similar al humano, entender el contexto y proporcionar respuestas relevantes. También están diseñados teniendo en cuenta la privacidad, garantizando que no retengan información sensible del usuario.