# Studio di caso sulla classificazione del lavoro dei laureati

[Clavié et al., 2023](https://arxiv.org/abs/2303.07142) provide a case-study on prompt-engineering applied to a medium-scale text classification use-case in a production system. Using the task of classifying whether a job is a true "entry-level job", suitable for a recent graduate, or not, they evaluated a series of prompt engineering techniques and report their results using GPT-3.5 (`gpt-3.5-turbo`).

Il lavoro mostra che LLMs supera tutti gli altri modelli testati, compresa una linea di base estremamente forte in DeBERTa-V3. Anche `gpt-3.5-turbo` supera sensibilmente le vecchie varianti di GPT3 in tutte le metriche chiave, ma richiede un ulteriore parsing dell'output poiché la sua capacità di attenersi a un modello sembra essere peggiore rispetto alle altre varianti.

I risultati principali del loro approccio prompt engineering sono i seguenti:

- Per compiti come questo, in cui non è richiesta alcuna conoscenza esperta, la richiesta di CoT a pochi colpi ha ottenuto risultati peggiori rispetto alla richiesta a zero colpi in tutti gli esperimenti.
- L'impatto del prompt sull'elaborazione del ragionamento corretto è enorme. Chiedendo semplicemente al modello di classificare un determinato lavoro si ottiene un punteggio F1 di 65,6, mentre il modello ingegneristico post-prompt raggiunge un punteggio F1 di 91,7.
- Il tentativo di forzare il modello ad attenersi a un modello abbassa le prestazioni in tutti i casi (questo comportamento scompare nei primi test con GPT-4, che sono posteriori al documento).
- Molte piccole modifiche hanno un impatto eccessivo sulle prestazioni.
  - Le tabelle seguenti mostrano tutte le modifiche testate.
  - La corretta impartizione delle istruzioni e la ripetizione dei punti chiave sembrano essere il principale fattore di performance.
  - Una cosa semplice come dare un nome (umano) al modello e riferirsi ad esso come tale ha aumentato il punteggio F1 di 0,6 punti.


### Modifiche di prompt testate

| Nome breve | Descrizione                                                                                    |
|------------|------------------------------------------------------------------------------------------------|
| Baseline   | Fornire un annuncio di lavoro e chiedere se è adatto a un laureato.                            |
| CoT        | Fornite alcuni esempi di classificazione accurata prima dell'interrogazione.                   |
| Zero-CoT   | Chiedete al modello di ragionare passo dopo passo prima di fornire la risposta.                |
| rawinst    | Dare istruzioni sul suo ruolo e sul compito da svolgere aggiungendole al messaggio dell'utente.|
| sysinst    | Fornire istruzioni sul suo ruolo e sul suo compito come messaggio di sistema.                  |
| bothinst   | Dividere le istruzioni con il ruolo come msg di sistema e il compito come msg utente.          |
| mock       | Dare istruzioni sul compito deridendo una discussione in cui le si riconosce.                  |
| reit       | Rafforzare gli elementi chiave delle istruzioni ripetendoli.                                   |
| strict     | Chiedete al modello di rispondere seguendo rigorosamente uno schema fornito dato.              |
| loose      | Chiedete che venga fornita solo la risposta finale seguendo un determinato schema.             |
| right      | Chiedere al modello di raggiungere la giusta conclusione.                                      |
| info       | Fornire informazioni aggiuntive per affrontare i più comuni errori di ragionamento.            |
| name       | Dare al modello un nome con cui ci si possa riferire ad esso durante la conversazione.         |
| pos        | Fornite al modello un feedback positivo prima di interrogarlo.                                 |


### Impatto delle Performance per ogni modifica di Prompt

|                                        | Precision     | Recall        | F1            | Template Stickiness    |
|----------------------------------------|---------------|---------------|---------------|------------------------|
| _Baseline_                             | _61.2_        | _70.6_        | _65.6_        | _79%_                  |
| _CoT_                                  | _72.6_        | _85.1_        | _78.4_        | _87%_                  |
| _Zero-CoT_                             | _75.5_        | _88.3_        | _81.4_        | _65%_                  |
| _+rawinst_                             | _80_          | _92.4_        | _85.8_        | _68%_                  |
| _+sysinst_                             | _77.7_        | _90.9_        | _83.8_        | _69%_                  |
| _+bothinst_                            | _81.9_        | _93.9_        | _87.5_        | _71%_                  |
| +bothinst+mock                         | 83.3          | 95.1          | 88.8          | 74%                    |
| +bothinst+mock+reit                    | 83.8          | 95.5          | 89.3          | 75%                    |
| _+bothinst+mock+reit+strict_           | _79.9_        | _93.7_        | _86.3_        | _**98%**_              |
| _+bothinst+mock+reit+loose_            | _80.5_        | _94.8_        | _87.1_        | _95%_                  |
| +bothinst+mock+reit+right              | 84            | 95.9          | 89.6          | 77%                    |
| +bothinst+mock+reit+right+info         | 84.9          | 96.5          | 90.3          | 77%                    |
| +bothinst+mock+reit+right+info+name    | 85.7          | 96.8          | 90.9          | 79%                    |
| +bothinst+mock+reit+right+info+name+pos| **86.9**      | **97**        | **91.7**      | 81%                    |

L'aderenza allo schema si riferisce alla frequenza con cui il modello risponde nel formato desiderato. 
