OpenAI API 토큰 사용량 최적화 작업

문제 상황

사내 문서 검색 챗봇을 GPT-4로 운영 중이었는데, 월 API 비용이 예상치의 2배를 넘어섰다. 사용자 수는 예측 범위 내였기 때문에 토큰 사용 효율에 문제가 있다고 판단했다.

원인 분석

로그를 분석한 결과 두 가지 문제를 발견했다.

  1. 불필요한 컨텍스트 전송: 문서 검색 결과를 그대로 프롬프트에 넣어서 매번 4000토큰 이상 소비
  2. 토큰 계산 누락: 응답 토큰만 계산하고 프롬프트 토큰은 모니터링하지 않았음

해결 과정

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는 토큰당 비용이 높으니 더 주의가 필요하다.