LLM이 답을 빨리 시작하고 빨리 끝내게 만드는 방법 모음으로, 첫 글자가 나오기까지의 시간과 답을 끝내기까지의 시간을 줄인다. 채팅, 음성 비서, 자동완성처럼 사용자가 화면 앞에서 답을 기다리는 서비스라면 꼭 챙겨야 한다.
기다리는 시간은 아래처럼 나눠서 본다.
| 지표 | 뜻 | 사용자가 느끼는 것 | 주로 줄이는 방법 |
|---|---|---|---|
| TTFT | 요청 후 첫 토큰까지 걸리는 시간 | 반응이 늦다 | 프롬프트 캐싱, 짧은 입력 |
| TPOT | 토큰 하나를 만드는 간격 | 글이 천천히 나온다 | 작은 모델, 추측적 디코딩 |
| 전체 시간 | TTFT + 출력 길이 × TPOT | 끝날 때까지 기다린다 | 출력 줄이기, 요청 수 줄이기 |
모델을 직접 돌리지 않아도 API를 부르는 쪽에서 할 수 있는 일이 많다. 전체 시간은 출력 길이에 비례해서 늘어나므로, 출력을 줄이는 것부터 하는 게 효과가 크다.
| 방법 | 어떻게 | 효과 |
|---|---|---|
| 스트리밍 | stream 옵션 켜기 | 첫 글자가 바로 보여 덜 기다리는 느낌 |
| 출력 줄이기 | "세 줄로" 지시, 최대 토큰 제한 | 전체 시간이 크게 준다 |
| 프롬프트 캐싱 | 고정된 시스템 프롬프트·문서를 앞에 두기 | 반복 요청의 TTFT가 준다 |
| 작은 모델 | 분류·추출은 경량 모델에 맡기기 | 토큰 생성 자체가 빨라진다 |
| 요청 합치기·병렬화 | 서로 상관없는 단계는 동시에 호출하기 | 주고받는 횟수가 준다 |
vLLM 같은 서빙 엔진으로 모델을 직접 띄운다면 서버 쪽 기법도 쓸 수 있다. KV 캐시는 이미 계산한 앞부분을 다시 계산하지 않게 하고, Flash Attention은 긴 프롬프트를 빨리 처리한다.
추측적 디코딩은 작은 모델이 토큰 여러 개를 먼저 써 두면 큰 모델이 한꺼번에 검사하는 방식이라 TPOT가 준다. 양자화로 모델을 가볍게 만들거나, 사용자와 가까운 지역에 서버를 두어 네트워크 왕복 시간을 줄이는 방법도 있다.
요청을 크게 묶어 처리하면 서버가 한 번에 많이 처리하지만, 요청 하나하나는 느려진다. 그래서 상황마다 무엇을 먼저 챙길지 정해야 한다.
| 상황 | 먼저 볼 것 |
|---|---|
| 채팅, 음성, 자동완성 | TTFT |
| 에이전트의 중간 단계 | 전체 시간 |
| 밤새 도는 대량 요약 | 처리량과 비용 |
작은 모델로 바꾸거나 출력을 줄이면 품질이 떨어질 수 있으니, 바꾸기 전과 후의 답을 비교해 본다. 프롬프트 캐싱은 앞부분이 매번 같아야 적용되므로 날짜나 사용자 이름처럼 바뀌는 값은 뒤에 둔다.
감으로 고치지 말고 TTFT와 전체 시간을 따로 기록해서 어디가 느린지부터 찾는다. 정해진 규칙으로 처리할 수 있는 단계는 LLM 대신 일반 코드로 바꾸는 것이 가장 빠르다.
가장 흔한 건 스트리밍과 프롬프트 캐싱을 기본으로 켜 두는 방식이다. 그 위에 서비스 성격에 맞춰 출력 길이, 모델 크기, 호출 순서를 조절한다.
| 어디서 | 어떻게 쓰나 |
|---|---|
| 채팅 서비스 | 스트리밍을 켜고 고정된 시스템 프롬프트를 캐싱해 첫 글자를 바로 보여준다 |
| 음성 비서 | 짧게 답하라고 지시하고, 첫 문장이 나오는 대로 음성으로 바꿔 읽기 시작한다 |
| 코드 자동완성 | 작은 모델과 짧은 출력으로 타이핑하는 동안 제안이 바로 뜨게 한다 |
| 에이전트 | 상관없는 도구 호출은 동시에 보내고, 단순한 단계는 경량 모델이나 일반 코드로 넘긴다 |