L'efficacia di un modello linguistico di grandi dimensioni dipende in gran parte dalle istruzioni che gli forniamo. L'ingegneria del prompt è 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 con LLM diversi, probabilmente avrai notato che devi 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, spesso possono produrre risultati soddisfacenti con uno sforzo minimo di prompt. Tuttavia, quando lavori con un LLM predefinito più piccolo che non è stato ottimizzato, devi adattare il tuo approccio.
Gli LLM più piccoli sono meno potenti e hanno un pool di informazioni più piccolo da cui attingere.
Cosa si intende per "LLM più piccoli"?
Definire le dimensioni degli LLM è complicato e non sempre vengono divulgate dai produttori.
In questo documento, "LLM più piccoli" indica qualsiasi modello con meno di 30 miliardi di parametri. A partire da oggi, i modelli con parametri che vanno da pochi milioni a pochi miliardi possono essere eseguiti in modo realistico nel browser, su dispositivi di consumo.
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 a 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 limiti di memoria e GPU/CPU di un dispositivo.
- AI generativa personalizzata lato server. Modelli open-weight di piccole dimensioni come Gemma 2B, Gemma 7B o Gemma 27B sono disponibili per l'esecuzione sul tuo server (e facoltativamente per l'ottimizzazione).
Inizia
Le interfacce di chat basate su LLM di grandi dimensioni, come Gemini o ChatGPT, spesso possono produrre risultati soddisfacenti con uno sforzo minimo di prompt. 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 il contesto e istruzioni precise sul formato
Per ottenere risultati ottimali con i modelli 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 (review) | Output (valutazione) | |
|---|---|---|
| LLM più grande (Gemini 1.5) | LLM più piccolo (Gemma 2B) | |
| Adoro la vestibilità! Distribuisce bene il peso ed è sorprendentemente comodo anche durante le escursioni di un'intera giornata. Consigliato. | 5 | 4 stelle su 5** |
| Gli spallacci 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 precisa. La prima recensione è abbastanza entusiasta da indicare una recensione a 5 stelle.
Per risolvere il problema, dobbiamo utilizzare tecniche di prompt engineering, prompt one-shot, few-shot e multi-shot e prompt chain-of-thought. Inoltre, dobbiamo fornire istruzioni chiare sul formato e insistere affinché il modello utilizzi 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 (review) | Output con un LLM più piccolo (Gemma 2B) |
|---|---|
Adoro la vestibilità! Distribuisce bene il peso ed è sorprendentemente comodo anche durante le escursioni di un'intera giornata. Consigliato. |
Analisi: questa recensione è molto positiva e sottolinea la vestibilità e il comfort del prodotto, indicando una grande soddisfazione. Questo giustifica una valutazione elevata. Valutazione (numero intero): 5 |
Gli spallacci sono fragili e hanno iniziato a scavare nelle spalle sotto carichi pesanti. |
**Analisi:** la recensione evidenzia un problema di comfort significativo con i cinturini. Inoltre, suggerisce che il prodotto potrebbe non essere adatto a carichi pesanti o uscite prolungate. **Valutazione:** 1 (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 pulire e interpretare manualmente l'output di un LLM, ciò è particolarmente vero per gli LLM più piccoli, che potrebbero produrre risultati meno raffinati e potrebbero richiedere prompting chain-of-thought.
Nel primo esempio, abbiamo utilizzato il prompting chain-of-thought, quindi l'output includeva sia un'analisi sia una valutazione e dobbiamo analizzare manualmente la valutazione. Inoltre, nota la formattazione incoerente nell'output della sezione precedente: il modello a volte restituisce 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
Le API cloud LLM come l'API Gemini o OpenAI, che in genere sono il punto di accesso a 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 MediaPipe LLM Inference o Transformers.js. Sebbene non si tratti necessariamente di una limitazione tecnica, le API AI nel browser tendono a essere più snelle.
Limiti di token di Mind
Poiché il prompt per i modelli 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 1 milione di token di input, mentre i modelli Gemma hanno una finestra contestuale di 8000 token.
Utilizza le funzioni di conteggio dei token per evitare di raggiungere il limite.
Adattare le stime dei tempi
Tieni conto della progettazione e del test dei prompt nelle stime del tempo 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 più impegno.
Ingegnere del prompt o messa a punto?
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 l'ingegneria dei prompt avanzata potrebbe non essere sufficiente in alcuni casi d'uso, soprattutto se utilizzi un modello LLM più piccolo.
Utilizza l'ottimizzazione quando:
- Hai bisogno di accuratezza e prestazioni di alto livello per un'attività specifica. Il fine tuning regola direttamente i parametri interni del modello per ottenere risultati ottimali.
- Hai dati ben curati, pertinenti per l'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 può essere eseguita una sola volta e riutilizzata per un'attività specifica.