Menu

토큰과 컨텍스트 윈도우: AI가 텍스트를 읽는 방식

AI 모델은 텍스트를 단어의 작은 조각인 토큰 단위로 읽고, 한 번에 담을 수 있는 토큰 수에는 한계가 있습니다. 이것이 컨텍스트 윈도우입니다. 둘이 어떻게 동작하는지, 대화가 길어지면 어떻게 해야 하는지 알아봅니다.

이 페이지의 모든 프롬프트는 수정한 뒤 ChatGPT, Claude 등 AI 앱에서 바로 열 수 있습니다.

AI 언어 모델은 글자나 단어를 읽지 않습니다. 모델이 읽는 것은 토큰, 즉 텍스트의 작은 조각으로, 단어 하나 전체일 때가 많고 단어의 일부일 때도 있습니다. 그리고 모델은 한 번에 제한된 수의 토큰만 받아들일 수 있는데, 이 한계를 컨텍스트 윈도우라고 합니다. 이 두 개념을 알면 AI 도구의 가격이 왜 그렇게 매겨지는지, 긴 대화에서 왜 초반의 지시를 잊기 시작하는지, 방금 정확하게 쓴 단어의 글자 수를 모델이 왜 잘 세지 못하는지 이해할 수 있습니다.

AI에서 토큰이란?

모델이 프롬프트를 보기 전에 토크나이저라는 프로그램이 텍스트를 고정된 어휘 목록의 조각으로 나누고, 각 조각을 숫자로 바꿉니다. 모델은 오로지 이 숫자로 작업하고, 답변도 같은 방식으로 토큰을 하나씩 쓰며, 앱이 이를 다시 텍스트로 바꿉니다.

어휘 목록은 방대한 텍스트에서 학습되므로, 흔한 단어는 토큰 하나가 되는 경향이 있고 드문 단어는 익숙한 조각 여러 개로 나뉩니다. 공백은 뒤따르는 단어의 앞에 붙는 경우가 많습니다. 영어 문장 하나는 대략 이렇게 나뉠 수 있습니다.

Token ization isn 't magic .

이 분할은 설명을 위한 예시입니다. 모델 계열마다 자체 토크나이저가 있고, 같은 문장도 모델마다 조각 수가 다르게 나올 수 있습니다. 많은 제공사가 토크나이저 도구나 토큰 계산 API를 공개하므로 실제 개수를 확인할 수 있습니다.

모델이 이미지, 오디오, 파일을 받는 경우 이것들도 토큰으로 변환됩니다. 첨부한 스크린샷이 텍스트와 같은 예산의 일부를 쓰는 이유입니다.

단어 하나는 몇 토큰일까?

영어 텍스트의 경우 흔히 쓰는 경험칙은 토큰 하나에 약 네 글자, 즉 단어의 4분의 3 정도입니다. 이 추정에 따르면 1,000토큰은 영어 단어 약 750개이고, 3,000단어짜리 영어 기사는 약 4,000토큰입니다.

이 비율은 내용에 따라 달라집니다.

  • 다른 언어는 같은 뜻에 더 많은 토큰을 쓰는 경우가 많습니다. 토크나이저는 영어 비중이 높은 데이터로 학습되기 때문에 영어 단어는 촘촘한 토큰을 얻는 반면, 일본어, 한국어, 아랍어, 힌디어 등 많은 언어의 텍스트는 더 많은 조각으로 나뉩니다. 차이는 토크나이저에 따라 다르고 최신 토크나이저에서는 줄었지만, 사라지지는 않았습니다.
  • 코드는 들여쓰기, 괄호, 연산자, 긴 식별자에 토큰을 쓰므로, 파일 하나가 단어 수로 짐작하는 것보다 많은 토큰을 쓰는 경우가 많습니다.
  • 숫자, URL, 특이한 문자열, 예를 들어 ID나 해시는 작은 토큰 여러 개로 나뉘는 경향이 있습니다.

토큰이 중요한 이유

비용. API는 토큰 단위로 요금을 받고, 보내는 토큰과 모델이 쓰는 토큰의 가격이 따로 있습니다. 채팅에서는 새 메시지를 보낼 때마다 대화 전체가 다시 전송되므로, 긴 대화는 짧은 대화보다 메시지당 비용이 더 듭니다.

한도. 모델에는 한 번의 요청에서 읽고 쓰는 모든 것을 위한 컨텍스트 윈도우가 있고, 답변 하나의 길이에 대한 별도의 상한이 있는 경우가 많습니다. API에서는 이 상한을 직접 정할 수 있고, Anthropic API에서는 반드시 정해야 합니다. max_tokens가 필수 매개변수이기 때문입니다.

속도. 답변은 토큰 하나 다음에 또 하나 식으로 만들어지므로, 답변이 길수록 끝나는 데 그만큼 더 오래 걸립니다.

철자 관련 작업. 모델은 magic 같은 단어를 다섯 글자가 아니라 한두 개의 단위로 보기 때문에, 글자 수 세기, 단어 뒤집기, 정확한 길이의 단어 찾기처럼 개별 글자에 달린 작업은 보기보다 어렵습니다. 최신 모델은 이런 작업을 많이 잘하게 되었지만, 글자가 중요하다면 답을 확인하거나, 모델에게 먼저 단어를 한 글자씩 써 보게 하세요.

컨텍스트 윈도우란?

컨텍스트 윈도우는 모델이 한 번의 요청에서 고려할 수 있는 최대 토큰 수입니다. 모델의 작업 기억이라고 생각하면 됩니다. 모델이 답변을 쓰는 데 쓸 수 있는 모든 것이 한꺼번에 그 안에 들어가야 합니다. 여기에는 다음이 포함됩니다.

  • 시스템 프롬프트, 즉 앱 자체의 지시와 여러분의 지시
  • 지금까지의 대화, 모든 사용자 메시지와 모든 답변
  • 첨부한 파일, 붙여 넣은 문서, 검색이나 도구 결과
  • 지금 쓰고 있는 답변

윈도우 밖에 있는 것은 모델에게 존재하지 않습니다. 모델이 찾아볼 수 있는 배경 기억 같은 것은 없습니다. 컨텍스트 윈도우 크기는 모델마다 크게 다르고 계속 커지고 있으므로, 기사에 나온 숫자에 기대지 말고 사용하는 모델의 제공사 문서를 확인하세요.

모델은 요청과 요청 사이에 아무것도 보관하지 않습니다. 채팅에서 기억처럼 보이는 것은 앱이 매번 대화 전체를 다시 보내는 것입니다. 채팅 앱의 메모리 기능도 같은 방식으로 동작합니다. 앱이 여러분에 대한 메모를 저장하거나 이전 대화를 검색하고, 찾은 내용을 새 대화의 컨텍스트에 넣어 줍니다.

대화가 길어지면 생기는 일

대화가 컨텍스트 윈도우를 넘어서면 무언가를 포기해야 합니다. 앱에 따라 가장 오래된 메시지를 버리거나, 오래된 부분을 요약으로 바꾸거나, 대화가 한도에 도달했으니 새 대화를 시작하라고 알려 줍니다. 어느 경우든 첫 메시지에서 준 지시를 포함해 초반의 세부 사항이 더 이상 답변에 영향을 주지 못할 수 있습니다.

윈도우가 가득 차는 것만이 문제는 아닙니다. 모델 앞에 놓인 자료가 많을수록 놓칠 것도 많아지고, 긴 대화에서는 초반의 결정이 그 이후에 나온 모든 말과 경쟁합니다. 앞서 정한 제약을 무시하는 답변, 이미 고친 버전으로 되돌아간 코드, 여러분이 거절한 아이디어를 다시 꺼내는 모델이 그 증상입니다.

컨텍스트 윈도우 안에서 작업하는 법

작업마다 새 대화를 시작하세요. 첫 메시지가 명확한 새 대화가 여러 주제를 떠돌아다닌 긴 대화보다 대개 낫습니다.

요약을 가지고 넘어가세요. 대화에서 쓸모 있는 결정이 쌓였다면, 새 대화에 붙여 넣을 수 있도록 쓴 요약을 요청한 다음 거기서 이어 가세요. 아래 빈칸을 여러분의 작업에 맞게 채워 보세요.

새 대화에서 이어 가기
Fill in
이 대화가 길어지고 있어. 새 대화에 붙여 넣어서 작업을 이어 갈 수 있게 요약을 써 줘. 목표, 우리가 내린 결정과 그 이유, 데이터베이스 스키마의 현재 버전, 남은 질문을 포함해 줘. 요약은 데이터베이스 스키마 자체를 빼고 400자 이내로 해 줘.
Try it
Example replyReplies vary between models and runs.

목표: SQLite에 저장하는 작은 도서관 앱용 데이터베이스.

결정 사항:

  • 대출 기록 전체를 보관하기 위해 대출은 별도 테이블로 둔다.
  • returned_at이 비어 있는 대출이 없으면 그 책은 대출 가능한 것으로 본다.

현재 스키마:

CREATE TABLE books (id INTEGER PRIMARY KEY, title TEXT NOT NULL, author TEXT NOT NULL);
CREATE TABLE members (id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE);
CREATE TABLE loans (
  id INTEGER PRIMARY KEY,
  book_id INTEGER NOT NULL REFERENCES books(id),
  member_id INTEGER NOT NULL REFERENCES members(id),
  loaned_at TEXT NOT NULL,
  returned_at TEXT
);

남은 질문:

  • 연체료가 필요한가?
  • 같은 책의 여러 권을 따로 관리해야 하는가?

작업에 필요한 것만 붙여 넣으세요. 저장소 전체가 아니라 버그가 있는 함수와 그 함수를 호출하는 코드만 넣으세요. 계약서 40페이지 전체가 아니라 문제가 되는 조항만 넣으세요. 자료가 적을수록 놓칠 것도 적습니다.

긴 자료 뒤에 질문을 두고, 중요한 것을 다시 말하세요. 긴 문서를 붙여 넣을 때는 문서 뒤, 맨 끝에 질문을 하고 핵심 제약 조건을 거기서 다시 말하세요. 그러면 지시가 모델이 쓰기 시작하는 지점 바로 옆에 놓입니다.

메시지 하나에 넣기에 너무 긴 문서는 나눠서 보내세요. 일부 앱은 모델의 윈도우가 더 담을 수 있어도 메시지 하나에 붙여 넣을 수 있는 양을 제한합니다. 문서를 나눠 보내면 메시지 한도는 피할 수 있지만 컨텍스트 윈도우는 피할 수 없습니다. 모든 조각이 여전히 윈도우를 차지합니다. 전부 보낼 때까지 답하지 말라고 처음에 모델에게 알려 주세요.

Fill in
긴 문서를 3개로 나눠서 보낼게. 조각을 하나 받을 때마다 "3개 중 N번째 받음"이라고만 답하고 다른 말은 하지 마. 내가 질문하기 전까지는 요약하거나 아무것도 답하지 마. 3개 중 1번째: """ [1번째 조각을 붙여 넣으세요] """
Try it
Example replyReplies vary between models and runs.

3개 중 1번째 받음

중요할 때는 토큰 수를 세세요. API로 개발한다면 보내기 전에 세세요. OpenAI의 오픈소스 라이브러리 tiktoken은 OpenAI 토크나이저로 텍스트를 토큰화하고, Anthropic API에는 토큰 계산 엔드포인트가 있습니다. 한 제공사의 토크나이저로 센 값은 다른 제공사에서는 추정치일 뿐입니다.

import tiktoken

enc = tiktoken.get_encoding("o200k_base")  # one of OpenAI's tokenizers
tokens = enc.encode("Tokenization isn't magic.")
print(len(tokens))
print([enc.decode([t]) for t in tokens])

모델을 중심으로 앱을 만들 때는 윈도우에 무엇을 어떤 순서로 넣을지 정하는 일이 그 자체로 하나의 설계 문제가 됩니다. 이 내용은 컨텍스트 엔지니어링에서 다루고, 큰 작업을 각각 여유 있게 들어가는 단계로 나누는 방법은 프롬프트 체이닝에서 보여 줍니다. 메시지 하나가 전체 입력 안에서 어떻게 자리 잡는지는 프롬프트란을 참고하세요.

자주 묻는 질문

AI에서 토큰이란 무엇인가요?

토큰은 언어 모델이 읽고 쓰는 텍스트의 단위입니다. 흔한 단어 하나 전체일 수도, 긴 단어의 일부일 수도, 문장 부호나 공백 한 조각일 수도 있습니다. 모델이 프롬프트를 보기 전에 토크나이저가 텍스트를 토큰으로 나누고 각각을 숫자로 바꾸며, 모델은 답변을 토큰 하나씩 생성합니다.

1,000토큰은 몇 단어인가요?

영어에서는 흔히 토큰 하나에 약 네 글자라는 경험칙을 쓰는데, 이렇게 계산하면 1,000토큰은 영어 단어 약 750개입니다. 실제 수치는 모델의 토크나이저와 텍스트에 따라 다릅니다. 코드, 숫자, 그리고 한국어를 포함한 영어 외의 많은 언어는 같은 분량의 내용에 더 많은 토큰을 씁니다.

컨텍스트 윈도우란 무엇인가요?

컨텍스트 윈도우는 모델이 한 번의 요청에서 고려할 수 있는 최대 토큰 수입니다. 여기에는 시스템 프롬프트, 지금까지의 대화, 첨부한 파일이나 도구 결과, 그리고 모델이 쓰고 있는 답변까지 모두 들어가야 합니다. 그 밖에 있는 것은 모델에게 존재하지 않습니다.

대화가 컨텍스트 윈도우를 넘으면 어떻게 되나요?

앱이 공간을 만들어야 합니다. 앱에 따라 가장 오래된 메시지를 버리거나, 요약으로 바꾸거나, 대화가 한도에 도달했다고 알려 줍니다. 어떤 경우든 대화 초반의 지시와 세부 사항이 더 이상 답변에 영향을 주지 못할 수 있고, 긴 대화에서 모델이 무언가를 잊는 것처럼 보이는 이유가 여기에 있습니다.

ChatGPT나 Claude는 이전 대화를 기억하나요?

모델 자체는 기억하지 않습니다. 각 답변은 그 요청의 컨텍스트 윈도우에 있는 내용으로 생성됩니다. 일부 앱에는 여러분에 대한 메모를 저장하거나 지난 대화를 검색해 새 대화에 넣어 주는 메모리 기능이 있고, 프로젝트에는 공유 파일과 지침을 넣을 수 있지만, 이는 앱이 컨텍스트에 텍스트를 넣어 주는 것이지 모델이 기억하는 것이 아닙니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기