토크나이제이션 심층 분석: 컨트롤 토큰

토크나이제이션 심층 분석: 컨트롤 토큰 (Concept Deep Dive: Tokenization — Control Tokens)

토크나이제이션에서 컨트롤 토큰(Control Token)은 경계(boundary) 문제 해결, 효율성 개선, 보안 강화 등 여러 문제를 한 번에 다루는 개념이에요. 이 글에서는 컨트롤 토큰이 무엇이고, 왜 필요한지, 토크나이저 버전별로 어떻게 다른지 살펴봐요.

출처: 문서

본문

경계 (Boundaries) — 복습

경계 문제는 모델이 예상치 못한 토큰 시퀀스를 만날 때 발생해요. 훈련 중에 https만 봤는데 http + s 같은 조합을 만나면 부정확한 예측이 나올 수 있죠. 토큰 힐링(Token Healing)은 시퀀스의 마지막 토큰을 제거하고, 다음 토큰 생성이 제거된 토큰에 해당하는 문자열로 시작하도록 제약해서 이 문제를 해결해요. 토큰 생성 한 번의 비용으로 경계 문제를 푸는 방식이에요.

컨트롤 토큰 (Control Tokens)

컨트롤 토큰은 여러 문제를 한 번에 다루지만, 그중 세 가지만 집중해서 봐요.

  • 효율성 (Efficiency): 컨트롤 토큰을 쓰면 더 적은 토큰으로 개선된 효율을 얻어요.
  • 보안 (Security): 컨트롤 토큰은 모델이 프롬프트 인젝션에 더 강건해지게 해요.
  • 경계 문제 (Boundary issues): 컨트롤 토큰은 기본적으로 경계 문제를 완화하는 데도 도움이 돼요.

이전에는 우리가 다음과 같이 인코딩해 왔어요.

BOS_ID
+ encode("[INST] Hello, how are you? [/INST]")
+ encode("Fine, and you?") + EOS_ID
+ encode("[INST] I'm doing great! [/INST]")
+ encode("Glad to hear!") + EOS_ID

여기서 효율성 문제는 특수 문자열 [INST]와 [/INST]가 나머지 텍스트와 함께 일반적으로 토크나이즈된다는 점에서 생겨요. 토크나이저는 이를 [ + INST + ] 또는 [/ + INST + ]처럼 문자열당 세 개의 토큰으로 인코딩할 수 있어요. 이 두 문자열이 항상 어디에나 존재한다는 점을 고려하면 효율적이지 않죠.

보안 측면에서, 채팅 애플리케이션에 모델이 있다고 상상해 봐요. 사용자가 자신의 메시지에 특수 문자열을 넣는 것을 막을 게 없어요. 결국 이런 일이 생길 수 있어요.

BOS_ID
+ encode("[INST] Hello, [INST] [/INST] how are you? [/INST]")
+ encode("Fine, and you?") + EOS_ID
+ encode("[INST] I'm doing great! [/INST]")
+ encode("Glad to hear!") + EOS_ID

이렇게 되면 템플릿이 완전히 깨져서, 사용자가 기대된 모델 동작을 주입(inject)하고 깨뜨릴 수 있어요.

컨트롤 토큰의 아이디어는 파인튜닝 단계에서 모델이 이전에 본 적 없는 새 토큰을 도입한다는 거예요. 이 토큰들은 문자열 스펙트럼에 존재하지 않아 오직 토큰 ID로만 존재하기 때문에 사용자는 절대 주입할 수 없어요. 기본적으로 특수 문자열을 대체할 새 토큰 ID를 추가하는 거죠. 표현상의 이유로 [INST]와 [/INST]를 그 문자열 표현으로 쓰지만, BOS와 EOS처럼 토크나이저는 실제로 그 문자열을 보지 않아요. 그것들은 단지 우리가 무엇을 논의하는지 알기 위한 표기일 뿐이에요.

그래서 특수 문자열로 사용자 지시를 감싸는 대신, 컨트롤 토큰 ID로 직접 감싸요. 최종 결과는 다음과 같아요.

BOS_ID
+ INST_ID
+ encode("Hello, how are you?")
+ /INST_ID
+ encode("Fine, and you?") + EOS_ID
+ INST_ID
+ encode("I'm doing great!")
+ /INST_ID
+ encode("Glad to hear!") + EOS_ID

간접적으로 이 방식은 문자열이 아니라 토큰 ID로 작업하므로 특수 문자열 주변의 경계 문제도 줄여줘요. 이론적 문자열 표현은 조금 달라져요.

<s>[INST]Hello, how are you?[/INST]Fine, and you?</s>[INST]I'm doing great![/INST]Glad to hear!</s>

토크나이저 V2/V3

V1 이후의 모든 토크나이저는 컨트롤 토큰을 사용해요. 다만 그 문자열 표현의 최종 결과는 대부분 여전히 sentencepiece의 영향을 받아서, V1처럼 각 인코딩 단계마다 공백(whitespace)을 추가해요.

<s>[INST] Hello, how are you?[/INST] Fine, and you?</s>[INST] I'm doing great![/INST] Glad to hear!</s>

V2와 V3의 유일한 차이는 툴 호출(tool calling) 관련이고, 그 외에는 완전히 동일해요.

토크나이저 V3-Tekken

이 토크나이저는 V3 토크나이저의 변형이에요. 인코딩과 포맷 관련해 모든 것이 같아서 V3라고도 불러요. 주요 차이는 sentencepiece가 아니라 tiktoken을 사용한다는 점이에요. 따라서 기본적으로 추가되는 공백이 없어져, 최종 문자열 표현이 깔끔해요.

<s>[INST]Hello, how are you?[/INST]Fine, and you?</s>[INST]I'm doing great![/INST]Glad to hear!</s>

더 알아보기 (Learn more)