ID.nl logo
Programmeren in Python met ChatGPT - Deel 5
© Limitless Visions - stock.adobe.com
Huis

Programmeren in Python met ChatGPT - Deel 5

In de vorige delen van de workshopreeks over de OpenAI-API hebben we teksten samengevat, vertaald en er informatie uit gehaald. Dat bleef telkens beperkt tot één vraag en één antwoord. In dit laatste deel gaan we een stap verder: je gaat in je eigen Python-programma’s volwaardige conversaties voeren met het taalmodel van ChatGPT.

In dit laatste deel laten we zien dat je in Python een conversatie met ChatGPT kunt voeren.

  • We breiden de basiscode uit met 'messages'
  • We creëren een spelpersonage

Lees ook: Babbelen met bijdehante bots: er is meer dan ChatGPT

Code downloaden In dit deel worden wat voorbeelden van stukken code gegeven. Omdat overtikken van code erg foutgevoelig is, kun je die code beter downloaden en daarna bekijken of kopiëren. Het bestand, gptcode-dl5.txt is beschikbaar via deze webpagina.

Je weet ondertussen hoe je in je Python-programma’s een vraag aan ChatGPT stelt via de OpenAI-API. We hebben dit in de vorige vier delen van deze workshopreeks geïllustreerd met talloze toepassingen. Maar onze programma’s hadden daarbij telkens dezelfde structuur: je stelt een vraag (de prompt), je krijgt een antwoord (de completion) en dan stopt de interactie.

Als je al eens van ChatGPT gebruikgemaakt hebt op de OpenAI-website, weet je dat je er ook volledige conversaties mee kunt voeren. Die mogelijkheid gaan we nu ook in onze eigen Python-programma’s inbouwen. In plaats van een klassieke, beperkte interface met invoer in een vast patroon, creëer je zo een conversationele interface. 

Basiscode

In de vorige delen van deze reeks maakten we altijd gebruik van een basisfunctie get_completion waaraan we een gebruikersprompt en eventueel een systeemprompt gaven, met optioneel ook een model. Die functie stuurde de prompt(s) door aan de OpenAI-API en gaf het antwoord terug.

Om een conversatie te voeren, moet het taalmodel toegang tot de hele context hebben, met de vorige boodschappen die het taalmodel en jij hebben uitgewisseld. Daarom maken we in dit deel een nieuwe hulpfunctie: get_completion_from_messages. Daaraan geef je de hele geschiedenis van boodschappen door. Onze basiscode ziet er dan als volgt uit:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Klik daarom in Visual Studio Code op File / New File en kies Python File. Plaats daarin de voorgaande Python-code. De API-sleutel moet je zelf aanmaken in je account bij OpenAI, net zoals in de vorige delen van deze workshopreeks.

Google Nest Mini

Een apparaat dat ook luistert naar wat jij te zeggen hebt

Rollen

Waaruit bestaan die boodschappen nu? Het argument messages dat we aan de functie get_completion_from_messages moeten doorgeven, is een lijst van Python-dictionary’s, een datastructuur die sleutels en waardes heeft. Elke dictionary in de lijst messages heeft twee sleutels: "role" en "content". De eerste beschrijft de rol van de boodschap in de conversatie en de tweede de inhoud (de tekst).

De OpenAI-API kent drie rollen: system, user en assistant. Een boodschap met de rol system beschrijft een systeemprompt. Zoals we in de vorige delen uitlegden, geeft een systeemprompt algemene instructies aan het taalmodel. Een boodschap met de rol user beschrijft een vraag van de gebruiker. En een boodschap met de rol assistant beschrijft een antwoord van het taalmodel.

Een conversatie met de OpenAI-API kan er dan in Python als volgt uitzien in de vorm van boodschappen met een rol en inhoud:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Voeg deze lijst aan je code toe. Daarna kun je aan de OpenAI-API vragen om de conversatie in deze boodschappen voort te zetten:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Sla dit bestand in Visual Studio Code op met Ctrl+S en geef het een naam. Klik dan op Terminal / New Terminal, waarna er onder je code een nieuw deelvenster opent met een opdrachtprompt. Klik rechts bovenaan op het afspeelknopje (het driehoekje met de tooltip Run Python File als je erboven blijft hangen). Als alles goed gaat, krijg je nu in de terminal een antwoord als “Voor het geval dat de cloud gaat regenen!”.

Met deze kennis over de rollen weet je nu ook waarom er in de laatste regel van de functie get_completion_from_messages (en de functie get_completion die we in de eerdere workshops gebruikten) response.choices[0].message["content"] staat. Het stukje message["content"] geeft de tekst van het antwoord van het taalmodel terug. Als je message["role"] in die functie zou tonen, zou je "assistant" te zien krijgen.

Aan ChatGPT is geen originele komiek verloren gegaan.

Wat onthoudt de chatbot?

Je hebt gezien dat elke conversatie die je met het taalmodel voert, bestaat uit een lijst van boodschappen. Het taalmodel houdt rekening met alle informatie die in deze boodschappen te vinden is. Vertel je bijvoorbeeld in één boodschap je naam, dan kun je daar in een van de boodschappen erna naar vragen en kan het taalmodel daar perfect op antwoorden. Vervang de lijst messages uit het vorige voorbeeld maar eens door deze lijst en voer het programma uit:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

De conversatie is eenvoudig. Het taalmodel krijgt de instructie dat het een vriendelijke chatbot is. Daarna stelt de gebruiker zich voor en vraagt het taalmodel wat het kan doen. De gebruiker vraagt dan wat zijn naam is.

Als je dit programma uitvoert, zul je zien dat het taalmodel de naam heeft onthouden. Je krijgt dan immers een antwoord als: “Je naam is Koen. Dat heb je net verteld! Is er nog iets specifieks waar je meer over wilt weten?”

In een andere conversatie waarin je je naam niet vertelt, zal de chatmodel niet op de vraag kunnen antwoorden wat je naam is. Deze conversatie bijvoorbeeld:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Dan krijg je als antwoord iets als: “Sorry, maar ik ben een chatbot en heb geen toegang tot persoonlijke informatie. Ik ken je naam niet.”

Het is belangrijk om te weten dat elke conversatie die je met het taalmodel voert volledig losstaat van de andere. Dat je eerder je naam verteld hebt in de andere conversatie, is geen informatie die in de nieuwe conversatie beschikbaar is. Het taalmodel kent alleen de algemene informatie waarop het is getraind en de lijst met boodschappen die je eraan doorgeeft. 

Conversaties voeren

Hierboven hebben we de boodschappen in de programmacode gezet. Maar we willen de gebruiker zelf invoer laten geven. Hoe doen we dat? Met nog een extra hulpfunctie, die de lijst met boodschappen opbouwt en telkens nieuwe invoer vraagt en de uitvoer toont. Dat doen we door de basiscode uit te breiden met:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Als je dit programma uitvoert, kun je een vraag intypen en met een druk op Enter doorsturen. De functie converse voegt je vraag als prompt toe aan de lijst met boodschappen in de variabele context. Ook het antwoord van het taalmodel voegt de functie aan de lijst toe en dat antwoord wordt getoond. We blijven in een oneindige lus (met while True) de functie oproepen, waarbij de context telkens wordt uitgebreid met je vraag en het antwoord. Daardoor onthoudt het taalmodel de voorgaande boodschappen en kunnen we een echte conversatie voeren.

Het taalmodel onthoudt zaken die je in eerdere boodschappen hebt verteld.

Conversationele interface

We hebben nu in wezen een eenvoudige interface voor ChatGPT gebouwd in een terminalvenster. Maar we willen hier een conversationele interface van maken om op een gebruiksvriendelijke manier invoer voor een groter programma te verkrijgen. Als voorbeeld nemen we een computerspel, waarbij je in het begin je spelpersonage moet ontwerpen.

Pak een momentje van ontspanning

Met je favoriete spelpersonage

Een spelpersonage bestaat uit enkele eigenschappen, zoals naam, vaardigheid, uitrusting en ras. Het spel zou je dat allemaal in een formulier kunnen laten invullen, maar waarom niet in een conversatie? Dat gaan we in de rest van dit artikel programmeren. Als eerste stap moeten we dus een uitgebreide systeemprompt creëren die de conversatie kadert:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Ja, de systeemprompt moet echt zo lang zijn. Als we niet expliciet zeggen wat de chatbot wel en niet mag doen, krijgen we uiteindelijk niet wat we willen: een JSON-string met de eigenschappen van het personage. 

Doet je programma niet wat het moet doen? Zodra je een taalmodel in je programma integreert, ben je afhankelijk van de grillen van het taalmodel. Het is een zwarte doos, waarvan je niet weet hoe het exact werkt en wat het doet. Dat contrasteert heel sterk met de ijzeren logica van een programmeertaal als Python. Het is dus goed mogelijk dat het programma van dit artikel niet doet wat je wilt, omdat je een net iets andere invoer geeft dan verwacht of omdat OpenAI ondertussen zijn taalmodel een update heeft gegeven die zich anders gedraagt. Je zult dus waarschijnlijk continu je programma moeten testen en de systeemprompt moeten finetunen, zodat het gewenste gedrag behouden blijft. Dat is het nadeel van de flexibiliteit van een taalmodel in je programma’s te integreren.

JSON

Een groot deel van onze systeemprompt bestaat uit instructies om de uiteindelijke keuzes van de gebruiker in de vorm van JSON (JavaScript Object Notation) te geven. Waarom is dat zo belangrijk? Omdat we de rest van ons programma alleen met gestructureerde gegevens kunnen laten omgaan, niet met tekst.

Dus als de gebruiker in een conversatie met onze assistent een speler met de naam Born heeft gekozen, die een orkenschurk is met een boog, dan moet ons programma dit uiteindelijk in de volgende vorm kunnen inlezen:

Converseren naar een doel

Het doel van onze conversatie is dus dat we uiteindelijk een JSON-string als hierboven krijgen, zodat het programma verder kan en we het spel kunnen spelen. We kunnen onze conversatie dus laten stoppen wanneer de uitvoer van de assistent een geldige JSON-string is.

Om JSON in Python te gebruiken, importeer je eerst de gelijknamige bibliotheek helemaal in het begin van het programma:

import json

Daarna komt onze basiscode en de systeemprompt met de uitgebreide instructies van hierboven, en daarna creëren we de volgende functie converse:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

Deze functie vraagt dus invoer van de gebruiker, voegt die aan de context toe en stelt de vraag aan de OpenAI-API. Het antwoord van de assistent voegen we aan de context toe.

Daarna probeert de functie om het antwoord van de assistent als een JSON-object in te laden. Lukt dat, dan geeft de functie dit JSON-object terug. Lukt dat niet, dan geeft Python de foutmelding json.decoder.JSONDecodeError terug en reageren we daarop door gewoon het antwoord van de assistent te tonen. Het is dan immers niet het laatste antwoord met de gestructureerde data in JSON-vorm, maar een vraag. In dat geval geeft de functie None terug, omdat de data nog niet volledig zijn.

Gestructureerde data

Hoe maken we nu van die functie converse gebruik? Dat doen we met de volgende code:

De code kun je bekijken in het bestand gptcode-dl5.txt, te downloaden via deze pagina.

We initialiseren eerst de variabele properties door ze de waarde None te geven. Dan tonen we de eerste boodschap van de assistent, waarin we de gebruiker naar de naam van het spelpersonage vragen.

Daarna roepen we de hele tijd de functie converse met de context aan, zolang de waarde die deze functie teruggeeft None is. Zoals we in die functie gezien hebben, geeft ze een JSON-string terug als de assistent JSON-data teruggeeft en anders None. Als de assistent de instructies correct volgt (zie het kader “Doet je programma niet wat het moet doen?”), stopt de conversatie dus wanneer de data volledig zijn.

Op dat moment wordt de code na het while-blok uitgevoerd. We kunnen nu de eigenschappen van het spelpersonage op een gestructureerde manier uit het JSON-object properties halen. We tonen ze hier één voor één. Uiteraard zou je nog wat controles moeten uitvoeren, zodat er geen ongeldige waardes in staan wanneer het taalmodel niet goed werkt. Maar dat is een oefening voor de lezer!

Onze spelassistent weet dat we met ‘human’ een mens bedoelen en met ‘staf’ een toverstaf, maar negeert in dit geval ons verbod om begeleidende tekst bij de JSON-string te geven.

Lees ook:

▼ Volgende artikel
Waarom jouw zuinige A+++-wasdroger straks zomaar een C-label krijgt
© fotomek
Huis

Waarom jouw zuinige A+++-wasdroger straks zomaar een C-label krijgt

Denk je net goed bezig te zijn met een A+++-wasdroger, blijkt die vanaf juli 2025 opeens een magere C te scoren. Wat is hier aan de hand? Geen paniek: je apparaat is niet plotseling minder efficiënt geworden, het energielabel wordt een stuk strenger. In dit artikel lees je waarom de regels zijn veranderd, wat het nieuwe label precies meet en hoe je wél de juiste conclusies trekt bij je volgende aankoop.

Partnerbijdrage - in samenwerking met Bemmel & Kroon

Vanaf 1 juli 2025 – morgen dus! – verandert het energielabel van wasdrogers in heel Europa. De bekende klassen als A+, A++ en A+++ verdwijnen en maken plaats voor een overzichtelijker schaal van A tot en met G. Hierdoor krijgen veel huidige A+++-drogers voortaan een label C. Niet omdat ze slechter presteren, maar omdat de normering strenger en toekomstbestendiger wordt.

Waarom een nieuw energielabel nodig was

Het oude systeem was zijn doel voorbijgeschoten. Doordat fabrikanten steeds energiezuinigere apparaten ontwikkelden, werden er voortdurend plussen aan de A-klasse toegevoegd. Daardoor ontstond een wildgroei aan energielabels die de consument eerder in verwarring bracht dan hielp. Met het nieuwe label keert de rust terug: één heldere schaal die opnieuw ruimte laat aan de top. De zuinigste klasse A blijft voorlopig zelfs leeg, zodat alleen uitzonderlijk efficiënte apparaten die plek mogen innemen.

©Bemmel & Kroon

Wat je ziet op het nieuwe label

Het nieuwe energielabel bevat veel meer informatie dan alleen een letter. Naast de energieklasse geeft het label nu ook inzicht in het verbruik per honderd droogbeurten, gemeten volgens een gestandaardiseerd Eco-programma. Ook de programmaduur, het maximale vulgewicht van de trommel, het geluidsniveau in decibel en de condensatie-efficiëntie staan erop vermeld. Via een QR-code kun je bovendien extra technische details opzoeken in de Europese EPREL-database. Deze toevoegingen zorgen ervoor dat je als consument beter kunt inschatten welk apparaat past bij jouw huishouden en gebruik. Meer informatie vind je op deze pagina.

©Bemmel & Kroon

1. QR-code met link naar de EU database
2. Energie-efficiëntieklasse
3. Energieverbruik in kWh/100 droogcycli*
4. Condensatie-efficiëntieklasse en -percentage

5. Geluidklasse en geluidemissie in dB(A)**
6. Maximale laadcapaciteit (nominale capaciteit in kg)**
7. Duur in uren en minuten**

* Waarden gelden voor een gewogen gemiddelde van halve en volle ladingen met een verhouding van 0,62 (24x volle lading, 76x halve lading).
** Droogcyclus van katoen eco-programma bij volle lading.

Het lastige van vergelijken

Oude en nieuwe energielabels kun je niet zomaar naast elkaar leggen. Een A+++-droger uit 2024 kan volgens de nieuwe testmethodes een label C krijgen, terwijl het apparaat in de praktijk nog steeds even zuinig is. Dat verschil komt puur door de aangescherpte meetnormen, en niet door een verandering in prestaties. Laat je dus niet misleiden door een ogenschijnlijke 'verslechtering' van het label, maar kijk naar de echte verbruiksgegevens en technische kenmerken van jouw wasdroger.

Wat dit voor jouw keuze betekent

Bij het kopen van een nieuwe droger is het dus belangrijk om verder te kijken dan alleen de letter op het label. De vermelding van het energieverbruik per honderd droogcycli geeft je een veel concreter beeld van de stroomkosten op jaarbasis. Ook het geluidsniveau, de capaciteit van de trommel en de duur van het droogprogramma bepalen in sterke mate hoe comfortabel en efficiënt het apparaat in de praktijk is. Dankzij de QR-code kun je bovendien snel en eenvoudig controleren of de technische gegevens aansluiten bij je verwachtingen.

©Viktoria

Slim kiezen met het nieuwe label

De vernieuwde energielabels maken het makkelijker om een slimme, bewuste keuze te maken. Niet alleen zie je in één oogopslag hoe energiezuinig een apparaat is volgens de nieuwste normen, je hebt ook toegang tot de details die er écht toe doen. Zo kun je jouw keuze afstemmen op wat je belangrijk vindt: lage kosten, weinig geluid, korte droogtijd of een groot vulgewicht. Door te letten op de werkelijke prestaties in plaats van alleen op een letter, maak je een duurzame keuze die ook op de lange termijn rendeert.

Wil je hulp bij het kiezen van een energiezuinige droger of persoonlijk advies over welk type het best bij jouw huishouden past? Laat je dan informeren door een specialist, zodat je met vertrouwen de juiste keuze maakt voor nu én de toekomst.

Op zoek naar een écht zuinige droger?

Bekijk de beste deals bij Bemmel & Kroon!
▼ Volgende artikel
Inbouwapparatuur in je keuken? Zo meet je alles precies goed op
© zephyr_p
Huis

Inbouwapparatuur in je keuken? Zo meet je alles precies goed op

Een nieuwe oven, koelkast of vaatwasser kiezen begint niet bij het design of de functies – het begint met een meetlint. Want hoe mooi of geavanceerd een apparaat ook is, als het nét niet past, zit je met een kostbare misser. Een paar millimeter speling kan het verschil maken tussen een perfect passende keuken en een frustrerende inbouwervaring. Met deze meetinstructies weet je zeker dat je straks niet voor verrassingen komt te staan.

Wil je je inbouwapparatuur tot op de millimeter nauwkeurig installeren, dan is precies meten onmisbaar. In dit artikel lees je over:

• Algemene meetprincipes • Waar je precies op moet letten bij een ⋄ inbouwkoelkast of -vriezer  ⋄ inbouwoven en -magnetron  ⋄ inbouwvaatwasser ⋄ inbouw-espressomachine  • Welke veelgemaakte fouten je moet zien te vermijden • Wat je altijd als laatste moet doen

Ook interessant: Een inbouwkoelkast kopen: waar moet je op letten?

Goed meten is het halve werk

Voordat je aan de slag gaat met meten, is het slim om een paar basisregels aan te houden. Gebruik altijd een betrouwbare rolmaat en eventueel een digitale schuifmaat voor extra precisie. Meet de binnenafmetingen van de nis (dus niet de buitenkant van je keukenkast) en noteer breedte, hoogte én diepte.

Houd daarnaast rekening met de ventilatieruimte: meestal is 2 tot 5 cm aan de achterkant en zijkanten nodig. En check of er ruimte is voor stopcontacten, wateraansluitingen en kabeldoorvoeren – die bepalen vaak óók of het apparaat goed kan worden geplaatst.

©Andrey Sinenkiy

Waar moet je op letten per apparaat?

Elk soort inbouwapparaat heeft zijn eigen eisen en aandachtspunten. Hieronder lees je per type waar je bij het opmeten en installeren specifiek op moet letten. Zo kom je niet voor verrassingen te staan.

Inbouwkoelkast of -vriezer

De hoogte van de nis is hier allesbepalend. Veelvoorkomende maten voor inbouwkoelkasten en -vriezers zijn 88, 140 en 178 cm, maar afwijkingen komen vaak voor. Let op het deursysteem: een sleepdeurmechanisme vraagt meestal om iets meer ruimte in de breedte. Diepte is vaak 55 cm, maar modellen met een ventilator achterop kunnen richting de 60 cm gaan.

Inbouwoven of -magnetron

Standaard? Niet helemaal. De nisbreedte is meestal 56 cm, terwijl het frontpaneel iets breder is (ca. 59,5 cm) voor een nette aansluiting. Hoogtes verschillen: compacte ovens zijn 45 cm hoog, standaardmodellen 60 cm. Magnetrons vragen soms extra ruimte aan de bovenkant voor uitstekende bedieningspanelen.

Inbouwvaatwasser

Hier draait het vooral om hoogte. Die varieert tussen 81,5 en 87 cm, met verstelbare poten voor wat speling. Meet ook de plinthoogte (van vloer tot onderkant kast), en vergeet de watertoevoer niet – reken op zo’n 5 cm extra ruimte in de diepte voor de slang.

Inbouw-espressomachine

Kleiner apparaat, maar niettemin precisiewerk. De breedte is vaak rond de 56 cm, maar de diepte varieert sterk. Let vooral op het waterreservoir (dat tot 55 cm diep kan zijn) en op kleppen of deurtjes die naar voren openen: die hebben extra werkruimte nodig.

©Cristina Villar Martin | Ladanifer

Veelgemaakte fouten die je makkelijk voorkomt

Zelfs met zorgvuldige metingen kan het misgaan, vaak doordat kleine details worden vergeten. Denk aan ventilatieruimte, uitstekende stekkers of leidingen die net in de weg zitten. Een handige tip: plak een strook tape op de vloer op de plek waar de achterkant van het apparaat komt, en markeer waar stekkers en leidingen zitten. Zo zie je snel of er iets in de weg zit.

Ook niet onbelangrijk: controleer of de nis waterpas is! Zeker bij koelkasten met uitschuiflades kan een scheve ondergrond voor problemen zorgen. Pas waar nodig je kast of ondervloer aan voordat je installeert.

Bij renovaties gelden vaak afwijkende maten. Oudere keukens hebben soms dikkere wanden of ongebruikelijke dieptes. Meet dus altijd de huidige situatie én de specificaties van je nieuwe apparaat. Twijfel je? Schakel een keukenexpert in, zeker bij combinaties zoals een oven met magnetron, waarbij elk detail telt.

En tot slot: de allerbelangrijkste stap

Het klinkt als een open deur, maar het voorkomt de meeste problemen: meet altijd twee keer! Schrijf je maten op en leg ze naast de officiële productspecificaties. Let daarbij op details als verstelbare voetjes, uitsparingen voor de deur of een uitschuifbaar bedieningspaneel. Zo weet je zeker dat jouw nieuwe inbouwapparaat niet alleen technisch past, maar ook mooi aansluit bij de rest van je keuken. Want uiteindelijk draait het om één ding: alles moet kloppen – tot op de millimeter.