Ingegneria pratica del prompt per LLM più piccoli

Maud Nalpas
Maud Nalpas

L'efficacia di un modello linguistico di grandi dimensioni dipende molto dalle istruzioni che gli diamo. Il prompt engineering è il processo di creazione di domande in modo da ottenere il miglior output da un LLM. Si tratta di un passaggio fondamentale per l'implementazione di una funzionalità basata su LLM.

Il prompt engineering è un processo iterativo. Se hai sperimentato diversi LLM, probabilmente hai notato che dovevi modificare il prompt per ottenere un risultato migliore.

Questo vale anche per i modelli di dimensioni diverse.

Le interfacce di chat basate su LLM di grandi dimensioni, come Gemini o ChatGPT, possono spesso produrre risultati soddisfacenti con un impegno minimo per i prompt. Tuttavia, quando utilizzi un LLM predefinito più piccolo e non ottimizzato, devi adattare il tuo approccio.

Gli LLM più piccoli sono meno potenti e hanno un pool di informazioni più ridotto da cui attingere.

Che cosa si intende per "LLM più piccoli"?

La definizione delle dimensioni LLM è complicata e non sempre vengono comunicate dai produttori.

In questo documento, per "LLM più piccoli" si intendono tutti i modelli con meno di 30 miliardi di parametri. Ad oggi, i modelli con da alcuni milioni a qualche miliardo di parametri possono essere eseguiti in modo realistico nel browser su dispositivi di consumo.

Dove vengono utilizzati LLM più piccoli?

  • IA generativa on-device/in-browser, ad esempio se utilizzi Gemma 2B con l'API di inferenza LLM di MediaPipe (adatta anche per dispositivi solo CPU) o DistilBert nel browser con Transformers.js. Il download di un modello ed l'esecuzione dell'inferenza sul dispositivo di un utente è possibile solo con questi LLM più piccoli, per mantenere ragionevoli i download web e adattarsi ai vincoli di memoria e GPU/CPU di un dispositivo.
  • IA generativa lato server personalizzata. Puoi eseguire su un tuo server (e eventualmente ottimizzare) piccoli modelli a peso aperto come Gemma 2B, Gemma 7B o Gemma 27B.

Inizia

Le interfacce di chat basate su LLM di grandi dimensioni, come Gemini o ChatGPT, possono spesso produrre risultati soddisfacenti con un impegno minimo per i prompt. Tuttavia, quando si utilizzano LLM più piccoli, è necessario adattare l'approccio. Gli LLM più piccoli sono meno potenti e hanno un pool di informazioni più ridotto da cui attingere.

Fornire contesto e istruzioni precise sul formato

Per ottenere risultati ottimali con LLM di piccole dimensioni, crea prompt più dettagliati e specifici.

Ad esempio:

Based on a user review, provide a product rating as an integer between 1 and 5. \n
Only output the integer.

Review: "${review}"
Rating:
Input (revisione) Output (valutazione)
  LLM più grande (Gemini 1.5) LLM più piccolo (Gemma 2B)
Mi piacciono molto. Distribuisce bene il peso ed è sorprendentemente comodo anche per le escursioni di un'intera giornata. Lo consiglio. 5 4 stelle su 5**
Le cinghie sono fragili e hanno iniziato a scavare nelle mie spalle sotto carichi pesanti. 1 2/5

Sebbene Gemini 1.5 fornisca l'output desiderato con questo semplice prompt, l'output di Gemma non è soddisfacente:

  • Il formato non è corretto. Abbiamo richiesto un numero intero per la valutazione.
  • La valutazione non sembra molto accurata. La prima recensione è abbastanza entusiasta da indicare una recensione a 5 stelle.

Per risolvere il problema, dobbiamo utilizzare tecniche di progettazione dei prompt, prompt one-shot, few-shot e multi-shot e prompt concatenati. Inoltre, dobbiamo fornire istruzioni di formato chiare e insistere sul fatto che il modello deve utilizzare l'intera gamma di valutazioni.

Ad esempio:

`Analyze a product review, and then based on your analysis give me the
corresponding rating (integer). The rating should be an integer between 1 and
5. 1 is the worst rating, and 5 is the best rating. A strongly dissatisfied
review that only mentions issues should have a rating of 1 (worst). A strongly
satisfied review that only mentions positives and upsides should have a rating
of 5 (best). Be opinionated. Use the full range of possible ratings (1 to
5). \n\n
    \n\n
    Here are some examples of reviews and their corresponding analyses and
    ratings:
    \n\n
    Review: 'Stylish and functional. Not sure how it'll handle rugged outdoor
    use, but it's perfect for urban exploring.'
    Analysis: The reviewer appreciates the product's style and basic
    functionality. They express some uncertainty about its ruggedness but
    overall find it suitable for their intended use, resulting in a positive,
    but not top-tier rating.
    Rating (integer): 4
    \n\n
    Review: 'It's a solid backpack at a decent price. Does the job, but nothing
    particularly amazing about it.'
    Analysis: This reflects an average opinion. The backpack is functional and
    fulfills its essential purpose. However, the reviewer finds it unremarkable
    and lacking any standout features deserving of higher praise.
    Rating (integer): 3
    \n\n
    Review: 'The waist belt broke on my first trip! Customer service was unresponsive too. Would not recommend.'
    Analysis: A serious product defect and poor customer service experience naturally warrants the lowest possible rating. The reviewer is extremely unsatisfied with both the product and the company.
    Rating (integer): 1
    \n\n
    Review: 'Love how many pockets and compartments it has. Keeps everything organized on long trips. Durable too!'
    Analysis: The enthusiastic review highlights specific features the user loves (organization and durability), indicating great satisfaction with the product. This justifies the highest rating.
    Rating (integer): 5
    \n\n
    Review: 'The straps are a bit flimsy, and they started digging into my shoulders under heavy loads.'
    Analysis: While not a totally negative review, a significant comfort issue leads the reviewer to rate the product poorly. The straps are a key component of a backpack, and their failure to perform well under load is a major flaw.
    Rating (integer): 1
    \n\n
    Now, here is the review you need to assess:
    \n
    Review: "${review}" \n`;
Input (revisione) Output con un LLM più piccolo (Gemma 2B)

Mi piacciono molto. Distribuisce bene il peso ed è sorprendentemente confortevole anche per le escursioni giornaliere. Lo consiglio.

Analisi: questa recensione è molto positiva e sottolinea la vestibilità e il comfort del prodotto, a indicare una grande soddisfazione. Ciò giustifica una valutazione elevata.

Valutazione (numero intero): 5

Le cinghie sono fragili e hanno iniziato a scavare nelle mie spalle sotto carichi pesanti.

**Analisi:** la recensione evidenzia un problema significativo di comfort con le cinghie. Inoltre, suggerisce che il prodotto potrebbe non essere adatto per carichi pesanti o gite prolungate.

**Valutazione:** 1 (peggiore)

Il nostro prompt più elaborato, combinato con le tecniche di prompt con pochi esempi e di associazione di idee, consente di ottenere valutazioni più accurate.

Aspettati l'analisi manuale dell'output

Sebbene tu debba sempre ripulire e interpretare manualmente l'output di un LLM, questo è particolarmente vero per gli LLM più piccoli che potrebbero produrre risultati meno raffinati e richiedere prompt di associazione di idee.

Nel primo esempio abbiamo utilizzato il prompt della catena di pensiero, pertanto l'output includeva sia un'analisi sia una valutazione e dovevamo analizzare manualmente la valutazione. Inoltre, tieni presente la formattazione incoerente dell'output nella sezione precedente: a volte il modello genera markdown, ma non sempre.

// Use try/catch to catch (parsing) errors
try {
  // Parse the output for a rating
  const int = /[1-5]/;
  const ratingAsString = llmOutput.match(int)[0];
  // Parse as int
  const ratingAsInt = parseInt(ratingAsString);
  // `checkRating` checks the rating is a number between 1 and 5, since the
  // regEx may catch a number like "100"
  const finalRating = checkRating(ratingAsInt);
} catch (e) {
  console.error('Error', e);
}

Differenze tra le API Mind

Le API cloud LLM come l'API Gemini o OpenAI, che in genere rappresentano l'accesso ai modelli LLM più grandi, offrono utili funzionalità di prompt. Ad esempio, Gemini 1.5 Pro offre istruzioni di sistema e la modalità JSON.

Al momento, queste funzionalità non sono sempre disponibili per l'utilizzo di modelli personalizzati o per LLM più piccoli a cui si accede utilizzando API di IA in-browser, come l'API MediaPipe LLM Inference o Transformers.js. Sebbene non si tratti necessariamente di una limitazione tecnica, le API di IA in-browser tendono a essere più snelle.

Limiti di token Mind

Poiché il prompt per LLM più piccoli deve includere esempi o istruzioni più dettagliate, è probabile che sia più lungo e occupi una parte maggiore del limite di token di input, se esistente.

Inoltre, i modelli più piccoli tendono ad avere un limite di token di input inferiore. Ad esempio, Gemini 1.5 Pro ha un limite di un milione di token di input, mentre i modelli Gemma hanno una finestra contestuale di 8K.

Utilizza le funzioni di conteggio dei token per evitare di raggiungere il limite.

Adatta le stime dei tempi

Tieni conto della progettazione e del test dei prompt nelle stime dei tempi di ingegneria.

A causa delle differenze tra le API e dei limiti di token, probabilmente avrai bisogno di più tempo e impegno per creare il prompt per un modello LLM più piccolo rispetto a uno più grande. Anche il test e la convalida dell'output dell'LLM potrebbero richiedere un maggiore impegno.

Prompt engineering e ottimizzazione fine?

Per gli sviluppatori web, il prompt engineering è il nostro modo preferito di sfruttare l'IA generativa rispetto all'addestramento e alla messa a punto personalizzati. Tuttavia, anche la progettazione avanzata dei prompt potrebbe non essere sufficiente in alcuni casi d'uso, soprattutto se utilizzi un LLM più piccolo.

Utilizza la messa a punto fine quando:

  • Hai bisogno di precisione e prestazioni di alto livello per un'attività specifica. La messa a punto fine regola direttamente i parametri interni del modello per ottenere risultati ottimali.
  • Hai dati ben curati, pertinenti per la tua attività, già etichettati con gli output preferiti. Questi dati sono necessari per un'ottimizzazione efficace.
  • Utilizzi il modello ripetutamente per lo stesso scopo. L'ottimizzazione fine può essere eseguita una volta e riutilizzata per un'attività specifica.