티스토리 뷰

"This model's maximum context length is 4097 tokens. However, you requested 4162 tokens (66 in the messages, 4096 in the completion). Please reduce the length of the messages or completion."

 

GPT를 쓰다보면 이런 에러를 만나는 경우가 있을 것이다.

 

이 에러는 왜 나는 걸까?

 

모델에 입력할 수 있는 최대 토큰 수를 초과했기 때문에 나는 에러이다.

 

각 모델 별 입력 받을 수 있는 최대 토큰 수

 

토큰 수는 일반적으로 텍스트의 길이를 비율을 정해서 본다면, 어느정도는 맞을 수 있다. 

 

다만, 토큰 수 = 텍스트 길이는 참이 아니다.

 

그렇다면 토큰 수는 어떻게 세면 될까?

 

OpenAI에서는 공식적으로 토큰 수를 셀 수 있는 페이지를 제공한다.

 

그러나 페이지를 잘 뜯어보면,

 

GPT-3 기준이다.

 

2023.11.27 업데이트

위 사이트에 GPT-3.5와 GPT-4 모델의 토큰을 세는 옵션이 추가되었습니다.

 

새 옵션이 추가되었음

 

하지만, 여전히 코드 내에서

 

GPT-3.5 의 토큰 수를 세려면 외부 라이브러리를 사용해야 한다.

 

GPT-3.5의 토큰 수를 가장 직관적으로 계산할 수 있는 토크나이저를 찾아 다녔는데,

 

개인적으로 jtokkit 이 가장 맘에 들어서 이 라이브러리를 사용했다. 

 

JTokkit 사용법

설치부터 시작

 

build.gradle

 implementation 'com.knuddels:jtokkit:0.5.0'

java

public int getTokenSize(String text) {
    EncodingRegistry registry = Encodings.newDefaultEncodingRegistry();
    Encoding enc = registry.getEncodingForModel(ModelType.GPT_3_5_TURBO);

    List<Integer> encoded = enc.encode(text);
    return encoded.size();
}

사실 github 페이지에 다 나와있는 내용인데, 토큰 크기가 인코딩된 배열의 사이즈라는게 제대로 명시되어 있지 않은 것 같다.

 

결론은 토큰 사이즈는 encoded 배열의 사이즈이다.

 

따라서 문자열의 토큰 크기 계산은 위 코드와 같이 쓰면 된다.

 

만약 GPT-3.5가 아닌 GPT 토큰 수 계산 페이지와 같은 GPT-3의 토크나이저를 쓰고 싶다면, 아래와 같이 쓰면 된다.

registry.getEncoding(EncodingType.CL100K_BASE);

 

주의할 점

 

어떤 이유에서인지 chat API 에서 max_tokens 파리미터를 각 model의 최대 파라미터로 설정하면 무조건 maxmum token(토큰 허용량 초과) 에러가 난다.

 

null로 둬도 되니까 null로 두고 사용하거나 적당한 크기로 두고 사용하자.

(첫 예시도 max_token 사이즈로 두고 사용했을 때 발생하는 에러)

 

마치며

내가 jtokkit에 등록한 이슈에 대한 답변과 이것저것 써본 내용이다.

 

한 질문을 거의 그대로 가져왔다. 

 

만약 유료 플랜을 쓰고 있다면, 토큰 당 과금이 되기 때문에 토큰 계산식이 꽤나 중요하다.

 

나름 잘 정리한 것 같으니 잘 활용해주세요.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함