왜 엔드투엔드 지연시간만으로는 원인을 특정할 수 없는가
콜봇 루프는 매 턴마다 최소 세 번의 API 호출을 순차 또는 스트리밍으로 거칩니다. STT(음성 인식)로 오디오를 텍스트로 바꾸고, LLM이 응답을 생성하고, TTS가 다시 오디오로 합성하는 세 서비스는 공급자·지연 특성·실패 모드가 모두 다릅니다. 턴 전체 지연시간 하나만 재면 이 셋 중 어디가 늦어졌는지 알 수 없고, 콜봇 루프의 관측은 LLM 호출 하나로 끝나는 텍스트 에이전트보다 한 단계 더 세분화돼야 합니다.
표준이 아직 음성 단계를 정의하지 않는다는 사실
OpenTelemetry GenAI 시맨틱 컨벤션은 추론(Inference)·임베딩·검색·도구 호출 스팬을 정의하지만, 이 스팬 타입들은 모두 여전히 Development 상태입니다. 오디오는 별도 스팬이 아니라 추론 스팬 안의 입력·출력 토큰 수(오디오 입력 토큰, 오디오 출력 토큰)로만 표현되고, STT·TTS·VAD·바지인 전용 스팬이나 속성은 표준에 없습니다. 콜봇 루프를 관측하려는 팀은 당분간 자체 스팬 스키마를 설계해야 한다는 뜻입니다.
설계에서 운영까지: 콜봇 루프 스테이지 어트리뷰션 구축 로드맵
관측 설계는 스팬 이름 체계를 코드보다 먼저 문서에 고정하는 데서 시작합니다. 통화 하나를 루트 스팬으로 두고 턴마다 자식 스팬을 열어 그 아래 STT·LLM·툴콜·TTS를 다시 자식으로 겹치는 4단 구조가, 표준이 없는 상황에서도 가장 다루기 쉬운 형태입니다. 목표 지표는 스팬 커버리지 100%(모든 턴이 4단계를 빠짐없이 남김), 원인 미상 실패율(어느 스테이지인지 특정 못한 실패) 5% 이하로 시작하면 충분합니다.
표준 스팬이 없다 보니 흔한 실수는 턴 전체 지연시간만 로그에 남기고 스테이지를 구분하지 않는 것입니다. 이 경우 LLM 응답이 느려진 회귀와 TTS 합성 큐잉이 밀린 장애가 대시보드에서 똑같은 "턴 지연 증가" 한 줄로 보이므로, 온콜 담당자가 재시도 대상을 잘못 고르기 쉽습니다. LLM 지연인데 STT를 재시작하면 원인은 그대로 남고 지연만 두 배로 늘어납니다.
스테이지를 구분한 뒤에도 복구 분기는 스테이지마다 달라야 합니다. STT 지연은 부분 전사(partial transcript) 캐시를 유지한 채 재연결하고, LLM 타임아웃은 캐시된 컨텍스트로 짧은 재시도 1회 후 사람에게 넘기며, TTS 실패는 이전 문장에 이어 붙이기보다 해당 턴 전체를 다시 합성하는 편이 자연스럽습니다. 하나의 재시도 정책을 전 구간에 적용하면 셋 중 최소 하나는 항상 과잉 대응이 됩니다.
배포 전에는 통화 시작부터 종료까지 스테이지별 스팬이 실제로 4단 구조를 채우는지 시나리오 테스트로 확인합니다. 전사 텍스트나 합성 원문이 스팬 속성에 그대로 남으면 개인정보가 로그 백엔드까지 흘러가므로, STT 출력과 LLM 입력을 담는 속성은 저장 전에 마스킹하거나 보존 기간이 짧은 저장소로 분리해야 합니다.
계측 자체가 지연을 더할 수 있다는 점도 체크리스트에 넣습니다. 스팬 생성과 속성 부착을 동기 경로가 아니라 비동기 익스포터로 흘려보내야, 관측을 켠 것 자체가 턴 지연을 늘리는 역설을 피할 수 있습니다.
운영 단계에서는 스테이지 쌍(예: STT→LLM, LLM→TTS)별 지연 분포를 주 단위로 집계해 어느 전이 구간이 p95를 끌어올리는지 좁혀 갑니다. 표준 스키마가 없는 만큼 자체 속성 이름과 스팬 구조는 버전 필드를 붙여 관리해야, 스키마를 바꿀 때 과거 트레이스와 섞여 집계가 깨지는 상황을 막을 수 있습니다.
스테이지 어트리뷰션이 자리 잡으면 다음 과제는 원인 미상 실패율을 계속 낮추는 것이 아니라, 특정 전이 구간에 자동 롤백이나 대체 공급자 전환 같은 대응을 스팬 태그 하나로 트리거하는 일입니다. 표준이 안정화되기 전까지는 이 자체 스키마가 콜봇 루프의 실질적인 관측 규격 역할을 합니다.
바로 쓰는 체크리스트
스팬 이름 체계를 콜(루트)-턴-스테이지 4단으로 먼저 고정하고, 스팬 커버리지 100%·원인 미상 실패율 5% 이하를 배포 게이트로 삼습니다. 스테이지별로 다른 복구 분기를 적용하고, 전사 텍스트가 담긴 속성은 마스킹하거나 짧은 보존 기간으로 분리하며, 계측 자체가 비동기 경로를 타는지 배포 전에 확인합니다. 표준 스키마가 안정화되기 전까지는 버전을 붙인 자체 스팬 구조가 콜봇 루프의 관측 규격을 대신합니다.