Hallucinerende AI - ChatGPT suggereert API's die nooit hebben bestaan

Crowds of fun-seekers exploring a city on foot, "

Arjan Franzen

18 April 2023

A yellow bird toy with "Kaboom" written on its be

Ik was een stuk code aan het debuggen dat een Java.lang.OutOfMemoryError gaf. Na een kort onderzoek ontdekte ik dat de SQL query die de code uitvoerde geen 'WHERE' clausule bevatte, waardoor een grote tabel bijna volledig gedownload werd, waardoor het proces geen geheugen meer had.

De oplossing was eenvoudig en snel: voeg een WHERE-clausule toe aan de SQL-query. Toen dacht ik, als onderdeel van preventief onderhoud, om te controleren waarom deze query zelfs werd uitgevoerd, omdat de parameters aanwezig waren in de code, klaar om te worden ingevoegd in het SQL statement.

Ik wil dat de NamedParameterJdbcTemplate een exception gooit als 'Hey, je had twee parameters moeten hebben in deze query; je hebt er geen!'. Dus vroeg ik ChatGPT om hulp: hoe kan ik vooraf controleren of alle opgegeven parameters hun weg hebben gevonden naar de SQL in de WHERE-clausule?

Hoe controleer je wanneer je jdbctemplate.query uitvoert of alle NamedParameterSource variabelen zijn ingevuld?

Dit is wat het opleverde:

Je kunt controleren of alle NamedParameterSource variabelen zijn gevuld door gebruik te maken van de SqlParameterSourceUtils klasse die wordt geleverd door Spring framework. Hier is een voorbeeld:

1NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
2String sql = "SELECT * FROM my_table WHERE column1 = :param1 AND column2 = :param2";
3MapSqlParameterSource params = new MapSqlParameterSource();
4params.addValue("param1", "value1");
5//params.addValue("param2", "value2"); //Uitgecommentarieerd om een ontbrekende parameter te simuleren
6
7SqlParameterSourceUtils.assertAllParamsSet(params, sql);
8List<MyObject> results = jdbcTemplate.query(sql, params, new MyRowMapper());

In dit voorbeeld zal de assertAllParamsSet methode een IllegalArgumentException gooien als een genoemde parameter in de SQL query ontbreekt in het params object. Hierdoor kun je ontbrekende parameters opvangen voordat je de query uitvoert. Merk op dat deze methode alleen werkt voor NamedParameterJdbcTemplate en SqlParameterSource objecten, maar je kunt het aanpassen aan andere typen JDBC templates en parameterbronnen als dat nodig is.

Dus de 'money shot' (sorry voor mijn Frans) is op regel 7. Aangezien ik op zoek ben naar een manier om te controleren (assert) dat al mijn parameters gebruikt (ingesteld) zijn, maakte het lezen van deze codesuggestie me een blije kleine nerd.

Ik ontdekte al snel dat deze API-aanroep, onderdeel van deze helperklasse, niet bestaat; het heeft nooit bestaan. Nadat de IDE allerlei 'niet gevonden' indicaties gaf, besloot ik dit deel van de code op te zoeken, en dit is wat er gebeurde:

Google logo w/"assertAllParamsSet" text: successful search

(droevige trombone)

Een oude grap van programmeurs is dat je in de problemen zit als er 0 resultaten zijn als je je probleem googelt.

Bah.

Uiteindelijk moest ik dit zelf implementeren in plaats van te verwachten dat de bibliotheek het voor me zou doen. ChatGPT suggereerde een helperklasse en API-aanroep die gewoon niet bestaat: het zou een mooie toevoeging zijn aan de Util, dus dat ga ik misschien doen.

ChatGPT droomde ervan me te helpen; de bot hallucineerde over API's die in een ideale wereld zouden bestaan, alleen niet in de echte wereld.

background

Softwareontwikkeling ontmoeilijken

Laat ZEN Software uw softwareontwikkeling analyseren en optimaliseren.