Utilizzo di ChatGPT per il Debugging Efficiente

'ChatGPT for Efficient Debugging'

Migliora la tua esperienza di debugging e apprendi più velocemente grazie alla potenza dei Modelli di Linguaggio Grandi

Foto di Pavel Danilyuk su Pexels

È difficile negare che i Modelli di Linguaggio Grandi (LLM) stiano avendo un impatto profondo su diverse industrie e applicazioni, rivoluzionando il modo in cui lavoriamo e interagiamo. Anche se l’entusiasmo iniziale intorno a ChatGPT si è calmato dal suo rilascio circa sei mesi fa (a novembre 2022), la sua influenza rimane significativa. Sembra che i LLM autoregressivi continueranno a far parte delle nostre vite nel prossimo futuro e vale la pena sviluppare le competenze per interagire con loro, sia come sviluppatore che come utente.

Come ha affermato Chip Huyen nel suo post sul blog, è relativamente facile ottenere qualcosa di impressionante con i LLM, ma è abbastanza difficile costruire qualcosa di pronto per la produzione considerando le limitazioni e i potenziali problemi che i LLM hanno attualmente. Tuttavia, mentre la comunità di ricerca e ingegneristica sta lavorando attivamente per affrontare queste sfide, vale la pena riconoscere il fatto che gli individui già possono beneficiare enormemente dai LLM, almeno utilizzandoli come assistenti personali per compiti quotidiani non critici o come collaboratori per il brainstorming.

Nel mio precedente articolo, ho discusso le migliori pratiche dell’ingegneria dei prompt, fornendo approfondimenti per aiutarti a sviluppare applicazioni basate sui LLM locali. In questo post, condividerò un insieme di tecniche che ti consentono di utilizzare modelli come ChatGPT per un debugging del codice efficace e un’apprendimento accelerato della programmazione. Esamineremo anche i prompt di esempio per scrivere ed esporre il codice. Queste tecniche saranno preziose non solo quando si interagisce con ChatGPT, ma anche quando si cerca assistenza dai colleghi o si affrontano sfide di programmazione in modo indipendente.

Questo articolo è rivolto principalmente ai principianti, quindi ho cercato di fornire esempi e spiegazioni illustrative. Spero che queste tecniche ti aiuteranno a comprendere e risolvere i problemi di codice in modo più efficiente.

Quadro generale per il debugging del codice

In realtà, ChatGPT non ha apportato cambiamenti significativi al processo di debugging. La cosa fantastica è che ora puoi connetterti facilmente con un collega virtuale senza preoccuparti di essere un fastidio o di sentirti esitante nel fare domande stupide! Ma le tecniche che considereremo esistono finché esiste l’ingegneria del software, e quindi saranno utili non solo quando si interagisce con i LLM, ma anche per una migliore comprensione del processo e una interazione più efficace con i colleghi.

Per trovare un bug nel tuo codice, hai solo bisogno di due passaggi essenziali (in realtà ce ne sono tre):

  1. Isolare il bug e dimostrarlo con la quantità minima di codice;
  2. Fare un’ipotesi sull’errore e testarla;
  3. Iterare con ulteriori ipotesi fino a trovare una soluzione.

Anche se puoi iniziare subito ad usare ChatGPT, in realtà è meglio iniziare riproducendo l’errore per alcune ragioni. Prima di tutto, potrebbe essere difficile includere tutti i punti correlati e spiegare esattamente ciò che stai cercando di ottenere all’interno del contesto del modello di linguaggio. In secondo luogo, ti permetterà di capire meglio il problema e, eventualmente, trovare l’errore tu stesso. Vediamo.

A proposito, in questo post sto usando la versione vanilla di ChatGPT (GPT-3.5), ma per i compiti di codifica, GPT-4 è tipicamente più competente.

Passaggio 1: Isolare e Riprodurre il Problema con la Quantità Minima di Codice

Il primo passaggio è riprodurre il problema. Come sappiamo, la maggior parte dei problemi può ancora essere risolta con il classico “spegnerlo e riaccenderlo”. È possibile che tu ti sia imbattuto nell’ordine di esecuzione del codice in Jupyter Notebook.

Se possibile (e di solito lo è), è consigliabile scrivere nuovo codice che genera lo stesso errore e mantenerlo il più semplice possibile.

Consideriamo l’esempio di un TypeError: 'int' object is not iterable, che si verifica quando si cerca di iterare su some_integer invece di utilizzare il costrutto range(some_integer).

Cattivo esempio: una funzione richiama un’altra funzione che poi invoca un metodo di una classe. A prima vista, potrebbe richiedere del tempo per determinare dove avviene il calcolo effettivo, nonostante questo sia un esempio relativamente semplice. Allo stesso modo, per i modelli, diventa sempre più difficile individuare le informazioni rilevanti tra dettagli non correlati.

Miglior esempio: eliminare la classe spostando la funzionalità della funzione do_some_work() (che sta causando l’errore) direttamente nella funzione che stiamo chiamando.

Oltre al fatto che continuiamo a fare un pessimo lavoro con le convenzioni di denominazione delle variabili (ricorda, i nomi delle variabili dovrebbero essere descrittivi e significativi!), questo codice è comunque più facile da debuggare e capire.

Esempio ancora migliore: possiamo eliminare anche some_function().

Nel complesso, abbiamo accorciato il codice di più della metà. Confronta quanto più facile sia trovarci un bug.

Nel contesto di pandas, ad esempio, questo principio può significare non utilizzare il dataframe originale. Consideriamo una situazione in cui vogliamo calcolare lo stipendio medio per ogni posizione utilizzando i nostri dati e incontriamo un KeyError. Ecco un cattivo esempio:

In primo luogo, non possiamo essere certi che il dataframe contenga i dati forniti nei commenti. Infatti, ne abbiamo bisogno solo di due colonne, e se ne creiamo una versione mini simile, sarà molto più facile capire che abbiamo semplicemente sbagliato a scrivere il nome della colonna dello stipendio (Salary vs salary).

A proposito, ChatGPT è piuttosto bravo a generare dati finti, quindi può essere utile anche qui!

Ci sono innumerevoli tipi di errori ed è impossibile elencarli tutti, ovviamente. In generale, cerca di modificare il codice in modo tale che produca lo stesso errore riscontrato, ma rendilo il più facile possibile da capire rapidamente.

A causa della cosiddetta “debugging della papera di gomma”, questo passaggio spesso ti aiuta a capire la causa del problema da solo, senza cercare assistenza esterna. Ad esempio, se il tuo mini-codice non genera lo stesso errore, sei già a metà strada per trovare una soluzione. Tuttavia, anche se lo fa, è comunque un risultato positivo. 🙂

Passaggio 2: Effettua un’Assunzione, Testala e Itera

Se non riesci ancora a trovare un modo per correggere l’errore, vale la pena cercare assistenza. Ma è utile avere le tue stesse ipotesi su ciò che potrebbe essere sbagliato.

Trova la Linea Esatta

In primo luogo, trova l’espressione e la linea di codice esatta che stanno causando il problema. Probabilmente già sai che si trova all’interno dell’ultima riga del mini-codice che hai scritto in precedenza.

Ricorda che il traceback di Python visualizza il messaggio di errore in basso e il codice eseguito corrispondente in alto con le chiamate di funzioni interne in mezzo.

Python traceback. Image by Author

Questo può essere abbastanza facile per i bug semplici, ma può essere più difficile quando si tratta di errori logici che non generano messaggi di errore ma producono output inaspettati a causa di errori logici. In tali casi, è utile osservare i valori passo dopo passo con un debugger o semplici istruzioni print() e definire la linea di codice che non si allinea con le tue aspettative.

Se l’errore è causato da una complessa espressione, come df.groupby('Occupation')['Address'].apply(lambda x: ', '.join(x)), puoi prima spezzarlo in parti ed esplorare l’output passo dopo passo, ad esempio prima esegui df.groupby('Occupation'), poi df.groupby('Occupation')['Address'], e così via.

Pensa alle Cause Comuni

Dopo di ciò, considera alcune cause comuni dell’errore:

  • Potrebbe essere che la libreria necessaria non sia installata o installata con la versione sbagliata?
  • Forse c’è un semplice errore di battitura o errore di sintassi da qualche parte?
  • Potrebbe essere che l’errore sia legato ai tipi di dati, ad esempio sommi una stringa e un numero?
  • E così via.

Chiedi a ChatGPT

Se non ti viene in mente nulla, è il momento di chiedere l’aiuto di ChatGPT. I problemi semplici possono spesso essere risolti semplicemente incollando il tuo codice e chiedendo cosa non va. Tuttavia, per problemi più complessi, potrebbe essere necessario fornire informazioni pertinenti aggiuntive. Ad esempio, se stai incontrando un errore di sistema, potrebbe essere utile includere la versione di Python che stai usando. Nel complesso, cerca sempre di includere il messaggio di errore e descrivere ciò che stai cercando di realizzare. Potresti dover provare diverse formulazioni, quindi non aver paura di sperimentare.

Le situazioni possono variare molto, quindi passiamo ad alcuni esempi. Per prima cosa, diamo un’occhiata alla KeyError di pandas che abbiamo incontrato in precedenza.

Prompt di esempio:

Questo codice Python produce un <errore> in <questa riga>.```Inserisci qui il tuo codice```Dimmi come fare il debug del codice per risolvere l'errore dato.

Esempio:

Questo codice Python produce KeyError: 'Column not found: salary' nell'ultima riga.```import pandas as pddf = pd.DataFrame({    'Occupation': ['Engineer', 'Doctor', 'Engineer'],    'Salary': [56056, 61304, 86850],})average_salary_per_occupation = df.groupby('Occupation')['salary'].mean()```Dimmi come fare il debug del codice per risolvere l'errore dato.
Output for a debugging pandas example. Image by Author created using ChatGPT

Sembra buono! Vediamo un esempio più impegnativo con un errore logico.

Prompt di esempio:

Questo codice Python <fa questo, ma voglio che faccia questo>.```Inserisci qui il tuo codice```Dimmi come correggere il codice per risolvere il problema.

Esempio:

Questo codice Python addestra un classificatore random forest sul dataset Iris. Per quanto ne so, il dataset è relativamente semplice e mi aspetto che il classificatore faccia le previsioni perfette, tuttavia, ottengo circa il 95% di accuratezza anche con 100 alberi nella foresta. Questi risultati sono ragionevoli per questa situazione?```from sklearn.datasets import load_irisfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_scorefrom sklearn.model_selection import train_test_split, GridSearchCV# carica il dataset Irisiris = load_iris()X = iris.datay = iris.target# dividi i datiX_test, X_train, y_test, y_train = train_test_split(    X, y, test_size=0.2, random_state=42)X_train, X_val, y_train, y_val = train_test_split(    X_train, y_train, test_size=0.2, random_state=42)param_grid = {    'n_estimators': [3, 7, 15, 25, 50, 100]}# crea un classificatore random forest e utilizza la ricerca della griglia per trovare il miglior numero di alberirf_classifier = RandomForestClassifier()grid_search = GridSearchCV(estimator=rf_classifier,                            param_grid=param_grid, cv=5)grid_search.fit(X_train, y_train)# ottieni il miglior stimatore dalla ricerca della griglia e testalobest_rf = grid_search.best_estimator_y_pred = best_rf.predict(X_test)test_accuracy = accuracy_score(y_test, y_pred)print("Test accuracy:", test_accuracy)# ottieni il miglior numero di alberi dalla ricerca della grigliabest_n_estimators = grid_search.best_params_['n_estimators']print("Best number of trees:", best_n_estimators)```Dimmi come correggere il codice per risolvere il problema se ce n'è uno.
Output for a debugging sklearn example. Image by Author created using ChatGPT

Il modello è stato in grado di individuare il problema nascosto e risolverlo. Fantastico!

Dato che ChatGPT ricorda i tuoi messaggi precedenti, le possibilità che si aprono qui sono infinite. Puoi chiedere di spiegare alcuni concetti che stai avendo difficoltà a capire, suggerire soluzioni alternative, tradurre il codice da una lingua all’altra e così via.

Inoltre, poiché ChatGPT può comprendere il codice, è anche in grado di scriverlo.

Usa ChatGPT per Scrivere ed Esplicare il Codice

In questa sezione, esploreremo un paio di trucchi che possono essere utilizzati quando si codifica con ChatGPT. Ma prima, penso sia importante ricordare che prima dell’emergere di ChatGPT, Google era lo strumento principale per gli sviluppatori software.

E penso che sia importante non dimenticare come usare Google, per varie ragioni. Alla fine, con Google probabilmente puoi fare tutto ciò che puoi fare con ChatGPT (in ambiente di codifica), solo che potrebbe essere più lento. Anche se, quando si tratta di compiti specifici come la creazione di una matrice diagonale con numpy, probabilmente lo farei più velocemente usando Google.

Credo che l’analogia appropriata sia il processo di apprendimento di una lingua straniera (anche se si potrebbe dire che si sta facendo esattamente quello imparando un linguaggio di programmazione :). Usare Google significa tradurre parole singole utilizzando un vocabolario, mentre utilizzare ChatGPT è simile a tradurre intere frasi e paragrafi di testo utilizzando traduttori online. Anche se ChatGPT può essere estremamente potente, potresti incontrare delle sfide nell’identificare errori nascosti o nella comprensione di determinati blocchi di codice, soprattutto se sei un principiante.

Dato l’immensa capacità di ChatGPT, può essere impiegato in vari modi. Ti consiglio di usarlo per generare brevi frammenti di codice – agendo come un dizionario per gli idiomi o le espressioni stabili. Assicurarsi di avere una solida comprensione del codice generato è essenziale perché può aiutare a prevenire problemi e complicazioni future.

Quindi, usa ChatGPT, ma ricorda anche di cercare su Google! Questo articolo offre alcuni preziosi consigli sulla ricerca efficace su Google per gli sviluppatori software.

Scrivi

Una tecnica utile in queste situazioni è chiamata role prompting. Invece di chiedere semplicemente al modello di generare codice, puoi chiedergli di scrivere il codice assumendo il ruolo di uno sviluppatore junior, ad esempio. Assumendo questo ruolo, è più probabile che il modello produca un codice comprensibile per i principianti e eviti costrutti troppo complessi.

Esempio:

Fai finta di essere uno sviluppatore junior Python.Scrivi il codice con commenti che spiegano cosa sta accadendo.Quando fornisci la soluzione, assicurati che l'output sia ben formattato e il codice sia ben documentato.Includi esempi di utilizzo e spiegazioni.<Descrivi qui il tuo problema>

Esempio:

Fai finta di essere uno sviluppatore junior Python.Scrivi il codice con commenti che spiegano cosa sta accadendo.Quando fornisci la soluzione, assicurati che l'output sia ben formattato e il codice sia ben documentato.Includi esempi di utilizzo e spiegazioni.Scrivi un programma per trovare i valori comuni tra due array numpy.È una funzione che prende in input due array numpy e restituisce un array numpy.
Output per una richiesta di generazione di codice. Immagine dell'autore creata con ChatGPT

In questo esempio, ChatGPT ha fatto un buon lavoro seguendo tutte le nostre istruzioni, inclusi esempi e spiegazioni dettagliate.

Non dimenticare di confrontare il codice con le tue ipotesi iniziali e trarre conclusioni che ti permettano di non fare una tale richiesta in futuro.

In generale, ricorda che LLM non hanno alcuna conoscenza pregressa su di te o sul problema specifico che stai affrontando, quindi più informazioni fornisci, migliore sarà l’output:

  • Descrivi il tuo compito;
  • Definisci la struttura del codice: ad esempio, è uno script completo, una classe o una funzione;
  • Specifica input e output: ad esempio, la funzione prende due argomenti interi e restituisce un float;
  • Menziona gli strumenti/librerie che vuoi utilizzare, come numpy o pandas, così come un linguaggio di programmazione;
  • Se possibile, aggiungi le tue proposte su come potrebbe apparire la soluzione: ad esempio, suggerisco di utilizzare la funzione pandas.DataFrame.groupby per calcolare il salario medio per posizione.

Ottimizza

Se in precedenza abbiamo chiesto al modello di comportarsi come uno sviluppatore junior, vogliamo che sia più forte nella programmazione per compiti come l’ottimizzazione del codice.

A proposito, è possibile utilizzare lo stesso trucco di prompt per il debug.

Prompt di esempio:

Fai finta di essere uno sviluppatore Python esperto che fa da mentore a uno sviluppatore junior. Fornisci spiegazioni e commenti sui concetti che possono essere difficili per i principianti. Utilizza le migliori pratiche di Python e scrivi docstring. Riscrivi il codice Python sopra e ottimizzalo.```Inserisci il tuo codice qui```

Esempio:

Fai finta di essere uno sviluppatore Python esperto che fa da mentore a uno sviluppatore junior. Fornisci spiegazioni e commenti sui concetti che possono essere difficili per i principianti. Utilizza le migliori pratiche di Python e scrivi docstring. Riscrivi il codice Python sopra e ottimizzalo.```def unique_list(l):    # Ottieni una lista di elementi distinti dalla lista data    x = []    for a in l:        if a not in x:            x.append(a)    return x```
Risultato per una richiesta di ottimizzazione del codice. Immagine dell'autore creata utilizzando ChatGPT

Qui, per estrarre gli elementi unici dalla lista, ChatGPT suggerisce di utilizzare il tipo di dati set (che per definizione non consente valori duplicati), invece di un ciclo for. Una buona scelta, poiché è fondamentalmente una soluzione in una sola riga.

Spiegazione

Possiamo utilizzare la stessa notazione per richiedere commenti e spiegazioni del codice. Spesso questo tende a produrre commenti ridondanti, come import numpy as np # importazione della libreria numpy. Tuttavia, questo può essere comunque utile all’inizio del tuo percorso e aiutare il modello a esprimere i suoi pensieri interni come discusso nella sezione di ragionamento Chain-of-Thought nel mio articolo precedente.

Prompt di esempio:

Fai finta di essere uno sviluppatore Python esperto che fa da mentore a uno sviluppatore junior. Fornisci spiegazioni e commenti sui concetti che possono essere difficili per i principianti. Spiega e commenta il seguente codice.```Inserisci il tuo codice qui```

Esempio:

Fai finta di essere uno sviluppatore Python esperto che fa da mentore a uno sviluppatore junior. Fornisci spiegazioni e commenti sui concetti che possono essere difficili per i principianti. Spiega e commenta il seguente codice.```def func(n):    trow = [1]    y = [0]    for x in range(max(n, 0)):        print(trow)        trow = [l + r for l, r in zip(trow + y, y + trow)]    return n >= 1func(6)```
Risultato per una richiesta di spiegazione del codice. Immagine dell'autore creata utilizzando ChatGPT

Qui, il modello è stato in grado di identificare il compito dietro questo codice: generare righe del triangolo di Pascal. Buon lavoro!

Anche se ci sono numerose applicazioni utili per ChatGPT che puoi immaginare, è importante notare che potrebbe non sempre essere in grado di risolvere ogni problema che incontri. Vale la pena discutere ulteriormente questo aspetto.

Alcune note sui potenziali rischi

Anche se ChatGPT può essere molto utile e svolgere varie attività, è importante tenere a mente i potenziali svantaggi che possono essere insidiosi.

Essendo un LLM autoregressivo, ChatGPT non è deterministico…

ChatGPT è un esempio di un grande modello di lingua, e i modelli di lingua attuali sono autoregressivi, il che significa che sono addestrati per prevedere il token successivo in una sequenza. L’output di un modello è una distribuzione di probabilità su tutti i possibili token, e campioniamo il testo finale da questa distribuzione, token per token. Di conseguenza, il processo di campionamento è non deterministico, il che significa che è possibile avere output diversi per lo stesso input per motivi probabilistici.

Per illustrare questo, possiamo immaginare il processo di campionamento come un albero. Qui, la frase iniziale è mostrata in blu, i token selezionati sono mostrati in verde e quelli non selezionati sono rappresentati in rosso (senza la loro ulteriore evoluzione). Le probabilità sono scelte casualmente solo per motivi illustrativi.

Visualizzazione semplificata del processo di campionamento per LLM. Immagine dell'autore

La sequenza di input è: ” Il mio nome è ” e ChatGPT la completa con “ChatGPT, lieto di assisterti!”. Questo è un esempio del mio articolo precedente, in cui ho discusso le basi degli LLM.

… ed è per questo che ChatGPT può essere sbagliato

Nella pratica, questo significa che puoi ottenere un output subottimale solo perché hai ottenuto alcuni token rari e improbabili all’inizio. Di conseguenza, potrebbe essere necessario eseguire diverse volte lo stesso input per esaminare i diversi output e selezionare quello più adatto o anche combinare diverse parti da diversi output.

Inoltre, è importante sottolineare che i moderni modelli di linguaggio, specialmente GPT-4, possiedono impressionanti capacità di autocorrezione. Se il codice generato contiene errori, è possibile restituirlo semplicemente e indicare che non funziona correttamente. GPT-4 è abile nel debugging del proprio codice e nell’offrire suggerimenti pertinenti. Spesso sarai in grado di ottenere il codice corretto dopo un paio di iterazioni.

Sovraffollamento

Nonostante il fatto che gli LLM possano a volte fornire output non corretti, sono stati addestrati a dare priorità all’accuratezza. Ciò può far sì che il loro output sembri molto convincente, anche quando è sbagliato. Di conseguenza, identificare gli errori nascosti può essere difficile perché il modello spesso non può dire esplicitamente “Ho bisogno di più informazioni”, anche se la ricerca in corso sta esplorando attivamente modi per affrontare questa limitazione.

In questo senso, utilizzare ChatGPT per generare piccoli snippet di codice per risolvere compiti specifici, come ho già menzionato quando ho parlato di Googling, può essere più sicuro. È essenziale assicurarsi di avere una solida comprensione del codice che si riceve che ti consente di navigare efficacemente i potenziali ostacoli.

Conclusione

In questo articolo, abbiamo esplorato metodi che possono aiutarti nella fase di debug, non solo con ChatGPT ma anche con te stesso.

Isolando il problema e riprendendolo in poche righe di codice, è probabile che si ottengano informazioni sull’errore sottostante. Oppure lascia che ChatGPT ti aiuti fornendoti informazioni complete su ciò che sta accadendo, facendo assunzioni ed esperimenti.

Puoi anche utilizzare ChatGPT per compiti come la scrittura, l’ottimizzazione o l’esplicazione del codice, come abbiamo discusso nell’esempio del role prompting. Le altre applicazioni legate al codice sono infinite e includono la creazione di dati falsi, la scrittura di test, la generazione di documentazione e altro ancora.

Ma ricorda le limitazioni degli LLM, poiché possono introdurre problemi nascosti. A causa della loro natura autoregressiva, gli LLM possono essere sbagliati pur sembrando sicuri, il che potrebbe richiedere di fare più domande o eseguire molteplici iterazioni per selezionare il miglior output.

Ti auguro il meglio nella tua esperienza di apprendimento!

Risorse

Controlla questo articolo per una guida più ampia su come fare di ChatGPT il tuo mentore personale di codifica.

Ecco i miei altri articoli sugli LLM che potrebbero esserti utili. Ho già coperto:

  • Stima della scala dei grandi modelli di linguaggio: cosa sono gli LLM, come sono addestrati e di quanta quantità di dati e calcolo hanno bisogno;
  • Migliori pratiche per la progettazione di prompt: come applicare tecniche di progettazione di prompt per interagire efficacemente con gli LLM e come costruire applicazioni locali basate su LLM con OpenAI API e Streamlit.

Potresti anche essere interessato a:

  • Corso gratuito di apprendimento del prompting per acquisire una comprensione più approfondita del prompting e delle varie tecniche ad esso associate;
  • Corsi brevi di recente rilascio di DeepLearning.AI per creare applicazioni con OpenAI API.

Grazie per aver letto!

  • Spero che questi materiali ti siano stati utili. Seguimi su Nisoo per ottenere altri articoli come questo.
  • Se hai domande o commenti, sarò lieto di ricevere qualsiasi feedback. Chiedimelo nei commenti o collegati tramite LinkedIn o Twitter.
  • Per supportarmi come scrittore e per accedere a migliaia di altri articoli di Nisoo, ottieni la membership di Nisoo utilizzando il mio link di riferimento (nessun costo aggiuntivo per te).