Formatação Gemma e instruções do sistema

Formatação para ajuste das instruções

Modelos ajustados por instruções (TI) são treinados com um formatador específico que anota todos os exemplos de ajuste de instruções com informações extras, tanto no momento do treinamento quanto na inferência. O formatador tem duas finalidades:

  1. indicar papéis em uma conversa, como as funções de sistema, usuário ou assistente;
  2. Delinear turnos em uma conversa, especialmente em uma conversa de várias interações.

Abaixo, especificamos os tokens de controle usados pela Gemma e os casos de uso deles. Os tokens de controle são reservados e específicos do nosso tokenizador.

  • Token para indicar a rodada de um usuário: user
  • Token para indicar a rotatividade de um modelo: model
  • Token para indicar o início da rodada do diálogo: <start_of_turn>
  • Token para indicar o fim da rodada do diálogo: <end_of_turn>

Confira um exemplo de diálogo:

<start_of_turn>user
knock knock<end_of_turn>
<start_of_turn>model
who is there<end_of_turn>
<start_of_turn>user
Gemma<end_of_turn>
<start_of_turn>model
Gemma who?<end_of_turn>

O token "<end_of_turn>\n" é o separador de curva, e o prefixo de solicitação é "<start_of_turn>model\n". Isso significa que, se você quiser perguntar ao modelo o modelo "O que é a Regra de Cramer?", alimente o modelo da seguinte maneira:

"<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model"

Se você quiser ajustar os modelos Gemma pré-treinados base com seus próprios dados, poderá usar qualquer esquema para tokens de controle, desde que ele seja consistente entre seus casos de uso de treinamento e inferência.

Instruções do sistema

Tanto para o ajuste fino supervisionado (SFT) quanto para o aprendizado por reforço com feedback humano (RLHF), os modelos não foram treinados com instruções do sistema. Como resultado, os únicos tokens de formatação relevantes para o Gemma são <start_of_turn>, <end_of_turn>, user e model. Exemplo:

<start_of_turn>user
What is Cramer's Rule?<end_of_turn>
<start_of_turn>model
Cramer's Rule is ...<end_of_turn>

Formatação para tarefas do FIM

As variantes 2B e 7B do CodeGemma são especialmente ajustadas para tarefas de preenchimento de código.

Especificamente, eles são treinados com quatro tokens de controle de formatação que podem ser usados para ajudar a criar prompts de modelo para tarefas de codificação de preenchimento no meio (FIM, na sigla em inglês).

Contexto Token
Prefixo do FIM `<
Sufixo FIM `<
FIM do meio `<
Separador de arquivos `<

Use os tokens do FIM para definir a localização do cursor e o contexto ao redor dele para que o CodeGemma realize o preenchimento de código. Use o token do separador de arquivos para contextos de vários arquivos.

Exemplo: criar um comando FIM

Esta seção reutiliza o exemplo do guia de início rápido do Keras CodeGemma para mostrar como criar um prompt para tarefas do FIM.

Pense no seguinte código:

import |⏎ # Line 1
if __name__ == '__main__':⏎ # Line 2
   sys.exit(0) # Line 3

O | indica a localização do cursor em que o código precisa ser concluído. Observe que há um espaço antes do cursor e que as linhas 1 e 2 têm retornos de carro no final.

O prefixo é, então,

import

com um espaço no final.

O sufixo é:

⏎
if __name__ == '__main__':⏎
   sys.exit(0)

com uma nova linha no início.

O comando deve ser criado da seguinte forma:

<|fim_prefix|>import <|fim_suffix|>⏎
if __name == '__main__':⏎
   sys.exit(0)<|fim_middle|>

Observações:

  • Não pode haver espaços em branco extras entre os tokens do FIM e o prefixo e o sufixo.
  • O token do meio do FIM precisa estar no final para preparar o modelo para continuar preenchendo
  • O prefixo ou sufixo pode estar vazio, dependendo de onde o cursor está no arquivo ou de quanto contexto você quer fornecer ao modelo

Noções básicas sobre a saída do modelo

A resposta do modelo para o exemplo acima seria:

<|fim_prefix|>import <|fim_suffix|>⏎
if __name__ == "__main__":\n    sys.exit(0)<|fim_middle|>sys\n<|file_separator|>

O modelo repete a solicitação de entrada e fornece sys como o preenchimento do código.

Ao usar os modelos do CodeGemma para tarefas do FIM, faça streaming de tokens de resposta e use o FIM ou os tokens do separador de arquivos como delimitadores para interromper o streaming e conseguir o preenchimento do código resultante.