프롬프트 컨텍스트 관리 전략: 토큰 효율과 정확도 사이
문제 상황
레거시 마이그레이션 프로젝트에서 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는 구글 검색이 아니다. 많이 주면 좋은 게 아니라, 필요한 것만 구조화해서 주는 게 답이었다. 프롬프트 엔지니어링의 핵심은 "무엇을 물을까"가 아니라 "어떤 컨텍스트를 줄까"인 것 같다.
특히 레거시 코드처럼 복잡도가 높은 영역일수록 컨텍스트 큐레이션이 중요했다. 시간을 들여 프롬프트 템플릿을 만들어두니 장기적으론 확실히 이득이다.