Instrucciones del sistema y formato de Gemma

Cómo formatear instrucciones para ajustar instrucciones

Los modelos ajustados por 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 momento del entrenamiento como de la inferencia. El formateador tiene dos propósitos:

  1. Indicar funciones en una conversación, como las funciones de sistema, usuario o asistente
  2. Delinear turnos en una conversación, especialmente en una conversación de varios turnos.

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

  • Token para indicar el turno de un usuario: user
  • Token para indicar un giro del modelo: model
  • Token para indicar 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 deseas indicarle al modelo una pregunta como "¿Cuál es la regla de Cramer?", debes alimentar el 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 deseas ajustar los modelos base 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 inferencia y entrenamiento.

Instrucciones del sistema

Para el ajuste supervisado (SFT) y el aprendizaje por refuerzo a partir de 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 se ajustan especialmente para tareas de relleno de código.

Específicamente, se entrenan con cuatro tokens de control de formato que puedes usar con el objetivo de ayudar a crear instrucciones de modelo para tareas de codificación de llenado en el medio (FIM).

Contexto Token
Prefijo FIM `<
Sufijo FIM `<
FIM intermedia `<
Separador de archivos `<

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

Ejemplo: Crea una instrucción de FIM

En esta sección, se vuelve a usar el ejemplo de la guía de inicio rápido de Keras CodeGemma con el objetivo de mostrarte 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 | 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 retornos de carro al final.

El prefijo es entonces

import

con un espacio al final.

El sufijo es:

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

con una línea nueva 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 el sufijo.
  • El token intermedio de FIM debe estar al final para preparar el modelo para que continúe
  • El prefijo o sufijo podría estar vacío según la ubicación actual del cursor en el archivo o la cantidad de contexto que desees proporcionar al modelo.

Comprende 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 del código.

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