5초에서 0.7초로: 프로덕션‑Ready Voice AI 에이전트를 구축한 방법 (Latency를 7배 감소)
Source: Dev.to
바쁜 개발자를 위한 요약
생산 환경에 바로 적용 가능한 음성 AI 에이전트를 5 초 이상의 지연에서 1 초 미만의 응답으로 8단계에 걸친 체계적인 최적화를 통해 만들었습니다. 이 과정은 단순히 코드를 고치는 것이 아니라, 병목 현상이 어디에 숨겨져 있는지 파악하고 간단한 변화가 얼마나 큰 영향을 미칠 수 있는지를 이해하는 것이었습니다.
스택
- LiveKit Agents SDK – 실시간 WebRTC 인프라
- OpenAI – STT (Whisper → GPT‑4o‑mini‑transcribe) & LLM (GPT‑4o → GPT‑4o‑mini)
- ElevenLabs – 텍스트‑투‑스피치 합성
- Python 3.11 – 구현 언어
결과
- 🚀 7배 빠름 – 전체 지연: 5.5 s → 0.7 s (최고 사례)
- ⚡ 3‑8배 LLM 개선 – TTFT: 4.7 s → 0.4 s
- 💨 98 % STT 개선 – 이후 전사 시간: 2.1 s → 0.026 s (거의 즉시!)
- 💰 10배 비용 절감 – GPT‑4o에서 GPT‑4o‑mini로 전환
- 🧠 컨텍스트 관리 – 자동 가지치기로 무한 성장 방지
- 🔧 MCP 통합 – 음성 에이전트가 이제 음성 명령으로 문서 작업을 수행 가능
핵심 인사이트: 최적화는 반복적인 작업입니다. 각 수정이 다음 병목을 드러냅니다. 메트릭을 기반으로 시작하고, 데이터에 따라 최적화하며, “명백한” 변경을 두려워하지 마세요—대부분 가장 큰 영향을 줍니다.
도전 과제: 로봇처럼 느껴지지 않는 음성 에이전트 만들기
초기 구현은 느릿느릿했습니다: 사용자가 질문을 하면 5 초 이상을 기다려야 했고, 로봇 같은 응답을 받았습니다. 기능은 했지만 경험이 자연스럽지는 않았습니다.
인간 기준
연구에 따르면 파트너가 말을 마친 뒤 평균 인간 반응 시간은 236 ms이며, 표준 편차는 ≈ 520 ms입니다. 대부분의 자연스러운 반응은 ≈ 750 ms 이내에 이루어집니다.
목표
- 실시간 음성 이해
- 빠르고 지능적인 LLM 응답
- 자연스러운 음성 출력
- 중단 상황에 대한 우아한 처리
- 지속적인 최적화 메트릭
목표 지연: ≈ 540 ms (음성 에이전트 파이프라인의 이론적 최선 사례, 인간 평균의 한 표준 편차 이내).

아키텍처: 파이프라인 vs. 엔드‑투‑엔드
저는 파이프라인 접근법(STT → LLM → TTS)을 음성‑투‑음성 모델보다 선택했습니다.
파이프라인을 선택한 이유
- 세밀한 제어 – 각 구성 요소를 독립적으로 최적화
- 유연성 – 단계별로 모델/제공자를 교체 가능
- 디버깅 – 중간 출력(전사, LLM 응답) 확인 가능
- 비용 최적화 – 요구사항에 따라 다른 모델 사용
- 프로덕션 준비 – 실제 서비스에 더 적합
- 세분화된 트레이드‑오프 – STT는 정확도, LLM은 속도, TTS는 품질에 맞게 최적화
트레이드‑오프: 복잡도가 증가하지만, 프로덕션 사용 사례에서는 충분히 가치가 있습니다.
실용적인 예시
| 사용 사례 | 지연 우선순위 |
|---|---|
| 레스토랑 예약 | LLM 추론 |
| 의료 트리아지 | STT 정확도 |
다양한 애플리케이션이 서로 다른 지연 예산을 갖는 경우 이 유연성이 핵심입니다.

Phase 1: 초기 구현 (베이스라인)
초기 스택
| 구성 요소 | 모델 / 서비스 |
|---|---|
| STT | OpenAI Whisper‑1 (배치) |
| LLM | GPT‑4o (고품질, 느림) |
| TTS | ElevenLabs |
| VAD | Silero (경량, 오픈‑소스) |
| 인프라 | LiveKit Cloud (WebRTC) |
왜 LiveKit인가?
LiveKit의 전 세계에 분산된 메시는 직접 피어‑투‑피어 연결 대비 20‑50 % 네트워크 지연을 줄여줍니다. 실시간 네트워크 측정, 자동 오디오 압축(97 % 용량 감소), 패킷 타임스탬프, 지속적인 상태 연결 등 대화형 에이전트에 필수적인 기능을 제공합니다.
초기 성능
- 전체 지연: 3.9‑5.5 s (인간 평균보다 15‑20배 느림)
- LLM TTFT: 1.0‑4.7 s (전체 지연의 50‑85 %) ⚠️
- STT 소요 시간: 0.5‑2.5 s (전체 지연의 30‑40 %)
- TTS TTFB: 0.2‑0.3 s (병목 아님)
- VAD: ≈ 20 ms (거의 무시 가능)
LLM이 주요 병목이었으며, 단일 느린 응답(4.7 s)이 상호작용 흐름을 깨뜨렸습니다.

Phase 2: 모든 것을 바꾼 “명백한” 수정
발견
모든 응답에 GPT‑4o를 사용하는 것은 과도했습니다. GPT‑4o‑mini는 품질의 ~80 %를 유지하면서 비용은 10 % 수준이며 3‑8배 빠릅니다.
변경 내용
# Before
llm = openai.LLM(model="gpt-4o")
# After
llm = openai.LLM(model="gpt-4o-mini")
결과
| 메트릭 | 변경 전 | 변경 후 | 개선 정도 |
|---|---|---|---|
| LLM TTFT | 1.0‑4.7 s | 0.36‑0.59 s | 3‑8배 빠름 |
| 토큰/초 | 4.5‑17.7 | 11.3‑32.3 | 2‑4배 빠름 |
| 전체 지연 | 2.3‑3.0 s | 1.2‑1.5 s (≈ 1.6‑2×) | 1.6‑2배 빠름 |
| 비용 | — | 10배 절감 | — |
| 일관성 | 가변적 | 훨씬 예측 가능함 | — |
교훈: “명백한” 수정이 가장 큰 영향을 줄 수 있습니다. 먼저 측정하고 데이터를 기반으로 최적화하세요.

Phase 3: 실시간 STT 스트리밍 구현
(내용은 스트리밍 구현, 배치 제거 및 추가 지연 감소와 함께 계속됩니다.)