Skip to main content

좋은 프롬프트를 떠올릴 때 많은 팀은 먼저 정답률을 생각한다. 물론 맞는 답을 내는 일은 중요하다. 하지만 서비스에 들어가는 순간, 프롬프트는 더 이상 한 번 쓰고 끝나는 문장이 아니다. 매 요청마다 다시 조립되고, 매번 토큰 비용을 발생시키며, 매번 지연 시간을 만들고, 매번 모델의 컨텍스트 창을 차지한다. 그래서 운영 환경에서의 좋은 프롬프트는 "정확한 프롬프트"이면서 동시에 "예산 안에 들어오는 프롬프트"여야 한다.

이 장의 핵심은 단순하다. 프롬프트의 품질은 답변의 품질만으로 결정되지 않는다. 같은 품질을 더 적은 토큰, 더 짧은 대기 시간, 더 싼 모델로 낼 수 있다면 그쪽이 더 좋은 설계다.

프롬프트도 운영 비용이다

비용은 모델 가격표가 아니라 요청 구조에서 시작된다

LLM 비용은 보통 모델 단가에서 시작해 생각하지만, 실제 청구서는 프롬프트 구조가 만든다. 한 번의 호출 비용은 대략 입력 토큰 수와 출력 토큰 수의 곱으로 결정된다. 여기서 중요한 점은 컨텍스트 윈도우가 입력만 담는 공간이 아니라는 사실이다. 시스템 지시, 개발자 지시, 사용자 입력, few-shot 예시, 대화 이력, 검색으로 가져온 문서, 그리고 모델이 생성할 답변까지 모두 같은 창을 함께 쓴다.1

이 사실을 놓치면 이상한 일이 생긴다. 팀은 "128K 모델이니까 충분하겠지"라고 생각하지만, 실제로는 시스템 프롬프트 1K, 정책 2K, 도구 설명 1K, 대화 이력 8K, 검색 문서 12K가 쌓여서 답변이 쓸 수 있는 공간이 생각보다 빠르게 줄어든다. 그러면 모델은 짧게 대답하거나, 중요한 지시를 놓치거나, 아예 요청을 거절한다. 긴 프롬프트가 곧 풍부한 문맥을 뜻하는 것 같지만, 운영에서는 종종 긴 프롬프트가 곧 비싼 요청, 느린 응답, 불안정한 품질을 뜻한다.

따라서 비용 관리는 "말을 줄여라"가 아니라 "무엇이 매 요청마다 꼭 다시 들어가야 하는가"를 묻는 일이다.

토큰 예산은 글자 수가 아니라 자리 배치의 문제다

실무에서 토큰 예산은 한 덩어리 숫자가 아니다. 예산은 여러 층이 서로 자리를 차지하는 방식으로 관리해야 한다. 특히 에이전트나 RAG 시스템에서는 프롬프트를 하나의 문단으로 보지 말고, 서로 역할이 다른 레이어들의 조합으로 봐야 한다.

가장 먼저 분리할 것은 정적 영역과 동적 영역이다. 정적 영역은 모든 사용자와 세션에서 거의 바뀌지 않는 내용이다. 예를 들면 에이전트의 정체성, 안전 규칙, 도구 사용 규칙, 출력 형식 계약이 여기에 들어간다. 반대로 동적 영역은 세션 상태, 사용자별 메모리, 검색 결과, 남은 예산, 현재 작업 정보처럼 요청마다 달라지는 내용이다. 이 둘의 경계를 명확히 잡아야 캐시를 활용하기 쉽고, 매 요청마다 불필요하게 같은 토큰을 다시 보내는 일을 줄일 수 있다.2

운영 관점에서 이 구분은 꽤 중요하다. 정적 영역이 자주 바뀌면 캐시 적중률이 낮아지고, 같은 정책을 반복 전송하느라 비용이 불어난다. 반대로 동적 정보를 정적 규칙 사이에 섞어 넣으면 테스트도 어려워진다. 프롬프트가 길어서 문제가 되는 경우보다, 프롬프트의 고정 부분과 가변 부분이 뒤섞여서 문제가 되는 경우가 더 많다.

컨텍스트 창은 넓을수록 좋다는 함정

컨텍스트 창이 길어졌다고 해서 무조건 프롬프트를 길게 써도 된다는 뜻은 아니다. 긴 창은 여유를 주지만, 규율 없는 확장을 정당화하지는 않는다. 모델은 너무 긴 입력에서 정보를 놓치거나, 중간의 중요 정보를 약하게 반영하거나, 초과 시 오류를 내거나 일부를 잘라낼 수 있다.1

여기서 기억해야 할 감각은 "최대치"와 "운영 가능 구간"은 다르다는 점이다. 최대 컨텍스트는 이론적인 상한선에 가깝다. 실제 서비스에서는 답변 길이, 안전 여유분, 예외 상황, 도구 호출 결과 재삽입까지 고려해야 한다. 쉽게 말해, 책상 위에 물건을 끝까지 쌓을 수 있다고 해서 그렇게 쌓는 것이 좋은 정리는 아닌 것과 같다. 마지막 공간은 늘 비상구처럼 남겨둬야 한다.

특히 긴 문서를 다루는 시스템에서는 모든 문서를 한 번에 넣는 버릇이 위험하다. 문서가 많을수록 모델이 더 똑똑해지는 것이 아니라, 더 많은 노이즈를 걸러야 하는 상황이 되기 쉽다. 그래서 고급 프롬프트 설계는 "얼마나 많이 넣을까"보다 "무엇을 빼도 되는가"를 더 자주 고민한다.

운영에서 쓰는 토큰 예산 설계법

토큰 예산을 관리하는 가장 실용적인 방법 중 하나는 레이어별 우선순위를 정하는 것이다. 예를 들어 시스템 규칙과 필수 안전 지시는 절대 빠지면 안 되는 필수 레이어로 두고, 대화 이력이나 오래된 참고 문서는 낮은 우선순위로 둔다. 예산을 초과하면 모든 레이어를 조금씩 잘라내는 대신, 낮은 우선순위 레이어부터 통째로 제거하는 편이 더 예측 가능하다. 절반만 잘린 시스템 프롬프트보다, 온전한 시스템 프롬프트와 아예 빠진 보조 문맥이 운영에서는 훨씬 낫다.3

이 원칙은 의외로 중요하다. 많은 팀이 "공평하게 조금씩 자르자"고 생각하지만, 프롬프트에서는 공평한 손실이 보통 최악의 손실이다. 중요한 규칙도 반쯤, 검색 문서도 반쯤, 이력도 반쯤 들어가면 모델은 어느 쪽에서도 확실한 신호를 받지 못한다.

실무에서는 다음처럼 예산을 나누면 생각이 쉬워진다.

레이어예산 예시원칙
시스템 규칙600필수, 축약만 허용
개발자 지시/정책400필수, 버전 관리 대상
도구 설명300필요 도구만 노출
사용자 입력300원문 유지 우선
최근 대화 이력1,000최근성 우선
검색 문맥2,000상위 근거만 포함
출력 여유분800미리 예약

이 표의 숫자는 예시일 뿐이지만, 중요한 건 마지막 줄이다. 출력 여유분을 미리 예약하지 않으면, 입력을 잔뜩 넣은 뒤 답변이 잘리는 상황이 생긴다. 시스템은 결국 "입력 예산"이 아니라 "입출력 총합 예산"으로 운영해야 한다.1

또 하나 조심할 점이 있다. 토큰 추정은 언어마다 다르게 어긋난다. 어떤 시스템은 간단한 추정을 위해 영어 기준으로 대략 4자당 1토큰 같은 근사치를 쓰는데, 이런 방식은 비용 통제용 대략치로는 유용해도 한국어·중국어·일본어 같은 CJK 텍스트에서는 오차가 커질 수 있다.3 한국어 서비스라면 "영어에서 맞던 감각"을 그대로 가져오면 안 된다.

지연 시간은 생성 속도보다 먼저, 프롬프트 처리 시간에서 생긴다

사용자는 보통 "답변이 늦다"고 말하지만, 엔지니어는 그 지연을 둘로 나눠 봐야 한다. 하나는 모델이 첫 토큰을 내놓기 전까지 프롬프트를 읽고 준비하는 시간이고, 다른 하나는 실제로 답을 생성하는 시간이다. 이 중 앞부분, 즉 프롬프트 처리 시간은 입력 토큰이 많을수록 늘어난다. 그래서 긴 프롬프트는 단순히 비싼 것이 아니라, 첫 응답이 시작되기까지의 체감 속도를 악화시킨다.4

이 점은 RAG에서 특히 두드러진다. 사용자의 질문은 짧은데, 검색 결과를 1,500토큰, 2,000토큰씩 붙여 넣는 순간 기다림의 대부분이 프롬프트 처리에서 발생할 수 있다.4 사용자는 모델이 오래 생각한다고 느끼지만, 실제로는 모델이 오래 읽고 있는 셈이다.

여기서 중요한 실무 판단은 이것이다. 출력이 짧은 작업이라면 더더욱 입력을 줄여야 한다. 50토큰짜리 분류 결과를 내기 위해 2,500토큰의 장황한 지시와 예시를 넣는 것은, 고급 레스토랑에서 컵라면을 끓이는 것과 비슷하다. 비싸고 느리지만 결과는 단순하다.

길게 생각하게 하면 항상 더 잘 답할까

꼭 그렇지는 않다. 최근 연구는 질문과 모델에 맞는 적정 토큰 예산을 찾는 접근이 비용 절감에 큰 도움이 될 수 있음을 보여준다. 예산을 점진적으로 줄여 가며 정답을 유지하는 최소 수준을 찾는 방식은, 불필요하게 긴 추론을 유도하는 관성을 줄여 준다. 한 연구에서는 정확도 저하 없이 평균 토큰 사용량을 크게 줄인 결과도 보고했다.5

이 말은 곧, "차근차근 아주 자세히 생각해"가 만능 주문이 아니라는 뜻이다. 어떤 문제는 짧은 추론으로 충분하고, 어떤 문제만 긴 추론이 필요하다. 모든 질문에 최대 추론 모드를 거는 것은 모든 직원에게 회의 3시간짜리 보고서를 요구하는 것과 같다. 복잡한 안건에는 필요하지만, 회의실 예약 확인에도 그 정도 절차를 쓰면 조직이 마비된다.

그러므로 고급 프롬프트 설계자는 추론의 품질만이 아니라 추론의 길이도 설계해야 한다.

프롬프트 압축은 좋은 약이지만 만병통치약은 아니다

프롬프트 압축은 분명 유용하다. 긴 입력에서 불필요한 부분을 덜어내면 비용과 지연을 함께 줄일 수 있다. 실제로 최근 연구는 적절한 조건에서 프롬프트 압축이 종단 간 속도를 의미 있게 개선할 수 있음을 보여준다.6 하지만 여기에는 단서가 붙는다. 압축 자체에도 전처리 비용이 있기 때문에, 프롬프트 길이·압축 비율·하드웨어 조건이 맞을 때만 이득이 크고, 그렇지 않으면 압축 오버헤드가 이득을 먹어 버릴 수 있다.6

즉, 압축은 "항상 켜 두는 기능"이 아니라 "손익분기점을 계산해야 하는 기능"이다. 문서가 아주 길고 반복적으로 비슷한 패턴이 들어오며, 압축 품질이 안정적일 때는 좋은 선택이 된다. 반대로 짧은 요청에까지 무조건 압축을 붙이면, 비용을 아끼겠다며 계산기부터 두드리다가 더 늦어지는 꼴이 된다.

모델 선택은 최고 성능 모델을 고르는 일이 아니라, 적절한 모델을 보내는 일이다

모델 선택도 같은 원리로 봐야 한다. 운영 시스템의 목표는 가장 똑똑한 모델을 매번 쓰는 것이 아니라, 요구 품질을 만족하는 가장 싼 조합을 찾는 것이다. 일반적으로 빠른 분류, 단순 추출, 짧은 요약, 포맷 변환 같은 일은 더 작고 저렴한 모델로도 충분한 경우가 많고, 다단계 추론이나 미묘한 판단, 긴 문맥 통합이 필요한 작업만 상위 모델로 올리는 편이 낫다.7

그래서 실무에서는 단일 모델보다 라우팅이나 캐스케이드가 자주 쓰인다. 먼저 저비용 모델로 처리하고, 자동 검사에서 실패하거나 복잡도가 높다고 판단될 때만 상위 모델로 승격하는 방식이다.8 이 구조의 장점은 분명하다. 대부분의 쉬운 요청은 싸고 빠르게 끝내고, 어려운 요청에만 비싼 추론을 쓴다.

여기서 중요한 것은 감으로 라우팅하지 않는 것이다. 어떤 요청을 어떤 모델로 보낼지는 반드시 평가셋과 운영 로그로 검증해야 한다. "이 정도는 미니 모델도 되겠지"라는 믿음은 대개 월말 청구서나 장애 회고에서 깨진다.

좋은 프롬프트의 기준을 다시 정의하자

이쯤 되면 좋은 프롬프트의 정의도 바뀌어야 한다. 좋은 프롬프트는 다음 네 조건을 함께 만족해야 한다.

  • 목표 품질을 안정적으로 낸다.

  • 정해진 비용 한도 안에서 돈다.

  • 지연 시간 목표를 넘기지 않는다.

  • 모델이 바뀌거나 트래픽이 늘어도 쉽게 유지된다.

이 네 가지 중 하나라도 빠지면 프롬프트는 예쁘게 쓰인 문장일 수는 있어도, 운영 가능한 설계는 아니다.

예를 들어 사내 정책 도우미를 만든다고 해보자. 이때 훌륭한 설계는 "모든 정책 문서를 다 넣고 가장 큰 모델을 부른다"가 아니다. 오히려 다음에 가깝다.

  • 정적 규칙은 짧고 강하게 유지한다.

  • 검색 문맥은 관련도 높은 일부만 넣는다.

  • 출력 길이를 제한하고 필요한 경우에만 확장한다.

  • 쉬운 정책 조회는 저비용 모델로 보내고, 복잡한 예외 판단만 상위 모델로 보낸다.

  • 매 요청의 토큰 수, TTFT, 실패율, 승격률을 로그로 남긴다.

이런 시스템은 화려해 보이지 않을 수 있다. 하지만 운영에서는 이런 시스템이 오래 살아남는다.

비용 최적화는 마지막 단계가 아니라 설계의 시작점이다

많은 팀이 기능을 먼저 만들고, 비용은 나중에 줄이려 한다. 그러나 프롬프트 시스템에서는 이 순서가 자주 비효율적이다. 한 번 길고 복잡한 프롬프트 스택에 의존하기 시작하면, 나중에 토큰을 줄이는 일은 생각보다 어렵다. 지시가 서로 얽혀 있고, 어떤 문장이 꼭 필요한지 아무도 모르게 되기 때문이다.

따라서 처음부터 이렇게 시작하는 편이 낫다.

첫째, 성공 기준과 함께 비용 상한과 지연 목표를 적는다. 둘째, 출력 여유분을 먼저 예약한다. 셋째, 정적 영역과 동적 영역을 분리한다. 넷째, 레이어별 우선순위를 정한다. 다섯째, 모델 라우팅 정책을 평가셋으로 검증한다.

이렇게 설계하면 비용 절감은 나중에 덤으로 얻는 효과가 아니라, 처음부터 품질과 함께 설계된 속성이 된다.

프롬프트는 결국 문장이 아니라 실행 비용을 가진 인터페이스다. 인터페이스가 길어질수록, 비싸질수록, 느려질수록, 시스템은 그만큼 둔해진다. 고급 프롬프트 엔지니어링의 다음 단계는 더 인상적인 문장을 쓰는 것이 아니다. 같은 품질을 더 적은 토큰으로, 더 짧은 기다림으로, 더 알맞은 모델에서 뽑아내는 구조를 만드는 일이다.

그때부터 프롬프트는 정말로 운영이 된다.

참고

1LLM Context Windows Explained: Token Budget Guide

2Prompt Architecture | ClaudePedia

3token-budget/ARCHITECTURE.md at main · protectyr-labs/token-budget · GitHub

4Prompt Optimization for Latency: Shorter Prompts = Faster Responses

5Token-Budget-Aware LLM Reasoning - arXiv.org

6Prompt Compression in the Wild: Measuring Latency, Rate Adherence, and Quality for Faster LLM Inference

7Practical Guide for Model Selection for Real-World Use Cases

8Cost-Quality Trade-Offs: Model Selection and Routing

책 목록

운영 가능한 프롬프트 아키텍처: 평가, RAG, 에이전트, 보안까지 (프롬프트 고급)

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기