Condividi tramite


ChatML del linguaggio di markup chat (anteprima)

Importante

L'uso dei modelli GPT-3.5-Turbo con l'endpoint di completamento come descritto in questo articolo rimane in anteprima ed è possibile solo con gpt-35-turbo la versione (0301) prevista per il ritiro il 1° agosto 2024. È consigliabile usare l'API/l'endpoint di completamento della chat ga. L'API Completamento chat è il metodo consigliato per interagire con i modelli GPT-3.5-Turbo. L'API Completamento chat è anche l'unico modo per accedere ai modelli GPT-4.

Il frammento di codice seguente illustra il modo più semplice per usare i modelli GPT-3.5-Turbo con ChatML. Se questa è la prima volta che si usano questi modelli a livello di codice, è consigliabile iniziare con la guida introduttiva GPT-35-Turbo & GPT-4.

Nota

Nella documentazione di Azure OpenAI si fa riferimento a GPT-3.5-Turbo e GPT-35-Turbo in modo intercambiabile. Il nome ufficiale del modello in OpenAI è gpt-3.5-turbo, ma per Azure OpenAI a causa di vincoli di caratteri specifici di Azure il nome del modello sottostante è gpt-35-turbo.

import os
import openai
openai.api_type = "azure"
openai.api_base = "https://{your-resource-name}.openai.azure.com/"
openai.api_version = "2024-02-01"
openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.Completion.create(
  engine="gpt-35-turbo", # The deployment name you chose when you deployed the GPT-35-Turbo model
  prompt="<|im_start|>system\nAssistant is a large language model trained by OpenAI.\n<|im_end|>\n<|im_start|>user\nWho were the founders of Microsoft?\n<|im_end|>\n<|im_start|>assistant\n",
  temperature=0,
  max_tokens=500,
  top_p=0.5,
  stop=["<|im_end|>"])

print(response['choices'][0]['text'])

Nota

I parametri seguenti non sono disponibili con i nuovi modelli gpt-35-turbo: logprobs, best_of e echo. Se si imposta uno di questi parametri, verrà visualizzato un errore.

Il token <|im_end|> indica la fine di un messaggio. Quando si usa ChatML, è consigliabile includere <|im_end|> il token come sequenza di arresto per assicurarsi che il modello interrompa la generazione di testo quando raggiunge la fine del messaggio.

Prendere in considerazione l'impostazione di max_tokens a un valore leggermente superiore a quello normale, ad esempio 300 o 500. In questo modo il modello non smette di generare testo prima che raggiunga la fine del messaggio.

Gestione della versione dei modelli

Nota

gpt-35-turbo equivale al modello gpt-3.5-turbo di OpenAI.

A differenza dei modelli GPT-3 e GPT-3.5 precedenti, il modellogpt-35-turbo e i modelli gpt-4 e gpt-4-32k continueranno a essere aggiornati. Quando si crea una distribuzione di questi modelli, è necessario specificare anche una versione del modello.

È possibile trovare le date di ritiro del modello per questi modelli nella pagina dei modelli.

Uso di Chat Markup Language (ChatML)

Nota

OpenAI continua a migliorare il GPT-35-Turbo e Chat Markup Language usato con i modelli continuerà a evolversi in futuro. Questo documento verrà aggiornato con le informazioni più recenti.

OpenAI ha eseguito il training di GPT-35-Turbo su token speciali che delineano le diverse parti del prompt. Il prompt inizia con un messaggio di sistema usato per assegnare al modello una serie di messaggi tra l'utente e l'assistente.

Il formato di un prompt ChatML di base è il seguente:

<|im_start|>system 
Provide some context and/or instructions to the model.
<|im_end|> 
<|im_start|>user 
The user’s message goes here
<|im_end|> 
<|im_start|>assistant 

Messaggio di sistema

Il messaggio di sistema viene incluso all'inizio della richiesta tra i token <|im_start|>system e <|im_end|>. Questo messaggio fornisce le istruzioni iniziali per il modello. È possibile fornire varie informazioni nel messaggio di sistema, tra cui:

  • Breve descrizione dell'assistente
  • Tratti di personalità dell'assistente
  • Istruzioni o regole che si desidera far seguire all'assistente
  • Dati o informazioni necessarie per il modello, ad esempio domande rilevanti dalle domande frequenti

È possibile personalizzare il messaggio di sistema per il caso d'uso o semplicemente includere un messaggio di sistema di base. Il messaggio di sistema è facoltativo, ma è consigliabile includerne almeno uno di base per ottenere i migliori risultati.

Messaggi

Dopo il messaggio di sistema, è possibile includere una serie di messaggi tra l'utente e l'assistente. Ogni messaggio deve iniziare con il token <|im_start|> seguito dal ruolo (user o assistant) e terminare con il token <|im_end|>.

<|im_start|>user
What is thermodynamics?
<|im_end|>

Per attivare una risposta dal modello, la richiesta deve terminare con un token <|im_start|>assistant che indica che è il turno della risposta dell'assistente. È possibile includere nella richiesta anche messaggi di esempio tra l'utente e l'assistente per eseguire alcuni scatti di apprendimento.

Esempi di richiesta

La sezione seguente illustra esempi di diversi stili di richieste che è possibile usare con i modelli GPT-35-Turbo e GPT-4. Questi esempi sono solo un punto di partenza ed è possibile sperimentare richieste diverse per personalizzare il comportamento per i propri casi d'uso.

Esempio di base

Se si vuole che i modelli GPT-35-Turbo e GPT-4 si comportino in modo analogo a chat.openai.com, è possibile usare un messaggio di sistema di base come "Assistente è un modello linguistico di grandi dimensioni sottoposto a training da OpenAI".

<|im_start|>system
Assistant is a large language model trained by OpenAI.
<|im_end|>
<|im_start|>user
Who were the founders of Microsoft?
<|im_end|>
<|im_start|>assistant

Esempio con istruzioni

Per alcuni scenari, potrebbe essere necessario fornire istruzioni aggiuntive al modello per definire protezioni per le operazioni che il modello è in grado di eseguire.

<|im_start|>system
Assistant is an intelligent chatbot designed to help users answer their tax related questions. 

Instructions:
- Only answer questions related to taxes. 
- If you're unsure of an answer, you can say "I don't know" or "I'm not sure" and recommend users go to the IRS website for more information.
<|im_end|>
<|im_start|>user
When are my taxes due?
<|im_end|>
<|im_start|>assistant

Uso dei dati per il grounding

È anche possibile includere dati o informazioni pertinenti nel messaggio di sistema per fornire al modello un contesto aggiuntivo per la conversazione. Se si ha bisogno di includere solo una quantità limitata di informazioni, è possibile impostarla come hardcoded nel messaggio di sistema. Se si dispone di una grande quantità di dati che il modello deve conoscere, è possibile usare incorporamenti o un prodotto come Ricerca di intelligenza artificiale di Azure per recuperare le informazioni più rilevanti in fase di query.

<|im_start|>system
Assistant is an intelligent chatbot designed to help users answer technical questions about Azure OpenAI Serivce. Only answer questions using the context below and if you're not sure of an answer, you can say "I don't know".

Context:
- Azure OpenAI Service provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series.
- Azure OpenAI Service gives customers advanced language AI with OpenAI GPT-3, Codex, and DALL-E models with the security and enterprise promise of Azure. Azure OpenAI co-develops the APIs with OpenAI, ensuring compatibility and a smooth transition from one to the other.
- At Microsoft, we're committed to the advancement of AI driven by principles that put people first. Microsoft has made significant investments to help guard against abuse and unintended harm, which includes requiring applicants to show well-defined use cases, incorporating Microsoft’s principles for responsible AI use
<|im_end|>
<|im_start|>user
What is Azure OpenAI Service?
<|im_end|>
<|im_start|>assistant

Alcuni scatti di apprendimento con ChatML

È anche possibile fornire alcuni esempi di scatti al modello. L'approccio per pochi scatti di apprendimento è cambiato leggermente a causa del nuovo formato di richiesta. Ora è possibile includere una serie di messaggi tra l'utente e l'assistente nella richiesta come esempi di scatti. Questi esempi possono essere usati per eseguire il seeding delle risposte alle domande comuni per preparare il modello o insegnare al modello comportamenti specifici.

Questo è solo un esempio di come è possibile usare alcuni scatti di apprendimento con GPT-35-Turbo. È possibile sperimentare diversi approcci per vedere cosa funziona meglio per il caso d'uso.

<|im_start|>system
Assistant is an intelligent chatbot designed to help users answer their tax related questions. 
<|im_end|>
<|im_start|>user
When do I need to file my taxes by?
<|im_end|>
<|im_start|>assistant
In 2023, you will need to file your taxes by April 18th. The date falls after the usual April 15th deadline because April 15th falls on a Saturday in 2023. For more details, see https://www.irs.gov/filing/individuals/when-to-file
<|im_end|>
<|im_start|>user
How can I check the status of my tax refund?
<|im_end|>
<|im_start|>assistant
You can check the status of your tax refund by visiting https://www.irs.gov/refunds
<|im_end|>

Uso di Chat Markup Language per scenari non di chat

ChatML è progettato per gestire più facilmente le conversazioni a più turni, ma funziona bene anche per scenari non di chat.

Ad esempio, per uno scenario di estrazione di entità, è possibile usare il prompt seguente:

<|im_start|>system
You are an assistant designed to extract entities from text. Users will paste in a string of text and you will respond with entities you've extracted from the text as a JSON object. Here's an example of your output format:
{
   "name": "",
   "company": "",
   "phone_number": ""
}
<|im_end|>
<|im_start|>user
Hello. My name is Robert Smith. I’m calling from Contoso Insurance, Delaware. My colleague mentioned that you are interested in learning about our comprehensive benefits policy. Could you give me a call back at (555) 346-9322 when you get a chance so we can go over the benefits?
<|im_end|>
<|im_start|>assistant

Prevenzione di input dell'utente non sicuri

È importante aggiungere mitigazioni all'applicazione per garantire un uso sicuro di Chat Markup Language.

È consigliabile impedire agli utenti finali di includere token speciali nell'input, ad esempio <|im_start|> e <|im_end|>. È anche consigliabile includere una convalida aggiuntiva per assicurarsi che le richieste inviate al modello siano ben formate e seguano il formato di Chat Markup Language, come descritto in questo documento.

Inoltre, è possibile fornire istruzioni nel messaggio di sistema per guidare il modello nella risposta a determinati tipi di input dell’utente. Ad esempio, è possibile indicare al modello di rispondere solo ai messaggi relativi a un determinato oggetto. È anche possibile rafforzare questo comportamento con alcuni esempi di scatti.

Gestione delle conversazioni

Il limite di token per gpt-35-turbo è 4096 token. Questo limite include il numero di token sia dal prompt che dal completamento. Il numero di token nella richiesta combinato con il valore del parametro max_tokens deve rimanere al di sotto di 4096 o si riceverà un errore.

È responsabilità dell'utente assicurarsi che la richiesta e il completamento rientrino nel limite di token. Ciò significa che, per conversazioni più lunghe, è necessario tenere traccia del conteggio dei token e inviare al modello solo un prompt che rientri nel limite di token.

L'esempio di codice seguente illustra un semplice esempio di come tenere traccia dei messaggi separati nella conversazione.

import os
import openai
openai.api_type = "azure"
openai.api_base = "https://{your-resource-name}.openai.azure.com/" #This corresponds to your Azure OpenAI resource's endpoint value
openai.api_version = "2024-02-01" 
openai.api_key = os.getenv("OPENAI_API_KEY")

# defining a function to create the prompt from the system message and the conversation messages
def create_prompt(system_message, messages):
    prompt = system_message
    for message in messages:
        prompt += f"\n<|im_start|>{message['sender']}\n{message['text']}\n<|im_end|>"
    prompt += "\n<|im_start|>assistant\n"
    return prompt

# defining the user input and the system message
user_input = "<your user input>" 
system_message = f"<|im_start|>system\n{'<your system message>'}\n<|im_end|>"

# creating a list of messages to track the conversation
messages = [{"sender": "user", "text": user_input}]

response = openai.Completion.create(
    engine="gpt-35-turbo", # The deployment name you chose when you deployed the GPT-35-Turbo model.
    prompt=create_prompt(system_message, messages),
    temperature=0.5,
    max_tokens=250,
    top_p=0.9,
    frequency_penalty=0,
    presence_penalty=0,
    stop=['<|im_end|>']
)

messages.append({"sender": "assistant", "text": response['choices'][0]['text']})
print(response['choices'][0]['text'])

Rimanere al di sotto del limite di token

L'approccio più semplice per rimanere al di sotto del limite di token consiste nel rimuovere i messaggi meno recenti nella conversazione quando si raggiunge il limite di token.

È possibile scegliere di includere sempre il maggior numero possibile di token pur rimanendo al di sotto del limite, oppure è sempre possibile includere un numero impostato di messaggi precedenti presupponendo che tali messaggi rimangano entro il limite. È importante tenere presente che le richieste più lunghe richiedono più tempo per generare una risposta e comportano un costo più elevato rispetto alle richieste più brevi.

È possibile stimare il numero di token in una stringa usando la libreria Python tiktoken, come illustrato di seguito.

import tiktoken 

cl100k_base = tiktoken.get_encoding("cl100k_base") 

enc = tiktoken.Encoding( 
    name="gpt-35-turbo",  
    pat_str=cl100k_base._pat_str, 
    mergeable_ranks=cl100k_base._mergeable_ranks, 
    special_tokens={ 
        **cl100k_base._special_tokens, 
        "<|im_start|>": 100264, 
        "<|im_end|>": 100265
    } 
) 

tokens = enc.encode( 
    "<|im_start|>user\nHello<|im_end|><|im_start|>assistant",  
    allowed_special={"<|im_start|>", "<|im_end|>"} 
) 

assert len(tokens) == 7 
assert tokens == [100264, 882, 198, 9906, 100265, 100264, 78191]

Passaggi successivi