Il modo in cui formuli una richiesta a GitHub Copilot determina la qualità del codice generato più di qualsiasi altra variabile. Le tre tecniche fondamentali — zero-shot, one-shot e few-shot — descrivono quanti esempi fornisci al modello dentro il prompt, mentre l’iterazione è il processo con cui affini il risultato. Padroneggiare la scelta fra queste strategie è il cuore del prompt engineering richiesto dall’esame GH-300.

Zero-shot: nessun esempio

Nel prompting zero-shot descrivi solo l’obiettivo, senza mostrare esempi. Ti affidi interamente alla conoscenza pre-addestrata del modello. È l’approccio più rapido e va bene quando il compito è comune, non ambiguo e non richiede convenzioni specifiche.

# Write a function that returns True if a string is a valid email address

Copilot completerà con una regex plausibile. Per attività standard (validazioni, conversioni di formato, boilerplate) lo zero-shot è quasi sempre sufficiente: aggiungere esempi sarebbe uno spreco di context window.

One-shot: un esempio guida

Con il one-shot fornisci un solo esempio del pattern desiderato. Serve quando esiste un formato o uno stile preciso che il modello non può indovinare da solo, ma che un singolo caso rende evidente.

# Convert dictionaries to log lines. Example:
# {"user": "ana", "action": "login"} -> "user=ana action=login"
def to_log_line(d):

L’esempio comunica la forma dell’output (chiave=valore, separati da spazio) meglio di una lunga descrizione a parole.

Few-shot: più esempi per fissare un pattern

Il few-shot fornisce due o più esempi coerenti fra loro. È la tecnica più potente per guidare stile, naming e pattern architetturali: il modello inferisce le regole implicite osservando la ripetizione.

# get_user_by_id(id) -> fetch_one("SELECT ... WHERE id = ?", [id])
# get_order_by_id(id) -> fetch_one("SELECT ... WHERE id = ?", [id])
# get_product_by_id(id) ->

Qui i due esempi impongono una convenzione di naming (get_X_by_id), una firma e uno stile di query parametrizzata. Copilot proseguirà rispettando quel pattern anziché inventare uno stile proprio. Usa il few-shot quando:

  • vuoi imporre convenzioni di team (formattazione, gestione errori, naming);
  • il dominio ha casi limite che un solo esempio non copre;
  • generi codice ripetitivo che deve restare omogeneo.

Come gli esempi modellano l’output

Gli esempi non trasmettono solo cosa fare ma come: indentazione, uso di type hint, gestione delle eccezioni, lingua dei commenti. Se i tuoi esempi usano snake_case e docstring in italiano, il completamento le erediterà. Esempi incoerenti tra loro confondono il modello e degradano la qualità: la coerenza è tanto importante quanto il numero di esempi.

Refinement iterativo

Raramente il primo prompt è perfetto. L’iterazione è un ciclo deliberato:

  1. Chiedi — formula il prompt con la tecnica più leggera che sembri adeguata.
  2. Valuta — leggi criticamente il codice generato: è corretto? rispetta lo stile? gestisce i casi limite?
  3. Correggi — raffina il prompt aggiungendo un vincolo, un esempio o un controesempio, poi rigenera.

In pratica, un fallimento in zero-shot spesso si risolve aggiungendo esempi (passando a one/few-shot) o esplicitando un vincolo mancante (“usa async/await”, “niente dipendenze esterne”). In Copilot Chat l’iterazione è conversazionale: chiedi una modifica (“aggiungi la gestione degli errori”, “riscrivi con list comprehension”) sfruttando la cronologia come contesto crescente.

Few-shot non è “dare contesto”

Attenzione a una confusione frequente: fornire contesto (aprire i file rilevanti, includere firme, referenziare #file o @workspace) non è few-shot. Il contesto dice al modello con cosa sta lavorando; il few-shot gli mostra esempi input→output del compito stesso. Sono complementari: il primo ancora il modello al tuo codebase, il secondo definisce il pattern da produrre.

Trappole tipiche d’esame

  • Scenario: un semplice utility function per parsare una data ISO → risposta giusta: lo zero-shot basta; aggiungere esempi è inutile overhead.
  • Scenario: devi generare 20 handler che seguono la stessa convenzione di naming ed error handling del team → risposta giusta: few-shot con 2-3 esempi coerenti, non zero-shot con una descrizione a parole.
  • Scenario: Copilot genera codice corretto ma nello stile sbagliato → risposta giusta: non riscrivere a mano; itera aggiungendo un esempio del formato desiderato.
  • Scenario: la domanda descrive “aprire i file correlati e passare @workspace” e la chiama few-shot → risposta giusta: è fornire contesto, non few-shot; il few-shot richiede esempi input→output nel prompt.
  • Scenario: il primo output è impreciso → risposta giusta: il flusso corretto è chiedi → valuta → correggi (refinement iterativo), non accettare o scartare al primo tentativo.