Strategie di ottimizzazione
Questa guida condivide strategie e tattiche per ottenere risultati migliori dai grandi modelli linguistici (a volte chiamati modelli GPT) come GPT-4. I metodi descritti qui possono essere talvolta combinati per ottenere un effetto maggiore. Incoraggiamo l'esperimento per trovare i metodi che funzionano meglio per te.
Alcuni degli esempi presentati qui attualmente funzionano solo con il nostro modello più capace, gpt-4
. In generale, se scopri che un modello non riesce in un compito e è disponibile un modello più capace, spesso vale la pena riprovare con il modello più capace.
Suggerimenti: Questo tutorial è una traduzione della guida ufficiale di OpenAI per l'ingegneria dei suggerimenti. Il tutorial spiega la strategia/tattica di scrivere parole chiave e come istruire il LLM a restituire il risultato desiderato attraverso l'iscrizione.
Sei strategie per ottenere risultati migliori
Scrivere istruzioni chiare
Questi modelli non possono leggere nella tua mente. Se gli output sono troppo lunghi, chiedi risposte brevi. Se gli output sono troppo semplici, chiedi una scrittura di livello esperto. Se non ti piace il formato, dimostra il formato che vorresti vedere. Più il modello deve indovinare ciò che vuoi, più è probabile che tu lo ottenga.
Tattiche:
- Includi dettagli nella tua richiesta per ottenere risposte più pertinenti
- Chiedi al modello di adottare una personalità
- Utilizza delimitatori per indicare chiaramente parti distinte dell'input
- Specifica i passaggi necessari per completare un compito
- Fornisci esempi
- Specifica la lunghezza desiderata dell'output
Fornire testo di riferimento
I modelli linguistici possono inventare con sicurezza risposte fasulle, specialmente quando si chiedono informazioni su argomenti esoterici o per citazioni e URL. Allo stesso modo in cui un foglio di appunti può aiutare uno studente a fare meglio in un test, fornire un testo di riferimento a questi modelli può aiutare a rispondere con meno invenzioni.
Tattiche:
- Istruisci il modello a rispondere utilizzando un testo di riferimento
- Istruisci il modello a rispondere con citazioni da un testo di riferimento
Suddividere compiti complessi in compiti più semplici
Così come è una buona pratica nell'ingegneria del software decomporre un sistema complesso in un insieme di componenti modulari, lo stesso vale per i compiti inviati a un modello linguistico. I compiti complessi tendono ad avere tassi di errore più elevati rispetto ai compiti più semplici. Inoltre, i compiti complessi possono spesso essere ridefiniti come un flusso di compiti più semplici in cui gli output dei compiti precedenti vengono utilizzati per costruire gli input dei compiti successivi.
Tattiche:
- Utilizza la classificazione dell'intento per identificare le istruzioni più pertinenti per una query dell'utente
- Per le applicazioni di dialogo che richiedono conversazioni molto lunghe, riassumi o filtra il dialogo precedente
- Riassumi i lunghi documenti pezzo per pezzo e costruisci un riassunto completo in modo ricorsivo
Dare al modello il tempo per "pensare"
Se chiedessi di moltiplicare 17 per 28, potresti non saperlo istantaneamente, ma potresti comunque risolverlo con il tempo. Allo stesso modo, i modelli commettono più errori di ragionamento quando cercano di rispondere subito, piuttosto che prendersi il tempo per elaborare una risposta. Chiedere un "filo del pensiero" prima di una risposta può aiutare il modello a ragionare verso risposte corrette in modo più affidabile.
Tattiche:
- Istruisci il modello a elaborare la propria soluzione prima di giungere a una conclusione affrettata
- Utilizza il monologo interiore o una sequenza di interrogativi per nascondere il processo di ragionamento del modello
- Chiedi al modello se ha perso qualcosa nei passaggi precedenti
Utilizzo di strumenti esterni
Compensa i difetti del modello fornendogli gli output di altri strumenti. Ad esempio, un sistema di recupero dei testi (a volte chiamato RAG o generazione potenziata da recupero) può informare il modello su documenti rilevanti. Un motore di esecuzione del codice come l'interprete del codice di OpenAI può aiutare il modello a fare calcoli e eseguire il codice. Se un compito può essere svolto in modo più affidabile o efficiente da uno strumento piuttosto che da un modello linguistico, scaricalo per ottenere il meglio di entrambi.
Tattiche:
- Utilizza la ricerca basata su embeddamenti per implementare un recupero efficiente delle conoscenze
- Utilizza l'esecuzione del codice per eseguire calcoli più accurati o chiamare API esterne
- Fornisci al modello l'accesso a funzioni specifiche
Testare cambiamenti sistematicamente
Migliorare le prestazioni è più facile se è possibile misurarle. In alcuni casi, una modifica a un suggerimento può ottenere una migliore performance su alcuni esempi isolati, ma portare a una peggiore prestazione complessiva su un insieme più rappresentativo di esempi. Pertanto, per essere sicuri che un cambiamento contribuisca in modo netto alle prestazioni, potrebbe essere necessario definire un test completo (noto anche come "eval").
Tattica:
- Valutare gli output del modello facendo riferimento a risposte di standard d'oro
Tattiche
Ognuna delle strategie elencate sopra può essere istanziata con tattiche specifiche. Queste tattiche sono destinate a fornire idee su cose da provare. Non sono certo esaustive e dovresti sentirti libero di provare idee creative non rappresentate qui.
Descrizione dell'esempio di parola chiave Prompt
Sappiamo tutti che l'API del modello di chat che chiama OpenAI ha tre tipi di messaggi, SYSTEM, USER e ASSISTANT, e le funzioni di questi tre messaggi sono le seguenti:
Tipo di messaggio (corrispondente al parametro di ruolo dell'api) | Descrizione |
---|---|
SYSTEM | Il messaggio di sistema aiuta a impostare il comportamento dell'assistente. Ad esempio, è possibile modificare la personalità dell'assistente o fornire istruzioni specifiche su come dovrebbe comportarsi durante la conversazione. Tuttavia, si noti che il messaggio di sistema è facoltativo e il comportamento del modello senza un messaggio di sistema è probabilmente simile all'uso di un messaggio generico come "Sei un assistente disponibile". |
USER | Un messaggio dell'utente è una questione di input dell'utente. |
ASSISTANT | I messaggi di assistenza rappresentano ciò che restituisce GPT. |
Gli esempi di parole chiave in questo tutorial verranno spiegati nel seguente formato:
// Messaggio del SISTEMA
Questo mostra come impostare la parola chiave del messaggio del SISTEMA.
// Messaggio dell'UTENTE
Ciò mostra come impostare la parola chiave del messaggio dell'UTENTE.
// Messaggio dell'ASSISTENTE
Questo dimostra ciò che potrebbe restituire GPT.
Strategia: Scrivere istruzioni chiare
Tattica: Includere dettagli nella tua richiesta per ottenere risposte più pertinenti
Per ottenere una risposta molto pertinente, assicurati che le richieste forniscano tutti i dettagli o il contesto importanti. In caso contrario, stai lasciando al modello il compito di indovinare cosa intendi.
Peggio | Meglio |
Come posso aggiungere numeri in Excel? | Come posso sommare una riga di importi in dollari in Excel? Vorrei fare ciò automaticamente per un'intera serie di righe con tutti i totali che finiscono a destra in una colonna chiamata "Totale". |
Chi è il presidente? | Chi era il presidente del Messico nel 2021 e con quale frequenza si tengono le elezioni? |
Scrivi del codice per calcolare la sequenza di Fibonacci. | Scrivi una funzione TypeScript per calcolare efficientemente la sequenza di Fibonacci. Commenta abbondantemente il codice per spiegare cosa fa ogni pezzo e perché è stato scritto in quel modo. |
Riassumi le note della riunione. | Riassumi le note della riunione in un solo paragrafo. Quindi crea un elenco in markdown degli speaker e ognuno dei loro punti chiave. Infine, elenca i passi successivi o gli elementi di azione suggeriti dagli speaker, se ce ne sono. |
Tattica: Chiedi al modello di adottare una persona
Il messaggio di sistema può essere utilizzato per specificare la persona utilizzata dal modello nelle sue risposte.
// Messaggio del SISTEMA
Quando chiedo aiuto per scrivere qualcosa, risponderai con un documento che contiene almeno una barzelletta o un commento giocoso in ogni paragrafo.
// Messaggio dell'UTENTE
Scrivi una nota di ringraziamento al mio fornitore di bulloni in acciaio per aver consegnato in tempo e su breve preavviso. Ciò ha reso possibile consegnare un ordine importante.
Tattica: Utilizzare delimitatori per indicare chiaramente parti distinte dell'input
I delimitatori come le virgolette doppie, i tag XML, i titoli di sezione, ecc. possono aiutare a delimitare le sezioni di testo da trattare in modo diverso.
// Messaggio dell'UTENTE
Riassumi il testo delimitato dalle virgolette doppie con un haiku.
"""inserisci qui il testo"""
// Messaggio del SISTEMA
Ti verranno forniti due articoli (delimitati con i tag XML) sullo stesso argomento. Prima riassumi gli argomenti di ciascun articolo. Indica quindi quale di essi presenta un argomento migliore e spiega perché.
// Messaggio dell'UTENTE
<article> inserisci qui il primo articolo </article>
<article> inserisci qui il secondo articolo </article>
// Messaggio del SISTEMA
Ti verrà fornito un abstract della tesi e un titolo suggerito per essa. Il titolo della tesi dovrebbe dare al lettore una buona idea dell'argomento della tesi ma dovrebbe anche essere accattivante. Se il titolo non soddisfa questi criteri, suggerisci 5 alternative.
// Messaggio dell'UTENTE
Abstract: inserisci qui l'abstract
Titolo: inserisci qui il titolo
Per compiti semplici come questi, l'uso dei delimitatori potrebbe non fare una differenza nella qualità dell'output. Tuttavia, più complessa è un'attività, più è importante disambiguare i dettagli del compito. Non fare lavorare il modello per capire esattamente ciò che gli stai chiedendo.
Tattica: Specificare i passaggi necessari per completare un compito
Alcuni compiti sono meglio specificati come una sequenza di passaggi. Scrivere esplicitamente i passaggi può rendere più semplice per il modello seguirli.
// Messaggio di SISTEMA
Segui le seguenti istruzioni passo dopo passo per rispondere agli input dell'utente.
Passaggio 1 - L'utente ti fornirà del testo racchiuso tra virgolette triple. Riassumi questo testo in una sola frase con un prefisso che dice "Riepilogo: ".
Passaggio 2 - Traduci il riepilogo dal Passaggio 1 in spagnolo, con un prefisso che dice "Traduzione: ".
// Messaggio dell'UTENTE
"""inserisci qui il testo"""
Tattica: Fornire esempi
Fornire istruzioni generali che si applicano a tutti gli esempi è generalmente più efficiente che mostrare tutte le permutazioni di un compito per esempio, ma in alcuni casi fornire esempi può essere più semplice. Ad esempio, se l'intenzione è che il modello copi uno stile particolare nel rispondere alle richieste degli utenti, il quale è difficile da descrivere esplicitamente. Questo è noto come "few-shot" prompting.
// Messaggio di SISTEMA
Rispondi con uno stile coerente.
// Messaggio dell'UTENTE
Insegnami cosa significa pazienza.
// Messaggio dell'ASSISTENTE
Il fiume che scava la valle più profonda scorre da una sorgente modesta; la grandiosa sinfonia ha origine da una singola nota; il tessuto più intricato inizia con un filo solitario.
// Messaggio dell'UTENTE
Insegnami qualcosa sull'oceano.
Tattica: Specificare la lunghezza desiderata dell'output
È possibile chiedere al modello di produrre output di una determinata lunghezza target. La lunghezza dell'output mirato può essere specificata in termini di conteggio di parole, frasi, paragrafi, elenchi puntati, ecc. Tuttavia, è importante notare che istruire il modello a generare un numero specifico di parole non funziona con alta precisione. Il modello può generare in modo più affidabile output con un numero specifico di paragrafi o punti elenco.
// Messaggio dell'UTENTE
Riassumi il testo racchiuso tra virgolette triple in circa 50 parole.
"""inserisci qui il testo"""
// Messaggio dell'UTENTE
Riassumi il testo racchiuso tra virgolette triple in 2 paragrafi.
"""inserisci qui il testo"""
// Messaggio dell'UTENTE
Riassumi il testo racchiuso tra virgolette triple in 3 punti elenco.
"""inserisci qui il testo"""
Strategia: Fornire testo di riferimento
Tattica: Istruire il modello a rispondere utilizzando un testo di riferimento
Se possiamo fornire al modello informazioni affidabili rilevanti alla query corrente, possiamo istruire il modello a utilizzare le informazioni fornite per comporre la sua risposta.
// Messaggio di SISTEMA
Utilizza gli articoli forniti racchiusi tra virgolette triple per rispondere alle domande. Se la risposta non può essere trovata negli articoli, scrivi "Non ho potuto trovare una risposta."
// Messaggio dell'UTENTE
<inserire gli articoli, ognuno racchiuso tra virgolette triple>
Domanda: <inserire qui la domanda>
Poiché tutti i modelli hanno finestre di contesto limitate, abbiamo bisogno di un modo per cercare dinamicamente informazioni rilevanti alla domanda posta. Gli embedding possono essere utilizzati per implementare un efficiente recupero di conoscenza. Consultare la tattica "Utilizzare la ricerca basata su embeddings per implementare un efficiente recupero di conoscenza" per ulteriori dettagli su come implementare questo.
Tattica: Istruire il modello a rispondere con citazioni da un testo di riferimento
Se l'input è stato integrato con conoscenze rilevanti, è semplice richiedere che il modello aggiunga citazioni alle sue risposte facendo riferimento ai passaggi dei documenti forniti. Si noti che le citazioni nell'output possono essere verificate in modo programmato attraverso la corrispondenza di stringhe nei documenti forniti.
// Messaggio di SISTEMA
Ti sarà fornito un documento racchiuso tra virgolette triple e una domanda. Il tuo compito è rispondere alla domanda utilizzando solo il documento fornito e citare il passaggio(i) del documento utilizzato per rispondere alla domanda. Se il documento non contiene le informazioni necessarie per rispondere a questa domanda, scrivi semplicemente: "Informazioni insufficienti." Se viene fornita una risposta alla domanda, questa deve essere annotata con una citazione. Utilizza il seguente formato per citare i passaggi rilevanti ({"citazione": …}).
// Messaggio dell'UTENTE
"""<inserire qui il documento>"""
Domanda: <inserire qui la domanda>
Tattica: Utilizzare la classificazione dell'intento per identificare le istruzioni più pertinenti per una richiesta dell'utente
Per compiti in cui sono necessari molti insiemi indipendenti di istruzioni per gestire casi diversi, può essere vantaggioso classificare prima il tipo di richiesta e utilizzare tale classificazione per determinare quali istruzioni sono necessarie. Questo può essere realizzato definendo categorie fisse e codificando duramente le istruzioni rilevanti per gestire compiti in una data categoria. Questo processo può anche essere applicato in modo ricorsivo per scomporre un compito in una sequenza di fasi. Il vantaggio di questo approccio è che ogni richiesta conterrà solo quelle istruzioni necessarie per eseguire la fase successiva di un compito, il che può ridurre i tassi di errore rispetto all'utilizzo di una singola richiesta per eseguire l'intero compito. Ciò può anche portare a costi inferiori poiché le richieste più grandi costano di più da eseguire.
Ad esempio, supponiamo che per un'applicazione di assistenza clienti, le richieste potrebbero essere utilmente classificate come segue:
// Messaggio di SISTEMA
Ti verranno fornite richieste di assistenza clienti. Classifica ciascuna richiesta in una categoria primaria e una categoria secondaria. Fornisci l'output in formato json con le chiavi: primaria e secondaria.
Categorie primarie: Fatturazione, Supporto tecnico, Gestione dell'account o Richiesta generale.
Categorie secondarie della Fatturazione:
- Annulla sottoscrizione o aggiornamento
- Aggiungi un metodo di pagamento
- Spiegazione del pagamento
- Contestare un addebito
Categorie secondarie del Supporto tecnico:
- Risoluzione dei problemi
- Compatibilità dispositivi
- Aggiornamenti software
Categorie secondarie della Gestione dell'account:
- Ripristino della password
- Aggiornare le informazioni personali
- Chiudere l'account
- Sicurezza dell'account
Categorie secondarie della Richiesta generale:
- Informazioni sul prodotto
- Prezzi
- Feedback
- Parlare con un operatore umano
// Messaggio dell'UTENTE
Devo far funzionare di nuovo internet.
Sulla base della classificazione della richiesta del cliente, è possibile fornire un insieme di istruzioni più specifiche a un modello affinché gestisca i passaggi successivi. Ad esempio, supponiamo che il cliente necessiti di aiuto con la "risoluzione dei problemi".
// Messaggio di SISTEMA
Ti verranno fornite richieste di assistenza clienti che richiedono risoluzione dei problemi in un contesto di supporto tecnico. Aiuta l'utente:
- Chiedigli di verificare che tutti i cavi dal router siano collegati. Nota che è comune che i cavi si scollegano nel tempo.
- Se tutti i cavi sono collegati e il problema persiste, chiedigli quale modello di router stanno utilizzando.
- Ora consiglialo su come riavviare il dispositivo:
-- Se il numero di modello è MTD-327J, consiglialo di premere il pulsante rosso e tenerlo premuto per 5 secondi, quindi attendere 5 minuti prima di testare la connessione.
-- Se il numero di modello è MTD-327S, consiglialo di scollegarlo e ricollegarlo, quindi attendere 5 minuti prima di testare la connessione.
- Se il problema del cliente persiste dopo il riavvio del dispositivo e l'attesa di 5 minuti, collegalo al supporto IT emettendo {"Richiesta supporto IT"}.
- Se l'utente inizia a fare domande non correlate a questo argomento, conferma se desidera terminare la chat attuale sulla risoluzione dei problemi e classifica la loro richiesta secondo lo schema seguente:
<inserire lo schema di classificazione primaria/secondaria sopra indicato>
// Messaggio dell'UTENTE
Devo far funzionare di nuovo internet.
Si noti che al modello è stato istruito di emettere stringhe speciali per indicare quando lo stato della conversazione cambia. Ciò ci consente di trasformare il nostro sistema in una macchina a stati in cui lo stato determina quali istruzioni vengono iniettate. Tenendo traccia dello stato, delle istruzioni rilevanti in quello stato e anche facoltativamente delle transizioni di stato consentite da quello stato, possiamo porre dei limiti attorno all'esperienza dell'utente che sarebbe difficile da ottenere con un approccio meno strutturato.
Tattica: Per le applicazioni di dialogo che richiedono conversazioni molto lunghe, riassumere o filtrare i turni di dialogo precedenti
Poiché i modelli hanno una lunghezza del contesto fissa, il dialogo tra un utente e un assistente in cui l'intera conversazione è inclusa nella finestra di contesto non può continuare all'infinito.
Esistono vari stratagemmi per affrontare questo problema, uno dei quali è riassumere i turni precedenti nella conversazione. Una volta che le dimensioni dell'input raggiungono una lunghezza limite predeterminata, ciò potrebbe innescare una query che riassume parte della conversazione e il riassunto della conversazione precedente potrebbe essere incluso come parte del messaggio del sistema. In alternativa, la conversazione precedente potrebbe essere riassunta in modo asincrono in background durante l'intera conversazione.
Una soluzione alternativa è selezionare dinamicamente le parti precedenti della conversazione più rilevanti per la richiesta corrente. Consulta la tattica "Utilizzare la ricerca basata su embedding per implementare un efficiente recupero delle conoscenze".
Tattica: Riassumi i lunghi documenti pezzo per pezzo e costruisci un riassunto completo in modo ricorsivo
Poiché i modelli hanno una lunghezza di contesto fissa, non possono essere utilizzati per riassumere un testo più lungo della lunghezza del contesto meno la lunghezza del riassunto generato in un'unica query.
Per riassumere un documento molto lungo come un libro possiamo utilizzare una sequenza di query per riassumere ogni sezione del documento. I riassunti delle sezioni possono essere concatenati e riassunti producendo riassunti di riassunti. Questo processo può procedere in modo ricorsivo fino a quando un intero documento viene riassunto. Se è necessario utilizzare informazioni sulle sezioni precedenti per rendere sensato il contenuto delle sezioni successive, quindi un ulteriore trucco che può essere utile è includere un riassunto in corso del testo che precede un determinato punto nel libro mentre si riassume il contenuto in quel punto. L'efficacia di questa procedura per riassumere i libri è stata studiata in precedenti ricerche di OpenAI utilizzando varianti di GPT-3.
Strategia: Dai tempo ai modelli per "pensare"
Tattica: Indirizza il modello a elaborare la propria soluzione prima di giungere a una conclusione
A volte otteniamo risultati migliori quando istruiamo esplicitamente il modello a ragionare dai primi principi prima di giungere a una conclusione. Supponiamo ad esempio che vogliamo che un modello valuti la soluzione di uno studente a un problema di matematica. Il modo più ovvio di affrontare questo è semplicemente chiedere al modello se la soluzione dello studente è corretta o no.
// Messaggio del SISTEMA
Determinare se la soluzione dello studente è corretta o no.
// Messaggio dell'UTENTE
Enunciato del Problema: Sto costruendo un impianto di energia solare e ho bisogno di aiuto per calcolare i costi finanziari.
- Il costo del terreno è di $100 al piede quadrato
- Posso acquistare pannelli solari per $250 al piede quadrato
- Ho negoziato un contratto di manutenzione che mi costerà un fisso di $100.000 all'anno e ulteriori $10 al piede quadrato
Qual è il costo totale per il primo anno di operazioni in funzione del numero di piedi quadrati.
Soluzione dello Studente: Sia x la dimensione dell'installazione in piedi quadrati.
1. Costo del terreno: 100x
2. Costo dei pannelli solari: 250x
3. Costo di manutenzione: 100.000 + 100x
Costo totale: 100x + 250x + 100.000 + 100x = 450x + 100.000
// Messaggio dell'ASSISTENTE
La soluzione dello studente è corretta.
Ma la soluzione dello studente in realtà non è corretta! Possiamo far sì che il modello si accorga con successo di questo promettendo al modello di generare prima la propria soluzione.
// Messaggio del SISTEMA
Prima elabora la tua soluzione al problema. Poi confronta la tua soluzione con quella dello studente e valuta se la soluzione dello studente è corretta o no. Non decidere se la soluzione dello studente è corretta fino a quando non hai risolto il problema da solo.
// Messaggio dell'UTENTE
Enunciato del Problema: Sto costruendo un impianto di energia solare e ho bisogno di aiuto per calcolare i costi finanziari.
- Il costo del terreno è di $100 al piede quadrato
- Posso acquistare pannelli solari per $250 al piede quadrato
- Ho negoziato un contratto di manutenzione che mi costerà un fisso di $100.000 all'anno e ulteriori $10 al piede quadrato
Qual è il costo totale per il primo anno di operazioni in funzione del numero di piedi quadrati.
Soluzione dello Studente: Sia x la dimensione dell'installazione in piedi quadrati.
1. Costo del terreno: 100x
2. Costo dei pannelli solari: 250x
3. Costo di manutenzione: 100.000 + 100x
Costo totale: 100x + 250x + 100.000 + 100x = 450x + 100.000
// Messaggio dell'ASSISTENTE
Sia x la dimensione dell'installazione in piedi quadrati.
1. Costo del terreno: 100x
2. Costo dei pannelli solari: 250x
3. Costo di manutenzione: 100.000 + 10x
Costo totale: 100x + 250x + 100.000 + 10x = 360x + 100.000
La soluzione dello studente non è corretta. Ha commesso un errore nel calcolo del costo di manutenzione, utilizzando 100x invece di 10x. Il costo totale corretto per il primo anno di operazioni è 360x + 100.000.
Tattica: Utilizzare il monologo interiore o una sequenza di domande per nascondere il processo di ragionamento del modello
La tattica precedente dimostra che talvolta è importante per il modello ragionare in dettaglio su un problema prima di rispondere a una domanda specifica. Per alcune applicazioni, il processo di ragionamento che un modello utilizza per arrivare a una risposta finale sarebbe inappropriato da condividere con l'utente. Ad esempio, nelle applicazioni di tutoraggio potremmo voler incoraggiare gli studenti a trovare da soli le risposte, ma il processo di ragionamento di un modello sulla soluzione dello studente potrebbe rivelare la risposta allo studente.
Il monologo interiore è una tattica che può essere utilizzata per mitigare questo problema. L'idea del monologo interiore è quella di istruire il modello a mettere in una struttura i pezzi dell'output che devono essere nascosti all'utente in modo che il loro parsing sia facile. Poi, prima di presentare l'output all'utente, l'output viene analizzato e solo una parte dell'output viene resa visibile.
// Messaggio del SISTEMA
Segui questi passaggi per rispondere alle domande dell'utente.
Passo 1 - Prima risolvi il problema da solo. Non fare affidamento sulla soluzione dello studente poiché potrebbe essere incorretta. Racchiudi tutto il tuo lavoro per questo passo tra triple virgolette (""").
Passo 2 - Confronta la tua soluzione con quella dello studente e valuta se la soluzione dello studente è corretta o no. Racchiudi tutto il tuo lavoro per questo passo tra triple virgolette (""").
Passo 3 - Se lo studente ha commesso un errore, determina quale suggerimento puoi dare allo studente senza rivelare la risposta. Racchiudi tutto il tuo lavoro per questo passo tra triple virgolette (""").
Passo 4 - Se lo studente ha commesso un errore, fornisci allo studente il suggerimento dal passo precedente (fuori dalle triple virgolette). Invece di scrivere "Step 4 - ..." scrivi "Suggerimento:".
// Messaggio dell'UTENTE
Enunciato del problema: <inserisci l'enunciato del problema>
Soluzione dello studente: <inserisci la soluzione dello studente>
In alternativa, questo può essere realizzato con una sequenza di domande in cui tutte tranne l'ultima hanno il loro output nascosto all'utente finale.
Inizialmente, possiamo chiedere al modello di risolvere il problema da solo. Poiché questa query iniziale non richiede la soluzione dello studente, questa può essere omessa. Ciò fornisce il vantaggio aggiuntivo che non c'è possibilità che la soluzione del modello sia condizionata dal tentativo dello studente.
// Messaggio dell'UTENTE
<inserire l'enunciato del problema>
Successivamente, possiamo chiedere al modello di utilizzare tutte le informazioni disponibili per valutare la correttezza della soluzione dello studente.
// Messaggio del SISTEMA
Confronta la tua soluzione con quella dello studente e valuta se la soluzione dello studente è corretta o no.
// Messaggio dell'UTENTE
Enunciato del problema: """<inserire l'enunciato del problema>"""
La tua soluzione: """<inserire la soluzione generata dal modello>"""
Soluzione dello studente: """<inserire la soluzione dello studente>"""
Infine, possiamo permettere al modello di utilizzare la propria analisi per costruire una risposta nella persona di un tutor disponibile.
// Messaggio del SISTEMA
Sei un tutor di matematica. Se lo studente ha commesso un errore, offrigli un suggerimento in modo da non rivelare la risposta. Se lo studente non ha commesso un errore, offrigli semplicemente un commento incoraggiante.
// Messaggio dell'UTENTE
Enunciato del problema: """<inserire l'enunciato del problema>"""
La tua soluzione: """<inserire la soluzione generata dal modello>"""
Soluzione dello studente: """<inserire la soluzione dello studente>"""
Analisi: """<inserire l'analisi generata dal modello dal passaggio precedente>"""
Tattica: Chiedere al modello se ha tralasciato qualcosa nei passaggi precedenti
Supponiamo di utilizzare un modello per elencare estratti da una fonte che sono rilevanti per una determinata domanda. Dopo aver elencato ciascun estratto, il modello deve determinare se dovrebbe iniziare a scriverne un altro oppure se dovrebbe interrompersi. Se il documento sorgente è ampio, è comune che un modello si fermi troppo presto e non elenchi tutti gli estratti rilevanti. In tal caso, spesso si ottiene una migliore performance facendo prompt al modello con domande di follow-up per trovare eventuali estratti che ha trascurato nei passaggi precedenti.
// Messaggio del SISTEMA
Ti verrà fornito un documento delimitato da triple virgolette. Il tuo compito è selezionare estratti pertinenti alla seguente domanda: "Quali significativi cambiamenti di paradigma sono avvenuti nella storia dell'intelligenza artificiale."
Assicurati che gli estratti contengano tutto il contesto rilevante necessario per interpretarli - in altre parole, non estrarre piccoli frammenti mancanti di contesto importante. Fornisci l'output nel formato JSON come segue:
[{"estratto": "..."},
...
{"estratto": "..."}]
// Messaggio dell'UTENTE
"""<inserire qui il documento>"""
// Messaggio dell'ASSISTENTE
[{"estratto": "il modello scrive qui un estratto"},
...
{"estratto": "il modello scrive un altro estratto qui"}]
// Messaggio dell'UTENTE
Ci sono altri estratti pertinenti? Fai attenzione a non ripetere estratti. Assicurati anche che gli estratti contengano tutto il contesto rilevante necessario per interpretarli - in altre parole, non estrarre piccoli frammenti mancanti di contesto importante.
Strategia: Utilizzare strumenti esterni
Tattica: Utilizzare la ricerca basata su embedding per implementare un efficiente recupero delle conoscenze
Un modello può sfruttare fonti esterne di informazioni se fornite come parte del suo input. Ciò può aiutare il modello a generare risposte più informate e aggiornate. Ad esempio, se un utente pone una domanda su un film specifico, può essere utile aggiungere informazioni di alta qualità sul film (ad es. attori, regista, ecc...) all'input del modello. Gli embedding possono essere utilizzati per implementare un efficiente recupero delle conoscenze, in modo che le informazioni rilevanti possano essere aggiunte dinamicamente all'input del modello durante l'esecuzione.
Un embedding di testo è un vettore che può misurare la correlazione tra stringhe di testo. Le stringhe simili o rilevanti saranno più vicine tra loro rispetto alle stringhe non correlate. Questo fatto, insieme all'esistenza di algoritmi rapidi di ricerca vettoriale, significa che gli embedding possono essere utilizzati per implementare un efficiente recupero delle conoscenze. In particolare, un corpus di testo può essere suddiviso in chunk e ciascun chunk può essere incorporato ed archiviato. Successivamente, una determinata query può essere incorporata e può essere eseguita una ricerca vettoriale per trovare i chunk di testo incorporati dal corpus che sono più correlati alla query (ossia più vicini nello spazio di embedding).
Tattica: Utilizzare l'esecuzione del codice per eseguire calcoli più accurati o chiamare API esterne
I modelli linguistici non possono essere affidabili per eseguire da soli calcoli aritmetici o calcoli complessi. Nei casi in cui ciò è necessario, un modello può essere istruito a scrivere e eseguire il codice anziché effettuare i propri calcoli. In particolare, un modello può essere istruito a inserire il codice da eseguire in un formato designato, come il triplo backtick. Dopo che un'output è prodotto, il codice può essere estratto ed eseguito. Infine, se necessario, l'output del motore di esecuzione del codice (ossia l'interprete Python) può essere fornito come input al modello per la query successiva.
// Messaggio di SISTEMA
Puoi scrivere ed eseguire codice Python racchiudendolo nel triplo backtick, ad es. ```codice da inserire```. Usa questo metodo per eseguire calcoli.
// Messaggio dell'UTENTE
Trova tutte le radici reali del seguente polinomio: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.
Un altro buon caso d'uso per l'esecuzione del codice è la chiamata di API esterne. Se un modello è istruito sull'uso corretto di un'API, può scrivere del codice che ne faccia uso. Un modello può essere istruito su come utilizzare un'API fornendogli documentazione e/o esempi di codice che mostrino come utilizzare l'API.
// Messaggio di SISTEMA
Puoi scrivere ed eseguire codice Python racchiudendolo nel triplo backtick. Inoltre, si noti che hai accesso al seguente modulo per aiutare gli utenti a inviare messaggi ai loro amici:
\`\`\`python
import message
message.write(to="John", message="Ehi, vuoi incontrarti dopo il lavoro?")\`\`\`
ATTENZIONE: Eseguire codice prodotto da un modello non è intrinsecamente sicuro e vanno prese precauzioni in qualsiasi applicazione che cerchi di farlo. In particolare, è necessario un ambiente di esecuzione del codice sandboxato per limitare il danno che il codice non attendibile potrebbe causare.
Tattica: Dare al modello accesso a funzioni specifiche
L'API delle completamento della chat consente di passare un elenco di descrizioni delle funzioni nelle richieste. Ciò consente ai modelli di generare argomenti di funzione secondo gli schema forniti. Gli argomenti di funzione generati vengono restituiti dall'API in formato JSON e possono essere utilizzati per eseguire chiamate di funzione. L'output fornito dalle chiamate di funzione può quindi essere reinviato a un modello nella richiesta successiva per chiudere il ciclo. Questo è il modo raccomandato per utilizzare i modelli OpenAI per chiamare funzioni esterne.
Strategia: Testare i cambiamenti in modo sistematico
A volte può essere difficile capire se un cambiamento, ad esempio una nuova istruzione o un nuovo design, migliora o peggiora il sistema. Guardare alcuni esempi può far intuire quale sia migliore, ma con campioni di piccole dimensioni può essere difficile distinguere tra un miglioramento effettivo e una fortuna casuale. Forse il cambiamento migliora le prestazioni in alcuni casi, ma peggiora le prestazioni in altri.
Le procedure di valutazione (o "valutazioni") sono utili per ottimizzare i design dei sistemi. Le buone valutazioni sono:
- Rappresentative dell'uso del mondo reale (o almeno diverse)
- Contengono molti casi di test per una maggiore potenza statistica (vedi tabella sotto per linee guida)
- Facili da automatizzare o ripetere
Differenza da rilevare | Dimensione del campione necessaria per una confidenza del 95% |
---|---|
30% | ~10 |
10% | ~100 |
3% | ~1.000 |
1% | ~10.000 |
La valutazione degli output può essere fatta da computer, esseri umani o una combinazione dei due. I computer possono automatizzare le valutazioni con criteri oggettivi (ad esempio, domande con risposte corrette singole) e alcuni criteri soggettivi o sfumati, nei quali gli output del modello vengono valutati da altre query del modello. OpenAI Evals è un framework software open-source che fornisce strumenti per creare valutazioni automatizzate.
Le valutazioni basate su modelli possono essere utili quando esiste una gamma di possibili output che sarebbero considerati di alta qualità in modo equivalente (ad esempio, per domande con risposte lunghe). Il confine tra ciò che può essere realisticamente valutato con una valutazione basata su modelli e ciò che richiede un intervento umano per essere valutato è sfumato e cambia costantemente man mano che i modelli diventano più capaci. Incoraggiamo a sperimentare per capire quanto bene le valutazioni basate su modelli possano funzionare per il vostro caso d'uso.
Tattica: Valutare le uscite del modello facendo riferimento alle risposte standard
Si supponga che si conosca la risposta corretta a una domanda e che essa faccia riferimento a un insieme specifico di fatti noti. In tal caso possiamo utilizzare una query del modello per contare quanti dei fatti richiesti sono inclusi nella risposta.
Ad esempio, utilizzando il seguente messaggio di sistema:
// Messaggio di SISTEMA
Ti verrà fornito un testo delimitato da triple virgolette che dovrebbe essere la risposta a una domanda. Verifica se le seguenti informazioni sono direttamente contenute nella risposta:
- Neil Armstrong è stato la prima persona a camminare sulla Luna.
- La data in cui Neil Armstrong ha camminato per la prima volta sulla Luna è il 21 luglio 1969.
Per ciascuno di questi punti, esegui i seguenti passaggi:
1 - Riformula il punto.
2 - Fornisci una citazione dalla risposta che si avvicina a questo punto.
3 - Valuta se qualcuno che legge la citazione e non conosce l'argomento potrebbe dedurre direttamente il punto. Spiega perché sì o perché no prima di prendere una decisione.
4 - Scrivi "sì" se la risposta al punto 3 è sì, altrimenti scrivi "no".
Infine, fornisce un conteggio di quante risposte "sì" ci sono. Fornisci questo conteggio come {"conteggio": <inserire qui il conteggio>}.
Ecco un esempio di input in cui vengono soddisfatti entrambi i punti:
// Messaggio di SISTEMA
<inserisci qui il messaggio di sistema sopra>
// Messaggio dell'UTENTE
"""Neil Armstrong è famoso per essere stato il primo essere umano a mettere piede sulla Luna. Questo storico evento è avvenuto il 21 luglio 1969, durante la missione Apollo 11."""
Ecco un esempio di input in cui è soddisfatto solo un punto:
// Messaggio di SISTEMA
<inserisci qui il messaggio di sistema sopra>
// Messaggio dell'UTENTE
"""Neil Armstrong ha fatto la storia quando è sceso dal modulo lunare, diventando la prima persona a camminare sulla luna."""
Ecco un esempio di input in cui nessuno dei punti è soddisfatto:
// Messaggio di SISTEMA
<inserisci qui il messaggio di sistema sopra>
// Messaggio dell'UTENTE
"""Nell'estate del '69, un viaggio grandioso,
Apollo 11, audace come la mano della leggenda.
Armstrong ha fatto un passo, la storia si è svolta,
"Un piccolo passo", ha detto, per un nuovo mondo."""
Ci sono molte possibili varianti di questa valutazione basata sul modello. Si consideri la seguente variazione che tiene traccia del tipo di sovrapposizione tra la risposta del candidato e la risposta standard, e tiene anche traccia se la risposta del candidato contraddice qualche parte della risposta standard.
// Messaggio di SISTEMA
Utilizza i seguenti passaggi per rispondere agli input dell'utente. Riformula completamente ciascun passaggio prima di procedere, cioè "Passo 1: Ragione...".
Passo 1: Ragiona passo dopo passo se le informazioni nella risposta inviata rispetto alla risposta dell'esperto siano: disgiunte, uguali, un sottoinsieme, un sovrainsieme, o in sovrapposizione (cioè una certa intersezione ma non sottoinsieme/soprainsieme).
Passo 2: Ragiona passo dopo passo se la risposta inviata contraddica qualche aspetto della risposta dell'esperto.
Passo 3: Produci un oggetto JSON strutturato come: {"tipo_di_sovrapposizione": "disgiunta" o "uguale" o "sottoinsieme" o "sovrainsieme" o "in sovrapposizione", "contraddizione": true o false}
Ecco un esempio di input con una risposta non adeguata che comunque non contraddice la risposta dell'esperto:
// Messaggio di SISTEMA
<inserisci qui il messaggio di sistema sopra>
// Messaggio dell'UTENTE
Domanda: """Per quale evento Neil Armstrong è più famoso e in quale data si è verificato? Assumere il tempo UTC."""
Risposta Inviata: """Non è che abbia camminato sulla Luna o qualcosa del genere?"""
Risposta dell'Esperto: """Neil Armstrong è più famoso per essere stato la prima persona a camminare sulla Luna. Questo storico evento è avvenuto il 21 luglio 1969."""
Ecco un esempio di input con una risposta che contraddice direttamente la risposta dell'esperto:
// Messaggio di SISTEMA
<inserisci qui il messaggio di sistema sopra>
// Messaggio dell'UTENTE
Domanda: """Per quale evento Neil Armstrong è più famoso e in quale data si è verificato? Assumere il tempo UTC."""
Risposta Inviata: """Il 21 luglio 1969, Neil Armstrong è diventato la seconda persona a camminare sulla Luna, seguendo dopo Buzz Aldrin."""
Risposta dell'Esperto: """Neil Armstrong è più famoso per essere stato la prima persona a camminare sulla Luna. Questo storico evento è avvenuto il 21 luglio 1969."""
Ecco un esempio di input con una risposta corretta che fornisce anche un po' più di dettagli di quanto necessario:
// Messaggio di SISTEMA
<inserire il messaggio di sistema sopra>
// Messaggio dell'UTENTE
Domanda: """Per quale evento Neil Armstrong è più famoso e in che data è avvenuto? Si suppone l'ora in UTC."""
Risposta Inserita: """Verso le 02:56 UTC del 21 luglio 1969, Neil Armstrong è diventato il primo essere umano a mettere piede sulla superficie lunare, segnando un traguardo monumentale nella storia dell'umanità."""
Risposta dell'Esperto: """Neil Armstrong è famoso per essere stato la prima persona a camminare sulla luna. Questo storico evento è avvenuto il 21 luglio 1969."""