Gemma 4 프롬프트 형식 지정

Gemma 4부터 새로운 제어 토큰이 도입됩니다. Gemma 3 이하의 경우 이전 문서를 참고하세요.

다음 섹션에서는 Gemma 4에서 사용되는 제어 토큰과 사용 사례를 지정합니다. 제어 토큰은 토큰화 도구에서 예약되어 있으며 토큰화 도구에만 적용됩니다.

  • 시스템 요청 사항을 나타내는 토큰: system
  • 사용자 턴을 나타내는 토큰: user
  • 모델 턴을 나타내는 토큰: model
  • 대화 턴의 시작을 나타내는 토큰: <|turn>
  • 대화 턴의 끝을 나타내는 토큰: <turn|>

다음은 대화의 예입니다.

<|turn>system
You are a helpful assistant.<turn|>
<|turn>user
Hello.<turn|>

멀티모달리티

멀티모달 토큰 목적
<|image>
<image|>
이미지 임베딩 표시
<|audio>
<audio|>
오디오 임베딩 표시
<|image|>
<|audio|>
특수 자리표시자 토큰

이미지 및 오디오 토큰을 삽입할 위치를 지정하기 위해 두 개의 특수 자리표시자 토큰 (<|image|><|audio|>)이 사용됩니다. 토큰화 후 이러한 토큰은 모델 내부의 실제 소프트 임베딩으로 대체됩니다.

다음은 대화의 예입니다.

prompt = """<|turn>user
Describe this image: <|image|>

And translate these audio:

a. <|audio|>
b. <|audio|><turn|>
<|turn>model"""

오디오

오디오 처리에는 다음 프롬프트 구조를 사용하세요.

  • 오디오 음성 인식 (ASR)
Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text.

Follow these specific instructions for formatting the answer:
*   Only output the transcription, with no newlines.
*   When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three.
  • 자동 음성 번역 (AST)
Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}.
When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}.

에이전트형 및 추론 제어 토큰

에이전트 워크플로를 지원하기 위해 Gemma는 내부 추론 (생각)과 외부 작업 (함수 호출)을 구분하는 특수 제어 토큰을 사용합니다. 이러한 토큰을 통해 모델은 최종 응답을 제공하거나 외부 도구와 상호작용하기 전에 복잡한 로직을 처리할 수 있습니다.

함수 호출

Gemma 4는 '도구 사용' 수명 주기를 관리하기 위해 6개의 특수 토큰으로 학습됩니다.

토큰 쌍 목적
<|tool>
<tool|>
도구를 정의합니다.
<|tool_call>
<tool_call|>
도구를 사용하려는 모델의 요청을 나타냅니다.
<|tool_response>
<tool_response|>
도구의 실행 결과를 모델에 다시 제공합니다.

문자열 값의 구분자: <|"|>

단일 토큰 <|"|>는 구조화된 데이터 블록 내의 모든 문자열 값의 구분자로 사용됩니다.

  • 목적: 이 토큰은 문자열 내의 특수 문자 (예: {, }, , 또는 따옴표)가 데이터 구조의 기본 구문의 일부가 아닌 리터럴 텍스트로 처리되도록 합니다.
  • 사용: 함수 선언, 호출, 응답의 모든 문자열 리터럴은 이 토큰 (예: key:<|"|>string value<|"|>)을 사용하여 묶어야 합니다.

사고 모드

사고 모드를 활성화하려면 시스템 명령어 내에 <|think|> 제어 토큰을 포함하세요.

제어 토큰 목적
<|think|> 사고 모드를 활성화합니다.
<|channel>
<channel|>
모델의 내부 프로세스를 나타냅니다.

다음은 대화의 예입니다.

<|turn>system
<|think|><turn|>
<|turn>user
What is the water formula?<turn|>
<|turn>model
<|channel>thought
...
<channel|>The most common interpretation of "the water formula" refers...<turn|>

사고 모드는 대화 수준에서 사용 설정하도록 설계되었습니다. 이는 도구 정의와 같은 다른 시스템 지침과 함께 단일 시스템 턴으로 통합해야 합니다.

추론 및 함수 호출 예시

에이전트형 턴에서 모델은 함수 호출을 결정하기 전에 비공개로 '생각'할 수 있습니다. 수명 주기는 다음 순서를 따릅니다.

  1. 사용자 문의: 사용자가 질문을 합니다.
  2. 내부 추론: 모델이 사고 채널에서 비공개로 생각합니다.
  3. 도구 요청: 모델이 생성을 중지하고 도구 호출을 요청합니다.
  4. 실행 및 삽입: 애플리케이션이 도구를 실행하고 응답을 추가합니다.
  5. 최종 응답: 모델이 응답을 읽고 최종 답변을 생성합니다.

다음 예에서는 날씨 도구를 사용하는 모델을 보여줍니다.

<|turn>system
<|think|>You are a helpful assistant.<|tool>declaration:get_current_temperature{...}<tool|><turn|>
<|turn>user
What's the temperature in London?<turn|>
<|turn>model
<|channel>thought
...
<channel|><|tool_call>call:get_current_temperature{location:<|"|>London<|"|>}<tool_call|><|tool_response>

애플리케이션은 모델의 응답을 파싱하여 함수 이름과 인수를 추출하고, 함수를 실행한 다음 assistant 역할 아래의 채팅 기록에 tool_callstool_responses를 추가해야 합니다.

<|turn>model
<|tool_call>call:get_current_weather{location:<|"|>London<|"|>}<tool_call|><|tool_response>response:get_current_weather{temperature:15,weather:<|"|>sunny<|"|>}<tool_response|>

마지막으로 Gemma가 도구 응답을 읽고 사용자에게 대답합니다.

The temperature in London is 15 degrees and it is sunny.<turn|>

이 예시의 전체 JSON 채팅 기록은 다음과 같습니다.

[
  {
    "role": "system",
    "content": "You are a helpful assistant."
  },
  {
    "role": "user",
    "content": "What's the temperature in London?"
  },
  {
    "role": "assistant",
    "tool_calls": [
      {
        "function": {
          "name": "get_current_weather",
          "arguments": {
            "location": "London"
          }
        }
      }
    ],
    "tool_responses": [
      {
        "name": "get_current_weather",
        "response": {
          "temperature": 15,
          "weather": "sunny"
        }
      }
    ],
    "content": "The temperature in London is 15 degrees and it is sunny."
  }
]

턴 간 사고 컨텍스트 관리

모델에서 생성된 생각을 적절하게 관리하는 것은 멀티턴 대화에서 성능을 유지하는 데 매우 중요합니다.

  • 표준 멀티턴 대화: 다음 턴을 위해 대화 기록을 모델에 다시 전달하기 전에 이전 턴에서 모델이 생성한 생각을 삭제해야 합니다. 대화 중에 생각 모드를 사용 중지하려면 이전 생각을 삭제할 때 <|think|> 토큰을 삭제하면 됩니다.
  • 함수 호출 (예외): 단일 모델 턴에 함수 또는 도구 호출이 포함된 경우 함수 호출 사이에 생각을 삭제하면 안 됩니다.

에이전트 워크플로 및 장기 실행 작업

표준 턴 사이에서 원시적인 생각이 삭제되므로 장기 실행 에이전트를 빌드하는 개발자는 모델이 순환적 추론 루프에 진입하지 않도록 추론 컨텍스트를 유지하는 것이 좋습니다.

  • 생각 요약: 추천되는 추론 기법은 모델의 이전 생각을 추출하고 요약하여 표준 텍스트로 컨텍스트 윈도우에 다시 입력하는 것입니다.
  • 형식 제약사항: Gemma 4는 프롬프트에 포함된 원시적인 생각을 사용하여 명시적으로 학습되지 않았기 때문에 (위에서 언급한 특정 도구 호출 시나리오 제외) 이러한 삽입된 생각에 대해 모델이 예상하는 엄격하거나 구체적인 형식이 없습니다. 요약된 추론을 특정 에이전트 아키텍처에 가장 적합한 방식으로 자유롭게 포맷할 수 있습니다.

통합 참고사항

  • 내부 상태: <|channel><channel|> 토큰은 일반적으로 생각의 사슬 (CoT) 처리에 사용됩니다. 표준 사용자 대상 애플리케이션에서 이 콘텐츠는 일반적으로 최종 사용자에게 숨겨져 있습니다.
  • 도구 루프: tool_calltool_response 토큰은 애플리케이션 환경과 모델 간의 '핸드셰이크'를 지원합니다. 애플리케이션이 tool_call를 가로채고 기본 코드를 실행하며 결과를 tool_response 토큰 내에서 모델에 다시 제공합니다.
  • 모델 동작: 더 큰 모델 (예: gemma-4-26B-A4B-it, gemma-4-31B-it)은 생각 모드가 명시적으로 사용 중지된 경우에도 가끔 생각 채널을 생성할 수 있습니다. 이러한 극단적인 사례에서 모델 동작을 안정화하려면 프롬프트에 빈 생각 토큰을 추가하는 것이 좋습니다.

팁: 사고가 필요 없는 데이터 세트로 대규모 모델 미세 조정하기

생각이 포함되지 않은 데이터 세트로 더 큰 Gemma 모델을 세부 조정할 때는 학습 프롬프트에 빈 채널을 추가하면 더 나은 결과를 얻을 수 있습니다.

<|turn>model
<|channel>thought
<channel|>

팁: 시스템 요청 사항을 사용한 적응형 사고 효율성

Gemma 4의 '사고'는 공식적으로 ON 또는 OFF 불리언 기능으로 지원되지만, 모델에는 사고 행동을 동적으로 조절할 수 있는 매우 강력한 명령 준수 기능이 있습니다.

'높음' 또는 '낮음' 사고 모델을 위해 하드코딩된 프레임워크 매개변수에 의존하는 대신 시스템 요청 사항 (SI)을 사용하여 모델을 사고 감소 모드로 안내할 수 있습니다. 모델에 효율적으로 또는 낮은 심도로 생각하도록 명시적으로 지시하면('LOW' 사고 지시라고 함) 적응형 사고 효율성을 달성할 수 있습니다.

  • 비용 절감: 테스트 결과 '낮음' 사고 시스템 명령어를 적용하면 생성되는 사고 토큰 수가 약 20% 감소하는 것으로 나타났습니다.
  • 개념 증명: 이 동작은 특별히 학습된 것이 아니라 모델의 명령 가능성의 부산물이기 때문에 '완벽한' 프롬프트는 없습니다. 'LOW' 명령어는 개념 증명입니다.
  • 맞춤설정: 개발자는 자체 맞춤 시스템 안내를 자유롭게 사용해 보는 것이 좋습니다. 모델의 사고 과정의 깊이, 길이, 스타일을 미세 조정하여 특정 사용 사례에 맞게 지연 시간, 비용, 출력 품질의 균형을 완벽하게 맞출 수 있습니다.