결론 먼저 — 5단계 × 실패 모드 × 복구 가능성
| 단계 | 핵심 동작 | 대표 실패 | 복구 |
|---|---|---|---|
| 1. 사용자 요청 | 인증·세션 토큰 발급 | 토큰 만료 / 권한 부족 | 즉시 재시도 / 안내 |
| 2. 라우팅 | 상담 자원에 연결 | 가용 자원 없음 | 대기열 / 다른 시간 안내 |
| 3. 음성 채널 수립 | WebRTC 협상 | NAT / 방화벽 / SDP | TURN fallback |
| 4. STT → LLM → TTS turn | 음성 turn 처리 | 모델 timeout / 끊김 | 짧은 안내 음성, 작은 모델 재시도 |
| 5. 종료 / 요약 / 기록 | 비동기 후처리 | 요약 작업 실패 | 비동기 재시도 큐 |
각 단계마다 “복구 불가” vs “재시도 가능”을 미리 정해두면, 데모를 짜는 순서가 자연스럽게 잡힌다.
단계 1 — 사용자 요청
대시보드 또는 공유 링크로 통화 시작 의도가 들어온다. 인증·권한 검증 후 세션 토큰 발급. 가장 가벼운 단계지만, 여기서 막히면 통화 자체가 시작되지 않는다.
- 실패 모드: 토큰 만료, 권한 부족
- 사용자 영향: 통화가 시작 안 된 상태이므로 단순. “다시 시도하세요” 수준 안내로 충분
- 복구 비용: 낮음 (UI 단계)
단계 2 — 라우팅
요청을 받아 어느 자원(사람 / AI)에 연결할지 결정. 단순한 1:1 데모에서는 이 단계가 거의 무료지만, 다중 자원으로 확장되면 부하 분산 정책이 들어간다.
- 실패 모드: 모든 자원이 사용 중 / 라우팅 결정 자체 timeout
- fallback: 대기열, 가장 단순한 AI 자원으로 회귀
단계 3 — 음성 채널 수립 (WebRTC)
여기서부터 본격적으로 어렵다. SDP Offer/Answer → ICE candidate 수집 → connectivity check → DTLS → SRTP. 6단계 세부는 [WebRTC] 연결의 6단계에서 다뤘다.
- 실패 모드: ICE 연결 실패, DTLS 인증서 시간 동기 실패, codec 미스
- 가장 흔한 실패: NAT / 방화벽으로 인한 ICE 실패 → TURN fallback 필수 (STUN/TURN 매트릭스)
- 이 단계 fallback이 없으면 그 자리에서 사용자 이탈로 직결됨
단계 4 — STT → LLM → TTS turn
한 turn = 한 번의 (사용자 발화 → 응답 음성). 흐름은 다음과 같다.
- STT가 partial → final transcript 생성
- LLM이 응답 토큰 스트리밍
- TTS가 음성 chunk 스트리밍
- 실패 모드: STT timeout, LLM 응답 지연, TTS 실패
- fallback: 짧은 “잠시만요” 음성, 더 작은 모델로 재시도, 최후엔 텍스트 표시
- 이 단계가 음성 상담 latency 거의 전부를 결정 (4구간 latency 분해 참고)
단계 5 — 종료 / 요약 · 기록
통화가 끝난 뒤의 작업. 사용자 입장에서는 이미 끝난 turn이지만, 데이터 활용 측면에서는 가장 중요한 단계 중 하나.
- 실패 모드: 요약 LLM 호출 실패, 기록 저장 실패
- fallback: 원시 transcript는 우선 저장, 요약은 비동기 재시도 큐로 위임
- 복구 시간이 분~시간 단위여도 무방 (eventual consistency 허용)
의사결정 기준 — fallback을 어디까지 넣을 것인가
데모와 실제 시스템에서 가장 큰 차이는 단계 3·4의 fallback 두께다.
- 학습용 데모: 1번부터 5번까지 행복 경로만 있어도 사용자 영향 적음
- 작은 PoC: 단계 3에서 TURN fallback만 보강
- 본격 시스템: 단계 3·4 모두 fallback + 단계 5는 비동기 큐 위임
“먼저 행복 경로를 끝까지 잇고, 그 다음 가장 빈번한 실패부터 메운다”는 순서가 자연스럽다.
개인 메모 — 행복 경로를 먼저 잇는 이유
처음 데모를 만들 때, 모든 단계의 모든 실패 모드를 미리 고민하다가 시작 자체가 늦어진 적이 있다. 1단계에서 토큰이 못 들어오면? 3단계에서 NAT 통과가 안 되면? 4단계에서 LLM이 timeout이면? 이런 순서로 생각하면 머리가 굳고, 어느 단계도 끝까지 흘러가지 않는다.
행복 경로를 한 번 끝까지 흘려보내고 데모가 동작하는 순간을 만든 다음, 그제서야 어떤 실패를 어디서 처리할지 결정하는 게 훨씬 빠르다는 걸 직접 짜보면서 느꼈다. 5단계 매트릭스 자체가 그 결정을 빠르게 도와주는 도구가 되고, 처음부터 매트릭스를 채우려고 하기보다 행복 경로를 잇고 매트릭스를 한 칸씩 채우는 순서가 잘 맞았다.
답글 남기기