Instrucciones del sistema y formato de Gemma

Formato para ajustar las instrucciones

Los modelos ajustados para instrucciones (TI) se entrenan con un formateador específico que Anota todos los ejemplos de ajuste de instrucciones con información adicional, tanto en el tiempo de inferencia y entrenamiento. El formateador tiene dos propósitos:

  1. Indicar roles en una conversación, como el sistema, el usuario o assistant.
  2. Delimitar turnos en una conversación, especialmente en un turnos de varios turnos conversación.

A continuación, especificamos los tokens de control que usa Gemma y sus casos de uso. Nota en las que los tokens de control están reservados y son específicos de nuestro tokenizador.

  • Token que indica el turno de un usuario: user
  • Token para indicar un turno de modelo: model
  • Token que indica el comienzo del turno de diálogo: <start_of_turn>
  • Token para indicar el final del turno del diálogo: <end_of_turn>

Este es un diálogo de ejemplo:

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

El token "<end_of_turn>\n" es el separador de turno, y el prefijo del mensaje es "<start_of_turn>model\n" Esto significa que si quieres indicarle al modelo con una pregunta como, "¿Qué es la regla de Cramer?", modelo de la siguiente manera:

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

Ten en cuenta que si quieres ajustar los modelos base de Gemma previamente entrenados con tu propio datos, puedes usar cualquier esquema para los tokens de control, siempre que sea coherente entre tus casos de uso de entrenamiento y de inferencia.

Instrucciones del sistema

Para el ajuste supervisado (SFT) y el aprendizaje por refuerzo generado por comentarios (RLHF), los modelos no se entrenaron con instrucciones del sistema. Como como resultado, los únicos tokens de formato relevantes para Gemma son <start_of_turn>, <end_of_turn>, user y model. Por ejemplo:

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

Formato para tareas de FIM

Las variantes 2B y 7B de CodeGemma están especialmente ajustados para tareas de relleno de código.

Específicamente, están entrenados con cuatro tokens de control de formato que puedes usar para ayudar a crear instrucciones de modelo para tareas de programación de relleno por el medio (FIM).

ContextoToken
Prefijo de FIM <|fim_prefix|>
Sufijo de FIM <|fim_suffix|>
FIM intermedia <|fim_middle|>
Separador de archivo <|file_separator|>

Usa los tokens de FIM para definir la ubicación del cursor y el contexto circundante para que CodeGemma complete el código. Usa el token del separador de archivos para contextos de varios archivos.

Ejemplo: crea un mensaje de FIM

En esta sección, se vuelve a usar el ejemplo del archivo Keras CodeGemma guía de inicio rápido para mostrar cómo crear una instrucción para las tareas de FIM.

Considera el siguiente código:

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

El elemento | indica la ubicación del cursor, que es donde debe estar el código. el proyecto se completó. Ten en cuenta que hay un espacio antes del cursor y que las líneas 1 y 2 hay retornos de carro al final.

Entonces, el prefijo es:

import

con un espacio al final.

El sufijo es el siguiente:

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

con una nueva línea al comienzo.

La instrucción debe construirse de la siguiente manera:

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

Ten en cuenta lo siguiente:

  • No debe haber espacios en blanco adicionales entre los tokens de FIM y el prefijo y sufijo
  • El token del medio de FIM debe estar al final para preparar el modelo y continuar rellenando
  • El prefijo o sufijo puede estar vacío según la ubicación del cursor hay en el archivo o cuánto contexto quieres darle al modelo con

Comprende el resultado del modelo

La respuesta del modelo para el ejemplo anterior sería la siguiente:

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

El modelo repite la instrucción de entrada y proporciona sys como la finalización del código.

Cuando uses los modelos de CodeGemma para tareas de FIM, transmite tokens de respuesta y usa los tokens del separador de archivos FIM o como delimitadores para detener la transmisión y obtener la el resultado del código.