Instrucciones del sistema y formato de Gemma

Formato para el ajuste de instrucciones

Los modelos ajustados por instrucciones (IT) se entrenan con un formateador específico que anota todos los ejemplos de ajuste de instrucciones con información adicional, tanto en el momento del entrenamiento como en el de la inferencia. El formato tiene dos propósitos:

  1. Indicar roles en una conversación, como los roles de sistema, usuario o asistente
  2. Delinear los turnos en una conversación, en especial en una conversación de varios turnos

A continuación, especificamos los tokens de control que usa Gemma y sus casos de uso. Ten en cuenta que los tokens de control están reservados en nuestro analizador de tokens y son específicos para él.

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

A continuación, se muestra un ejemplo 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>

El token "<end_of_turn>\n" es el separador de turnos, y el prefijo de la instrucción es "<start_of_turn>model\n". Esto significa que, si quieres pedirle al modelo una pregunta como "¿Qué es la regla de Cramer?", debes ingresarlo 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 deseas ajustar los modelos de Gemma previamente entrenados con tus propios datos, puedes usar cualquier esquema de este tipo para los tokens de control, siempre que sea coherente entre tus casos de uso de entrenamiento y de inferencia.

Instrucciones del sistema

En el caso del ajuste fino supervisado (SFT) y el aprendizaje por refuerzo con retroalimentación humana (RLHF), los modelos no se entrenaron con instrucciones del sistema. 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 ajustadas para las tareas de inserción de código.

Específicamente, se entrenan con cuatro tokens de control de formato que puedes usar para ayudar a crear instrucciones de modelos para tareas de programación de completar el medio (FIM).

ContextoToken
Prefijo de FIM <|fim_prefix|>
Sufijo de FIM <|fim_suffix|>
Parte central de FIM <|fim_middle|>
Separador de archivos <|file_separator|>

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

Ejemplo: Cómo construir una instrucción de FIM

En esta sección, se reutiliza el ejemplo del instructivo de CodeGemma de Keras para mostrarte cómo crear una instrucción para tareas de FIM.

Considera el siguiente código:

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

El | indica la ubicación del cursor, que es donde se debe completar el código. Ten en cuenta que hay un espacio antes del cursor y que las líneas 1 y 2 tienen saltos de línea al final.

El prefijo es, entonces,

import

con un espacio al final.

El sufijo es el siguiente:


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

con una línea nueva al principio.

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 el sufijo.
  • El token medio de FIM debe estar al final para preparar el modelo para que siga completando
  • El prefijo o el sufijo pueden estar vacíos según dónde se encuentre el cursor en el archivo o la cantidad de contexto que desees proporcionar al modelo.

Información sobre la salida 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 de código.

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