프롬프트 컨텍스트 관리 전략: 토큰 효율과 정확도 사이

문제 상황

레거시 마이그레이션 프로젝트에서 AI 코딩 도구를 활용하고 있었다. 문제는 8년 된 모놀리식 코드베이스를 AI에게 설명하는 방식이었다. 전체 파일을 던지면 토큰 제약에 걸리고, 필요한 부분만 추리면 맥락을 놓쳐 엉뚱한 제안을 받았다.

특히 비즈니스 로직이 여러 레이어에 분산된 경우가 문제였다. Controller → Service → Repository → Utils로 이어지는 호출 체인을 AI가 이해하려면 4개 파일을 모두 봐야 하는데, 그러면 8000 토큰을 쉽게 넘었다.

시도한 방법들

1. 파일 전체 제공 (실패)

처음엔 관련 파일을 모두 첨부했다. 결과는 처참했다.

  • GPT-4: 128k 컨텍스트 윈도우가 있어도 긴 입력에선 중간 부분을 잘 놓침
  • Claude 3.5: 200k까지 지원하지만 비용이 급증
  • 실제로 필요한 정보는 전체의 20%도 안 됨

2. 요약본 제공 (부정확)

파일 구조와 핵심 함수 시그니처만 추출해서 제공했다.

// 이런 식으로 압축
class OrderService {
  processOrder(orderId: string): Promise<Order> { /* ... */ }
  validatePayment(paymentInfo: PaymentInfo): boolean { /* ... */ }
}

토큰은 절약됐지만 구현 세부사항을 모르니 부정확한 제안이 많았다.

3. 계층적 컨텍스트 로딩 (채택)

결국 3단계 접근법을 정리했다.

Level 1: 구조 맵핑

  • 파일 트리와 주요 export 목록
  • 타입 정의와 인터페이스
  • 의존성 그래프

Level 2: 관련 함수 전체

  • 질문과 직접 연관된 함수만 전체 코드 제공
  • 호출되는 함수는 시그니처만

Level 3: 필요시 확장

  • AI가 "X 함수의 구현을 봐야겠다"고 요청하면 추가 제공

실전 템플릿

# Context Structure

## File Tree
- src/services/OrderService.ts
- src/repositories/OrderRepository.ts
- src/utils/payment.ts

## Type Definitions
[인터페이스 전체]

## Focus Area
[실제 질문 대상 함수의 전체 코드]

## Related Functions (signatures only)
[호출되는 함수들의 시그니처]

## Question
[구체적인 질문]

효과

  • 평균 토큰 사용량: 12k → 4k (67% 감소)
  • 응답 정확도: 체감상 비슷하거나 오히려 향상 (노이즈 감소 효과)
  • 프롬프트 작성 시간: 초기엔 늘었지만 템플릿화 후 오히려 단축

배운 점

AI는 구글 검색이 아니다. 많이 주면 좋은 게 아니라, 필요한 것만 구조화해서 주는 게 답이었다. 프롬프트 엔지니어링의 핵심은 "무엇을 물을까"가 아니라 "어떤 컨텍스트를 줄까"인 것 같다.

특히 레거시 코드처럼 복잡도가 높은 영역일수록 컨텍스트 큐레이션이 중요했다. 시간을 들여 프롬프트 템플릿을 만들어두니 장기적으론 확실히 이득이다.