Gemma 형식 및 시스템 안내

명령어 조정 형식 지정

명령어 조정 (IT) 모델은 학습 및 추론 시 모두 모든 명령어 조정 예시를 추가 정보로 주석 처리하는 특정 포맷터로 학습됩니다. 형식 지정기에는 두 가지 목적이 있습니다.

  1. 대화에서 시스템, 사용자, 어시스턴트 역할과 같은 역할을 나타냅니다.
  2. 특히 멀티턴 대화에서 대화의 차례를 구분합니다.

아래에서는 Gemma에서 사용하는 제어 토큰과 사용 사례를 지정합니다. 제어 토큰은 토큰라이저에서 예약되어 있으며 토큰라이저에만 적용됩니다.

  • 사용자 차례를 나타내는 토큰: user
  • 모델 전환을 나타내는 토큰: model
  • 대화 차례의 시작을 나타내는 토큰: <start_of_turn>
  • 대화 턴의 끝을 나타내는 토큰: <end_of_turn>

다음은 대화의 예입니다.

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

토큰 "<end_of_turn>\n"는 턴 구분자이고 프롬프트 접두사는 "<start_of_turn>model\n"입니다. 즉, '크레이머의 법칙이란 무엇인가요?'와 같은 질문으로 모델에 프롬프트를 표시하려면 다음과 같이 모델에 입력해야 합니다.

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

자체 데이터로 사전 학습된 Gemma 모델을 미세 조정하려는 경우 학습 및 추론 사용 사례 간에 일관성이 있는 한 제어 토큰에 이러한 스키마를 사용할 수 있습니다.

시스템 안내

감독 기반 미세 조정 (SFT)과 인간 피드백 기반 강화 학습 (RLHF) 모두에서 모델은 시스템 안내로 학습되지 않았습니다. 따라서 Gemma와 관련된 유일한 형식 지정 토큰은 <start_of_turn>, <end_of_turn>, user, model입니다. 예를 들면 다음과 같습니다.

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

FIM 태스크 형식 지정

CodeGemma 2B 및 7B 변형은 코드 채우기 작업에 맞게 특별히 조정되었습니다.

특히, fill-in-the-middle (FIM) 코딩 태스크의 모델 프롬프트를 구성하는 데 사용할 수 있는 4가지 형식 지정 제어 토큰을 기반으로 학습됩니다.

컨텍스트토큰
FIM 접두사 <|fim_prefix|>
FIM 접미사 <|fim_suffix|>
FIM 중간 <|fim_middle|>
파일 구분자 <|file_separator|>

FIM 토큰을 사용하여 CodeGemma가 코드 채우기를 실행할 수 있도록 커서 위치와 주변 컨텍스트를 정의합니다. 다중 파일 컨텍스트에는 파일 구분자 토큰을 사용합니다.

예시 - FIM 프롬프트 구성

이 섹션에서는 Keras CodeGemma 빠른 시작의 예시를 재사용하여 FIM 작업의 프롬프트를 구성하는 방법을 보여줍니다.

다음 코드를 살펴보세요.

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

|는 코드를 완료해야 하는 커서의 위치를 나타냅니다. 커서 앞에 공백이 있고 1번과 2번 줄 끝에 캐리지 리턴이 있습니다.

그러면 접두사는 다음과 같습니다.

import

끝에 공백 1개가 추가됩니다.

접미사는 다음과 같습니다.


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

시작 부분에 새 줄이 있습니다.

프롬프트는 다음과 같이 구성해야 합니다.

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

참고:

  • FIM 토큰과 접두사 및 접미사 사이에는 공백이 추가되어서는 안 됩니다.
  • FIM 중간 토큰은 모델이 계속 채우도록 준비하기 위해 맨 끝에 있어야 합니다.
  • 접두사 또는 접미사는 파일에서 현재 커서가 있는 위치 또는 모델에 제공할 컨텍스트의 양에 따라 비어 있을 수 있습니다.

모델 출력 이해

위 예시의 모델 응답은 다음과 같습니다.

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

모델은 입력 프롬프트를 반복하고 sys를 코드 완성으로 제공합니다.

FIM 작업에 CodeGemma 모델을 사용하는 경우 응답 토큰을 스트리밍하고 FIM 또는 파일 구분자 토큰을 구분자로 사용하여 스트리밍을 중지하고 결과 코드 완성을 가져옵니다.