OpenAI API 토큰 사용량 최적화 작업
문제 상황
사내 문서 검색 챗봇을 GPT-4로 운영 중이었는데, 월 API 비용이 예상치의 2배를 넘어섰다. 사용자 수는 예측 범위 내였기 때문에 토큰 사용 효율에 문제가 있다고 판단했다.
원인 분석
로그를 분석한 결과 두 가지 문제를 발견했다.
- 불필요한 컨텍스트 전송: 문서 검색 결과를 그대로 프롬프트에 넣어서 매번 4000토큰 이상 소비
- 토큰 계산 누락: 응답 토큰만 계산하고 프롬프트 토큰은 모니터링하지 않았음
해결 과정
1. tiktoken으로 정확한 토큰 계산
import { encoding_for_model } from 'tiktoken';
const enc = encoding_for_model('gpt-4');
function countTokens(text) {
const tokens = enc.encode(text);
return tokens.length;
}
// API 호출 전 토큰 수 체크
const promptTokens = countTokens(systemPrompt + userMessage);
if (promptTokens > 6000) {
// 컨텍스트 압축 로직 실행
}
2. 문서 청킹 및 요약
검색된 문서를 GPT-3.5-turbo로 먼저 요약한 뒤 GPT-4에 전달하도록 변경했다. 요약 비용보다 GPT-4 토큰 절감이 더 컸다.
async function summarizeContext(documents) {
const combined = documents.map(d => d.content).join('\n\n');
const summary = await openai.chat.completions.create({
model: 'gpt-3.5-turbo',
messages: [{
role: 'system',
content: '다음 문서들의 핵심 내용만 추출해줘. 최대 500토큰 이내로.'
}, {
role: 'user',
content: combined
}],
max_tokens: 500
});
return summary.choices[0].message.content;
}
3. 시스템 프롬프트 다이어트
장황했던 시스템 프롬프트를 핵심만 남기고 300토큰에서 120토큰으로 축소했다. 답변 품질은 A/B 테스트 결과 차이가 없었다.
결과
- 평균 요청당 토큰: 8500 → 5100 (40% 감소)
- 월 API 비용: $2,400 → $1,450
- 응답 속도도 약간 개선 (토큰 수 감소로 처리 시간 단축)
교훈
토큰은 곧 비용이다. OpenAI API를 프로덕션에 사용한다면 tiktoken으로 정확히 계산하고, 불필요한 컨텍스트는 철저히 제거해야 한다. 특히 GPT-4는 토큰당 비용이 높으니 더 주의가 필요하다.