Compartilhar via


ChatML (Linguagem de Marcação de Chat) (Versão Prévia)

Importante

Usar os modelos GPT-3.5-Turbo com o ponto de extremidade de conclusão, conforme descrito neste artigo, permanece em versão prévia e só é possível com a gpt-35-turbo versão (0301), que está programada para ser desativada já em 01º de agosto de 2024.. É altamente recomendável usar a API de Conclusão de Chat de GA /ponto de extremidade. A API de Conclusão de Chat é o método recomendado para interação com os modelos GPT-3.5-Turbo. A API de Conclusão de Chat também é a única forma de acessar os modelos GPT-4.

O trecho de código a seguir mostra a maneira mais básica de usar os modelos GPT-3.5-Turbo com ChatML. Se essa for a primeira vez que você usa esses modelos programaticamente, recomendamos começar com o nosso Início rápido do GPT-35-Turbo e GPT-4.

Observação

Na documentação do Azure OpenAI, nos referimos ao GPT-3.5-Turbo e ao GPT-35-Turbo de forma intercambiável. O nome oficial do modelo no OpenAI é gpt-3.5-turbo, mas para o Azure OpenAI, devido a restrições de caracteres específicas do Azure, o nome do modelo subjacente é 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'])

Observação

Os seguintes parâmetros não estão disponíveis no modelo gpt-35-turbo: logprobs, best_of e echo. Se você definir qualquer um desses parâmetros, você receberá um erro.

O token <|im_end|> indica o final de uma mensagem. Ao usar o ChatML, é recomendável incluir o token <|im_end|> como uma sequência de parada para garantir que o modelo pare de gerar texto quando chegar ao final da mensagem.

Considere definir max_tokens para um valor ligeiramente superior ao normal, tal como 300 ou 500. Isso garante que o modelo não pare de gerar o texto antes de chegar ao fim da mensagem.

Controle de versão de modelo

Observação

gpt-35-turbo é equivalente ao modelo gpt-3.5-turbo da OpenAI.

Ao contrário dos modelos GPT-3 e GPT-3.5 anteriores, o modelo gpt-35-turbo, bem como os modelos gpt-4 e gpt-4-32k, continuarão a ser atualizados. Ao criar uma implantação desses modelos, você também precisará especificar uma versão do modelo.

Você pode encontrar as datas de desativação desses modelos na nossa página de modelos.

Trabalhando com a Linguagem de Marcação de Chat (ChatML)

Observação

A OpenAI continua aprimorando o GPT-35-Turbo e a Linguagem de Marcação de Chat usada com os modelos continuará a evoluir no futuro. Manteremos este documento atualizado com as informações mais recentes.

A OpenAI treinou o GPT-35-Turbo em tokens especiais que delineiam as diferentes partes da solicitação. O prompt começa com uma mensagem do sistema que é usada para preparar o modelo, seguida por uma série de mensagens entre o usuário e o assistente.

O formato de um prompt básico do ChatML é o seguinte:

<|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 

Mensagem do sistema

A mensagem do sistema é incluída no início do prompt entre os tokens <|im_start|>system e <|im_end|>. Esta mensagem fornece as instruções iniciais para o modelo. Você pode fornecer várias informações na mensagem do sistema, inclusive:

  • Uma breve descrição do assistente
  • Traços de personalidade do assistente
  • Instruções ou regras que você gostaria que o assistente seguisse
  • Dados ou informações necessárias para o modelo, tais como dúvidas relevantes provenientes de Perguntas Frequentes

Você pode personalizar a mensagem do sistema para seu caso de uso ou só incluir uma mensagem básica do sistema. A mensagem do sistema é opcional, mas é recomendável incluir pelo menos uma mensagem básica para obter os melhores resultados.

Mensagens

Depois da mensagem do sistema, você pode incluir uma série de mensagens entre o usuário e o assistente. Cada mensagem deve começar com o token <|im_start|> seguido pela função (user ou assistant) e terminar com o token <|im_end|>.

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

Para acionar uma resposta do modelo, o prompt deve terminar com o token <|im_start|>assistant indicando que é a vez do assistente responder. Você também pode incluir mensagens entre o usuário e o assistente no prompt como uma maneira de fazer alguns aprendizados one-shot.

Exemplos de prompts

A seção a seguir mostra exemplos de diferentes estilos de prompts que você pode usar com os modelos GPT-35-Turbo e GPT-4. Esses exemplos são apenas um ponto de partida, e você pode experimentar diferentes prompts para personalizar o comportamento para seus próprios casos de uso.

Exemplo básico

Se você deseja que os modelos GPT-35-Turbo e GPT-4 se comportem de forma semelhante ao chat.openai.com, você pode usar uma mensagem básica do sistema como "O Assistente é um grande modelo de linguagem treinado pela 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

Exemplo com instruções

Para alguns cenários, você pode desejar dar instruções adicionais ao modelo para definir proteções para o que o modelo pode fazer.

<|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

Usando dados para aterramento

Você também pode incluir dados ou informações relevantes na mensagem do sistema para dar ao modelo um contexto adicional para a conversa. Se você só precisa incluir uma pequena quantidade de informações, poderá codificá-las na mensagem do sistema. Se você tiver uma grande quantidade de dados dos quais o modelo deve estar ciente, poderá usar inserções ou um produto como a Pesquisa de IA do Azure para recuperar as informações mais relevantes no momento da consulta.

<|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

Alguns aprendizados one-shot com o ChatML

Você também pode dar alguns exemplos de one-shot para o modelo. A abordagem para alguns aprendizados one-shot mudou ligeiramente por causa do novo formato de prompt. Agora você pode incluir uma série de mensagens entre o usuário e o assistente no prompt como alguns exemplos de one-shot. Esses exemplos podem ser utilizados para propagar respostas para as perguntas mais frequentes para preparar o modelo ou ensinar comportamentos específicos ao modelo.

Este é apenas um exemplo de como você pode usar alguns aprendizados one-shot com o GPT-35-Turbo. Você pode experimentar diferentes abordagens para ver o que funciona melhor no seu caso de 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|>

Usando a linguagem de marcação de chat para cenários que não sejam de chat

O ChatML foi projetado para facilitar o gerenciamento de conversa com várias rodadas, mas também funciona bem em cenários que não sejam de chat.

Por exemplo, para um cenário de extração de entidades, você pode usar o seguinte prompt:

<|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

Evitando entradas de usuário inseguras

É importante adicionar mitigações ao seu aplicativo para garantir o uso seguro da Linguagem de Marcação de Chat.

Recomendamos que você impeça que os usuários finais incluam tokens especiais em suas entradas, como <|im_start|> e <|im_end|>. Também recomendamos que você inclua validação adicional para garantir que os prompts que você está enviando para o modelo estejam bem formados e sigam o formato da Linguagem de Marcação de Chat, conforme descrito neste documento.

Você também pode fornecer instruções na mensagem do sistema para orientar o modelo sobre como responder a determinados tipos de entradas do usuário. Por exemplo, você pode instruir o modelo a responder apenas mensagens sobre um determinado assunto. Você também pode reforçar esse comportamento com alguns aprendizados one-shot.

Gerenciando conversas

O limite de tokens para gpt-35-turbo é 4096 tokens. Esse limite inclui a contagem de tokens tanto do prompt como da conclusão. O número de tokens no prompt combinado com o valor do parâmetro max_tokens deve permanecer abaixo de 4096 ou você receberá um erro.

É sua responsabilidade garantir que o prompt e a conclusão estejam dentro do limite do tokens. Isso significa que, para conversas mais longas, você precisa acompanhar a contagem de tokens e enviar ao modelo apenas um prompt que esteja dentro do limite do token.

O exemplo de código a seguir mostra um exemplo simples de como você pode acompanhar separadamente as mensagens na conversa.

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'])

Permanecendo abaixo do limite de tokens

A abordagem mais simples para permanecer abaixo do limite de tokens é remover as mensagens mais antigas da conversa quando você atingir o limite de tokens.

Você pode optar por sempre incluir o maior número possível de tokens enquanto permanece abaixo do limite ou você sempre pode incluir um número definido de mensagens anteriores, supondo que essas mensagens permaneçam dentro do limite. É importante ter em mente que prompts mais longos demoram mais para gerar uma resposta e têm um custo maior do que prompts mais curtos.

Você pode estimar o número de tokens em uma cadeia de caracteres usando a biblioteca Python tiktoken, como mostrado abaixo.

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]

Próximas etapas