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"""
에이전트 및 추론 제어 토큰
에이전트 워크플로를 지원하기 위해 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|>
사고 모드는 대화 수준에서 사용 설정되도록 설계되었습니다. 도구 정의와 같은 다른 시스템 요청 사항과 함께 단일 시스템 턴으로 통합해야 합니다.
추론 및 함수 호출 예시
에이전트 턴에서 모델은 함수를 호출하기로 결정하기 전에 비공개로 '사고'할 수 있습니다. 수명 주기는 다음 시퀀스를 따릅니다.
- 사용자 문의: 사용자가 질문합니다.
- 내부 추론: 모델이 사고 채널에서 비공개로 사고합니다.
- 도구 요청: 모델이 생성을 중지하고 도구 호출을 요청합니다.
- 실행 및 삽입: 애플리케이션이 도구를 실행하고 응답을 추가합니다.
- 최종 응답: 모델이 응답을 읽고 최종 답변을 생성합니다.
다음 예에서는 날씨 도구를 사용하는 모델을 보여줍니다.
<|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_calls 및 tool_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|>토큰은 일반적으로 Chain-of-Thought (CoT) 처리에 사용됩니다. 표준 사용자 대상 애플리케이션에서 이 콘텐츠는 일반적으로 최종 사용자에게 표시되지 않습니다. - 도구 루프:
tool_call및tool_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)을 사용하여 모델을 사고 감소 모드로 안내할 수 있습니다. 모델에 효율적으로 또는 더 낮은 깊이로 사고하도록 명시적으로 지시하면('낮음' 사고 요청 사항이라고 함) 적응형 사고 효율성을 달성할 수 있습니다.
- 비용 절감: 테스트 결과 '낮음' 사고 시스템 요청 사항을 적용하면 생성되는 사고 토큰 수를 약 20% 줄일 수 있는 것으로 나타났습니다.
- 개념 증명: 이 동작은 특별히 학습된 것이 아니라 모델의 지시 가능성의 부산물이므로 단일 '완벽한' 프롬프트는 없습니다. '낮음' 요청 사항은 개념 증명입니다.
- 맞춤설정: 개발자는 자체 맞춤 시스템 요청 사항을 자유롭게 사용해 보는 것이 좋습니다. 모델의 사고 프로세스의 깊이, 길이, 스타일을 미세 조정하여 특정 사용 사례에 맞게 지연 시간, 비용, 출력 품질을 완벽하게 균형을 맞출 수 있습니다.