[LLM] 토큰 다이어트: 성능을 유지하면서 프롬프트 길이를 줄이는 엔지니어링

프롬프트 길이 증가로 발생한 토큰 비용 문제

LLM을 API 형태로 서비스에 붙이면 대부분 프롬프트가 점점 길어집니다. 기능이 추가될 때마다 지침이 추가되고 예시가 추가됩니다. 결국 몇 달 지나면 프롬프트가 상당히 길어집니다. 운영에서 정말 자주 보게 되는 패턴입니다.

저희 서비스도 처음에는 간단한 요약 기능이었습니다. 프롬프트 길이는 약 200 토큰 수준이었습니다. 그런데 기능이 늘어나면서 프롬프트에 규칙과 예시가 계속 추가되었습니다.

3개월 정도 지나니 평균 프롬프트 길이가 1500 토큰을 넘어갔습니다. 요청당 토큰 사용량이 늘어나면서 비용이 눈에 띄게 올라가기 시작했습니다.

당시 LLM 요청은 초당 약 15 정도였습니다. 하루 토큰 사용량이 약 300만 토큰 수준이었습니다. 

 

운영 로그에서 발견한 문제

로그를 분석해보니 흥미로운 사실이 하나 있었습니다. 실제 모델이 사용하는 정보는 프롬프트의 일부였습니다.

프롬프트 전체를 보내고 있었지만 모델이 참고하는 정보는 대략 20에서 30퍼센트 수준이었습니다. 나머지는 거의 사용되지 않는 지침이었습니다. 

그래서 프롬프트를 줄이는 작업을 시작했습니다. 내부에서는 이 작업을 토큰 다이어트라고 부르기 시작했습니다.

 

토큰 다이어트 전략 비교

프롬프트 길이를 줄이기 위해 두 가지 접근 방법을 검토했습니다. 단순히 프롬프트를 줄일지 아니면 구조 자체를 바꿀지였습니다.

방법 A 프롬프트 직접 축소

가장 단순한 방법입니다. 필요 없는 설명과 예시를 제거하는 방식입니다.

장점은 구현이 쉽다는 점입니다. 프롬프트 텍스트만 수정하면 됩니다. 별도의 시스템 변경도 필요 없습니다.

하지만 단점이 있습니다. 성능이 떨어질 가능성이 있습니다. 특히 예시를 제거하면 모델 출력이 불안정해지는 경우가 있습니다.

 

방법 B 프롬프트 구조 재설계

두 번째 방법은 프롬프트를 구조적으로 나누는 방식입니다. 예를 들어 system 프롬프트와 user 프롬프트를 분리하고 필요한 정보만 동적으로 추가하는 방식입니다.

장점은 토큰을 효율적으로 사용할 수 있다는 점입니다. 필요한 정보만 프롬프트에 포함할 수 있습니다.

단점은 구현 난이도입니다. 프롬프트 생성 로직을 코드로 관리해야 합니다.

결론적으로 저희는 두 방법을 같이 사용했습니다. 기본 프롬프트를 줄이고 필요한 정보만 동적으로 추가하는 방식이었습니다. 

 

토큰 다이어트 실전 구현 방법

프롬프트를 관리할 때 중요한 것은 템플릿 구조입니다. 저희는 프롬프트를 코드로 관리하도록 변경했습니다.

Spring Boot 기반 서비스에서 프롬프트 빌더 클래스를 만들었습니다. 요청 상황에 따라 필요한 정보만 포함하도록 했습니다.

public class PromptBuilder {

    public String buildSummaryPrompt(String text, boolean includeExample){

        StringBuilder prompt = new StringBuilder();

        prompt.append("다음 문서를 요약하세요.\n");

        // 운영 팁
        // 예시는 항상 필요하지 않습니다
        // 요청 유형에 따라 선택적으로 넣습니다

        if(includeExample){
            prompt.append("예시:\n");
            prompt.append("입력: 긴 문장...\n");
            prompt.append("출력: 짧은 요약\n");
        }

        prompt.append("문서:\n");
        prompt.append(text);

        return prompt.toString();
    }
}

토큰 절감 결과

프롬프트 구조를 정리한 후 평균 토큰 수가 크게 줄었습니다.

기존 평균 프롬프트 길이는 약 1500 토큰이었습니다. 개선 후에는 약 450 토큰 수준으로 줄었습니다.

토큰 사용량이 약 70퍼센트 감소했습니다. 비용도 같은 비율로 줄었습니다. 

흥미로운 점은 성능이 크게 떨어지지 않았다는 점입니다. 일부 케이스에서는 오히려 응답 품질이 좋아졌습니다. 불필요한 지침이 줄어들어서 그런 것 같습니다.

 

프롬프트 최적화의 현실적인 결론

토큰 다이어트는 생각보다 효과가 큽니다. 특히 트래픽이 있는 서비스에서는 비용 절감 효과가 바로 보입니다.

하지만 프롬프트를 줄인다고 해서 항상 성능이 유지되는 것은 아닙니다. 일부 작업에서는 예시가 반드시 필요합니다.

그래서 프롬프트 최적화는 한 번에 끝나는 작업이 아닙니다. 로그를 계속 분석하고 프롬프트를 조정해야 합니다.

결국 중요한 것은 프롬프트를 코드로 관리하는 구조입니다. 텍스트 파일처럼 관리하면 유지보수가 어려워집니다.

LLM 비용을 줄이는 가장 쉬운 방법은 모델 변경이 아니라 토큰 관리입니다.