ChatGPT API 비용 감축하기
팀 프로젝트에서 ChatGPT를 사용해 여러 사이트에서 모은 강의 데이터를 하나의 카테고리 상에 매핑하는 작업을 하려 했습니다. 이 과정에서 ChatGPT API 비용을 최적화한 과정을 정리해보려 합니다.
현재 LLM 에 제공할 강의 데이터는 다음과 같습니다. (이 중 None으로 존재하는 데이터는 제거)
- lecture_name
- description
- whatdoilearn
- tags
하지만 이때 기존 Category 300개에 달하는 방식으로는 ChatGPT 4o 모델을 한번 Inference 시 대략 $0.05가 발생하였습니다. (대략 1.2K 토큰, 1K 토큰 당 $0.005라고 함)
이 토큰을 줄이기 위하여 기존의 한글 카테고리 목록을 영어로 번역해 이 둘의 토큰 수 비교를 하기로 하였습니다.
1. 한글-영어 카테고리 목록 ChatGPT 토큰 비교
한글 방식
영어 방식
영어 방식으로 카테고리를 사용시 토큰을 절반 이상 줄일 수 있었습니다!
이를 Open AI의 Assistants API를 사용시 File Search에 추가하여 Vector embedding 후 사용하였더니 기존 사용 토큰 12000에서 6000 ~ 8000 토큰까지 감소하였습니다. (아마도 Vector Embedding 사용시 추가 비용이 붙는 것 같습니다.)
꽤나 줄어들었지만 비용은 아직도 개인 프로젝트에 적용하기에는 부담스러운 비용입니다.
이러한 강의 데이터가 10000개 있다고 가정하고, 기존 비용의 절반이 소요된다 가정시 $10000 \times 0.05 / 2 = 250$로 $250이라는 여전히 큰 비용이 발생합니다.
2. 모델의 변경
가장 쉽고 효과적으로 비용을 줄일 수 있는 방법은 바로 모델을 싼 모델을 쓰는 것입니다.
다행이게도 제가 하려는 작업은 ChatGPT 3.5 Turbo 모델로도 꽤나 잘 하는 것을 확인할 수 있어, 이를 사용시 기존 ChatGPT 4o 모델보다 5배 이상 절감이 가능합니다.
즉, 대략 $50에 처리할 수 있습니다.
3. 계층적 카테고리 분류
꽤나 많이 줄었지만 아무래도 모델의 성능이 많이 안좋아지고, 비용은 더욱 줄이면 좋기 때문에
$50이면 치킨 3마리 값이기 때문에
좀 더 이 비용을 최적화 할 방법을 찾아야 합니다.
위 사진처럼 모델 사용시 발생하는 토큰(6000 ~ 8000개)의 대부분은 입력 토큰이 차지하며 또한 이는 대부분 File Search로 제공되는 Category 데이터 입니다.
이 때문에 카테고리의 소분류를 제거하고 일단 중분류까지만 체크하는 방식을 취하였습니다. 또한 이 경우 카테고리 분류를 위해 필요한 정보 또한 당연하게도 줄어들게 됩니다. (카테고리 개수: 300개 → 25개)
줄어든 카테고리 사용시 사용 토큰
이 덕분에 API에서 file research에 제공하는 데이터가 크게 줄어 토큰 사용량이 위 사진처럼 1회에 2500개 정도로 감소하였습니다!!
하지만 기쁨도 잠시,,, 기존 300개의 분류에서 25개의 분류로 줄였는데 토큰이 1/10이 아닌 1/3 정도로만 줄어드는게 꽤나 이상합니다. 입출력 토큰 수(completion tokens)는 많아야 200개 정도로 작은데 말이죠!
이는 File Search에서 파일 데이터를 임베딩 처리하는데 토큰이 더 사용되는 것으로 그냥 유저 입력으로 Category 정보 삽입시 더욱 줄어듭니다.
위처럼 500개 정도로 줄어들며 기존 6000~8000개를 사용하던 것과 비교시 저희의 예상대로 1/10으로 줄어드는 것을 확인할 수 있습니다!
즉, $5에 모든 처리를 할 수 있습니다!!
이처럼 계층적으로 처리시 모든 질의를 2번 나눠서 하게 되므로 단순 계산으로 $10에 모든 처리를 할 수 있습니다!!
4. 배치 처리하기
또한 이때 여러개의 강의를 한번에 배치처리하도록 할수도 있습니다.
위처럼 4개의 강의를 배치 처리하여 토큰은 2배 더 사용하지만, 처리하는 강의는 4배 증가해 기존 대비 2배 더 좋은 성능을 내어 $2.5에 중분류까지의 처리를 할 수 있을 것으로 예상됩니다.
Open AI API 비용 감축 방법 최종 정리
- 입력 데이터를 최대한 영어로 변환해 토큰 사용 최소화 하기
- 모델 성능 비교를 통하여 저렴한 모델 채택하기
- 입력 데이터 줄이기
- 만약 해야하는 작업이 계층적인 경우, 이를 분리해서 적용하여 비용 감축이 가능한지 체크해보기
- 위 경우에서는 소분류가 너무 많았기에 중분류까지 분류 후 소분류를 따로 다시 챗봇에게 물어보는 과정으로 비용을 줄일 수 있습니다.
- 만약 해야하는 작업이 계층적인 경우, 이를 분리해서 적용하여 비용 감축이 가능한지 체크해보기
- File Search 사용 안하기
- 데이터 배치 처리하기
이 방식을 통해 기존 $500가 예상되던 작업을 $5로 줄일 수 있었습니다.
더 좋은 방법이 있다면 댓글로 공유 주신다면 감사하겠습니다!