Programa
En este artículo, te explicaré paso a paso cómo utilizar Flowise para crear un agente de IA que pueda responder preguntas basándose en un conjunto de datos CSV.
Flowise es una herramienta práctica para quienes quieran construir agentes de IA sin enredarse en codificación compleja. Flowise tiene un enfoque de bajo código y nos permite centrarnos más en la tarea que tenemos entre manos, en lugar de en los detalles técnicos.
Recientemente, he visto un aumento de las herramientas diseñadas para construir agentes de IA. Estas herramientas se han hecho más accesibles y fáciles de usar, permitiendo a todo el mundo crear sistemas inteligentes sin necesidad de grandes conocimientos técnicos. Si te interesa saber más sobre estas herramientas, consulta también estos tutoriales:
- n8n: Una guía con ejemplos prácticos
- Langflow: Una guía con proyecto de demostración
- Dificar la IA: Una guía con proyecto de demostración
¿Qué es Flowise?
Flowise es una herramienta diseñada para ayudarnos a crear agentes de IA mediante una sencilla interfaz de arrastrar y soltar. Funciona permitiéndonos conectar distintos bloques, que representan diversas funciones, para construir un flujo de trabajo personalizado. Cada bloque puede configurarse para realizar una acción concreta.
Por ejemplo, hay bloques conocidos como bloques LLM que se utilizan para enviar un mensaje a un gran modelo lingüístico. También hay bloques de función que nos dan la posibilidad de ejecutar funciones JavaScript personalizadas, lo que permite realizar operaciones aún más a medida.
Al enlazar estos bloques entre sí, la información fluye de un bloque al siguiente, procesando y transformando los datos paso a paso. Este enfoque modular facilita la construcción de agentes de IA sin profundos conocimientos de programación, ya que podemos centrarnos en diseñar el flujo de trabajo y configurar las acciones necesarias.
Construir un agente de IA analista de datos con Flowise
Vamos a desglosar el proceso de construcción de un agente de IA analista de datos utilizando Flowise. Esta guía cubrirá el registro en Flowise, la creación de un flujo de trabajo personalizado y la utilización de varios bloques para crear un agente interactivo que pueda analizar conjuntos de datos.
Paso 1: Crear una cuenta en Flowise
Empieza por visitar esta página de registro de Flowise y crea una cuenta. Rellena los datos requeridos y sigue las instrucciones enviadas a tu correo electrónico para verificar y activar tu cuenta.
Paso 2: Configuración de la base de datos
Ahora que tenemos lista nuestra cuenta Flowise, es hora de configurar la base de datos que vamos a utilizar. Necesitamos una base de datos para almacenar los datos que queremos analizar.
Utilizaremos SingleStore, un proveedor de bases de datos SQL popular y fácil de usar, para gestionar nuestros datos. Vamos a seguir estos pasos:
- Empieza por dirigirte al Sitio web de SingleStore.
- Crea una nueva cuenta en SingleStore.
- Con una cuenta SingleStore activa, el siguiente paso es cargar el conjunto de datos con el que vamos a trabajar. Para este ejemplo, estamos utilizando un conjunto de datos centrado en los hábitos de los estudiantes en las redes sociales, que se puede encontrar en Kaggle. Asegúrate de descargar el archivo del conjunto de datos de Kaggle y subirlo a SingleStore.
- Una vez cargado el conjunto de datos, SingleStore generará automáticamente una tabla de base de datos a partir de él. Esta tabla constituirá la base de nuestro análisis de datos, preparando la información para que nuestro agente de IA Flowise pueda interactuar con ella.
Paso 3: Navega hasta la sección de flujos de chat
Una vez iniciada la sesión, ve al panel de control y busca la sección "Flujos de chat". Haz clic en "Añadir nuevo" para empezar a crear un nuevo flujo de trabajo.
Paso 4: Crear una función personalizada para cargar la tabla Información
Este paso implica escribir una función personalizada para recuperar información sobre la tabla, como su descripción y los nombres de las columnas. Estos datos son cruciales para que nuestro agente de IA comprenda la estructura del conjunto de datos que va a consultar.
- Crea un bloque de funciones personalizado.
- Pega el siguiente código en el editor de bloques de función:
const mysql = require('mysql2/promise');
const tableName = $tableName;
const tableDescription = $tableDescription;
const connectionUrl = "<PASTE_YOUR_CONNECTION_STRING_HERE>"
async function main() {
try {
const pool = mysql.createPool(connectionUrl);
const q =
DESCRIBE ${tableName};
;
const [rows] = await pool.query(q);
const fields = rows.map((row) => ${row.Field} of type ${row.Type}).join("\n");
const tableInformation = Table name: ${tableName}\nTable description:\n${tableDescription.trim()}\nColumns:\n${fields.trim()};
return tableInformation;
} catch(error) {
return String(error);
}
}
return main();
En la parte superior de la función, tenemos que establecer el valor connectionUrl
. Puedes encontrarlo en SingleStore, en la pestaña Despliegues.
La cadena de conexión tiene este aspecto
françois-19ecc:<françois-19ecc Password>@svc-3482219c-a389-4079-b18b-d50662524e8a-shared-dml.aws-virginia-6.svc.SingleStore.com:3333/db_franois_88ec0
La primera parte, françois-19ecc
en mi caso, es el nombre de usuario. Justo después, hay un marcador de posición para la contraseña, , que tenemos que sustituir.
Esta función se conecta a la base de datos de SingleStore y obtiene la información de las columnas de la tabla. Tiene dos entradas:
tableName
: El nombre de la tablatableDescription
: La descripción de la tabla.
Deben configurarse haciendo clic en el botón "Variables de entrada" del nodo de código personalizado. Se puede acceder a las variables en el código anteponiendo a su nombre un $
.
En mi caso, la tabla se llamaba dataset
cuando se creó en SingleStore. Debes utilizar el nombre que se estableció cuando subiste el archivo CSV.
Paso 5: Crear un nodo de plantilla de avisos
En este nodo elaboramos las preguntas que guían a nuestro agente de IA. Conecta este nodo a tu función personalizada.
- Crea un nodo de plantilla de avisos.
- Introduce la siguiente indicación:
Based on the SQL table information and the user's questions, return a SQL query that answers that question.
TABLE INFORMATION: {tableInformation}
QUESTION: {question}
El indicador tiene dos marcadores de posición: {tableInformation}
y {question}
. El question
es el mensaje enviado por el usuario, mientras que el tableInformation
es la salida de la función que definimos en el paso anterior.
Estos valores de marcador de posición deben configurarse haciendo clic en el botón "Formatear valores de aviso" del nodo de plantilla de avisos.
Paso 6: Enlace a un bloque de cadena LLM
Ahora, conectamos el nodo de plantilla de consulta a un bloque de cadena LLM, que interpretará la consulta y generará una consulta SQL a partir de ella. Estos son los pasos que debemos seguir:
- Añade un bloque de cadena LLM.
- Incluye un bloque de modelo configurado para utilizar OpenAI, y conéctalo al bloque de cadena LLM en la entrada "Modelo de lenguaje".
- Para configurar el modelo OpenAI, necesitarás establecer una clave API OpenAI. Si no tienes una, puedes crear una aquí.
- Conecta el bloque de plantilla de aviso a la entrada "Aviso".
Paso 7: Utilizar un bloque de variables de ajuste
Para almacenar la consulta SQL generada para su uso posterior, crea un bloque de variable de conjunto y vincúlalo a la salida del bloque de cadena LLM.
Paso 8: Ejecuta la consulta SQL
Envía la consulta SQL a un nuevo bloque de código personalizado para ejecutarla en la base de datos.
- Crea otro bloque de código personalizado.
- Introduce el siguiente código:
const mysql = require('mysql2/promise');
const connectionUrl = "<PASTE_THE_SAME_URL_USED_BEFORE>";
function formatQuery() {
// This function is used to clean the query provided by ChatGPT
// by removing markdown quotes
const q = $query;
let lines = q.trim().split(/\r\n|\r|\n/);
if(lines[0].startsWith("")) {
lines = lines.slice(1, lines.length - 1);
}
return lines.join("\n").trim()
}
const q = formatQuery();
try {
const pool = mysql.createPool(connectionUrl);
const [rows] = await pool.query(q);
return rows;
} catch(error) {
return Query: ${q}\nError:${String(error)}`
}
Recuerda ajustar el valor connectionUrl
. Es el mismo que utilizábamos antes.
Esta función tiene una entrada, que es la consulta que queremos ejecutar, y se accede a ella en el código mediante $query
.
Paso 9: Crear otra plantilla de aviso
Esta plantilla se utiliza para dar formato a la respuesta que el agente de IA presentará al usuario basándose en los resultados de la consulta.
- Crea una nueva plantilla de aviso.
- Utiliza esta indicación:
Based on the question and the query result, provide an answer to the user's question. Always show the query to the user.
QUERY: {query}
QUERY RESULT: {queryResult}
QUESTION: {question}
Esta pregunta tiene tres marcadores de posición:
query
: La consulta SQL generada por el LLM, que se obtiene conectando el nodo variable.queryResult
: El resultado de la consulta, que se calcula mediante el nodo anterior de la función personalizada.question
: La consulta inicial del usuario.
Paso 10: Bloque final de la cadena LLM
Por último, conecta esta plantilla de aviso a un nuevo bloque de cadena LLM, que utilizará el aviso para formular la respuesta. Puedes conectarlo al mismo bloque de modelo OpenAI utilizado anteriormente.
Este es el flujo final del agente:
Con estos pasos completados, nuestro agente de IA está listo. Puede aceptar preguntas, generar consultas SQL para recuperar datos relevantes y ofrecer respuestas claras y concisas.
Chatear con el Agente Analista de Datos
El agente ya está listo para usar. Para chatear con él, haz clic en el botón de chat morado de la esquina superior derecha:
Comprobémoslo preguntando cuántas respuestas obtuvo la encuesta:
Ten en cuenta que el agente incluye la consulta en la respuesta debido a la forma en que se diseñó la última consulta. Preguntemos algunas estadísticas sobre los datos:
He aquí otro ejemplo:
Mi opinión sobre Flowise
Tras experimentar con varias herramientas de creación de agentes de IA, mi experiencia con Flowise resultó un tanto frustrante. Un problema recurrente al que me enfrentaba era borrar accidentalmente algunas configuraciones variables, lo que hacía que el agente se comportara de forma errática sin una explicación clara de por qué. Esto a menudo convertía la resolución de problemas en una tarea tediosa.
Además, Flowise carece de un punto de partida claro para sus flujos de agentes, lo que dificulta el seguimiento y la comprensión del funcionamiento del agente. Esto puede resultar especialmente desalentador para los que se inician en la creación de sistemas de IA. Además, Flowise se queda corto a la hora de ver fácilmente los resultados intermedios o de probar los nodos de forma aislada. Esto dificulta la detección de problemas o el perfeccionamiento eficaz del flujo de trabajo.
También me resultó difícil ver las configuraciones de los nodos de un vistazo. Por ejemplo, los nodos de código personalizado que utilizamos definían variables de entrada, pero no es visible que sea así. Tenemos que hacer clic en esa sección del nodo para verla. Esto dificulta la comprensión del flujo con sólo mirarlo.
Conclusión
Aunque Flowise ofrece una prometedora interfaz de bajo código para crear agentes de IA, tiene algunos problemas de usabilidad que la hacen más difícil de utilizar que otras herramientas similares, especialmente para quienes buscan una experiencia más fluida e intuitiva. A pesar de estos retos, el concepto de Flowise tiene potencial y, con algunas mejoras, podría convertirse en una gran herramienta para construir soluciones de IA.