OpenAI API를 이용할 때 모델별로 최대 토큰 수가 정해져 있습니다. API를 호출하기 전에 토큰 수를 미리 알 수 있으면 좋겠죠? 파이썬에서 텍스트를 토큰으로 변환해주는 tiktoken 패키지를 이용하면 토큰 수를 알 수 있습니다.
tiktoken 설치
tiktoken은 pip를 이용해 설치할 수 있습니다.
pip install tiktoken
인코딩 방법(토크나이저) 결정
OpenAI에 여러 종류의 토크나이저들이 있기 때문에 토큰화하기 전에 먼저 토크나이저를 지정해줍니다. 지정 방법에는 두 가지가 있는데, 토크나이저 이름을 이용하는 방법과 LLM 이름을 이용하는 방법 중 하나를 선택해 사용합니다.
import tiktoken
# 토크나이저 이름을 이용하는 방법
encoder = tiktoken.get_encoding("cl100k_base")
# LLM 이름을 이용하는 방법
encoder = tiktoken.encoding_for_model("gpt-3.5-turbo")
인코딩
토크나이저를 정한 후에는 다음과 같이 텍스트를 인코딩(토큰화)할 수 있습니다.
text = "I love Python!"
result = encoder.encode(text)
print(result) # 결과: [40, 3021, 13325, 0]
토큰 번호로 결과가 출력되네요. 토큰의 길이를 알고 싶다면 토큰 리스트의 길이를 이용하면 됩니다.
len(result) # 결과: 4
디코딩
다시 텍스트로 변환하려면 decode를 사용합니다.
encoder.decode(result) # 결과: 'I love Python!'
처음 입력했던 텍스트가 반환되는 것을 볼 수 있습니다. 토큰별로 확인하고 싶다면 decode_single_token_bytes를 사용합니다.
[encoder.decode_single_token_bytes(token) for token in result]
# 결과: [b'I', b' love', b' Python', b'!']
위 결과에서 작은 따옴표 앞에 붙은 b는 bytes 자료형을 의미합니다.
한글 인코딩/디코딩
이번에는 한글을 토큰화해보겠습니다.
text2 = "나는 파이썬이 좋아요!"
result2 = encoder.encode(text2)
print(result2)
# 결과: [61415, 16969, 56069, 13094, 168, 235, 105, 13094, 66799, 233, 54059, 36811, 0]
print(len(result2)) # 결과: 13
한글 문장과 영어 문장의 단어수는 같은데 한글의 토큰 수가 훨씬 많은 것을 볼 수 있습니다. 토큰 수가 많아지면 OpenAI API 사용료도 증가하게 됩니다. 디코딩 결과는 다음과 같습니다.
encoder.decode(result2) # '나는 파이썬이 좋아요!'
[encoding.decode_single_token_bytes(token) for token in result2]
# 결과: [b'\xeb\x82\x98', b'\xeb\x8a\x94', b' \xed\x8c\x8c', b'\xec\x9d\xb4', b'\xec', b'\x8d', b'\xac', b'\xec\x9d\xb4', b' \xec\xa2', b'\x8b', b'\xec\x95\x84', b'\xec\x9a\x94', b'!']