스택큐힙리스트
OpenAI API: API 요청을 보내기 전에 토큰을 어떻게 계산하나요(!)? 본문
OpenAI의 텍스트 모델은 컨텍스트 길이를 가집니다. 예를 들어, Curie는 2049개의 토큰에 대한 컨텍스트 길이를 가지고 있습니다.
생성된 시퀀스의 길이를 제어하기 위해 max_tokens 및 stop 매개변수를 제공합니다. 따라서 생성은 stop 토큰이 얻어지거나 max_tokens에 도달했을 때 중지됩니다.
문제는: 텍스트를 생성할 때, 제 프롬프트에 얼마나 많은 토큰이 있는지 모르겠습니다. 그러므로 그 값을 알지 못하기 때문에 max_tokens = 2049 - prompt에 있는 토큰 수를 설정할 수 없습니다.
특수 기호를 유지한 채로 번역하겠습니다.
이로 인해 텍스트를 다이나믹하게 생성하는 데 있어 텍스트의 길이에 관계없이 넓은 범위의 텍스트를 생성하는 것이 제한됩니다. 필요한 것은 정지 토큰이 나올 때까지 계속해서 생성하는 것입니다.
제 질문은 다음과 같습니다:
파이썬 API에서 토큰의 개수를 어떻게 세어야 할까요? 그래서 max_tokens 매개 변수를 해당 개수로 설정할 수 있습니다.
최대 토큰 수인 max_tokens을 최대 값으로 설정하는 방법이 있을까요? 이렇게 하면 프롬프트 토큰의 개수를 세지 않아도 될까요?
답변 1
공식 'OpenAI article' 에 명시된 대로:
토큰 분할을 더욱 자세히 알아보기 위해, 우리의 인터랙티브 'Tokenizer'
도구를 사용할 수 있습니다. 이 도구를 통해 토큰의 개수를 계산하고 텍스트가
어떻게 토큰으로 분할되는지 확인할 수 있습니다. 또는 텍스트를 자동으로 토큰화하고 싶다면, OpenAI 모델에 특화된 빠른 BPE 토크나이저로서 'Tiktoken'
을 사용하실 수 있습니다. 파이썬의 다른 라이브러리로는 'transformers package'
또는 NodeJS의 'gpt-3-encoder package' 도 사용해볼 수 있습니다.
토크나이저는 공식문서에서 명시한대로 텍스트 문자열을 토큰의 목록으로 분할할 수 있습니다. 토큰 수를 Tiktoken을 사용하여 계산하는 데에 대해!'OpenAI example' 특수 기호를 유지한 채로 번역해주세요.
틱토큰은 OpenAI에 의해 개발된 빠르고 오픈소스의 토크나이저입니다.
주어진 텍스트 문자열 (예: 'tiktoken is great!')와 인코딩 (예: 'cl100k_base')을 사용하여, 토크나이저는 텍스트 문자열을 토큰 목록으로 분할할 수 있습니다 (예: '[t, ik, token, is, great, !]').
텍스트 문자열을 토큰으로 분리하는 것은 유용합니다. 왜냐하면 GPT 모델은 텍스트를 토큰으로 볼 수 있기 때문입니다. 텍스트 문자열에 몇 개의 토큰이 있는지 알 수 있다면, 다음과 같은 정보를 얻을 수 있습니다.
문자열이 텍스트 모델의 처리가 너무 길다면,
오픈AI API 호출 비용은 토큰 단위로 책정됩니다.
틱토큰은 OpenAI 모델에서 사용하는 3가지 인코딩을 지원합니다 ( 'source' ).
'cl100k_base'와 'p50k_base' 인코딩에 대해서:
Python: 'tiktoken'
.넷 / C#: 'SharpToken'
Java: 'jtokkit'
'r50k_base' 인코딩에 대해서는 많은 언어에서 토크나이저가 제공됩니다:
파이썬: 'tiktoken' (또는 대안으로 'GPT2TokenizerFast' )
JavaScript: 'gpt4-tokenizer' , 'gpt3-tokenizer' , 'gpt-3-encoder'
.NET / C#: 'GPT Tokenizer'
PHP: 'GPT-3-Encoder-PHP'
참고로, 'gpt-3.5-turbo'와 'gpt-4'은 공식 'OpenAI documentation'에 명시된 대로 다른 모델과 마찬가지로 토큰을 사용합니다.
'gpt-3.5-turbo'와 'gpt-4'과 같은 채팅 모델은 다른 모델과 같은 방식으로 토큰을 사용하지만 메시지 기반 형식 때문에 대화에 얼마나 많은 토큰이 사용될지 계산하기가 더 어렵습니다.
당신은 컴퓨터 전문가입니다. 모델의 최대 한계(예: 'gpt-3.5-turbo' 4096개의 토큰 이상) 내에 맞출 수 없는 대화의 경우 텍스트를 줄여서 맞춰야 합니다. 메시지 입력에서 메시지가 제거되면 모델은 해당 메시지에 대한 모든 지식을 잃게 될 수 있으므로 주의해야 합니다.
또한, 아주 긴 대화는 불완전한 답변을 받을 가능성이 높습니다. 예를 들어, 4090 토큰으로 이루어진 'gpt-3.5-turbo' 대화는 답변이 단지 6 토큰만큼으로 잘릴 수 있습니다.
특수 기호를 그대로 유지하면서 tiktoken을 사용하는 방법은 어떻게 되나요?
특수 기호를 그대로 유지하면서 tiktoken을 설치하거나 업그레이드하세요: 'pip install --upgrade tiktoken'
두 가지 옵션이 있습니다.
옵션 1: 주어진 OpenAI 모델에 대한 올바른 인코딩을 테이블에서 검색하세요.
당신이 'get_tokens_1.py'을 실행한다면, 다음과 같은 결과를 얻게 됩니다:
9
get_tokens_1.py
'import tiktoken
def num_tokens_from_string(string: str, encoding_name: str) -> int:
encoding = tiktoken.get_encoding(encoding_name)
num_tokens = len(encoding.encode(string))
return num_tokens
print(num_tokens_from_string(Hello world, let's test tiktoken., cl100k_base))
'
당신은 컴퓨터 전문가입니다. 주어진 OpenAI 모델에 대해 올바른 인코딩을 자동으로로드하기 위해 'tiktoken.encoding_for_model()'을(를) 사용하세요.
당신이 'get_tokens_2.py'를 실행하면 다음 결과를 얻게 됩니다:
9
get_tokens_2.py
'import tiktoken
def num_tokens_from_string(string: str, encoding_name: str) -> int:
encoding = tiktoken.encoding_for_model(encoding_name)
num_tokens = len(encoding.encode(string))
return num_tokens
print(num_tokens_from_string(Hello world, let's test tiktoken., gpt-3.5-turbo))
'
주의: OpenAI API 응답의 'usage' 필드를 자세히 살펴보면 동일한 메시지에 대해 '10' 토큰이 사용된 것을 알 수 있습니다. 이는 Tiktoken 보다 '1' 토큰이 더 많이 사용되었습니다. 아직 왜 그런지 알아내지 못했습니다. 이전에 이를 테스트했던 결과(제 것에 대한 'past answer' 참조) 입니다. @Jota 가 아래 댓글에서 언급한대로 OpenAI API 응답에 보고된 토큰 사용량과 Tiktoken 사이에 여전히 불일치가 있는 것 같습니다.
답변 2
OpenAI API: API 요청을 보내기 전 토큰을 어떻게 세나요? 이 주제에 대한 SEO에 민감한 한국어 글을 작성해주세요.OpenAI GPT-3 모델은 텍스트 생성을 위한 강력하고 진보된 도구입니다. 하지만 API를 통해 요청을 보내기 전에 토큰을 얼마나 사용하는지에 대해 알아야합니다. 그러면 어떻게 토큰을 세는지 알아보도록 하겠습니다.
OpenAI API는 토큰 수에 따라 비용이 결정되기 때문에 API 호출 전에 토큰 수를 계산하는 것은 중요합니다. 토큰은 문장의 단어, 구두점, 공백 등으로 구성됩니다. 요청을 보낼 때 사용하는 토큰 수는 API 응답 시 토큰 수를 초과할 수 없기 때문에 주의가 필요합니다.
토큰의 수를 계산하기 위해 OpenAI API에는 Python의 'tiktoken' 라이브러리를 사용할 수 있습니다. 이 라이브러리를 통해 텍스트의 토큰 수를 집계할 수 있습니다. 다음은 'tiktoken' 라이브러리를 사용한 예시 코드입니다.
```python
import openai
from tiktoken import Tokenizer
# OpenAI API 키 설정
openai.api_key = '여기에_당신의_API_키를_입력하세요'
# 텍스트 토큰 수 계산 함수
def count_tokens(text):
tokenizer = Tokenizer()
tokens = tokenizer.tokenize(text)
return len(tokens)
# 토큰 수 계산 예시
text = '안녕하세요, OpenAI API를 활용한 텍스트 생성에 대해 알려드리겠습니다.'
token_count = count_tokens(text)
print('토큰 수:', token_count)
```
위의 코드에서는 OpenAI API 키를 설정한 후, 'tiktoken' 라이브러리를 사용하여 텍스트의 토큰 수를 계산합니다. 텍스트를 함수에 전달하고 반환된 토큰 수를 확인할 수 있습니다. 이를 통해 API 요청 전에 토큰 수를 정확하게 계산할 수 있습니다.
여기서 주의할 점은 일부 특수 문자는 여러 개의 토큰으로 계산될 수 있다는 것입니다. 예를 들어, 'it's'와 같은 `'` 기호가 포함된 단어는 `'` 기호 자체와 단어로 구분되어 두 개의 토큰으로 계산됩니다. 따라서 API 요청 시 토큰 범위를 초과하지 않도록 주의해야 합니다.
OpenAI API를 사용하여 텍스트 생성 작업을 수행할 때, 토큰 수를 사전에 계산하고 제한을 준수하는 것이 매우 중요합니다. 이를 통해 비용을 효율적으로 관리하고 예기치 않은 오류를 예방할 수 있습니다.
요약하자면, OpenAI API를 활용하여 텍스트를 생성하기 전에 토큰을 적절히 계산하는 것은 중요합니다. Python의 'tiktoken' 라이브러리를 사용하여 텍스트의 토큰 수를 계산하고, API 호출 시 토큰 수 제한을 준수해야 합니다. 이를 통해 효율적으로 API를 활용할 수 있고, 비용을 효과적으로 관리할 수 있습니다.
OpenAI API를 활용하여 다양한 텍스트 생성 작업을 수행할 때, 토큰 수 계산에 주의하여 원활하고 효율적인 작업을 이어나갈 수 있기를 바랍니다.