중단 대신 저하: 약 120개의 기능 플래그 뒤에서 음성 파이프라인 운영하기

실시간 통화에서는 예외를 던지고 끝낼 수가 없습니다. 무언가 불확실할 때 기능을 한 단계 낮추고 통화를 이어가는 쪽을 기본값으로 두었습니다.

창가에 겹쳐 드리운 얇은 커튼을 통과하는 햇빛. 바깥층은 밝고 안쪽으로 갈수록 부드러워지지만 어느 층에서도 빛은 남아 있다.

웹 요청은 실패하면 다시 부르면 됩니다. 통화는 그렇지 않습니다. 상대는 지금 수화기를 들고 있고, 파이프라인 어딘가가 예외를 던지는 순간 그 사람에게 남는 것은 침묵입니다.

그래서 저희는 음성 파이프라인을 "정상 동작 아니면 오류"가 아니라, 여러 단계로 낮아질 수 있는 시스템으로 설계했습니다.

플래그는 스위치가 아니라 등급입니다

파이프라인에는 약 120개의 기능 플래그가 있습니다. 대부분은 기능을 켜고 끄기 위한 것이 아니라, 상황이 나빠졌을 때 어느 단계까지 내려갈지를 정하기 위한 것입니다.

원칙은 단순합니다. 위험한 경로는 기본적으로 꺼져 있습니다. 새 기능은 켜진 상태로 태어나지 않고, 꺼진 상태로 들어와 관측 가능해진 뒤에 올라갑니다.

벤더가 흔들려도 통화는 이어집니다

음성 합성은 외부 벤더에 의존합니다. 한 벤더의 품질이 통화 도중에 떨어지면, 남은 통화 구간 동안 다른 벤더로 고정 전환합니다. 매 문장마다 왔다 갔다 하면 목소리가 바뀌는 것이 더 이상하기 때문에, 한 번 넘어가면 그 통화에서는 계속 그쪽을 씁니다.

모르면 아니오

가장 중요한 규칙은 이것입니다. 확인되지 않은 상태는 낙관적으로 해석하지 않습니다.

어떤 상태를 검증할 수 없으면 그 경로는 페일클로즈로 닫힙니다. 사람이 없는 자동 실행은 자기 자신에게 확인을 받아 통과할 수 없습니다. 정리 작업은 항상 드라이런이 먼저입니다.

이 규칙들은 하나하나 실제로 겪은 실패에서 나왔습니다. 일반론으로 만든 정책이 아니라, 한 번씩 크게 데인 자리마다 박아 둔 못에 가깝습니다.

그래서 무엇을 주장하지 않는가

이 글은 "저희 파이프라인은 안 죽습니다"라는 이야기가 아닙니다. 죽습니다. 다만 죽는 방식을 고르려고 했습니다. 통화를 끊는 것보다는 기능을 낮추는 편이, 잘못된 답을 자신 있게 말하는 것보다는 모른다고 말하는 편이 낫다고 보았습니다.

이 글은 작성 시점의 구현 상태를 설명합니다. 수치는 저장소에서 직접 센 값이며, 공개 벤치마크나 성능 보증이 아닙니다.