Sterretjes zien door AI

  • Berichtcategorie:Projecten

Het lijkt wel een eeuwig­heid geleden: de lente van 2022, toen wij tegen de sterren op onze wildste puzzel­ideeën trachtten uit­werken voor de aller­eerste editie van Nerdland Festival. In enkele van onze aller­eerste blog­posts (1), (2) en (3) gaven we toen een eerlijke blik achter de schermen, met naast succes­verhalen ook tegen­slagen. In het bijzonder hadden we toen dolgraag een puzzel gemaakt waarin de sterren­beelden verwerkt zitten — niet de pseudo­weten­schappelijke astro­logische dieren­riem, maar de volledige 88 constellaties zoals geofficialiseerd door de Inter­nationale Astronomische Unie (IAU) en ook concreet gebruikt door astronomen.

We waren er niet in geslaagd om een geschikte sterren­puzzel op te stellen. Het kostte ons als niet-ingewijden veel gepruts in gespecialiseerde GIS-software (Geographic Information Systems) om de juiste data om te zetten in een proto­type dat we met de laser­cutter uit mdf konden snijden, en we moesten al snel toegeven dat daar geen toekomst in zat. Elke projectie van de volledige sterren­hemel naar een vlakke puzzel leidt op een of andere manier tot vervormingen of uitrekkingen en elk compromis introduceerde weer nieuwe problemen. Het prototype hieronder bijvoorbeeld steunt op de zogenaamde plate carrée, een eenvoudige projectie die parallellen en meridianen op horizontale en verticale rechte lijnen afbeeldt. Maar je ziet meteen dat de stukken aan de noord- en zuid­pool volledig onherkenbaar en fragiel worden, terwijl er langs de evenaar dan weer minuscule puzzel­stukjes overblijven.

We schrapten de puzzel, maar niet het idee: elk jaar opnieuw zochten we nieuwe puzzels en kwamen de sterren­beelden weer boven­drijven. Er moest toch een manier zijn om dit in een fysiek haalbare en leuke puzzel om te zetten? We droomden bijvoorbeeld over de hemel geprojecteerd op een voldoende rond veelvlak (zoals een dodecaëder met 12 of een icosaëder met 20 zijvlakken), over versies waarbij we bepaalde sterren­beelden opknipten of juist aan elkaar hangen, over een magnetische ge-3D-printe versie … maar bij elke poging waren er bezwaren en obstakels. Zo’n 3D-versie, hoe beginnen we daar bijvoorbeeld zelfs aan?!

Vier jaar later hebben we daar misschien een antwoord op. Het ging plots erg snel toen we op aanraden van een vriend een AI-taalmodel probeerden. In deze blogpost willen niet al te diep ingaan op de vele hete hang­ijzers maar voornamelijk een interessante ervaring delen, die ons in staat stelde om onderstaande 3D-figuur te maken en ons nieuwe hoop gaf om de sterren­hemel­puzzel in 3D te kunnen realiseren.

Loading file

Terzijde, het sterrenbeeld hierboven is de Grote Beer (Ursa Major) waarin je misschien de zeven sterren van het beroemde steel­pannetje herkent.

“Heb je het al eens aan AI gevraagd?”

We horen hier met de regelmaat van de klok een (meestal) goedbedoelde “Vraag het eens aan ChatGPT” en haalden daar vaker frustratie dan profijt uit. Artificiële intelligentie is een tool en elke tool kent z’n toepassingen, maar voor ons was de kosten-baten­analyse zelden positief. We ontdekten te vaak serieuze fouten (tot gehallucineerde referenties naar onbestaande artikels toe) en maken ons dan ook zorgen over het toenemend blindelings vertrouwen in AI-resultaten. Je kan online vele horror­verhalen terugvinden van AI-systemen die doodleuk je harde schijf wissen of serieuze IT-beveiligingslekken veroorzaken, als die verhalen al niet zelf AI-gegenereerd zijn natuurlijk. En dan zwijgen we nog over de ethiek en klimatologische impact.

We vinden het niet oké om moeiteloos onze webshop of blog aan te vullen met AI-gegenereerde slop en voor dat soort toepassingen zullen we altijd blijven passen. Onze bedoeling was hier om inspiratie op te doen voor een praktisch haalbare versie van de sterren­beelden­puzzel in 3D-vorm, terwijl we de concrete realisatie nog steeds stevig in eigen handen hielden. Ik ging met die insteek eens in op het goed­bedoelde advies, zonder veel verwachtingen.

De antwoorden van het gekendste taalmodel ChatGPT waren weinig behulpzaam, met meer wollig gedraai rond de pot dan duidelijke of bruikbare aanknopings­punten. Voor IT hoorde ik dat Claude populair is, en die gaf inderdaad een volledig andere, no-nonsense respons. Het helpt wellicht dat je in Claude je profiel kunt beschrijven en ik daar een voorkeur opgaf voor bondige en onverbloemde antwoorden, maar toch. Wie een idee wil, vindt hieronder integraal dat antwoord.

Claude beloofde dus meteen een Pythonscript! Eerlijk, mijn eerste reactie was iets in de trant van “Uhu, dat zijn veel mooie woorden, maar veel meer dan dat zal het niet worden.” Gelukkig kan ik me behelpen met Python. Ik was al tevreden met de algemene aanzet en de juiste methoden in de aan­gereikte bibliotheken, dus ik was benieuwd naar dat scriptje.

Een prompt verder was ik toch onder de indruk. Na grondige inspectie van de code — voer nooit blindelings een script uit dat je van de eerste de beste instantie gekregen hebt! — durfde ik alles uitvoeren en proberen debuggen. De eerste versies waren hoegenaamd niet instant bruikbaar, maar de grote lijnen en pakketten leken best goed te zitten. Er waren de klassieke problemen zoals een link naar een website die niet langer actief was of een Python­bibliotheek die ontbrak. Maar die werden verrassend snel opgelost: een halfuur later al had ik, stomverbaasd, een 3D STL-bestandje met een rudimentair sterren­beeld op een bolschil. Het was enkel nog maar de rand van het gebied, maar de eerste stappen waren bemoedigend.

De volgende avonden werden een heen-en-weer­spel waarin geleidelijk aan problemen werden vastgesteld en opgelost, extra opties zoals sterren en offsets toegevoegd, pakketten en formaten herbekeken …

Bij Claude kun je een blik achter de schermen openklikken en die “tegen zichzelf zien praten”, met her en der hilarische resultaten die je standaard niet te zien krijgt. “Dit is het probleem. Hmm nee, in die situatie gebeurt er dat, maar eigenlijk moet het dit zijn, en … wacht, dit wordt verwarrend.” Een andere keer noemde Claude het zuidelijk sterren­beeld Octant (afgekort Oct) steevast October. Of reageerde die op een grapje met (opnieuw achter de schermen) een droog “Humor afgerond, nu omgeschakeld naar diagnostieken.” Best entertainend!

  • I think [###] Hmm, but [###] and… wait this is getting confusing.
  • Could it be [###]? No… Let me think differently. [###] Oh wait! I think I understand now.
  • Acknowledged humor, pivoted to diagnostic execution.
  • The user is expressing relief. I’ll respond warmly and briefly.

AI-teamwork

Behalve de opvallend snelle vooruitgang waren er uiteraard ook struikel­blokken. Het grootste probleem trad op in de Kleine Beer, de noord­pool­constellatie. De vorm werd goed berekend, maar daarna werd steevast de buiten­kant van het gebied opgevuld dat over de zuidpool heel de bol rond ging. Volgens Claude was de oorzaak een verkeerd georiënteerd deel van de figuur. Alle suggesties kwamen neer op een soort omkeren van meet­kundige data, achterstevoren overlopen van lijsten, herdefiniëren van linker- en rechter­hand­regels … allemaal om die oriëntatie maar recht te trekken. Zelfs op een prompt om vijf verschillende verklaringen voor te stellen, bleef Claude in cirkels draaien.

Die tunnelvisie was een excuus om eens een ander taalmodel te proberen. Ik schetste de workflow, de gebruikte Python­bibliotheken, het concrete probleem en een geknutseld speelgoed­voorbeeld aan Copilot, en vroeg naar een mogelijke verklaring en oplossing. Puur op het vlak van code waren de resultaten niet indruk­wekkend, maar Copilot had ook een oorzaak gesuggereerd. Een beetje technisch — het kwam neer op een singulariteit in de para­metrisatie van de bol, juist op de noordpool. Copilot gaf ook een theoretisch lap­middel: een klein stukje snijden uit de bol rondom de noord­pool en die vervangen door een expliciet klein schijfje, om de singulariteit op de bol zelf te vermijden.

Op dat punt was ik niet genoeg vertrouwd met de Python­bibliotheek om dat idee zelf aan de praat te krijgen. Ik gaf de gesuggereerde patch van Copilot dus door aan Claude, met de vraag die te beoordelen, problemen te voor­spellen en te implementeren. Met succes: met de nodige manuele bijsturingen en verfijningen kwam de Kleine Beer er uiteindelijk in de juiste vorm uit.

Caveats

Artificiële intelligentie als assistent bij het programmeren kan heel snel resultaten leveren. Het is gemakkelijk om daarvan onder de indruk te zijn. Tegelijkertijd was het leerrijk om vast te stellen wat er allemaal fout kan gaan, en hoe AI in rondjes kan blijven draaien en overtuigend beweren dat alles correct werkt. Behalve de vorm van de Kleine Beer waren er veel meer dingen die fout liepen en aandacht vereisten. Zo zagen een aantal sterren­beelden er plots uit zoals Andromeda hieronder.

De gemeenschappelijke factor in de getroffen sterren­beelden was een soort “nulmeridiaan” — de coördinaten­stelsels voor sterren en sterren­beelden gebruiken geen breedte en lengte maar wel rechte klimming en declinatie, en het probleem trad juist op in de sterren­stelsels rondom de lijn met rechte klimming 0h, in stippellijn aangeduid in de figuur hierboven. De AI-gegenereerde code hield gewoon geen rekening met het feit dat een rechte klimming van 24h (360°) gelijk is aan 0h (0°). Uiteindelijk reikte Claude een oplossing aan, zij het niet echt een elegante (een soort middel­punt van het sterren­beeld berekenen en alle coördinaten door­schuiven tot die voldoende ver van de kritieke lijn liggen).

In de Kleine Beer gebeurde het dan weer ettelijke keren dat de Poolster plots verdween, zoals na de fiks aan de singulariteit of het introduceren van een offset. Niet helemaal verwonderlijk als je begrijpt wat er rondom de noordpool met de achter­liggende coördinaten gebeurt … maar AI is nu eenmaal slechts AI en begrijpt dat inderdaad niet. Gelukkig kon ik hier zelf in de code het nodige ontcijferen en rechtzetten.

En dan was er nog een andere subtiel maar serieus issue. Door stom toeval viel me plots op dat de ster Aludra leek te ontbreken in de Grote Hond. Het scriptje schuift met de juiste parameters de rand van de sterren­beelden een fractie naar binnen op, om de uiteindelijke puzzel­stukken wat speling te geven, en zo was er eerder al aandacht nodig voor sterren langs de randen. Ik had echter maar geen verklaring waarom die ene, relatief grote ster weg bleef. Uiteindelijk viel het kwartje: de bron­bestanden met de locaties van de sterren enerzijds en de definities van de sterren­beelden anderzijds, steunden op verschillende coördinaten­systemen!

Wat was er gebeurd? De sterrencatalogus beschreef rechte klimming en declinatie van sterren in zogenaamd J2000, de huidige standaard­epoche. De sterren­beelden echter zijn gedestilleerd uit tabellen die veel verder terugreiken. Het was Belgisch astronoom Eugène Delporte die in 1930 de sterren­beelden standaardiseerde (1) op vraag van de IAU. Daarbij werden de grenzen gekozen als lijnstukjes met een constante rechte klimming of declinatie, maar ten opzichte van een andere epoche, B1875. Door precessie van de aarde zijn de hemel­posities in de loop van 125 jaar lichtjes veranderd, voldoende om her en der een ster over een rand naar een ander sterren­beeld te trekken als de coördinaten niet correct mee aangepast worden.

Het wordt hier steeds technischer, maar de rode draad is hopelijk wel duidelijk — puur op het vlak van programmeer­code was artificiële intelligentie een bijzonder handige kickstart zonder dewelke de sterren­puzzel slechts een droom zou blijven, maar tegelijk moeten we bij de pinken zijn en alles kritisch blijven bekijken. Sommige fouten vallen meteen op; andere sprongen slechts toevallig in het oog. Uiteraard geldt hetzelfde als we alles zelf from scratch zouden programmeren, maar toch: AI kan zo overtuigend code produceren dat nuances lang onopgemerkt kunnen blijven.

Uiteindelijk stellen we ons wel de vraag wat er meer tijd had gekost: AI-code ontcijferen en rechttrekken, of toch alles zelf uitwerken (al dan niet op basis van AI-voorbeelden en -suggesties)? Hadden we zelf andere bibliotheken gezocht of een andere aanpak gebruikt? Een aantal struikel­blokken waren redelijk onvermijdelijk omdat coördinaten op een bol nu eenmaal lastig zijn, maar misschien hadden we sneller een elegantere, conceptuelere aanpak gevonden voor alle sterrenbeelden, of een geschikter Python­pakket zoals Astropy. En hebben we nu nog subtiliteiten over het hoofd gezien?

En verder?

Intussen hebben we een scriptje met alle instelbare parameters die we voor een praktische uitwerking van de puzzel kunnen wensen: schaal, dikte, sterren­grootte, offset, selectie qua helderheid, mate van bolvormigheid, maximale overhang van sterren over de rand … Ik beleefde alvast veel plezier met het maken van een animatie in Blender, een open­source software­pakket voor tekenen en animeren in 3D waar ik me al lang in wil verdiepen.

Maar we willen natuurlijk ook een tastbare versie van de puzzel! Daarmee zijn we momenteel volop bezig: experimenteren met verschillende oriëntaties in het 3D-printen, onderzoeken of we willen werken met magneet­verf op een licht­gewicht bol dan wel kiezen voor een massievere metalen bol om de stukken magnetisch te kunnen bevestigen, nadenken over montage op een draaibaar statief, experimenteren hoe we de sterren of de achter­grond een kleurtje kunnen geven …

We staan nog niet ver genoeg voor een uitgewerkt verhaal, en de bedoeling van deze blogpost was hoe dan ook om onze ervaringen met taal­modellen in het ontwerp­proces te delen, dus als alles goed gaat: wordt vervolgd!

  1. Eugène Delporte, Délimitation scientifique des constellations. Cambridge University Press, 1930. ()

Reacties

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *