Prompt engineering: tecniche di prompting [parte 1]

L'ingegneria dei prompt permette di ottimizzare i risultati ottenuti agendo solamente su ciò che viene fornito ai LLM. Negli ultimi anni si sono proposte diverse tecniche per strutturare in modo opportuno i prompt per risolvere task anche complessi senza dover riaddestrare il modello iniziale. Vedremo alcune tecniche semplici come zero-shoot, few shoot e Chain-of-Thought (CoT).

Share

Reading time: 7 minutes

Negli articoli precedenti, Ingegneria dei prompt e LLM: Esempi di Prompt, abbiamo sia introdotto la figura dell’ingegnere dei prompt che degli esempi pratici. Mediante gli esempi abbiamo potuto notare come la struttura del prompt possa influenzare il risultato finale in modo significativo. Ciò dipende dal fatto che le parole, o per meglio dire i token, generati dipendono da una probabilità condizionata di ciò che è stato visto in precedenza. Ciò implica che quello fornito dal prompt influenzerà in modo significativo ciò che verrà generato successivamente in cascata. Molti lavori di ricerca si sono maggiormente focalizzati su come costruire i prompt in base all’output desiderato, che su ottimizzare mediante fine tuning il modello di partenza. In questo articolo analizzeremo alcune tecniche che sono state proposte in questi ultimi anni. Partiamo!

Prompt Zero-Shot

Poiché i LLM sono stati addestrati su enormi quantità di dati, questi modelli possono eseguire operazioni a “colpo zero”, ossia senza la necessità di riaddestrare il modello per il contesto di interesse. Nell’articolo LLM: Esempi di Prompt, abbiamo visto già applicata questa tecnica, come ad esempio per la classificazione di testo in base al sentimento espresso. Di seguito uno degli esempi già visti in precedenza.

				
					Classify the text into neutral, negative or positive. 
Text: I think the food was good. 
Sentiment:

				
			

Output

				
					Sentiment: Positive
				
			

In alcuni casi, purtroppo, questa tecnica non funziona. Se ciò accadesse bisogna utilizzare la prossima tecnica, ossia il few-shot prompt.

Few-Shot Prompt

Il prompt few-shot può essere utilizzato come tecnica per consentire l’apprendimento in base al contesto. Si forniscono dimostrazioni direttamente nel prompt per “guidare” il modello verso prestazioni migliori. Gli esempi forniti servono per condizionare e definire l’output per ciò che verrà sottomesso successivamente.

Vediamo in azione il prompt few-shot usando l’esempio riportato da Brown et al. 2020. Nell’esempio, il compito consiste nell’utilizzare correttamente una nuova parola in una frase.

				
					A "whatpu" is a small, furry animal native to Tanzania. An example of a sentence that uses
the word whatpu is:
We were traveling in Africa and we saw these very cute whatpus.
To do a "farduddle" means to jump up and down really fast. An example of a sentence that uses
the word farduddle is:

				
			

Output

				
					We were so excited to see the band play that we couldn't help but farduddle in the front row.
				
			

Possiamo osservare che il modello ha in qualche modo imparato a svolgere il compito fornendogli un solo esempio (in questo caso si parla di 1-shot). Per compiti più difficili, possiamo aumentare il numero di esempi forniti nel prompt.

In base ai risultati presentati da Min et al. (2022) , ecco qualche altro consiglio su come fornire gli esempi quando si fanno pochi shot:

  • “lo spazio delle etichette e la distribuzione del testo di input specificato dalle dimostrazioni sono entrambi importanti (indipendentemente dal fatto che le etichette siano corrette per i singoli input)”.
  • il formato utilizzato gioca un ruolo fondamentale nelle prestazioni, anche se si utilizzano solo etichette casuali, è molto meglio che non averne affatto.
  • la selezione di etichette casuali da una vera distribuzione di etichette aiuta maggiormente che una distribuzione uniforme.

Vediamo alcuni esempi per comprendere al meglio queste raccomandazioni. Partiamo innanzitutto un esempio con etichette casuali (cioè le etichette Negativo e Positivo assegnate in modo casuale agli esempi):

				
					This is awesome! // Negative
This is bad! // Positive
Wow that movie was rad! // Positive
What a horrible show! //

				
			

Output

				
					It seems like there might be a mix-up in your statements. Let me help clarify:

1. "This is awesome!" - Positive
2. "This is bad!" - Negative
3. "Wow that movie was rad!" - Positive
4. "What a horrible show!" - Negative

So, in this corrected version:

1. Positive
2. Negative
3. Positive
4. Negative
				
			

Non solo si ottiene la risposta corretta, anche se le etichette sono state generate casualmente, ma ChatGPT corregge pure quelle fornite. Si noti che abbiamo mantenuto anche il formato, il che aiuta. L’esperimento che abbiamo condotto dimostra che l’ultimo modello di ChatGPT (Settembre 2023) sia molto più robusto anche nei confronti di dati casuali. Esempio:

				
					Positive This is awesome! 
This is bad! Negative
Wow that movie was rad!
Positive
What a horrible show! –
				
			

Output

				
					Negative
				
			

Non c’è coerenza nel formato fornito, ma il modello ha comunque previsto l’etichetta corretta.

Limiti di un Few-shot Prompting

Il prompt standard di few-shot funziona bene per molti compiti, ma non è ancora una tecnica perfetta, soprattutto quando si tratta di compiti di ragionamento più complessi. Dimostriamo perché questo è il caso.

				
					The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: The answer is False.
The odd numbers in this group add up to an even number: 17,  10, 19, 4, 8, 12, 24.
A: The answer is True.
The odd numbers in this group add up to an even number: 16,  11, 14, 4, 8, 13, 24.
A: The answer is True.
The odd numbers in this group add up to an even number: 17,  9, 10, 12, 13, 4, 2.
A: The answer is False.
The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1. 
A:
				
			

Output

				
					The answer is True.
				
			

La risposta è sbagliata. In questo caso un prompt di few-shot non semra sufficiente per ottenere risposte affidabili per questo tipo di problemi di ragionamento. L’esempio precedente fornisce informazioni di base sul compito. Tuttavia, il tipo di compito che abbiamo richiesto comporta alcune fasi di ragionamento più complesse. In altre parole, potrebbe essere utile scomporre il problema in fasi e dimostrarlo al modello. Più recentemente, il chain-of-thought (CoT) è stato introdotto per affrontare compiti più complessi che richiedono ragionamenti di tipo aritmetico, di senso comune e/o simbolico.

Tuttavia, questi task a volte riescono ad essere risolti correttamente senza la necessità di usare il prompt few shot. Applichiamo la tecnica di zero-shot alla richiesta precedente.

				
					The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1. 
A:
				
			

Output

				
					The odd numbers in the given group are 15, 5, 13, 7, and 1. If we add them up, we get:

15 + 5 + 13 + 7 + 1 = 41

So, the sum of the odd numbers in this group is 41, which is an odd number. The statement "The odd numbers in this group add up to an even number" is not correct based on the provided numbers.

				
			

In questo caso ChatGPT riesce a dividere il problema e a fornire la risposta corretta con motivazione allegata.

In generale, sembra che fornire esempi sia utile per risolvere alcuni compiti qualora lo zero-shoot non funzioni. Quando sia il prompt zero-shot e quello a few-shot non sono sufficienti, potrebbe significare che quanto appreso dal modello non è sufficiente per svolgere bene il compito richiesto. Le soluzioni a questo punto potrebbero essere l’utilizzo del fine tuning del modello o l’utilizzo di tecniche più avanzate. Di seguito parleremo di una delle tecniche di prompting più diffuse, chiamata prompting a catena di pensieri (chain of thought), che ha guadagnato molta popolarità (l’articolo conta ad oggi più di 1400 citazioni).

Chain-of-Thought Prompt

Introdotto in Wei et al. (2022), il prompt a catena di pensieri (CoT) consente di ottenere capacità di ragionamento complesse attraverso fasi di ragionamento intermedie. Si può combinare con il prompt few-shot per ottenere risultati migliori su compiti più complessi che richiedono un ragionamento prima di rispondere.

Vediamo un esempio.

				
					The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: Adding all the odd numbers (9, 15, 1) gives 25. The answer is False.

The odd numbers in this group add up to an even number: 17,  10, 19, 4, 8, 12, 24.
A: Adding all the odd numbers (17, 19) gives 36. The answer is True.

The odd numbers in this group add up to an even number: 16,  11, 14, 4, 8, 13, 24.
A: Adding all the odd numbers (11, 13) gives 24. The answer is True.

The odd numbers in this group add up to an even number: 17,  9, 10, 12, 13, 4, 2.
A: Adding all the odd numbers (17, 9, 13) gives 39. The answer is False.

The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1. 
A:

				
			

Output

				
					Adding all the odd numbers (15, 5, 13, 7, 1) gives 41. The answer is False.
				
			

Perfetto! Come possiamo notare, utilizzando il few shot prompt nel quale si fornisce anche il ragionamento da effettuare, il modello riesce a risolvere un nuovo compito senza errori.  Proviamo a vedere se fornendo meno esempi la tecnica funziona.

				
					The odd numbers in this group add up to an even number: 4, 8, 9, 15, 12, 2, 1.
A: Adding all the odd numbers (9, 15, 1) gives 25. The answer is False.

The odd numbers in this group add up to an even number: 15, 32, 5, 13, 82, 7, 1. 
A:

				
			

Output

				
					Adding all the odd numbers (15, 5, 13, 7, 1) gives 41. The answer is False.
				
			

Funziona anche in questo caso!

Attenzione

Gli autori sostengono che si tratta di una capacità emergente che si manifesta con modelli linguistici sufficientemente grandi come ChatGPT.

Zero-shot COT Prompting

Un’idea emersa più di recente è quella della zero-shot CoT (Kojima et al. 2022) che consiste essenzialmente nell’aggiungere ” Let’s think step by step ” al prompt originale. 

Proviamo un problema di algebra semplice e vediamo come si comporta il modello senza l’applicazione di nessuna tecnica:

				
					I went to the market and bought 10 apples. I gave 2 apples to the neighbor and 2 to the repairman. I then went and bought 5 more apples and ate 1. How many apples did I remain with?
				
			

Output

				
					You started with 10 apples, gave away 2, and then bought 5 more. This means you had 10 - 2 + 5 = 13 apples. After eating one, you remained with 13 - 1 = 12 apples.
				
			

La risposta è errata! Proviamo allora con la tecnica Zero-shot COT.

				
					I went to the market and bought 10 apples. I gave 2 apples to the neighbor and 2 to the repairman. I then went and bought 5 more apples and ate 1. How many apples did I remain with?

Let's think step by step.
				
			

Output

				
					Sure! Let's break it down step by step:

1. You started with 10 apples.
2. You gave 2 apples to the neighbor, so you had 10 - 2 = 8 apples remaining.
3. You also gave 2 apples to the repairman, so you had 8 - 2 = 6 apples remaining.
4. After that, you went and bought 5 more apples, which means you now have 6 + 5 = 11 apples.
5. You ate 1 apple, so now you have 11 - 1 = 10 apples remaining.

So, you currently have 10 apples.
				
			

Il risultato è corretto! Solo aggiungendo una piccola istruzione al prompt abbiamo ottenuto sia la spiegazione passo per passo del procedimento che la risposta corretta. Ciò dimostra che questa tecnica può essere particolarmente utile quando non si hanno molti esempi da utilizzare nel prompt.

More To Explore

Intelligenza artificiale

Gradio: applicazioni web in python per AI [parte2]

Gradio è una libraria python che ci permette di creare applicazioni web in modo veloce e intuitivo per i nostri modelli di machine learning e AI. Le nostre applicazioni richiedono sempre un’interazione con l’utente e una personalizzazione del layout. Scopriamo, mediante degli esempi, come migliorare le nostre applicazioni.

Intelligenza artificiale

Gradio: applicazioni web in python per AI [parte1]

Scrivere applicazioni web per i nostri modelli di machine learning e/o di intelligenza artificiale può richiedere molto tempo e competenze che non sono in nostro possesso. Per snellire e velocizzare questo compito ci viene in aiuto Gradio, una libreria Python pensata per creare applicazioni web con poche righe di codice. Scopriamo le sue funzionalità base con alcuni esempi.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Design with MongoDB

Design with MongoDB!!!

Buy the new book that will help you to use MongoDB correctly for your applications. Available now on Amazon!