Prompt engineering

Nel modulo sull'AI generativa, hai imparato che lo spazio di input dei modelli di AI generativa è praticamente illimitato. Per produrre output in linea con le aspettative degli utenti, devi creare prompt. Un prompt è un contratto strutturato tra la tua applicazione e il modello.

Un prompt ben scritto:

  • Indica come l'LLM deve costruire la risposta.
  • È composto da più componenti che possono essere sottoposti a controllo delle versioni, testati e migliorati nel tempo.
  • Può fungere da artefatto condiviso per la collaborazione tra i team.

In questo modulo imparerai a scrivere prompt efficaci. Spieghiamo come è strutturato un prompt e come i suoi componenti sono distribuiti tra il sistema e l'utente finale. Imparerai anche le tecniche di prompt di base e gli scenari in cui applicare ciascuna di queste tecniche.

In questo modulo utilizzeremo un esempio condiviso: BlogBuddy, un assistente di scrittura basato sull'AI, ispirato all'utilizzo dell'API Prompt da parte di CyberAgent.

Torna al modulo di AI generativa per il progetto del sistema BlogBuddy.

Componenti dei prompt

Ogni componente del prompt ha un ruolo specifico nel guidare il comportamento del modello.

  • Contesto: definisce il ruolo e il dominio del modello, in modo che comprenda come comportarsi.
  • Istruzione: assegna un'attività specifica al modello.
  • Variabili di input: contesto specifico della situazione, fornito dalla tua applicazione in tempo reale.
  • Formato di output: definisce la struttura di output prevista. Ad esempio, potresti volere output JSON.
  • Esempi: mostra come deve essere eseguita l'attività per uno o più altri input.
  • Vincoli: imposta limiti chiari per mantenere l'output coerente, sicuro e in linea con il brand.

Il prompt può includere alcuni o tutti questi componenti. L'esempio seguente illustra questi componenti per la funzionalità di assistenza alla scrittura di BlogBuddy.

### Context

You are a writing assistant for blog authors.
Your job is to generate helpful, concise, and engaging content.

### Instruction

Generate 3 alternative titles for the user's blog post with a given style.

### Input variables

Here is the content of the blog post:
${blogPostContent}

Here is the desired style:
${titleStyle}

### Output format

Return valid JSON ONLY, in the following exact structure:
{
  "titles": ["Title option 1", "Title option 2", "Title option 3"]
}

### Examples

Example input:
{
  "blogPostContent": "I finally visited the small neighborhood café I've been eyeing for months...",
  "titleStyle": "friendly"
}

Example output:
{
  "titles": [
    "A First Visit to the Neighborhood Café",
    "Trying the Café I've Wanted to Visit for Months",
    "My Experience at a Long-Awaited Local Spot"
  ]
}
### Constraints

- Each title must be under 128 characters.
- Titles must be original, not copied verbatim from the draft.
- Keep the tone natural and human. Avoid emojis unless explicitly requested.
- Avoid sensationalism or clickbait.
- If the draft includes multiple topics, choose the most prominent topic.

Per i primi prompt, inizia con gli elementi essenziali: le istruzioni e il formato di output. Poi, aggiungi in modo iterativo altri componenti man mano che analizzi i risultati e determini quali controlli più precisi sono necessari per ottenere risultati ottimali.

Prompt di sistema e dell'utente

Alcuni componenti del prompt sono hardcoded, mentre altri possono essere forniti dall'utente finale:

  • Il prompt di sistema è fornito dagli sviluppatori dell'applicazione e definisce il comportamento generale del modello. Può impostare il ruolo del modello, il tono previsto, il formato di output (ad esempio uno schema JSON rigoroso) e qualsiasi vincolo globale. Il prompt di sistema è anche il luogo in cui codifichi i requisiti di sicurezza e responsabilità. Rimane coerente tra le richieste e fornisce una base stabile per il comportamento del modello.

  • Il prompt utente contiene la richiesta immediata che porta a un output. L'utente richiede un'attività specifica, che può includere variabili specifiche. Ad esempio, "Mostra tre titoli per questo post", "Continua questo paragrafo" o "Rendi questo testo più formale".

La maggior parte delle API di AI generativa consente di strutturare un prompt come un array di messaggi, ciascuno con un ruolo (sistema o utente) e contenuti. In questo modo è più facile separare le istruzioni stabili e globali dall'input dinamico per richiesta.

Come decidi quali componenti devono essere inclusi nel prompt di sistema e quali devono essere specificati dall'utente? La risposta dipende dalla flessibilità della tua esperienza utente e dalle capacità del tuo modello.

Casi d'uso vincolati

Per casi d'uso molto specifici, la maggior parte del prompt può essere predefinita nel prompt di sistema. Ad esempio, in BlogBuddy gli utenti possono fare clic su Mostra titoli per visualizzare un elenco di suggerimenti per i titoli generati per la bozza.

L'attività è fissa, il formato di output è noto e l'utente non deve fornire un contesto aggiuntivo per ottenere il risultato previsto. In questo caso, inserisci tutte le regole stabili, le linee guida sul tono, gli schemi di output e gli esempi nel prompt di sistema.

Per creare questo prompt con l'API Prompt, utilizzeremo initialPrompts per definire il comportamento a livello di sistema per l'intera sessione:

// Defines stable behavior for the entire session
const session = await LanguageModel.create({
  initialPrompts: [
    {
      role: "system",
      content: `You are a blog-writing assistant.
      Your task is to generate high-quality titles for blog posts.
      Always respond in concise, friendly language.
      Return exactly 3 alternative titles.
      Produce valid JSON with a "titles" array of strings.`
    }
  ]
});

Quando l'utente fa clic su Mostra titoli, viene visualizzato il prompt per i contenuti correnti:

// The only variable input is the blog content
const result = await session.prompt(blogContent);

Nel tempo, gli utenti potrebbero chiedere maggiore flessibilità e controllo. In questo caso, puoi spostare determinati componenti nel prompt utente, con i controlli dell'interfaccia. Ad esempio, un menu a discesa con le specifiche di stile o tono.

Tuttavia, troppe azioni strutturate possono rendere l'esperienza utente caotica. In questo caso, ti consigliamo di passare a un design più aperto che consenta agli utenti di specificare la maggior parte dei prompt. Scopri di più sull'ottimizzazione di questo design nel modulo sui pattern UX.

Le attività flessibili si basano su prompt utente dettagliati

Un'esperienza interattiva e aperta che aiuta gli utenti a scrivere post del blog da zero e offre maggiore flessibilità. Potrebbero chiedere idee, schemi, riscritture, cambi di tono o brainstorming oppure specificare esattamente come deve essere eseguita un'attività. Con questo tipo di applicazione, probabilmente hai bisogno di un modello più potente lato server.

Con le attività flessibili, l'utente deve specificare più informazioni, poiché la gamma di opzioni possibili è molto più ampia. Il prompt di sistema continua a regolare il comportamento generale.

Le best practice sono:

  • Inserisci regole, struttura ed esempi stabili nel prompt di sistema. Inserisci contenuti dinamici e richieste specifiche per l'attività nel prompt utente.
  • Più l'esperienza utente è aperta, più il prompt utente deve adattarsi a input imprevedibili.
  • Più lavoro deve svolgere il prompt utente, più deve essere capace il modello, poiché deve gestire una maggiore variazione con una struttura meno integrata.

Puoi utilizzare queste regole per ottimizzare gradualmente il compromesso tra controllo e flessibilità dell'utente nel contesto del tuo prodotto. Osserva attentamente le preferenze e i comportamenti degli utenti. Una maggiore flessibilità non sempre si traduce in un valore effettivo. Inoltre, gli utenti devono avere il tempo, le competenze e la larghezza di banda cognitiva per creare prompt più estesi.

Tecniche di prompt comuni

Gli sviluppatori in genere provano diverse tecniche di prompt per trovare quella più adatta al loro caso d'uso e al loro modello.

Prompt zero-shot

Descrivi l'attività per il modello e spera per il meglio. Ad esempio:

"What is the capital of France?"

Il prompt zero-shot è una base di riferimento efficiente per molte attività di AI. Per le richieste non complesse, come le query di conoscenza enciclopedica, probabilmente è meglio continuare a utilizzare questa tecnica. Tuttavia, nella maggior parte delle applicazioni reali, devi espandere il prompt con condizioni e logica aggiuntive.

Prompt few-shot

Con il few-shot prompting, fornisci esempi per dimostrare il comportamento, lo stile, la struttura e altre variabili importanti corretti. Ecco un esempio di prompt per la classificazione del sentiment:

You classify user messages into one of the following categories:
- "positive"
- "negative"
- "neutral"
Here are examples to guide your classifications:
Input: "I love this product! It works perfectly."
Output: { "label": "positive" }

Input: "This is terrible. I want a refund."
Output: { "label": "negative" }

Il prompting few-shot è utile per questo tipo di attività pseudo-predittiva. Può essere applicato anche a attività che seguono una struttura riconoscibile, come la generazione di titoli nella Figura 1.

Quando lo spazio di output è molto ampio, ad esempio per contenuti open-ended o di lunga durata, il few-shot prompting probabilmente non è la tecnica migliore. È difficile o addirittura impossibile fornire esempi che coprano in modo significativo lo spazio.

Prompting chain-of-thought

Incoraggi il modello a ragionare passo dopo passo prima di produrre una risposta. I passaggi possono essere descritti in modo esplicito o lasciati alla definizione del modello. Ad esempio:

"Think step-by-step to identify the main idea of this paragraph. Then produce a
short heading under 60 characters."

La catena di pensiero è ideale per le attività che richiedono ragionamenti ed esecuzioni in più passaggi, come la creazione della struttura di un post del blog o il supporto di decisioni complesse. È la tecnica principale alla base dei cosiddetti modelli di ragionamento.

Questa operazione può essere costosa. La generazione di tracce di ragionamento passo passo aumenta il calcolo, i costi e la latenza. Utilizzalo solo quando il tuo caso d'uso richiede ragionamenti e pianificazioni complessi.

Prompt per l'autoriflessione

Dopo la generazione iniziale, chiedi al modello di esaminare e rivedere il proprio output. Ad esempio:

"Review your previous output.
Identify unclear phrasing and rewrite it more concisely."

L'autoriflessione è particolarmente utile per le attività che traggono vantaggio dal perfezionamento iterativo, come gli strumenti di modifica o riscrittura. È facile da implementare e può produrre miglioramenti sostanziali della qualità. Un ciclo di autoriflessione è utile quando il prompt ha un buon rendimento. Innanzitutto, perfeziona l'output per una maggiore chiarezza o per aggiungere un tocco di sorpresa per l'utente.

I tuoi concetti principali

In questo modulo hai imparato come vengono creati i prompt a partire da componenti strutturati. In pratica, l'ingegneria dei prompt è altamente sperimentale. Chiarezza e affidabilità emergono solo dopo diversi cicli di perfezionamento.

Nel prossimo modulo, esamineremo lo sviluppo di prompt basato sulla valutazione. Questa pratica ti aiuta a migliorare sistematicamente i prompt e a trovare la soluzione più adatta al tuo prodotto e ai tuoi utenti.

Risorse

Ciascuna di queste tecniche ha le proprie varianti e best practice. Esiste un'ampia gamma di risorse esterne dettagliate, ad esempio:

Consulta la documentazione del modello scelto, in quanto potrebbero esserci consigli specifici per ottenere i migliori risultati possibili.

Verifica la tua comprensione

Quali tipi di regole puoi specificare in un prompt di sistema?

Variabili di input specifiche (come gli input dell'utente), struttura dell'output prevista, ruolo del modello e limite di conteggio dei caratteri.
Ottimo lavoro, la risposta è esatta.
Qui va inserito solo l'input dell'utente.
Non esattamente. Riprova.
Per stabilire il ruolo e il dominio del modello, in modo che comprenda come comportarsi.
Non esattamente. Riprova.
Il tipo e le dimensioni del modello che stai utilizzando.
No, riprova.

Quale tecnica dovresti utilizzare quando vuoi che il modello ragioni passo dopo passo prima di produrre la risposta?

Prompt zero-shot
Risposta errata.
Prompt few-shot
Risposta errata.
Prompting chain-of-thought
Ottimo lavoro, la risposta è esatta.
Prompt per l'autoriflessione
Risposta errata.

Quando è più utile il few-shot prompting?

Quando chiedi al modello di eseguire un'attività senza alcun contesto.
Risposta errata.
Quando l'attività segue una struttura riconoscibile, ad esempio la generazione di titoli, o richiede una formattazione specifica.
Ottimo lavoro, la risposta è esatta.
Quando lo spazio di output è molto grande, ad esempio per la scrittura creativa open-ended.
Risposta errata.
Quando vuoi che il modello critichi il proprio lavoro.
Risposta errata.

Che cos'è la tecnica di richiesta di autoriflessione?

Chiedere al modello di analizzare e rivedere il proprio output per migliorare la chiarezza o la qualità.
Ottimo lavoro, la risposta è esatta.
Eseguire il prompt più volte e calcolare la media dei risultati.
Risposta errata.
Chiedere all'utente di riscrivere il prompt se il risultato non è soddisfacente.
Risposta errata.
Consentendo al modello di modificare il prompt di sistema in modo dinamico.
Risposta errata.