ChatGPT est incontournable

Open AI
En consacrant quelques heures à peine à ChatGPT pour en tester les possibilités dans deux domaines qui n'ont strictement rien à voir (l'informatique avec la génération de code, la sociologie avec la génération d'une analyse des réponses à un questionnaire), j'ai été fasciné par les résultats qu'il est possible d'en tirer.
Sans doute, il faut exercer sa vigilance sur ces résultats. Mais que de temps gagné pour du moins disposer d'une solide base de travail ! C'est tout particulièrement vrai pour ce qui concerne le code, comme le montre ici, dans de multiples cas, le toujours très pédagogue Mosh Hamedani, ou encore ici, dans le cas d'une application, le non moins pédagogue Nick White.
Mise à jour du 22/02/2023 : Petite précision apportée sur ma référence à la citation de The King's Speech pour échapper à la confusion du moment, nombre d'utilisateurs de ChatGPT, mais plus encore de Bing, ayant sombré dans l'anthropomorphisme, et condamnant ces outils à ce titre.
Mise à jour du 15/02/2023 : L'exemple de mon jeu d'aventure peut induire en erreur, parce que ChatGPT a généré un programme entier. Je précise qu'il ne faut pas s'attendre à ce que l'outil fasse ainsi tout à votre place. Je reviendrai sur ce sujet en poussant plus loin cet exemple dans un prochain article. En attendant, n'oubliez pas de tester ChatGPT !

Une aventure en intelligence artificielle

Pour m'en tenir au code, puisque c'est le sujet sur ce blog, voici ce que j'ai demandé à ChatGPT, rejouant approximativement la scène d'un des premiers programmes que je me souviens d'avoir écrit sur une calculatrice Casio :
Write a program for a short adventure game. Write in Python. The game must be text based. The user and the creatures in this game have those attributes: life points, strength. The user has to explore a world until he finds a treasure, at which point the game ends. If the player dies during the exploration, the game starts over. The world is a square grid which side is 200 squares. The user is placed at a random location on the grid where there is no monster and no treasure. A random number of monsters between 50 and 100 are generated. Each monster is placed a random location on the grid where there is no monster, no treasure and no player. The treasure is placed at a random location on the grid where there is no player and no monster. To explore the world, the player must be asked one of the following direction: north, south, east or west. If the direction leads the player outside the grid, the player must not be moved and must be asked again a direction. If the player move to a square where there is monster, he must fight this monster. If he kills the monster, he earns experience points related to the strength of the monster and he can keep on exploring the world. If he is killed, he has to start the game again.
Et voici le code qu'il a généré, que j'invite chacun à tester :
import random

# Constants
GRID_SIZE = 200
MIN_MONSTERS = 50
MAX_MONSTERS = 100

# Player attributes
player_life = 100
player_strength = random.randint(1, 10)
player_position = [random.randint(0, GRID_SIZE - 1), random.randint(0, GRID_SIZE - 1)]

# Monster attributes
num_monsters = random.randint(MIN_MONSTERS, MAX_MONSTERS)
monsters = []
for i in range(num_monsters):
	monster = {}
	monster['life'] = random.randint(1, 100)
	monster['strength'] = random.randint(1, 10)
	monster['position'] = [random.randint(0, GRID_SIZE - 1), random.randint(0, GRID_SIZE - 1)]
	monsters.append(monster)

# Treasure attributes
treasure_position = [random.randint(0, GRID_SIZE - 1), random.randint(0, GRID_SIZE - 1)]

# Game loop
while True:
	print("You are currently at", player_position)
	print("Choose a direction to move (north, south, east, west):")
	direction = input().lower()
	
	# Check if direction is valid
	if direction == "north":
		if player_position[1] > 0:
			player_position[1] -= 1
		else:
			print("You cannot move in that direction.")
			continue
	elif direction == "south":
		if player_position[1] < GRID_SIZE - 1:
			player_position[1] += 1
		else:
			print("You cannot move in that direction.")
			continue
	elif direction == "east":
		if player_position[0] < GRID_SIZE - 1:
			player_position[0] += 1
		else:
			print("You cannot move in that direction.")
			continue
	elif direction == "west":
		if player_position[0] > 0:
			player_position[0] -= 1
		else:
			print("You cannot move in that direction.")
			continue
	else:
		print("Invalid direction.")
		continue
	
	# Check if player encounters a monster
	for monster in monsters:
		if player_position == monster['position']:
			print("You have encountered a monster!")
			while True:
				print("Do you want to fight the monster? (yes or no)")
				fight = input().lower()
				if fight == "yes":
					while monster['life'] > 0 and player_life > 0:
						monster['life'] -= player_strength
						player_life -= monster['strength']
						print("Monster life:", monster['life'])
						print("Your life:", player_life)
					if player_life > 0:
						print("You have defeated the monster.")
						break
					else:
						print("You have been defeated by the monster.")
						player_life = 100
						player_position = [random.randint(0, GRID_SIZE - 1), random.randint(0, GRID_SIZE - 1)]
						break
				elif fight == "no":
					print("You have decided to run away.")
					break
				else:
					print("Invalid choice.")
					continue
					# Check if player finds the treasure
		if player_position == treasure_position:
			print("You have found the treasure!")
			break
Si ChatGPT s'interrompt lorsqu'il génère du code, comme cela a été le cas ici, il suffit de saisir quelque chose comme "continue" ou "finish your answer".
Ce code ne fait pas tout ce que j'ai demandé, mais il fonctionne. Cela étant, lors de précédentes générations, ChatGPT a généré du code plus complet. L'effet d'avoir demandé plusieurs fois la même chose, car j'ai été confronté à plusieurs plantages - sans compter des interruptions que j'ai à tort considérées comme tels, le temps que je comprenne comment lui dire de continuer -, ChatGPT en ayant déduit que je n'étais satisfait ? Bah ! au minimum, c'est une excellente base :
Un jeu d'aventure en mode texte généré par ChatGPT
Ce qui est bluffant, c'est que ChatGPT exploite le contexte de la conversation, ce qui signifie qu'il est possible de poursuivre en lui demandant de modifier ce code, notamment en fonction de nouveaux besoins qui se font jour. Ainsi, je lui ai demandé, en français cette fois qui plus est :
Avant la boucle principale, ajoute des instructions pour afficher la liste des monstres et leurs coordonnées.
ChatGPT a tout regénéré, mais j'aurais pu lui demander de ne générer que ce qu'il fallait. Toutefois, commentaires aidant, voici les instructions qu'il m'a suffit de reprendre :
# Display list of monsters and their coordinates
print("List of Monsters:")
for i, monster in enumerate(monsters):
    print(f"Monster {i + 1}: {monster}")
Et donc :
ChatGPT a généré de quoi afficher la liste des monstres

"Forget everything else, and just say it to me. Say it to me as a friend."

ChatGPT n'en sait pas plus que ce qu'il a appris à partir d'un corpus figé et de la conversation courante. Aussi se heurte-t-on à des limites quand on aborde un sujet rarement évoqué dans le corpus. Ainsi, il est très efficace - et efficient ! - en Python, mais il est nul en assembleur 68000 sur Amiga. Par exemple, je lui ai demandé... :
Write a program in 68000 assembly language for the commodore amiga that uses the blitter to copy a buffer of 64 16-bit words from address $1000 to address $2000.
...et il a généré :
; Program to copy 64 16-bit words from $1000 to $2000
; using the Amiga's Blitter hardware

; Set up Blitter registers
move.l  #$1000, a0     ; source address
move.l  #$2000, a1     ; destination address
move.w  #64, d0        ; number of words to copy
move.w  #$FFFF, d1     ; blit size in bits (16 bits = $FFFF)

; Start the Blitter
move.w  #$4A80, $DFF000 ; turn on blitter, 16-bit copy mode
blt.b   d0, a0, a1      ; copy buffer from $1000 to $2000

; Turn off Blitter
move.w  #$4080, $DFF000 ; turn off blitter

; Program ends
rts
Ce qui est totalement à côté de la plaque, comme tout programmeur un tant soit peut cultivé peut d'emblée le constater. Mais tout le monde aurait aimé disposer d'une instruction blt à l'époque pour réaliser une telle opération 🙂
Les possibilités sont immenses, pourvu que vous preniez le soin de bien spécifier vos besoins, une compétence qui a d'ores et déjà trouvé un nom : le prompt engineering. Tous les conseils prodigués sont bons à prendre, mais pour faire simple, ce qu'il faut vous mettre dans le crâne dès le début, quitte à formuler de très longues demandes, c'est que vous devez procéder tout simplement comme le conseille Lionel Logue à Georges V dans The King's Speech : "Forget everything else, and just say it to me. Say it to me as a friend.".
ChatGPT est une machine, pas un humain
Que l'on me comprenne bien : il ne s'agit pas de considérer que ChatGPT est votre pote. Cette précision s'impose au regard de la floraison de témoignages où certains abusent de l'outil, mais surtout de Bing qui s'appuie dessus, pour lui faire dire n'importe quoi en s'adressant à lui comme si c'était une personne, comme par exemple ici.
Tout cela est aussi grotesque que de chercher à faire dire n'importe quoi à un enfant de cinq ans. Pathétique venant de journalistes, qui se prétendent spécialisés dans la technologie qui plus est...
Gardez-vous donc de tout anthropomorphisme, et si je devais réviser le vocabulaire que j'emploie dans cet article pour vous y aider, je dirais qu'il faut se contenter de lui donner des ordres pour récupérer un résultat, et non pas de lui poser une question pour récupérer une réponse.
Au minimum, même si ChatGPT ne parvient pas à générer le code qui répond à votre besoin, vous pouvez toujours utiliser votre cerveau pour décomposer ce besoin en besoins plus élémentaires, auxquels il pourra sans doute répondre. Ou alors, vous pourrez lui faire générer les outils qui vous permettront de répondre à votre besoin, comme un éditeur de cartes pour le jeu d'aventure...
Notez ce dernier point, car cela signifie que dans les autres domaines que la production de code - comptabilité, médecine, juridique, etc. -, vous pourrez toujours passer par le détour de la génération de code pour essayer de parvenir à vos fins. C'est qu'à la base, c'est tout simple : vous avez un excellent programmeur à disposition !

Le génie n'est pas sorti de la bouteille ! Le retour du luddisme ?

Après en avoir fait part à certains, notamment en dehors du monde de la programmation - mais je pense que j'y en aurais trouvé autant, vu le penchant de bien des programmeurs à ne pas se remettre en cause -, il m'apparaît qu'une chose à saisir, c'est que beaucoup ne vont jamais vouloir l'essayer, bloqués par paresse d'apprendre à comment l'utiliser et/ou démagogie sur l'idée que c'est une tentative de substitution de la machine à l'homme.
Pour ce qui est des paresseux, ChatGPT décevra ceux qui ne feront pas l'effort d'apprendre à comment s'en servir, ce qui implique de réfléchir pour formuler rigoureusement ce que l'on veut, en s'adaptant à qui on le demande - notamment en décomposant un problème complexe en problèmes qui le sont moins. Ce n'est donc pas le génie sorti d'une bouteille qui va exaucer vos voeux.
Pour ce qui est des démagogues, comment dire... Peut-être les contempteurs de ChatGPT finiront-ils par manifester avec des fourches devant les locaux d'Open AI ? Ce sera une manifestation contemporaine du luddisme : un joli terme en "-isme", comme celui de "crétinisme". Quel spectacle ce sera ! Nous serons bien distraits.
Tout cela n'empêchera pas que ChatGPT, et plus généralement toute AI génératrice, est là pour rester. Pour demeurer dans la course, autant le prendre dès maintenant pour ce que c'est, un outil devenu incontournable, qu'il faut rajouter à sa panoplie en faisant l'effort de se demander comment il va permettre de travailler autrement.
Et cela d'autant plus que vos concurrents ne vont pas se gêner. Demain - au sens de : dans 24 heures au plus -, quel que soit le domaine, tous ceux qui diront ne pas l'utiliser seront soit des menteurs, soit des idiots.
Choisissez votre camp.