Ga naar hoofdinhoud

Flowise AI: een gids met demoproject

Leer hoe je met Flowise, een low-code tool gebaseerd op workflows, een AI-agent bouwt die vragen beantwoordt op basis van een CSV-dataset.
· 12 min lezen

Verken met AI

In dit artikel leg ik stap voor stap uit hoe je Flowise gebruikt om een AI-agent te bouwen die vragen kan beantwoorden op basis van een CSV-dataset.

Flowise is een handige tool voor iedereen die AI-agents wil bouwen zonder te verdwalen in complexe code. Dankzij de low-code aanpak kun je je meer op de taak zelf richten dan op de technische details.

De laatste tijd zie ik een toename van tools om AI-agents te bouwen. Deze tools zijn toegankelijker en gebruiksvriendelijker geworden, waardoor iedereen intelligente systemen kan maken zonder uitgebreide technische vaardigheden. Als je meer over dit soort tools wilt ontdekken, bekijk dan ook deze tutorials:

Wat is Flowise?

Flowise is een tool waarmee je AI-agents kunt maken via een eenvoudige drag-and-dropinterface. Je koppelt verschillende blokken, die elk een bepaalde functie vertegenwoordigen, om een aangepaste workflow te bouwen. Elk blok kun je configureren voor een specifieke actie.

Zo zijn er LLM-blokken die worden gebruikt om een bericht te sturen naar een large language model. Er zijn ook functionele blokken waarmee je eigen JavaScriptfuncties kunt uitvoeren, voor nog gerichtere bewerkingen.

Door deze blokken aan elkaar te koppelen, stroomt informatie van het ene naar het andere blok en wordt de data stap voor stap verwerkt en getransformeerd. Deze modulaire aanpak maakt het gemakkelijk om AI-agents te bouwen zonder diepgaande programmeerkennis: je richt je op het ontwerpen van de workflow en het configureren van de benodigde acties.

Een data-analist-AI-agent bouwen met Flowise

Laten we het proces om een data-analist-AI-agent te bouwen met Flowise stap voor stap doorlopen. Deze gids behandelt het registreren bij Flowise, het opzetten van een aangepaste workflow en het gebruik van verschillende blokken om een interactieve agent te maken die datasets kan analyseren.

Stap 1: Maak een account aan op Flowise

Begin op deze Flowise-aanmeldpagina en maak een account aan. Vul de gevraagde gegevens in en volg de instructies in je e-mail om je account te verifiëren en te activeren.

Stap 2: Database instellen

Nu ons Flowise-account klaar is, is het tijd om de database in te richten die we gaan gebruiken. We hebben een database nodig om de data op te slaan die we willen analyseren.

We gebruiken SingleStore, een populaire en gebruiksvriendelijke SQL-databaseprovider, om onze data te beheren. Doorloop deze stappen:

  1. Ga eerst naar de SingleStore-website.
  2. Maak een nieuw account aan op SingleStore. 
  3. Met een actief SingleStore-account is de volgende stap het uploaden van de dataset waarmee we gaan werken. In dit voorbeeld gebruiken we een dataset over sociale-media-gewoonten van studenten, te vinden op Kaggle. Download het datasetbestand van Kaggle en upload het naar SingleStore.

Een bestand laden in SingleStore

  1. Zodra de dataset is geüpload, genereert SingleStore er automatisch een databasetabel van. Deze tabel vormt de basis voor onze data-analyse en maakt de informatie klaar voor interactie met onze Flowise-AI-agent.

Stap 3: Ga naar de chatflows-sectie

Ga na het inloggen naar het dashboard en zoek de sectie "Chatflows". Klik op "Add New" om een nieuwe workflow te maken.

Een nieuwe chatflow maken in Flowise

Stap 4: Maak een aangepaste functie om de tabelinformatie te laden

In deze stap schrijven we een aangepaste functie om informatie over de tabel op te halen, zoals de beschrijving en de kolomnamen. Deze gegevens zijn cruciaal zodat onze AI-agent de structuur van de dataset begrijpt die hij gaat bevragen.

  1. Maak een blok voor een aangepaste functie.

Een blok voor aangepaste functie toevoegen

  1. Plak de volgende code in de editor van het functieblok:
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();

Bovenaan de functie moeten we de waarde van connectionUrl instellen. Deze vind je in SingleStore, op het tabblad Deployments.

De informatie voor de databaseverbinding ophalen

De connection string ziet er zo uit:

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

Het eerste deel, françois-19ecc in mijn geval, is de gebruikersnaam. Meteen daarna staat een placeholder voor het wachtwoord, <françois-19ecc Password>, die we moeten vervangen.

Deze functie maakt verbinding met de SingleStore-database en haalt de kolominformatie van de tabel op. Er zijn twee inputs:

  • tableName: de naam van de tabel
  • tableDescription: de beschrijving van de tabel.

Deze moeten worden geconfigureerd via de knop “Input Variables” op de custom code-node. In de code kun je variabelen benaderen door hun naam te laten voorafgaan door een $.

Variabelen benaderen.

In mijn geval heette de tabel dataset toen hij in SingleStore werd aangemaakt. Gebruik de naam die is ingesteld toen je het CSV-bestand uploadde.

De tabelnaam controleren in SingleStore.

Stap 5: Maak een prompttemplate-node

In deze node formuleren we de vragen die onze AI-agent sturen. Verbind deze node met je aangepaste functie.

  1. Maak een prompttemplate-node.

Een prompttemplate-node maken in Flowise

  1. Voeg de volgende prompt in:
Based on the SQL table information and the user's questions, return a SQL query that answers that question.
TABLE INFORMATION: {tableInformation}
QUESTION: {question}

De aangepaste functie verbinden met de prompttemplate in Flowise

De prompt heeft twee placeholders: {tableInformation} en {question}. De question is de door de gebruiker ingediende prompt, terwijl tableInformation de output is van de functie die we in de vorige stap hebben gedefinieerd.

Deze placeholderwaarden moet je instellen via de knop “Format Prompt Values” op de prompttemplate-node.

Promptvariabelen configureren in Flowise

Stap 6: Koppel aan een LLM chain-blok

Verbind nu de prompttemplate-node met een LLM chain-blok, dat de prompt interpreteert en er een SQL-query uit genereert. Volg deze stappen:

  1. Voeg een LLM chain-blok toe.
  2. Voeg een modelblok toe dat is geconfigureerd voor OpenAI, en koppel dit aan de LLM chain op de input “Language Model”.
  3. Om het OpenAI-model te configureren, moet je een OpenAI API-sleutel instellen. Als je er nog geen hebt, kun je er hier een aanmaken.
  4. Verbind het prompttemplate-blok met de “Prompt”-input.

De LLM Chain-node configureren in Flowise

Stap 7: Gebruik een set variable-blok

Maak een set variable-blok om de gegenereerde SQL-query op te slaan voor verder gebruik, en koppel het aan de output van het LLM chain-blok.

Waarden opslaan met het set variable-blok in Flowise

Stap 8: Voer de SQL-query uit

Stuur de SQL-query naar een nieuw blok met aangepaste code om deze op de database uit te voeren.

  1. Maak nog een custom code-blok.
  2. Voer de volgende code in:
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)}`
}

Vergeet niet de waarde van connectionUrl in te stellen. Dat is dezelfde als die we eerder gebruikten.

Deze functie heeft één input, namelijk de query die we willen uitvoeren, en die wordt in de code benaderd met $query.  

Variabelen benaderen in een node met aangepaste functie

Stap 9: Maak nog een prompttemplate

Deze template wordt gebruikt om het antwoord te formuleren dat de AI-agent aan de gebruiker laat zien op basis van de queryresultaten.

  1. Maak een nieuwe prompttemplate.
  2. Gebruik deze prompt:
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}

Deze prompt heeft drie placeholders:

  • query: de SQL-query die door de LLM is gegenereerd, verkregen door de variabelenode te koppelen.
  • queryResult: het resultaat van de query, berekend door de vorige node met aangepaste functie.
  • question: de oorspronkelijke gebruikersprompt.

Verbindingen met de tweede prompttemplate voor het genereren van de SQL-query in Flowise

Stap 10: Laatste LLM chain-blok

Verbind deze prompttemplate tot slot met een nieuw LLM chain-blok, dat de prompt gebruikt om het antwoord te formuleren. Je kunt dit koppelen aan hetzelfde OpenAI-modelblok dat je eerder gebruikte.

Zo ziet de uiteindelijke agentflow eruit:

De uiteindelijke flow in Flowise

Met deze stappen is onze AI-agent klaar. Hij kan vragen aannemen, SQL-queries genereren om relevante data op te halen en heldere, beknopte antwoorden geven.

Chatten met de data-analist-agent

De agent is nu klaar voor gebruik. Klik op de paarse chatknop rechtsboven om te chatten:

Chatten met de AI-agent

Laten we hem testen door te vragen hoeveel reacties de enquête heeft gekregen:

Voorbeeld van een AI-agent met Flowise

Let op dat de agent de query in het antwoord opneemt, vanwege de manier waarop de laatste prompt is opgesteld. Laten we wat statistieken over de data vragen:

Voorbeeld van een AI-agent met Flowise

Hier is nog een voorbeeld:

Voorbeeld van een AI-agent met Flowise

Mijn gedachten over Flowise

Na te hebben geëxperimenteerd met verschillende tools voor het bouwen van AI-agents, vond ik mijn ervaring met Flowise enigszins frustrerend. Een terugkerend probleem was dat ik per ongeluk variabeleconfiguraties verwijderde, waardoor de agent zich onvoorspelbaar gedroeg zonder duidelijke verklaring. Fouten opsporen werd daardoor vaak een tijdrovende klus.

Bovendien mist Flowise een duidelijk startpunt voor agentflows, waardoor het lastig is om te volgen en te begrijpen hoe de agent werkt. Dat kan vooral ontmoedigend zijn voor wie net begint met het bouwen van AI-systemen. Ook laat Flowise te wensen over als het gaat om het eenvoudig bekijken van tussenresultaten of het geïsoleerd testen van nodes. Daardoor is het lastig problemen te lokaliseren of de workflow gericht te verfijnen.

Ook vond ik het moeilijk om de nodeconfiguraties in één oogopslag te zien. Zo definieerden de nodes met aangepaste code inputvariabelen, maar dat is niet zichtbaar. Je moet op dat gedeelte van de node klikken om het te bekijken. Daardoor is het lastig om de flow te begrijpen door er alleen naar te kijken.

Conclusie

Hoewel Flowise een veelbelovende low-code interface biedt voor het maken van AI-agents, heeft het enkele usabilityproblemen die het lastiger maken dan vergelijkbare tools—zeker voor wie een soepelere en intuïtievere ervaring zoekt. Ondanks deze uitdagingen heeft het concept van Flowise potentie, en met enkele verbeteringen zou het een geweldige tool kunnen worden voor het bouwen van AI-oplossingen.

François Aubry

Auteur

François Aubry

Full-stack engineer & oprichter bij CheapGPT. Lesgeven is altijd mijn passie geweest. Al vanaf mijn studententijd zocht ik actief naar kansen om bijles te geven en andere studenten te helpen. Die passie bracht me ertoe om te promoveren, waarbij ik ook als onderwijsassistent werkte ter ondersteuning van mijn academische werk. In die jaren vond ik veel voldoening in de traditionele klasomgeving, waar ik verbindingen kon leggen en leren kon begeleiden. Met de opkomst van online leerplatforms zag ik echter het transformerende potentieel van digitaal onderwijs. Sterker nog, ik was actief betrokken bij de ontwikkeling van zo’n platform op onze universiteit. Ik zet me sterk in om traditionele didactische principes te combineren met innovatieve digitale methoden. Mijn passie is om cursussen te maken die niet alleen boeiend en informatief zijn, maar ook toegankelijk voor lerenden in dit digitale tijdperk.

Onderwerpen

Gerelateerd