Partilhar via


Chat Markup Language ChatML (Pré-visualização)

Importante

O uso de modelos GPT-3.5-Turbo com o ponto final de conclusão conforme descrito neste artigo permanece em pré-visualização e só é possível com gpt-35-turbo a versão (0301), que está programada para aposentadoria já em 1º de agosto de 2024. É altamente recomendável usar a API/endpoint de conclusão de bate-papo do GA. A API de conclusão de bate-papo é o método recomendado para interagir com os modelos GPT-3.5-Turbo. A API de Conclusão de Chat também é a única maneira 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 o ChatML. Se esta é a primeira vez que utiliza estes modelos programaticamente, recomendamos que comece com o nosso Guia de início rápido GPT-35-Turbo & GPT-4.

Nota

Na documentação do Azure OpenAI, referimo-nos 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íficos 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'])

Nota

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

O <|im_end|> token indica o fim de uma mensagem. Ao usar o ChatML, é recomendável incluir <|im_end|> o token 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 um pouco mais alto do que o normal, como 300 ou 500. Isso garante que o modelo não pare de gerar texto antes de chegar ao final da mensagem.

Controlo de versões de modelos

Nota

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

Ao contrário dos modelos GPT-3 e GPT-3.5 anteriores, o gpt-35-turbo modelo, bem como os gpt-4 modelos 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 aposentadoria do modelo para esses modelos em nossa página de modelos .

Trabalhando com Chat Markup Language (ChatML)

Nota

A OpenAI continua a melhorar o GPT-35-Turbo e a Chat Markup Language 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 do prompt. 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 ChatML básico é 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 <|im_start|>system tokens e <|im_end|> . Esta mensagem fornece as instruções iniciais para o modelo. Você pode fornecer várias informações na mensagem do sistema, incluindo:

  • 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ários para o modelo, como perguntas relevantes de uma FAQ

Você pode personalizar a mensagem do sistema para o seu caso de uso ou apenas incluir uma mensagem básica do sistema. A mensagem do sistema é opcional, mas recomenda-se incluir pelo menos uma básica para obter os melhores resultados.

Mensagens

Após a 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 <|im_start|> token seguido pela função (user ou assistant) e terminar com o <|im_end|> token.

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

Para acionar uma resposta do modelo, o prompt deve terminar com <|im_start|>assistant token 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 poucos aprendizados.

Exemplos de pedidos

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ê quiser que os modelos GPT-35-Turbo e GPT-4 se comportem de forma semelhante à chat.openai.com, você pode usar uma mensagem básica do sistema como "Assistente é um modelo de linguagem grande 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, talvez você queira dar instruções adicionais ao modelo para definir guarda-corpos para o que o modelo é capaz de 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 contexto extra para a conversa. Se você só precisa incluir uma pequena quantidade de informações, você pode codificá-lo na mensagem do sistema. Se você tiver uma grande quantidade de dados que o modelo deve estar ciente, poderá usar incorporações ou um produto como o Azure AI Search 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

Poucas fotos aprendendo com o ChatML

Você também pode dar alguns exemplos de fotos para o modelo. A abordagem para poucos tiros de aprendizagem 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 captura. Esses exemplos podem ser usados para semear respostas a perguntas comuns para preparar o modelo ou ensinar comportamentos específicos ao modelo.

Este é apenas um exemplo de como você pode usar o aprendizado de tiro com GPT-35-Turbo. Você pode experimentar diferentes abordagens para ver o que funciona melhor para 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 bate-papo para cenários que não são de bate-papo

O ChatML foi projetado para facilitar o gerenciamento de conversas em vários turnos, mas também funciona bem para cenários sem bate-papo.

Por exemplo, para um cenário de extração de entidade, 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

Prevenção de entradas de utilizador inseguras

É importante adicionar atenuaçõ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 possam incluir 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 siga o formato Chat Markup Language conforme descrito neste documento.

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

Gerenciando conversas

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

É sua responsabilidade garantir que o prompt e a conclusão estejam dentro do limite do token. 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 de tokens.

O exemplo de código a seguir mostra um exemplo simples de como você pode acompanhar as mensagens separadas 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'])

Permanecer abaixo do limite de token

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

Você pode optar por sempre incluir o maior número possível de tokens enquanto permanece abaixo do limite ou 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 levam mais tempo para gerar uma resposta e incorrem em um custo mais alto do que prompts mais curtos.

Você pode estimar o número de tokens em uma cadeia de caracteres usando a biblioteca Python tiktoken, conforme 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óximos passos