Cursus
Dify is een gebruiksvriendelijke platform waarmee je AI-toepassingen kunt bouwen met weinig tot geen code. Het werkt met blokken die je sleept en neerzet, elk met een eigen functie. Informatie stroomt door de blokken, wordt verwerkt en gecombineerd om antwoorden te genereren.
In dit artikel leg ik de basis van Dify uit door je stap voor stap te laten zien hoe je een AI-reisagent maakt.
We houden onze lezers op de hoogte van het laatste AI-nieuws met The Median, onze gratis nieuwsbrief op vrijdag die de belangrijkste verhalen van de week voor je uitpluist. Abonneer je en blijf scherp in een paar minuten per week:
Wat is Dify?
Dify is een platform dat het ontwikkelen van AI-toepassingen vereenvoudigt zonder dat je uitgebreide programmeervaardigheden nodig hebt. Het biedt een gebruiksvriendelijke low-code omgeving waarin je apps bouwt door verschillende componenten te slepen en neer te zetten.
Zie Dify als een digitale gereedschapskist vol kant-en-klare blokken die je in elkaar klikt om werkende software te maken. Deze aanpak maakt technologie toegankelijker, zodat mensen met beperkte programmeerkennis hun ideeën tot leven kunnen brengen.
Elk bloktype heeft invoer en zet die om in verschillende uitvoer, afhankelijk van het type blok. Informatie wordt van blok naar blok doorgegeven en getransformeerd, wat het eindresultaat oplevert.
Aan de slag met Dify
Je kunt Dify op twee manieren gebruiken:
- Lokale installatie.
- De cloudversie gebruiken.
In deze tutorial gebruiken we de cloudversie. De cloudversie van Dify heeft een gratis plan, dus je kunt deze tutorial volgen zonder betaalde abonnementen.
Ben je geïnteresseerd in de lokale setup? De makkelijkste manier is:
- Download of kloon Dify vanuit de officiële repository.
- Start Dify met Docker zoals beschreven in de Quick Start-sectie van de README van de repository.
Een Chatflow maken met Dify
Dify biedt verschillende soorten apps. We richten ons op het bouwen van een Chatflow-app: een AI-flow waarbij gebruikers via een chatinterface met de agent communiceren.
Om een nieuwe Chatflow-app te maken, klik je eerst op "Create from blank" en kies je de optie "Chatflow".

Om de flow te maken, geven we een naam op en klikken dan op de knop “Create”:

Dit maakt de volgende standaardflow aan:

Deze flow heeft drie blokken:
- Het startblok start de flow. In het geval van een Chatflow begint de flow wanneer de gebruiker een bericht stuurt.
- De LLM-node neemt het gebruikersbericht als invoer en stuurt het naar een LLM, in dit geval
gpt-4. - De laatste node toont een bericht in de chat. In dit voorbeeld is hij verbonden met de LLM-node, dus de uitvoer van de LLM-node gaat naar de chat.
Deze drie nodes samen vormen feitelijk een AI-chat vergelijkbaar met ChatGPT. Voordat we deze app draaien, moeten we de OpenAI-plugin installeren en instellen.
De OpenAI-plugin installeren en instellen
Om de OpenAI-plugin te installeren, doe je het volgende:
- Klik op de knop "Plugins" rechtsboven.

- Klik op “Install from Marketplace.”

- Typ "openai" in het zoekvak en klik op de OpenAI-plugin.

- Selecteer de OpenAI-plugin en klik op “Install.”
Vervolgens moeten we de OpenAI API-sleutel instellen. Als je er nog geen hebt, maak hem dan hier aan. Let op: het gebruik van de OpenAI API is niet gratis, dus je moet een betaalmethode koppelen aan de API-sleutel.
Zodra we een sleutel hebben, configureren we die als volgt:
- Selecteer de LLM-node.

- Klik op het configuratie-icoon naast de modelnaam.

- Klik op de modelkeuzelijst bovenaan.

- Klik onderaan de lijst op "Model Provider Settings".

- Klik op "Setup" in de API-sleutelsectie.

- Plak de API-sleutel en klik op “Save”.

De app draaien
Nu kunnen we de app draaien door op de previewknop te klikken:

Op dit moment is het nog niet erg interessant: het is alleen een AI-chatbot. Onthoud dat er niets gebeurt totdat de gebruiker een bericht stuurt.

Variabelen maken
Dify maakt het mogelijk om de status van de applicatie op te slaan door waarden toe te kennen aan variabelen die voor alle blokken toegankelijk zijn.
Om een variabele te maken, klik je op de variabelenknop:

Laten we een variabele maken om de naam van de gebruiker op te slaan:

Deze configuratie maakte een variabele met de naam name die een string (tekst) opslaat. We lieten de standaardwaarde leeg, dus de variabele is in eerste instantie een lege string.
Er zijn verschillende manieren om die te vullen, maar de meest gebruikelijke is een AI-blok gebruiken om dit automatisch uit het gesprek af te leiden. Dat leren we zo. Eerst bekijken we hoe je de waarde van een variabele controleert om de flow van de applicatie te sturen.
IF/ELSE-blokken
Om de waarde van een variabele te controleren, kunnen we een IF/ELSE-blok gebruiken. Dit blok voert verschillende acties uit afhankelijk van de waarde van een variabele.
Om een nieuw blok toe te voegen, klik je op de "+"-knop onderaan:

Selecteer vervolgens het blok dat je wilt toevoegen. In dit geval kiezen we "IF/ELSE":

Klik daarna op het blok om het te configureren en selecteer de eerder gemaakte variabele name.
Om dit te testen voegen we twee Answer-blokken toe. Deze blokken tonen een bericht in de chat. We verbinden er één met de IF-uitvoer (die loopt als de voorwaarde waar is) en de andere met de ELSE-uitvoer (die loopt als de voorwaarde onwaar is).

Voor de IF-uitvoer zet ik de tekst "Sorry, ik weet je naam niet." en voor ELSE "Hallo, {name}!". We kunnen accolades gebruiken om een variabele in een string te injecteren. Dit is later ook handig bij het bouwen van prompts.
We kunnen deze Chatflow proberen via de knop "Preview". Let op: een Chatflow wordt getriggerd door een gebruikersbericht, dus stuur eerst iets, zoals "Hi". Hier zijn de resultaten afhankelijk van of de naam wel of niet is ingesteld (voor het tweede voorbeeld heb ik die handmatig gezet in de interfacevariabele):

Variable Assigner- en Parameter Extractor-blokken
We kunnen AI gebruiken om de waarden van variabelen te identificeren en te extraheren met een Parameter Extractor-blok. Dit blok gebruikt een LLM om informatie uit het gesprek te halen.

We voegen eerst een Parameter Extractor-blok toe op de IF-tak. Dit is de configuratie van het blok:

- De
INPUT VARIABLEstaat opsys.query, wat overeenkomt met het gebruikersbericht. Dit betekent dat het Parameter Extractor-blok de waarde uit het gebruikersbericht probeert te halen. - In de
EXTRACTION PARAMETERSdefiniëren we de informatie die we willen extraheren. Helaas kunnen we hier niet direct een variabele opgeven, dus we moeten die informatie herdefiniëren door op de “+”-knop te klikken.

- Het veld
INSTRUCTIONis de prompt die de LLM aanstuurt wat te doen. - Vervolgens voegen we een Variable Assigner-blok toe om de door de Parameter Extractor gevonden waarde (indien aanwezig) toe te wijzen aan de variabele
name.

Zorg dat je de geëxtraheerde name toewijst aan de variabele name.

Na deze stap kan de variabele name nog steeds ongedefinieerd zijn, omdat het kan dat de gebruiker geen naam heeft gegeven. We voegen dus nog een IF/ELSE-blok toe om te controleren. Als de naam is ingesteld, begroeten we de gebruiker. Anders vragen we naar de naam.

Hier is een voorbeeldinteractie:

Deze flow laat de basisprincipes van Dify-workflows zien. Wat het gebruikersbericht ook is, als de naam niet is gedefinieerd, probeert hij de naam uit het bericht te halen. Lukt dat niet, dan vraagt hij erom. Anders begroet hij de gebruiker met naam.
Er is op dit moment geen LLM-blok, dus de agent doet verder niets.
Code-blok
Code-blokken kun je gebruiken om aangepaste Python-code uit te voeren. Laten we de vorige flow aanpassen om in plaats van de gebruikersnaam de locatie van de gebruiker te extraheren. Daarna gebruiken we een Code-blok om een verzoek te doen aan een weer-API en de weersverwachting naar de gebruiker te sturen.
- Maak een nieuwe variabele met de naam
location. - Pas de IF/ELSE-blokken aan zodat ze
locationcontroleren in plaats vanname. - Pas het Parameter Extractor-blok aan om de locatie te extraheren in plaats van de naam.
- Pas het Variable Assigner-blok aan om de geëxtraheerde waarde toe te wijzen aan de variabele
location. - Pas de Answer-blokken aan om respectievelijk naar de locatie te vragen en de locatie te tonen.
Na deze stappen zou de flow er zo uit moeten zien:

Hier is een voorbeeldinteractie:

De volgende stap is een Code-blok toevoegen nadat we de locatie hebben. Dit blok doet een verzoek aan de OpenWeather API om de weersverwachting voor die locatie op te vragen.
Deze API is gratis te gebruiken, zolang we niet te veel verzoeken doen.
Vervang het tweede Answer-blok door een Code-blok.

Configureer het om één parameter met de waarde location te ontvangen.

Voor de Python-code: zo kun je met het pakket requests het weer ophalen via de OpenWeather API:
import requests
API_KEY = "PASTE_YOUR_API_KEY_HERE"
def main(location: str) -> str:
base_url = "http://api.openweathermap.org/data/2.5/weather"
params = {
"q": location,
"appid": API_KEY,
"units": "metric",
}
response = requests.get(base_url, params=params)
data = response.json()
if response.status_code == 200:
weather_desc = data["weather"][0]["description"]
temp = data["main"]["temp"]
return {
"result": f"Current weather in {location}: {weather_desc}, Temperature: {temp}°C"
}
else:
return {
"result": "Could not retrieve weather data",
}
Tot slot verbinden we de uitvoer van de Code-node met een Answer-node om die aan de gebruiker te tonen.

We hebben nu een Chatflow die de weersverwachting kan geven:

Project: een AI-reisplanner bouwen
We hebben nu alle tools om een AI-reisagent te bouwen. De mogelijkheden zijn eindeloos, maar om deze tutorial overzichtelijk te houden, houden we het simpel.
De agent richt zich op het plannen van één dag van de reis. Hij begint met het verzamelen van de locatie van de gebruiker en het soort activiteiten dat die graag doet. Daarvoor gebruiken we twee variabelen:
location: sla de locatie op waar de gebruiker naartoe reist.activities: een array met strings die de activiteiten bevatten die de gebruiker wil doen.

Zo kun je een flow maken om beide variabelen te extraheren:

In dit voorbeeld beginnen we met een variabelextractieblok om zowel de location als de lijst met activities te extraheren.

Daarna gebruiken we IF/ELSE-blokken om te controleren of elk van deze parameters is geëxtraheerd en werken we de variabelen bij als dat zo is. Anders dan in onze eerdere voorbeelden maakt dit het mogelijk dat de gebruiker de waarden bijwerkt.
Aan het einde van de waarde-extractie en variabeletoewijzing voegen we nog een IF/ELSE-blok toe om te controleren of er waarden ontbreken. Als er iets ontbreekt, vragen we de gebruiker expliciet om die te geven.

Als zowel location als activities zijn gedefinieerd, gebruiken we het eerder gemaakte Code-blok om het weer op de opgegeven locatie op te halen. Tot slot geven we het weer, de locatie en de activiteiten door aan een LLM-blok om de dag van de gebruiker te plannen.

Het LLM-blok is geconfigureerd met een system prompt die het model vertelt wat het moet doen. De locatie, activiteiten en het weer worden erin geïnjecteerd. Hier is het laatste deel van de flow:

Hier is een voorbeeldinteractie met de agent:

In de reactie zie je dat de agent dankzij de Code-node het weer kan geven en daarmee rekening houdt bij het plannen van de activiteiten.
Door de manier waarop de flow is opgezet, geeft de agent meteen een dagplanning als de gebruiker alle informatie direct in het eerste bericht geeft.

Een aangepaste begroeting instellen
Het kan zijn dat je ziet dat de agent begon met een begroeting aan de gebruiker:

Om dit mogelijk te maken, moeten we de Conversation Opener-functie activeren.


Dify Tools
In deze tutorial hebben we de fundamentele bouwstenen van Dify geleerd. Eén aspect dat we niet hebben behandeld, zijn tools.
In Dify zijn tools krachtige extensies waarmee je AI-agents met de buitenwereld kunnen communiceren, voorbij de beperkingen van een taalmodel. Een LLM kan redeneren en antwoorden genereren op basis van trainingsdata en promptcontext, maar heeft geen realtime toegang tot live data of externe diensten.
Tools lossen dit op door je agent in staat te stellen API-calls te doen, databases te bevragen, berekeningen uit te voeren, documenten op te halen, en meer. Ze vormen zo een brug tussen je AI en externe informatiebronnen.

Je kunt tools configureren in Dify via de visuele interface van het platform door het type tool te specificeren (zoals HTTP-verzoeken, code-interpreters of plugins van derden), het input/output-schema en eventuele authenticatievereisten. Eenmaal ingesteld kun je deze tools in je agentflow gebruiken via Tool-blokken, waarmee je data naar de tool stuurt en resultaten terugkrijgt om die vervolgens door te geven aan LLM-nodes of andere logische blokken.

Hierdoor worden je agents niet alleen slimmer, maar ook actiegericht: ze kunnen actuele, contextueel relevante antwoorden geven door met echte diensten te interageren.
In ons voorbeeld gebruikten we een codeblok om een verzoek te doen aan de weer-API. Een alternatief was geweest om een tool te maken en die aan de LLM te geven.
Conclusie
In deze tutorial hebben we enkele van de fundamentele blokken verkend die je nodig hebt om met Dify aan de slag te gaan. Dify biedt echter nog veel meer functies en mogelijkheden om te ontdekken.
Om je begrip te versterken, is een goede oefening om de reisagent die we hebben gemaakt uit te breiden. Overweeg functies toe te voegen zoals internetsuche-mogelijkheden om lokale activiteiten online te vinden, wat de agent kan verrijken en dynamischere suggesties kan opleveren.
Ben je gek op AI-agent builders zoals Dify? Bekijk dan ook onze andere tutorials:

