LLM 토큰 카운터

모델이 실제로 쓰는 인코딩을 기준으로 텍스트의 토큰 수를 브라우저에서 정확히 셉니다. 아무것도 업로드되지 않으며, 여기 있는 숫자는 추정치가 아닙니다.

여기에 붙여 넣은 것은 이 브라우저를 떠나지 않습니다. 고른 인코딩의 어휘는 이 사이트에서 한 번만 내려받고, 세는 일 자체는 이 탭의 별도 스레드에서 돌아갑니다. 직접 네트워크 패널을 열어 보세요. 내 텍스트를 실어 나르는 요청은 하나도 없습니다.

실제로 겨냥하는 모델을 고르세요. 모델은 인코딩을 쓰고, 여러 모델이 하나를 함께 씁니다. 세어 낸 값은 이름이 아니라 인코딩에 속합니다.

인코딩o200k_base
내 텍스트

위에 무언가를 붙여 넣거나 입력하면 정확한 토큰 수가 여기에 나옵니다.

토큰이란 실제로 무엇인가

언어 모델은 여러분의 텍스트를 글자로도 단어로도 읽지 않습니다. 무엇보다 먼저 텍스트는 토큰으로 잘리고, 토큰은 모델이 숫자 하나를 가지고 있는 바이트의 나열입니다. 정말로 단어 전체인 토큰도 있습니다. 많은 토큰은 단어에 그 앞의 공백을 더한 것이라, 같은 단어라도 앞에 무엇이 오느냐에 따라 드는 값이 달라집니다. 다른 것들은 접미사, 문장 부호, 들여쓰기, 또는 읽는 사람이 이름 붙일 만한 무언가의 조각조차 아닌 파편입니다. 자르는 일은 큰 텍스트 뭉치에서 어떤 나열이 가장 자주 함께 나타나는지 세어 만들어진 표가 하고, 그 어느 구석도 누군가가 쓰는 방식에 맞추도록 설계되지 않았습니다.

  • 토큰은 바이트의 나열이지 문자의 나열이 아닙니다. 이 구별은 라틴 알파벳 바깥에서 쓰기 시작하는 순간까지만 트집처럼 들리고, 거기서는 그것이 전부입니다.
  • 흔한 영어 단어는 보통 토큰 하나입니다. 드문 단어, 이름, 제품 코드, 오타는 여러 개가 됩니다. 표에 그 전체에 대한 항목이 없어 더 짧은 조각으로 지어 올려야 하기 때문입니다.
  • 공백은 공짜가 아닙니다. 들여쓰기, 빈 줄, 붙여넣은 표 안의 공백은 모두 바이트이고 모두 세어집니다. 깔끔해 보이는 프롬프트가 같은 내용을 납작하게 쓴 것보다 눈에 띄게 비쌀 수 있습니다.
  • 셈은 정확한 바이트에만 달려 있고 다른 무엇에도 달려 있지 않습니다. 화면에서 똑같아 보이지만 보이지 않는 문자 하나가 다른 두 텍스트 — 줄바꿈 없는 공백, 바이트 순서 표시, 다른 종류의 아포스트로피 — 는 서로 다른 텍스트이고 다른 수가 나올 수 있습니다.

모두가 되뇌는 어림짐작 — 문자 수를 4로 나누기 — 이 애초에 규칙이 아닌 까닭이 이것입니다. 그것은 한 언어의 한 종류 텍스트에 대한 하나의 평균일 뿐이고, 쓰는 텍스트가 코드나 표나 식별자 목록이 되는 순간, 또는 영어가 아닌 무엇으로 쓰이는 순간, 돈이 드는 쪽으로 틀립니다. 이 페이지의 수는 그 평균이 아닙니다. 진짜 표가 브라우저 안에서 낸, 진짜 자름입니다.

세는 것은 인코딩이다

표와 병합 규칙을 합쳐 인코딩이라 부르고, 인코딩에는 저마다의 이름이 있습니다. 배워 둘 값어치가 있는 것은 그 이름 쪽입니다. 셈은 모델이 아니라 인코딩에 속하기 때문입니다. 여러 모델이 인코딩 하나를 함께 쓰고, 더 새로운 모델에 자리를 내준 모델은 아주 흔히 앞선 것과 같은 인코딩을 그대로 지닙니다. 이 페이지가 수를 보여 줄 때는, 그것이 어느 인코딩 아래에서 계산되었는지도 고른 모델 바로 옆에 함께 보여 줍니다.

  • 모델은 인코딩을 씁니다. 짝지음이 여럿 대 하나라서, 내 모델이 어느 인코딩을 쓰는지 아는 편이 모델을 아는 것보다 더 많은 것을 알려 줍니다.
  • 인코딩에는 o200k_base처럼 공개된 저마다의 이름이 있고, 그 이름은 어디서 만나든 같은 표를 뜻합니다. 이 페이지에서 어떤 인코딩 아래 잰 셈과 다른 어디서든 같은 인코딩 아래 잰 셈은 서로 맞습니다. 인코딩을 붙인 셈이 애초에 확인할 수 있는 것이 되는 까닭이 이것입니다.
  • 셈은 인코딩을 붙여야만 뜻이 있습니다. 모델 이름만 붙고 인코딩이 없는 수는 확인할 수 없는 수이고, 이 주제를 다루는 대부분의 페이지가 주는 것이 바로 그것입니다.

실질적인 결과는 사람을 놀라게 합니다. 인코딩을 함께 쓰는 두 모델을 오가도 수는 전혀 움직이지 않고, 그것은 도구가 고장 난 것이 아니라 옳은 것입니다. 셈이 바뀌는 것을 보고 싶다면 바꿔야 할 것은 모델 이름이 아니라 인코딩입니다.

영어가 아닌 텍스트가 더 비싼 까닭

영어에서 출발해 쓰인 어떤 페이지도 알려 주지 않는 대목이 여기이고, 이 페이지가 있는 이유가 그것입니다. 쓰이는 인코딩은 바이트 단위입니다. 텍스트의 문자가 아니라 그 UTF-8 바이트를 상대합니다. 라틴 글자는 1바이트입니다. 히브리, 아랍, 그리스, 키릴 글자는 2바이트입니다. 중국어, 일본어, 한국어 문자는 3바이트입니다. 이모지는 4바이트이고, 깃발이나 이어 붙인 가족은 그것이 여럿 잇달아 있는 것입니다. 그래서 어떤 표를 들추기도 전에, 같은 문장이 한 언어에서는 다른 언어에서보다 이미 두세 배의 바이트입니다.

  • 표는 압도적으로 영어인 말뭉치에서 나열을 세어 만들어졌고, 그래서 영어 단어는 항목을 얻고 다른 언어의 단어는 흔히 얻지 못했습니다. 자기네 흔한 단어에 항목이 없는 언어는 조각조각 적히게 됩니다.
  • 이것은 바이트 값을 대신하는 것이 아니라 그 위에 겹칩니다. 저마다 2바이트나 3바이트인 파편 셋으로 지어 올려야 하는 단어는 두 겹으로 비쌉니다.
  • 영어가 아닌 언어들 사이에서 이 효과는 고르지 않습니다. 자기네 잦은 나열이 표에 들어 있는 문자 체계는 겨우 실린 문자 체계보다 훨씬 낫고, 여러분의 언어가 어디쯤인지 아는 길은 여러분의 텍스트를 붙여넣고 보는 것뿐입니다.
  • 영어로 잡은 예산이 옮겨지지 않는 까닭이 이것입니다. 컨텍스트 창이 몇 쪽을 담는다고 들었다면 그 수치는 거의 틀림없이 영어로 잰 것이고, 여러분의 언어는 거기에 미치지 못합니다.

이 가운데 무엇도 다르게 써서 비켜 갈 수 있는 결함이 아니고, 영어로 쓸 이유도 되지 않습니다. 이것은 떠맡기 전에 볼 수 있어야 하는 값이고, 위의 수가 하는 일은 오직 그것입니다.

한 문자가 여러 토큰에 걸쳐 잘릴 수 있다

토큰이 바이트의 나열이고 라틴 알파벳 바깥의 문자는 여러 바이트이므로, 문자 하나가 예사로 반씩 잘립니다. 앞쪽 바이트는 한 토큰에, 뒤쪽 바이트는 다음 토큰에 떨어집니다. 그 두 토큰은 어느 쪽도 그 자체로 텍스트가 아닙니다. 텍스트인 양 찍어 내는 것이, 토큰을 보여 주겠다고 약속하는 다른 페이지에서 보았을 법한 대체 문자의 줄을 만들어 냅니다. 그리고 그것은 그림이 주기로 했던 바로 그 통찰을 부숴 버립니다.

그래서 이 사이트는 대신 세그먼트를 그립니다. 바이트가 모여 온전한 텍스트가 되는, 잇닿은 토큰의 가장 짧은 나열입니다. 보통은 토큰 하나입니다. 문자가 잘린 자리에서는 둘 이상이 되고 — 4바이트짜리 문자가 1바이트씩 잘린 경우에는 넷까지 갑니다 — 세그먼트는 통째로 그려지고 그 안의 토큰 수가 옆에 적힙니다. 그래서 문자를 잘림에 잃는 대신 잘림 자체를 보게 됩니다. 셈은 이 가운데 무엇에도 영향받지 않습니다. 잘림은 바이트가 어떻게 잘렸는지에 관한 사실이고, 합계는 합계입니다.

내 텍스트의 그림 읽기

셈 아래에, 여러분의 텍스트가 경계가 드러난 채 두 번째로 그려집니다. 그 그림의 블록은 저마다 세그먼트 하나이고, 블록은 쓴 순서대로 이어지며, 빠지거나 줄어든 것이 없습니다. 그래서 보고 있는 것은 거기서 뽑아낸 조각의 목록이 아니라 여러분 자신의 텍스트입니다. 그것이 바로 수가 답할 수 없는 물음입니다. 전체가 얼마나 드는지가 아니라, 그 가운데 어느 대목이 비싼가 하는 물음입니다.

  • 수가 얹히지 않은 블록은 토큰 하나이고, 그것이 예사로운 경우입니다. 표시를 남기지 않은 것은 일부러입니다. 블록마다 숫자를 얹으면 쓴 문장 위에 숫자의 벽이 서고, 정작 볼 값어치가 있는 블록이 묻힙니다. 읽어야 할 것은 경계이고, 한 블록을 끝내고 다음을 시작하게 하는 것은 음영입니다.
  • 작은 수를 단 블록은 토큰 하나보다 큰 세그먼트이고, 거기가 문자가 경계 너머로 잘린 자리입니다. 문자는 그대로, 통째로 그려져 있고 그것이 든 토큰 수가 옆에 있습니다. 그래서 잘림은 텍스트의 손상이 아니라 값으로 드러납니다. 이모지나 오래된 문자 체계의 글자는 넷까지 갈 수 있습니다.
  • 공백, 줄바꿈, 들여쓰기도 다른 모든 것과 똑같이 그려집니다. 다른 모든 것과 똑같이 세어지기 때문입니다. 아무것도 없어 보이는 자리에 늘어선 블록은 긴 프롬프트에서 고치기 가장 값싼 대목이고, 볼 수 있게 되기 전까지는 보이지 않습니다.
  • 모델을 바꾸면 인코딩이 바뀔 때마다 그림이 다시 짜이고, 바뀌지 않을 때마다 있던 그대로 남습니다. 그것은 수가 보여 주는 것과 같은 사실을, 차이가 있다는 것만이 아니라 차이가 어디에서 생기는지까지 볼 수 있는 꼴로 보여 주는 것입니다.

아주 긴 텍스트는 어느 지점까지만 그려지고, 그림이 멈추는 자리에서 페이지는 몇 개 가운데 몇 개의 블록을 그렸는지 알려 줍니다. 셈은 그런 식으로 제한되는 법이 없습니다. 붙여넣은 모든 것을 어떤 길이든 다 세고, 그림 쪽의 사정은 거기에 닿지 않습니다. 제한이 있는 까닭은 브라우저가 블록을 하나씩 배치하고, 문서 전체라면 어떤 페이지도 쓸모 있게 보여 줄 수 있는 것보다 많은 블록이 되기 때문입니다. 그래서 그 너머에서 잃는 것은 나머지의 그림이지, 나머지에 대한 답이 결코 아닙니다.

여기서 어떤 모델은 수를 갖지 않는 까닭

모든 모델을 여러분의 브라우저 안에서 셀 수 있는 것은 아니고, 그에 대해 정직한 일은 짐작한 수를 보여 주는 것이 아니라 어느 것이 그렇고 왜 그런지를 말하는 것입니다. 이 페이지에서 모델이 놓일 수 있는 자리는 셋이고, 셋은 뭉뚱그려지지 않고 화면에서 서로 구분됩니다.

  • 인코딩이 공개되어 있고 이 사이트가 그것을 제공하는 경우에는, 진짜 표에 대고 여기서 계산한 정확한 셈을 얻습니다.
  • 인코딩이 공개되어 있고 이 사이트가 그것을 제공하지 않는 경우에는, 그 줄이 인코딩의 이름을 대고 까닭을 말합니다. 대개는 그 파일을 공개한 어느 쪽도 남이 다시 배포해도 된다는 라이선스를 밝히지 않았기 때문입니다. 표는 있습니다. 거절하는 쪽은 저희이고, 줄이 그렇게 말합니다.
  • 인코딩이 한 번도 공개된 적이 없는 경우에는, 제공할 표도 거절할 표도 없으니, 무엇을 내세우든 세상 어느 페이지도 그 모델을 브라우저 안에서 셀 수 없습니다. 줄은 그렇게 말하고, 수도 추정값도 범위도 싣지 않습니다.

이 주제를 다루는 대부분의 페이지가 조용히 속이는 자리가 바로 그 마지막 줄입니다. 붙여넣은 텍스트를 다른 모델의 표에 통과시키고 그 결과를 측정인 양 내놓습니다. 그것은 그저 부정확한 것이 아니라 치우쳐 있고, 하필 예산 잡기가 가장 어려운 텍스트 — 코드, 그리고 영어로 쓰이지 않은 모든 것 — 에서 가장 크게 치우칩니다. 그런 모델의 정확한 셈은 그것을 만든 곳의 토큰 계산 서비스에서 나오고, 거기에는 API 키가 필요합니다. 전적으로 브라우저 안에서 도는 페이지는 지닐 수도 없고 여러분에게 물어서도 안 되는 키입니다. 그 서비스를 찾아가는 것이 정직한 답이고, 이 페이지는 수 대신 그것을 드립니다.

셈을 직접 비용으로 바꾸기

이 페이지는 가격을 적지 않고, 그것은 일부러입니다. 이 주제에서 무엇보다 빨리 낡는 것이 가격이고, 낡은 가격은 페이지를 모자라게 두는 것이 아니라 거짓으로 만듭니다. 낡지 않는 것은 계산법이니 여기 적어 둡니다. 오늘 제공자 자신의 페이지가 무엇이라 하든 거기에 갖다 대면 됩니다.

  • 제공자는 토큰 백만 개당 단가를 밝힙니다. 이 페이지의 셈을 가져다 백만으로 나누고 그 단가를 곱하세요. 그것이 그 텍스트를 한 번 보내는 비용입니다.
  • 입력과 출력은 따로 값이 매겨지고, 보통 출력이 둘 중 비쌉니다. 이 페이지가 세는 것은 여러분이 보내는 것입니다. 아직 있지도 않은 답을 셀 수는 없으니, 여기서 뽑아낸 비용은 어떤 것이든 바닥값이지 총액이 아닙니다.
  • 대화는 자기 이력을 다시 보냅니다. 그 텍스트가 매 차례마다 따라가는 시스템 프롬프트라면, 예상하는 차례 수를 곱하고 다시 사용자 수를 곱한 다음에, 그것을 줄이는 데 한나절을 들일 값어치가 있는지 정하세요.

같은 셈이 사람들이 여기 들고 오는 다른 물음, 곧 텍스트가 들어맞을지로도 이어집니다. 그것도 이 페이지는 알려 주지 않습니다. 컨텍스트 창은 움직이는 수치이고, 들어맞는다는 약속은 모델 자신이 아닌 어떤 도구도 지킬 수 없기 때문입니다. 여기서 얻는 것은, 제공자가 내놓는 수치가 무엇이든 거기에 견줄 그 하나의 수입니다.

붙여넣은 것은 이 브라우저 밖으로 나가지 않는다

세는 일은 이미 불러들인 이 페이지 안에서 일어납니다. 고른 인코딩의 표는 이 사이트에서 한 번만 내려받고 — 그것은 파일을 내려받는 것이지 여러분의 텍스트를 올리는 것이 아닙니다 — 그 뒤의 모든 것은 긴 문서에도 탭이 멈추지 않도록 별도 스레드에서, 여러분 자신의 기계 위에서 돕니다. 브라우저의 네트워크 패널을 열고 입력하면서 지켜보세요. 쓴 것을 실어 나르는 요청은 하나도 나가지 않습니다.

그래서 정말로 세고 싶은 것 — 고객의 프롬프트, 내부 시스템 메시지, 비공개 문서의 한 토막 — 을, 어차피 다른 수가 나왔을 다듬은 판이 아니라 그대로 붙여넣어도 안전합니다. 저장되는 것도 없습니다. 페이지를 다시 불러들이면 칸은 비어 있고, 이력도 없으며 나중에 지울 것도 없습니다.

자주 묻는 질문

토큰은 단어와 같은 것인가요?
아닙니다. 그런 셈 치고 따지는 것이 예산을 그르치는 가장 흔한 길입니다. 잦은 영어 단어는 흔히 토큰 하나이지만 드문 단어나 이름이나 오타는 여러 개이고, 단어는 보통 앞의 공백을 같은 토큰 안에 품으며, 문장 부호와 들여쓰기도 다른 모든 것과 똑같이 세어집니다. 영어 바깥에서는 어긋남이 훨씬 큽니다. 토큰은 바이트의 나열이고, 문자 하나는 어떤 표를 들추기도 전에 흔히 2바이트나 3바이트나 4바이트이기 때문입니다.
문자 수를 그냥 4로 나누면 되나요?
영어 산문을 쓰고 있고 큰 폭으로 틀려도 괜찮다면 그렇습니다. 그 수치는 한 언어의 한 종류 텍스트에 대한 평균입니다. 소스 코드, 표, 식별자 목록, 그리고 다른 문자 체계로 쓰인 모든 것이 그것을 깨뜨리고, 깨뜨리는 쪽은 덜 드는 쪽이 아니라 더 드는 쪽입니다. 이 페이지의 수는 진짜 표가 낸 진짜 자름이니, 잴 수 있을 때 어림잡을 이유가 없습니다.
모델을 바꿔도 셈이 바뀌지 않는 이유는 무엇인가요?
그 두 모델이 같은 인코딩을 쓰고, 세는 것은 인코딩이기 때문입니다. 이것은 탈이 아니라 정상입니다. 더 새로운 모델은 앞선 모델의 표를 아주 흔히 물려받고, 한 곳에서 만든 여러 모델이 하나를 함께 씁니다. 인코딩이 셈 옆에 보이는 까닭이 바로 이것입니다. 바꿨는데 이름이 그대로라면 수도 그대로입니다.
제 언어가 영어보다 훨씬 많은 토큰이 드는 이유는 무엇인가요?
겹치는 두 가지 이유가 있습니다. 인코딩은 UTF-8 바이트를 상대하고, 라틴 글자가 1바이트인 자리에서 그 바깥의 글자는 2바이트나 3바이트나 4바이트입니다. 그리고 표는 압도적으로 영어인 말뭉치에서 나열을 세어 지어졌으므로, 영어 단어에는 저마다의 항목이 있고 다른 언어의 단어는 흔히 파편에서 지어 올려집니다. 3바이트짜리 파편 셋으로 된 단어는 두 겹으로 비쌉니다. 위에 여러분의 텍스트를 붙여넣으면 여러분의 언어가 실제로 어디쯤인지 보입니다.
목록의 모델 가운데 하나에 수가 없는 이유는 무엇인가요?
그 인코딩이 한 번도 공개된 적이 없어서, 이 페이지가 — 또는 브라우저 안에서 도는 다른 어떤 페이지가 — 대고 셀 표가 없기 때문입니다. 그런 모델에 수를 보여 주는 페이지는 여러분의 텍스트를 다른 모델의 표에 통과시키고 짐작을 측정으로 내놓는 것입니다. 그 짐작은 적게 세고, 적게 세는 정도는 코드와 영어가 아닌 텍스트에서 가장 큽니다. 하필 맞기를 바랐던 자리입니다.
그러면 그 모델의 정확한 셈은 어디서 오나요?
모델을 만든 곳의 토큰 계산 서비스에서 옵니다. 표를 가진 곳은 만든 곳뿐이니 정확할 수 있는 출처도 거기뿐입니다. 거기에는 API 키가 필요한데, 전적으로 브라우저 안에서 도는 페이지는 지닐 수도 없고 여러분에게 물어서도 안 되는 것입니다. 그러니 이 페이지가 할 수 있는 정직한 일은 수를 지어내는 것이 아니라 어디로 가야 하는지 알려 주는 것입니다. 이미 직접 쓴 코드에서 그 모델을 부르고 있다면, 거기서 쓰는 그 키가 이 물음에도 답해 줍니다.
공백, 줄바꿈, 들여쓰기도 세어지나요?
예, 모두 세어지고, 사람들이 여기는 것보다 많이 쌓일 수 있습니다. 들여쓴 코드, 문단 사이의 빈 줄, 붙여넣은 표 안의 채움은 모두 바이트입니다. 인코딩에는 공백 여러 개를 한꺼번에 담는 토큰도 있어서 값이 공백 하나에 토큰 하나인 것은 아니지만, 그렇다고 없는 것도 아닙니다. 긴 시스템 프롬프트를 줄이고 있다면, 문장을 잘라 내기 전에 서식을 다시 잡으면 어떻게 되는지 재 볼 값어치가 있습니다.
제 텍스트가 서버로 전송되나요?
아닙니다. 고른 인코딩의 표는 이 사이트에서 한 번만 내려받고, 그 뒤로 모든 셈은 여러분 자신의 브라우저 안에서, 별도 스레드에서 계산됩니다. 네트워크 패널을 열고 입력하면서 지켜보세요. 쓴 것을 실어 나르는 요청은 없습니다. 저장되는 것도 없어서 페이지를 다시 불러들이면 빈 칸이 남고 지울 것도 없습니다.
제 프롬프트가 얼마나 드는지, 또는 들어맞는지 알려 주나요?
둘 다 알려 주지 않고, 두 거절 모두 일부러입니다. 가격은 몇 달이면 낡을 텐데 여기서는 그것을 잡아낼 것이 아무것도 없으니, 이 안내는 대신 셈법을 가르치고 단가는 제공자 자신의 페이지에 맡깁니다. 컨텍스트 창도 같은 종류의 움직이는 수치이고, 텍스트가 들어맞을지는 이 페이지가 볼 수 없는 답에도 달렸습니다. 얻는 것은 두 물음이 다 같이 출발하는 그 하나의 수를, 정확하게 계산한 것입니다.

관련 도구