L'efficacia di un modello linguistico di grandi dimensioni dipende in gran parte dalle istruzioni che gli forniamo. Il prompt engineering è il processo di creazione di domande in modo da ottenere il miglior output da un LLM. È un passaggio cruciale nell'implementazione di una funzionalità basata su LLM.
Il prompt engineering è un processo iterativo. Se hai sperimentato con diversi LLM, probabilmente avrai 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 uno sforzo di prompting minimo. Tuttavia, quando lavori con un LLM predefinito più piccolo che non è ottimizzato, devi adattare il tuo approccio.
Gli LLM più piccoli sono meno potenti e hanno un pool di informazioni più piccolo da cui attingere.
Che cosa intendiamo con "LLM più piccoli"?
Definire le dimensioni degli LLM è complicato e non sempre i produttori le rivelano.
In questo documento, "LLM più piccoli" indica qualsiasi modello con meno di 30 miliardi di parametri. A oggi, i modelli con parametri che vanno da pochi milioni a pochi miliardi possono essere eseguiti in modo realistico nel browser, su dispositivi di livello consumer.
Dove vengono utilizzati gli LLM più piccoli?
- AI generativa sul dispositivo/nel browser, ad esempio se utilizzi Gemma 2B con l'API LLM Inference di MediaPipe (adatta anche per dispositivi solo CPU) o DistilBert nel browser con Transformers.js. Il download di un modello e l'esecuzione dell'inferenza sul dispositivo di un utente sono possibili solo con questi LLM più piccoli, per mantenere ragionevoli i download web e per adattarsi ai vincoli di memoria e GPU/CPU di un dispositivo.
- AI generativa personalizzata lato server. Sono disponibili piccoli modelli open-weight come Gemma 2B, Gemma 7B o Gemma 27B da eseguire sul tuo server (e, facoltativamente, da ottimizzare).
Inizia
Le interfacce di chat basate su LLM di grandi dimensioni, come Gemini o ChatGPT, possono spesso produrre risultati soddisfacenti con uno sforzo di prompting minimo. Tuttavia, quando lavori con LLM più piccoli, devi adattare il tuo approccio. Gli LLM più piccoli sono meno potenti e hanno un pool di informazioni più piccolo da cui attingere.
Fornisci istruzioni di contesto e formato precise
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) | |
| Adoro la vestibilità! 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 spalle sotto carichi pesanti. | 1 | 2/5 |
Mentre Gemini 1.5 fornisce 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 questo problema, dobbiamo utilizzare tecniche di prompt engineering, prompt one-shot, few-shot e multi-shot e prompt chain-of-thought. Dobbiamo anche 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) |
|---|---|
Adoro la vestibilità! Distribuisce bene il peso ed è sorprendentemente comodo anche per le escursioni di un'intera giornata. Lo consiglio. |
Analisi: questa recensione è molto positiva e sottolinea la vestibilità e il comfort del prodotto, indicando una grande soddisfazione per il prodotto. Questo giustifica una valutazione elevata. Valutazione (numero intero): 5 |
Le cinghie sono fragili e hanno iniziato a scavare nelle spalle sotto carichi pesanti. |
**Analisi:** la recensione evidenzia un problema di comfort significativo con le cinghie. Suggerisce inoltre che il prodotto potrebbe non essere adatto a carichi pesanti o uscite prolungate. **Valutazione:** 1 (la peggiore) |
Il nostro prompt più elaborato, combinato con le tecniche di prompting few-shot e prompting chain-of-thought, fornisce valutazioni più accurate.
Prevedi l'analisi manuale dell'output
Sebbene tu debba sempre liberare spazio e interpretare manualmente l'output di un LLM, questo è particolarmente vero per gli LLM più piccoli che potrebbero produrre risultati meno raffinati e richiedere il prompting chain-of-thought.
Nel primo esempio, abbiamo utilizzato il prompt chain-of-thought, quindi l'output includeva sia un'analisi sia una valutazione e dobbiamo analizzare manualmente la valutazione. Tieni presente anche la formattazione incoerente nell'output nella sezione precedente: il modello a volte 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);
}
Tieni presente le differenze tra le API
Le API cloud LLM come l'API Gemini o OpenAI, che in genere sono il punto di accesso agli LLM più grandi, offrono utili funzionalità di prompt. Ad esempio, Gemini 1.5 Pro offre istruzioni di sistema e 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 tramite API AI nel browser, come l' API LLM Inference di MediaPipe o Transformers.js. Sebbene non si tratti necessariamente di una limitazione tecnica, le API AI nel browser tendono a essere più snelle.
Tieni presente i limiti di token
Poiché il prompt per gli 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 presente.
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 token di input di 1 milione 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 progettazione.
A causa delle differenze tra le API e dei limiti di token, è probabile che tu abbia bisogno di più tempo e impegno per creare il prompt per un LLM più piccolo rispetto a uno più grande. Anche il test e la convalida dell'output dell'LLM potrebbero richiedere un maggiore impegno.
Ingegnere del prompt o ottimizzazione?
Per gli sviluppatori web, il prompt engineering è il nostro modo preferito di sfruttare l'AI generativa rispetto all'addestramento e all'ottimizzazione personalizzati. Tuttavia, anche il prompt engineering avanzato potrebbe non essere sufficiente in alcuni casi d'uso, soprattutto se utilizzi un LLM più piccolo.
Utilizza l'ottimizzazione quando:
- Hai bisogno di accuratezza e prestazioni di alto livello per un'attività specifica. L'ottimizzazione regola direttamente i parametri interni del modello per ottenere risultati ottimali.
- Hai dati ben curati, pertinenti alla tua attività, già etichettati con gli output preferiti. Hai bisogno di questi dati per un'ottimizzazione efficace.
- Utilizzi il modello ripetutamente per lo stesso scopo. L'ottimizzazione può essere eseguita una sola volta e riutilizzata per un'attività specifica.