Fornire contesto per migliorare l'accuratezza
Fornire un contesto permette al modello di intelligenza artificiale di comprendere meglio ciò che si sta chiedendo o ciò che dovrebbe sapere per fornire la risposta più idonea. Il contesto può essere fornito in diversi modi.
Richiesta di composizione dell'output
Specificare la struttura dell'output può avere un impatto significativo sui risultati. Ad esempio, è possibile richiedere al modello di citare le fonti, scrivere la risposta sotto forma di messaggio di posta elettronica, formattare la risposta come una query SQL, classificare il sentiment seguendo una struttura specifica e così via. Ad esempio:
Prompt
Write a table in markdown with 6 animals in it, with their genus and species
Response
| Animal | Genus | Species |
| ---------------- |:--------------:|:--------------:|
| Red Panda | Ailurus | fulgens |
| African Elephant | Loxodonta | africana |
| Snow Leopard | Panthera | uncia |
| Arctic Fox | Vulpes | lagopus |
| Chimpanzee | Pan | troglodytes |
| Siberian Tiger | Panthera | tigris altaica |
Questa tecnica può essere usata con formati personalizzati, ad esempio una struttura JSON:
Prompt
Put two fictional characters into JSON of the following format
{
firstNameFictional:
jobFictional:
}
Response
Here's an example of how you can put two fictional characters into JSON format:
{
"firstNameFictional": "Henry",
"jobFictional": "Wizard"
},
{
"firstNameFictional": "Frank",
"jobFictional": "Hero"
}
Messaggio di sistema
Il messaggio di sistema è incluso all'inizio di un prompt e ha lo scopo di fornire al modello direttive, un punto di vista da cui rispondere, o altre informazioni rilevanti per orientare la risposta. Il messaggio di sistema può includere tono o personalità, argomenti che non devono essere inclusi o dettagli (ad esempio la formattazione) su come rispondere.
Ad esempio, è possibile fornire al modello alcuni dei seguenti messaggi di sistema:
- "Voglio che tu agisca come un terminale della riga di comando. Rispondi ai comandi esattamente come farebbe cmd.exe, in un unico blocco di codice, e nient'altro."
- "Voglio che tu sia un traduttore, dall'inglese allo spagnolo. Non rispondere a nulla di ciò che dico o chiedo, traduci solo tra queste due lingue e rispondi con il testo tradotto".
- "Agisci come un oratore motivazionale, offrendo consigli incoraggianti su obiettivi e sfide. Devi includere molte affermazioni positive e attività consigliate per raggiungere l'obiettivo finale dell'utente".
Altri messaggi di sistema di esempio sono disponibili nella parte superiore della finestra della chat in Azure AI Studio selezionando il pulsante Esempi di richiesta . Provare a definire un prompt di sistema personalizzato che specifica una risposta univoca e chattare con il modello per vedere in che modo le risposte differiscono.
L'endpoint ChatCompletion
abilita l'inclusione del messaggio di sistema usando il ruolo di chat System
.
var chatCompletionsOptions = new ChatCompletionsOptions()
{
Messages =
{
new ChatRequestSystemMessage("You are a casual, helpful assistant. You will talk like an American old western film character."),
new ChatRequestUserMessage("Can you direct me to the library?")
}
};
Response
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "Well howdy there, stranger! The library, huh?
Y'all just head down the main road till you hit the town
square. Once you're there, take a left and follow the street
for a spell. You'll see the library on your right, can’t
miss it. Happy trails!",
"role": "assistant"
}
}
],
...
}
response = openai.ChatCompletion.create(
model="gpt-35-turbo",
messages=[
{"role": "system", "content": "You are a casual, helpful assistant. You will talk like an American old western film character."},
{"role": "user", "content": "Can you direct me to the library?"}
]
)
Response
{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "Well howdy there, stranger! The library, huh?
Y'all just head down the main road till you hit the town
square. Once you're there, take a left and follow the street
for a spell. You'll see the library on your right, can’t
miss it. Happy trails!",
"role": "assistant"
}
}
],
...
}
I messaggi di sistema possono modificare significativamente la risposta, sia nel formato che nel contenuto. Provare a definire un messaggio di sistema per il modello, spiegando il tipo di risposta atteso e cosa includere o meno.
Cronologia conversazioni
Oltre al messaggio di sistema, è possibile fornire altri messaggi al modello per migliorare la conversazione. La cronologia delle conversazioni consente al modello di continuare a rispondere in modo simile, ad esempio usando lo stesso tono o formattazione. Inoltre, consente all'utente di fare riferimento al contenuto precedente nelle query successive. La cronologia può essere fornita in due modi: attraverso una cronologia di chat reale oppure attraverso un esempio di conversazione definito dall'utente.
Le interfacce di chat che usano modelli OpenAI, ad esempio ChatGPT e il playground della chat in Azure AI Studio, includono automaticamente la cronologia delle conversazioni che comporta una conversazione più completa e più significativa. Nella sezione Parametri del playground della chat è possibile specificare il numero di messaggi precedenti da includere. Provare a ridurre il valore a 1 o ad aumentarlo al massimo per osservare come diverse quantità di cronologia influiscano sulla conversazione.
Nota
Includendo nel prompt una cronologia più ampia delle conversazioni, verrà usato un numero maggiore di token di input. È necessario determinare il giusto equilibrio per il proprio caso d'uso, tenendo conto del limite di token del modello in uso.
I sistemi di chat possono anche utilizzare le capacità di riepilogo del modello per risparmiare sui token di input. Un'app può scegliere di riepilogare i messaggi precedenti e inserire questo riepilogo nella cronologia della conversazione, limitando così l'invio al modello solo degli ultimi due messaggi nel loro formato originale.
Few shot learning
L'utilizzo di un esempio di conversazione definito dall'utente è quello che viene chiamato few shot learning, che fornisce al modello esempi di come dovrebbe rispondere a una determinata query. Questi esempi servono per eseguire il training del modello su come rispondere.
Ad esempio, dopo aver fornito al modello alcuni suggerimenti e la risposta prevista, si prosegue seguendo lo stesso schema senza fornire ulteriori indicazioni su cosa fare:
User: That was an awesome experience
Assistant: positive
User: I won't do that again
Assistant: negative
User: That was not worth my time
Assistant: negative
User: You can't miss this
Assistant:
Se si fornisce al modello solo la frase You can't miss this
senza alcun contesto aggiuntivo derivato dall'approccio few shot learning, è probabile che la risposta ottenuta non sia pertinente.
In pratica, sia la cronologia delle conversazioni che il few-shot learning vengono inviati al modello nella stessa maniera. Ogni messaggio dell'utente e ogni risposta dell'assistente costituiscono un messaggio distinto all'interno dell'oggetto messaggio. L'endpoint ChatCompletion
è ottimizzato per includere la cronologia dei messaggi, indipendentemente dal fatto che la cronologia dei messaggi venga fornita come few shot learning o come cronologia effettiva della conversazione.
var chatCompletionsOptions = new ChatCompletionsOptions()
{
Messages =
{
new ChatRequestSystemMessage("You are a helpful assistant."),
new ChatRequestUserMessage("That was an awesome experience"),
new ChatRequestAssistantMessage("positive"),
new ChatRequestUserMessage("I won't do that again"),
new ChatRequestAssistantMessage("negative"),
new ChatRequestUserMessage("That was not worth my time"),
new ChatRequestAssistantMessage("negative"),
new ChatRequestUserMessage("You can't miss this")
}
};
response = openai.ChatCompletion.create(
model="gpt-35-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "That was an awesome experience"},
{"role": "assistant", "content": "positive"},
{"role": "user", "content": "I won't do that again"},
{"role": "assistant", "content": "negative"},
{"role": "user", "content": "That was not worth my time"},
{"role": "assistant", "content": "negative"},
{"role": "user", "content": "You can't miss this"}
]
)
Suddividere un'attività complessa
Un'altra tecnica per migliorare l'interazione consiste nel dividere le richieste complesse in più query. Ciò consente al modello di comprendere meglio ogni singola parte e di migliorare l'accuratezza complessiva. Dividendo i prompt, è possibile integrare la risposta di un prompt precedente in un prompt successivo e sfruttare tali informazioni insieme alle funzionalità del modello di generare risposte pertinenti.
Ad esempio, è possibile chiedere al modello Doug can ride down the zip line in 30 seconds, and takes 5 minutes to climb back up to the top. How many times can Doug ride the zip line in 17 minutes?
. La risposta potrebbe essere 3
, ma se Doug parte dalla cima, tale risposta non sarebbe corretta.
Per ottenere una risposta più precisa, potremmo scomporre la domanda, chiedendo separatamente il tempo di andata e ritorno per raggiungere la cima con la teleferica e considerando che Doug parte effettivamente dalla cima. Analizzando il problema in questo modo, emerge che Doug può completare il tragitto con la teleferica quattro volte.
Catena di pensieri
Un metodo utile per suddividere l'attività in modo efficace consiste nel chiedere al modello di spiegare la propria catena di pensieri.
Chiedere a un modello di esporre i passaggi logici alla base della risposta consente di comprendere come ha interpretato il prompt. In questo modo, è possibile individuare dove il modello ha commesso un errore di logica e capire come adeguare il prompt per prevenire simili inconvenienti. Questa tecnica potrebbe prevedere la richiesta di citare le fonti, come ad esempio Bing Chat (che utilizza un modello GPT-4), e spiegare le ragioni che hanno portato a una determinata risposta.
La tecnica di richiesta della catena di pensiero è ideale per perfezionare e migliorare i prompt, al fine di ottenere le risposte di massima qualità dal modello.
Ad esempio, ponendo al modello la domanda What sport is easiest to learn but hardest to master?
, si riceve una risposta accompagnata da una breve spiegazione del perché. Tuttavia, formulando la domanda What sport is easiest to learn but hardest to master? Give a step by step approach of your thoughts, ending in your answer
, si ottiene una spiegazione esaustiva di come il modello sia giunto a quella conclusione.
Sure, here's a step-by-step approach to answering the question:
1. Identify sports that are popular and have a large following.
2. Consider the basic mechanics of each sport and how easy they are to learn.
3. Think about the various techniques and skills required to play each sport at a high level, and how difficult they are to master.
4. Compare the relative ease of learning each sport to the difficulty of mastering it.
5. Based on the above analysis, determine which sport is easiest to learn but hardest to master.
Using this approach, I would say that the sport of golf is easiest to learn but hardest to master. Here's why:
1. Golf is a popular sport with a large following.
2. The basic mechanics of hitting a golf ball are relatively simple and can be learned quickly with some practice.
3. However, achieving consistency and mastering the various shots and techniques required to play at a high level can take years of practice and dedication.
4. Compared to other sports, the difference between a beginner and an intermediate golfer is relatively small, while the difference between an intermediate and an advanced golfer is much larger.
5. Therefore, I would say that golf is the sport that is easiest to learn but hardest to master.
Comprendere il processo di ragionamento seguito dal modello per elaborare la risposta consente di identificare dove è necessario suddividere il prompt, fornire altre informazioni o specificare le istruzioni.