OpenAI API로 여러 데이터에 대한 답변 뽑을 때 주의* - RateLimitError, InvalidRequestError

Jomii·2024년 8월 23일
1

기타 에러&방법

목록 보기
2/3

에러나서 다시 돌리면 토큰 아까우니까 실행 전 미리 주의하세요..

json데이터나 csv에서 각 row에 대한 답변을 받으려고 할 때, 다음과 같은 에러가 나타났다.. 토큰 아끼려고 데이터 하나 넣어서 함수 만든거 동작하는지 확인한 다음 전체 데이터에 대해 돌렸는데 에러 발생

1. RateLimitError

RateLimitError: Rate limit reached for gpt-4 in organization org-xxxxxxxxxx on requests per min (RPM): Limit 3, Used 3, Requested 1. Please try again in 20s. Visit https://platform.openai.com/account/rate-limits to learn more. You can increase your rate limit by adding a payment method to your account at https://platform.openai.com/account/billing.

여러 데이터에 대한 답변을 생성할 때 요청이 일정 한도를 초과하면 발생한다고 한다... 호출할 때 time sleep을 두면 되는데, 나는 try except문으로 rate limit이 났을 때 time sleep을 할 수 있도록 수정했다.


# api 호출시 rate limit에 걸릴 경우 재시도하는 함수 정의
def extract_issues_with_retry(review_text, retries=3):
    for attempt in range(retries):
        try:
            return extract_issues_from_review(review_text) # 원하는 함수 실행
        except openai.error.RateLimitError:
            print(f"Rate limit")
            time.sleep(20) # 20초간 timesleep
    return "Rate limit exceeded"

limit에 도달하면 time sleep을 20초간 하고, 다시 호출에 실패할 경우에 최대 3번까지 다시 시도한다.

그러면 이렇게 리밋에 도달했을 때마다 20초씩 기다리는 모습을 볼 수 있다.



2. InvalidRequestError

InvalidRequestError: This model's maximum context length is 8192 tokens. However, your messages resulted in 11012 tokens. Please reduce the length of the messages.

gpt 모델의 최대 텍스트 길이를 초과하면 나타나는 에러이다. 필자는 리뷰글에 대한 텍스트를 한번에 돌리려다보니 거의 마지막에 이 에러를 마주했다.

아래와 같이 너무 긴 글일 경우 쪼개서 사용하는 방식으로 진행하면 해결된다.

def split_text(text, max_tokens=3000):
    words = text.split()
    chunks = []
    current_chunk = []

    for word in words:
        current_chunk.append(word)
        if len(' '.join(current_chunk)) > max_tokens:
            chunks.append(' '.join(current_chunk[:-1]))
            current_chunk = [word]
    
    chunks.append(' '.join(current_chunk))
    return chunks

def extract_issues_with_limit(review_text):
    chunks = split_text(review_text)
    all_issues = []

    for chunk in chunks:
        issues = extract_issues_from_review(chunk) # 원하는 함수 실행
        all_issues.append(issues)

    return '\n'.join(all_issues)


함수만들고 나서 끊긴 부분부터 다시 넣어서 그래도 토큰 낭비는 많이 없었다!

profile
📩 qtly_u@naver.com

0개의 댓글