Nozioni di base e procedure consigliate per la progettazione delle richieste

Completato

In questa unità tratteremo quanto segue:

  • Che cos'è la progettazione delle richieste?
  • Nozioni di base per la progettazione delle richieste
  • Procedure consigliate per la progettazione delle richieste
  • Modalità di apprendimento dalle richieste di Copilot

Che cos'è la progettazione delle richieste?

La progettazione delle richieste è il processo di creazione di istruzioni chiare per guidare i sistemi di intelligenza artificiale, come GitHub Copilot, per generare codice appropriato per il contesto in base alle esigenze specifiche del progetto. Ciò garantisce che il codice sia sintatticamente, funzionalmente e contestualmente corretto.

Ora che si sa che cos'è la progettazione delle richieste, è possibile apprendere alcuni dei principi correlati.

Principi della progettazione delle richieste

Prima di esplorare strategie specifiche, è necessario comprendere i principi di base della progettazione delle richieste, riepilogati tramite le 4 caratteristiche riportate di seguito. Queste regole principali sono la base per la creazione di richieste efficaci.

  • Singolarità: fare sempre in modo che la richiesta sia incentrata su una singola attività o domanda ben definita. Questa chiarezza è fondamentale per ottenere risposte accurate e utili da Copilot.
  • Specificità: assicurarsi che le istruzioni siano esplicite e dettagliate. La specificità porta a suggerimenti di codice più applicabili e precisi.
  • Brevità: le richieste devono essere specifiche ma anche concise e concrete. Questo equilibrio garantisce chiarezza senza sovraccaricare Copilot o complicare l'interazione.
  • Inclusione: utilizzare nomi file descrittivi e mantenere aperti i file correlati. Questo approccio offre a Copilot un contesto avanzato, che consente di ottenere suggerimenti di codice più personalizzati.

Questi principi fondamentali costituiscono la base per creare richieste efficienti ed efficaci. Tenendo presente queste 4 caratteristiche, è ora possibile esaminare nel dettaglio le procedure consigliate avanzate che garantiscono l'ottimizzazione di ogni interazione con GitHub Copilot.

Procedure consigliate per la progettazione delle richieste

Le procedure avanzate seguenti, basate sulle 4 caratteristiche, affinano e migliorano l'engagement con Copilot, assicurando che il codice generato non sia solo accurato ma perfettamente allineato alle esigenze e ai contesti specifici del progetto.

Fornire una chiarezza sufficiente

Basandosi sui principi "Singolarità" e "Specificità", mirare sempre alla chiarezza nelle richieste. Ad esempio, una richiesta come "Scrivi una funzione Python per filtrare e restituire numeri pari da un determinato elenco" è sia incentrato su un aspetto singolo che specifico.

Screenshot di una chat di Copilot con una richiesta Python.

Fornire un contesto sufficiente con i dettagli

Arricchire la comprensione di Copilot con il contesto, seguendo il principio "Inclusione". Più informazioni contestuali vengono fornite, più appropriati saranno suggerimenti di codice generati. Ad esempio, aggiungendo alcuni commenti nella parte superiore del codice per fornire altri dettagli a ciò che si vuole, è possibile fornire più contesto a Copilot per comprendere la richiesta e fornire suggerimenti di codice migliori.

Screenshot dei commenti aggiunti al codice per suggerimenti di Copilot migliori.

Nell'esempio precedente sono stati usati i passaggi per fornire altri dettagli, pur mantenendo la brevità della richiesta. Questa procedura segue il principio "Brevità", bilanciando i dettagli con concisione per garantire chiarezza e precisione nella comunicazione.

Nota

Copilot usa anche schede aperte parallele nell'editor di codice per ottenere più contesto sui requisiti del codice.

Fornire esempi per l'apprendimento

L'uso di esempi può chiarire i requisiti e le aspettative, illustrando i concetti astratti e rendendo le richieste più tangibili per Copilot. Esempi ben creati aiutano Copilot a comprendere rapidamente i modelli, causando suggerimenti iniziali più accurati che richiedono un minor numero di cicli di revisione. Questo approccio è particolarmente efficace per generare codice boilerplate, modelli di test e implementazioni ripetitive che costituiscono la base di funzionalità più grandi.

Screenshot di un esempio usato per chiarire le richieste per Copilot.

Asserzione e iterazione

Una delle chiavi per sbloccare il potenziale completo di GitHub Copilot e accelerare il flusso di lavoro di sviluppo è la pratica dell'iterazione strategica. La prima richiesta potrebbe non sempre produrre codice pronto per la produzione ed è perfettamente corretto. Invece di dedicare tempo manualmente a perfezionare l'output, considerarlo come l'inizio di un dialogo efficiente con Copilot.

Se il primo output non è proprio quello che si sta cercando, non iniziare da zero. Cancellare invece il codice suggerito, arricchire il commento iniziale con dettagli ed esempi aggiunti e richiedere nuovamente a Copilot. Questo approccio iterativo spesso consente di ottenere codice di alta qualità e pronto per la distribuzione più velocemente rispetto ai metodi di sviluppo tradizionali, poiché ogni iterazione si basa sulla comprensione di Copilot dei requisiti specifici.

Ora che sono state apprese le procedure consigliate per migliorare le competenze a livello di richiesta, è possibile esaminare in modo più approfondito come è possibile fornire esempi da cui Copilot può apprendere.

Modalità di apprendimento dalle richieste di Copilot

GitHub Copilot opera in base ai modelli di intelligenza artificiale sottoposti a training su grandi quantità di dati. Per migliorare la comprensione di contesti di codice specifici, i tecnici spesso forniscono esempi a Copilot. Questa procedura, comunemente presente nell'apprendimento automatico, ha portato a diversi approcci di training, ad esempio:

Apprendimento "zero-shot"

In questo caso GitHub Copilot genera codice senza esempi specifici, basandosi esclusivamente sul training di base. Questo approccio è ideale per implementare rapidamente modelli comuni e funzionalità standard. Si supponga, ad esempio, di voler creare una funzione per convertire le temperature tra Celsius e Fahrenheit. È possibile iniziare scrivendo solo un commento che descrive ciò che si vuole e Copilot potrebbe essere in grado di generare automaticamente codice pronto per la produzione, in base al training precedente, senza altri esempi.

Screenshot di Copilot che crea codice di conversione della temperatura da un commento.

Apprendimento "one-shot"

Con questo approccio viene fornito un singolo esempio, consentendo al modello di generare risposte più consapevoli del contesto che seguono modelli e convenzioni specifici. Ciò è particolarmente efficace per la creazione di implementazioni coerenti nella codebase, accelerando lo sviluppo di funzionalità mantenendo gli standard di codice. Basandosi sull'esempio "zero-shot" precedente, è possibile fornire un esempio di una funzione di conversione della temperatura e quindi chiedere a Copilot di creare un'altra funzione simile. Potrebbe avere un aspetto analogo al seguente:

Screenshot di Copilot che usa un esempio per creare codice di conversione della temperatura simile.

Apprendimento few-shot

In questo metodo vengono forniti a Copilot diversi esempi, in modo da trovare un equilibrio tra l'imprevedibilità dell'approccio "zero-shot" e la precisione dell'ottimizzazione. Questo approccio si distingue per la generazione di implementazioni sofisticate che gestiscono più scenari e casi perimetrali, riducendo il tempo dedicato ai test manuali e al perfezionamento. Si supponga di voler generare codice che invii un messaggio di saluto a seconda dell'ora del giorno. Ecco una versione "few-shot" di tale richiesta:

Screenshot di Copilot che genera codice di saluto in base a più esempi.

Catena di richieste e gestione della cronologia delle chat

Quando si usano funzionalità complesse che richiedono più passaggi, è possibile partecipare a conversazioni estese con GitHub Copilot Chat. Anche se il contesto dettagliato aiuta Copilot a comprendere i requisiti, la gestione di cronologie di conversazioni lunghe può diventare inefficiente e costosa in termini di elaborazione.

Ad esempio, è possibile iniziare con un'implementazione di base, quindi aggiungere in modo iterativo la gestione degli errori, i test, la documentazione e le ottimizzazioni. Ogni turno si basa sul contesto precedente, ma la cronologia completa cresce più a lungo:

Turno 1: "Creare una funzione di autenticazione utente" Turno 2: "Aggiungere la gestione degli errori per le credenziali non valide"
Turno 3: "Aggiungere unit test per la funzione di autenticazione" Turno 4: "Aggiungere commenti JSDoc per documentare la funzione" Turno 5: "Ottimizzare la funzione per una migliore prestazione"

Nota

Le richieste lunghe con cronologia di conversazione completa possono usare 2-3 PRU a turno. Riepilogare il contesto o reimpostare la conversazione può avvicinarla a 1 PRU per richiesta.

Per gestirlo in modo efficiente:

  • Riepilogare il contesto quando le conversazioni diventano lunghe: "In base alla discussione precedente sull'autenticazione utente, ora aggiungere una limitazione della frequenza per evitare attacchi di forza bruta"
  • Reimpostare e dare un contesto mirato per le nuove funzionalità: partire dai dettagli essenziali anziché mantenere la conversazione completa
  • Usare riferimenti concisi al lavoro precedente invece di ripetere implementazioni complete

Suggerimento di ruoli per compiti specializzati

La richiesta di ruoli implica l'indicare a GitHub Copilot di agire come un tipo specifico di esperto, che può migliorare significativamente la qualità e la pertinenza del codice generato per domini specializzati. Questo approccio consente di accelerare lo sviluppo ottenendo soluzioni più mirate al primo tentativo.

Ruolo esperto di sicurezza

Quando si lavora sulle funzionalità critiche per la sicurezza, chiedere a Copilot di pensare come un esperto di sicurezza:

"Agire come esperto di cybersecurity. Creare una funzione di convalida delle password che verifica la presenza di vulnerabilità comuni e segue le linee guida di OWASP."

Questo approccio genera in genere codice che include:

  • Purificazione dell'input
  • Protezione da attacchi comuni
  • Modelli di convalida standard del settore
  • Procedure consigliate per la sicurezza

Ruolo di ottimizzazione delle prestazioni

Per il codice critico per le prestazioni, usare un ruolo esperto delle prestazioni:

"Agire come esperto di ottimizzazione delle prestazioni. Effettuare il refactoring di questo algoritmo di ordinamento per gestire in modo efficiente set di dati di grandi dimensioni."

Questo comporta spesso:

  • Algoritmi ottimizzati e strutture di dati
  • Implementazioni efficienti della memoria
  • Considerazioni sulla scalabilità
  • Suggerimenti per il monitoraggio delle prestazioni

Ruolo specialista di test

Quando si creano gruppi di test completi, sfruttare la prospettiva di un esperto di test:

"Agire come specialista di test. Creare unit test completi per questo modulo di elaborazione dei pagamenti, inclusi i casi perimetrali e gli scenari di errore."

Questo produce in genere:

  • Copertura completa dei test
  • Gestione dei casi limite
  • Implementazioni fittizie
  • Test delle condizioni di errore

L'uso dei ruoli aiuta a ottenere codice pronto per la produzione più velocemente, integrando l'esperienza nel dominio nelle implementazioni iniziali di sviluppo e riducendo la necessità di cicli di revisione multipli.

Ora che si conosce il modo in cui Copilot usa le richieste per apprendere, si esaminerà nel dettaglio il modo in cui usa effettivamente la richiesta per suggerire il codice.