음성 지문 없이 화자 식별하기
최종 수정일: 9시간 전
화자별 텍스트 시그니처(text signature)가 전체 정확도를 40%대 초반에서 58%까지(이력이 있는 화자는 83%까지) 끌어올린 과정과, 그 과정에서 데이터로 폐기한 그럴듯한 아이디어 10가지에 대한 이야기입니다.

한 문단 요약
회의록에서 누가 무엇을 말했는지가 각 요약 항목과 액션 아이템의 주인을 정합니다. 우리는 화자를 목소리가 아니라 그가 실제로 사용한 단어로 식별합니다.
진짜 벽은 데이터 부족이 아니라 구분하기 어려울 만큼 서로 닮은 동료들이었습니다. 해법은 화자별 텍스트 시그니처(지난 발언에서 만든 어휘 지문)였고, 이것이 전체 정확도를 +15pt(58%) 끌어올렸고, 이력이 있는 화자에서는 83%까지 올라갔습니다.
테이블에 올린 아이디어는 18개였습니다. 7개는 반영하고 10개는 폐기했으며, 1개는 다음 과제로 남겼습니다. 임베딩, 더 큰 모델, 개인 메모리 — 어느 것도 도움이 되지 않았습니다. 측정이 노이즈가 출시되는 것을 막았습니다.
01 · 문제 — 세 사람이 한 사람이 된 날
화자 식별을 돌렸는데, 서로 다른 세 명의 화자에게 같은 신원이 부여됐습니다. 각각 80%를 넘는 확신과 함께였습니다. 회의를 연 사람은 명단에 아예 없었습니다.

이 한 장면에 문제의 전부가 담겨 있습니다. 모델은 틀렸을 때 오히려 더 확신하는 경향을 보였고, 우리는 오랫동안 그 정확도를 감으로 판단해왔습니다. 이 글은 그 감을 숫자로 바꾼 이야기입니다.
02 · 왜 어려운가 — 성문이라는 지름길을 택하지 않은 이유
쉬운 길은 성문입니다. 목소리를 등록해 두고 대조하면 됩니다. 다만 우리는 그 길을 택하지 않았습니다. 회의는 대부분 즉흥적으로, 말로 시작되고, 사전 등록도 참석자 명단도 없습니다. 남는 신호는 하나뿐입니다. 사람들이 실제로 한 말입니다.
그래서 고치기 전에 왜 틀리는지를 먼저 진단했습니다. 그리고 통념은 맞지 않았습니다.
문제는 사람을 찾는 일이 아니었습니다. 닮은 사람들 사이에서 한 사람을 구별해내는 일이었습니다.
동료들은 같은 프로젝트를 같은 용어로 이야기합니다. 그래서 병목은 커버리지가 아니라 구별이었고, 모델은 확신에 차서 다른 동료를 고르곤 했습니다.
한 사용자의 라벨 28건을 진단한 결과, 32%가 정답, 46%는 명단 속 동료와 혼동(혼동 사례의 100%가 명단 구성원), 21%는 이름을 내놓지 못했으며, 나머지 소수는 본인 오인이었습니다. 오류는 명단 밖의 엉뚱한 값이 거의 아니었고, 동료와의 확신 있는 혼동 아니면 포기였습니다. 커버리지가 가장 좋았던 사용자가 오히려 가장 많이 틀렸습니다.
신호가 없는 게 아니었습니다. 사람들이 구분하기엔 너무 닮아 있었을 뿐입니다. 방향은 정해졌습니다. 더 많은 지식이 아니라, 더 개인적인 언어입니다.
03 · 우리가 찾은 신호 — 사람을 가른 것은 각자의 언어였다
우리가 찾은 신호는 개인의 언어였습니다. 동료들은 의미로는 비슷했지만 어휘로는 달랐습니다. 한 사람을 다른 사람과 가른 것은 어휘의 발자국이었습니다. 무엇을 이야기했는가가 아니라, 어떤 단어를 즐겨 쓰는가였습니다. 파이프라인은 이 발견 위에서 세 단계로 흘러갑니다. 시그니처(어휘) → 스탠스(말하는 방식) → 앵커 게이트(상식 제약). 이 신호를 채울 이력이 아예 없는 화자에게만 구조적 맥락(명단, 역할 — 뒤에 나올 온톨로지)이 개입합니다.
① 텍스트 시그니처: 목소리 대신 어휘의 지문
이 프로젝트의 심장입니다. 과거 회의에서 확정 라벨이 붙은 발언을 화자별로 모아, 그 사람의 고유한 어휘를 TF-IDF로 가중한 벡터로 만듭니다. 흔한 단어는 눌리고, 그 사람만 쓰는 프로젝트 이름과 전문 용어, 말버릇은 도드라집니다. 일종의 '텍스트 지문'입니다. 새 회의의 익명 발언을 가장 가까운 지문에 대응시킵니다.
핵심은 이렇습니다. 이전 방식은 모든 사람을 서로 닮은 역할 요약 프로필과 맞추어 보았기 때문에 실패했습니다. 시그니처는 각자가 실제로 사용해온 언어와 대조합니다. 우리가 이야기해 왔던 '출처 기반 식별' 아이디어를 제대로 구현한 것입니다.
그 위에 무엇을 얹기 전에, 신호가 강하다는 것을 먼저 확인했습니다. 튜닝 없이 시그니처만으로도 이력이 있는 화자에서 정확도 73%에 이미 닿았습니다. 당시 식별기의 약 37%의 두 배입니다(이후 두 번의 개선으로 82%까지 오릅니다. 05의 상승 과정 참조). 그리고 참석자 명단 없이도(오픈셋) 무너지지 않습니다. 사전 입력이 전혀 필요 없다는 뜻이고, 입력을 줄이자는 우리 방향과도 맞습니다.
② 스탠스: 무엇을 말하는가가 아니라, 어떻게 말하는가
어휘가 놓치는 축이 하나 더 있습니다. 대화의 태도입니다. 누가 지시하고 요청하는지('해주실 수 있을까요', '이건 어떨까요?'), 누가 보고하고 수용하는지('완료했습니다', '알겠습니다'). 같은 말을 해도 사람마다 다르고, 이력이 얇은 곳에서 가장 효과가 큽니다. 이 피처가 이력 있는 화자의 정확도를 82%까지 밀어 올렸습니다.
③ 앵커 게이트: 상식으로 걸러내기
마지막으로, 정밀도가 높은 텍스트 단서(앵커)가 결과를 다시 손봅니다. 자기소개는 확정 신호로 올리고, 이름으로 불리거나 존칭이 붙은 경우처럼 반대 단서는 기각하며, 뒷받침 단서가 없는 추정은 등급을 낮춥니다. 앞에서 진단한 과신에 대한 직접적인 처방입니다. 근거 없는 추정은 이제 낮은 확신으로 내려갑니다. (프롬프트 자체로 확신도를 재조정하는 방법도 시도했지만 도움이 되지 않아 되돌렸습니다. 06의 장부 참고.)
또한 한 사람은 한 회의에서 최대 한 번이라는 제약을 강제합니다. 서두의 '세 사람이 한 사람'이 되는 실패를 막는 게이트입니다. 다만 이 규칙은 만능 해결책이 아니라 예외 상황을 중심으로 설계했습니다. 중복 제거는 이름이 아니라 화자 ID 단위로 하기 때문에 진짜 동명이인은 살아남고, 등급이 낮아진 후보는 버리지 않고 LLM 폴백으로 넘겨 한 번 더 봅니다. 한 사람이 여러 구간으로 쪼개지는 과분할은 이 규칙이 아니라 화자 수 상한으로 따로 처리합니다.
04 · 측정의 원칙 — 감을 백테스트로 바꾸다
어떤 아이디어든 프로덕션으로 옮기기 전에, 정답 라벨이 이미 있는 회의들에 대해 식별을 다시 돌려보는 백테스트 하네스를 만들었습니다. 명단이 온전한 전체 조건(프로덕션과 동일)과, 그 회의의 참석자를 명단에서 뺀 콜드스타트 조건을 함께 평가합니다. 이 하네스가 이후 모든 가설의 심판이 되었습니다.
규모부터 밝힙니다. 하네스가 측정하는 범위는 사용자 5명, 회의 22~30건이고 1~3회 반복합니다. 큰 말뭉치가 아니므로 수치는 그 규모 안에서 읽어야 합니다. 용어 둘을 여기서 고정합니다. 웜(warm)은 확정 라벨이 붙은 과거 발언이 있어 시그니처가 있는 화자, 콜드(cold)는 그런 이력이 전혀 없는 첫 등장 화자입니다. 앞의 콜드스타트 조건이 콜드 상황을 모사합니다.
주 지표는 하나로 고정했습니다. 백테스트의 전체 정확도(프로덕션 정책 아래 모든 화자 라벨의 평균)입니다. 이후 나오는 정밀도, 웜, 퍼센트포인트 수치는 모두 그 주 지표를 뒷받치는 부분 조각입니다. 조각을 읽을 때는 그것이 무엇의 부분집합인지를 함께 읽어야 합니다.
출발점은 기대보다 다소 낮았습니다.

측정은 그럴듯한 답 세 가지를 바로 탈락시켰습니다. 회의를 더 모으는 것은 정확도를 그대로 두었고(37.9%→37.3%), 개인 메모리 주입은 0.0pt를 더했고, 더 큰 모델은 명단 밖 사람에 대해 오히려 더 확신에 차서 틀렸습니다(비용 상한에도 걸렸습니다). 쉬운 답들이 걷혀 나가자 남은 길은 하나였습니다. 진단이 이미 가리키고 있던 것, 구별입니다.
여기서 규칙 하나가 생겼습니다. 숫자로 확인되지 않은 개선은 개선이라 부르기 어렵습니다. 그때부터 모든 아이디어는 출시 전에 백테스트를 통과해야 했습니다.
05 · 정확도의 상승 — 원시 모델에서 시그니처까지
방향(구별)이 도구(시그니처)를 만나자 정확도가 뛰었습니다. LLM만 쓰던 식별기를 시그니처 우선으로 바꾼 결과입니다(같은 평가 셋, 같은 정책, 3회 반복).


어휘 가중은 누구나 쓰는 군말과 맞장구를 걷어내고 특징적인 어휘만 남깁니다. 대화의 태도는 지시와 보고를 가르는 축을 더해, 이력이 적은 화자까지 끌어올립니다. 둘 다 추가 API 호출이 0이고, 모든 개선이 서버 쪽에서 이루어지므로 앱을 다시 빌드하지 않고도 웹과 모바일이 동시에 혜택을 받았습니다.

06 · 가설 장부 — 남긴 것보다 버린 것이 많았다
이 표에서 이야기는 솔직해집니다. 18개의 아이디어를 다뤄서 7개는 반영하고 10개는 데이터로 폐기했으며, 마지막 하나인 온톨로지 보강은 다음 레버로 대기 중입니다. 감에 의존했다면 그중 몇 개는 그대로 출시됐을 것입니다.
반영


표를 읽는 한 가지 방법입니다. 반영했다는 것이 곧 정확도 레버라는 뜻은 아닙니다. 서두의 버그를 없앤 사람 유일성 수정은 전체 정확도를 거의 움직이지 못했습니다. 측정 노이즈 범위 안에서 제자리였습니다(비교군도 같은 폭으로 흔들렸습니다). 대신 움직인 것은 이렇습니다. 본인 외 예측의 정밀도가 54.8%에서 57.3%로, 과신 오류가 13건에서 10건으로 줄었고, 무엇보다 신뢰를 깨뜨리는 '세 화자, 한 사람' 실패가 사라졌습니다. 정확도 숫자가 아니라 정확도의 정직함을 고친 것입니다. 이 구분은 하나의 주 지표 위에 몇 개의 부분 조각을 겹쳐 볼 때만 보입니다.
폐기한 실험 둘이 가장 많은 것을 가르쳐 주었습니다. 의미 임베딩은 직관과 반대로 움직였습니다. 문장을 '의미'로 임베딩하면 사람이 더 잘 갈릴 것이라고 가정했지만, 팀 안에서의 구별은 일반적인 의미가 아니라 각자의 특징적인 어휘에 달려 있었습니다. 의미로 평탄화하자 바로 그 개성이 지워졌습니다(−10~−15pt, 오픈-웜 −11pt). 그리고 이번에는 그 이유를 직접 관찰했습니다. 서로 다른 화자 사이의 회의 간 코사인을 재보니 TF-IDF는 0.073으로 떨어뜨려 놓았는데 임베딩은 0.806까지 끌어당겼습니다. 우리 데이터에서 같은 도메인의 동료들은 너무 비슷하게 표현되고 있었습니다. 그 결과 임베딩의 화자 분리도(같은 화자 − 다른 화자)는 0.032로, TF-IDF의 0.054보다 좁았습니다. 일반론이 아니라 우리 데이터에 대한 관찰입니다. TF-IDF의 어휘적 구체성은 한계가 아니라 강점이었습니다.

콜드스타트 자기소개 부트스트랩도 마찬가지였습니다. 첫 회의에서는 사람들이 자기소개를 한다는 가정이었지만, 반복되는 회의에는 자기소개가 없고 말로 시작된 회의에는 참석자 명단이 없습니다. 실제 노트의 25%에서 발동했지만 쓸 만한 배정은 0건이었고, 역할 명사와 파싱 노이즈만 올라왔습니다. 결론은 이렇습니다. 콜드스타트에서 전사문 파싱은 적절한 도구가 아니었습니다.
측정의 한계도 함께 밝힙니다. 이 수치들은 사용자 5명, 회의 22~30건, 1~3회 반복의 백테스트에서 나왔습니다. 정밀도나 오적용 건수처럼 집계된 값은 실행마다 안정적이지만, '13→10'처럼 한 자릿수 변화는 확정된 신호가 아니라 방향으로 읽어야 합니다. 측정이 자산이라면, 그 분산을 함께 적는 것도 논지의 일부입니다.
07 · 배운 것 — 측정이 막아낸 열 번의 출시
폐기한 아이디어는 모두 '그럴듯했다'. 임베딩, 더 큰 모델, 개인 메모리, 앙상블. 감으로 갔다면 적어도 몇 개는 출시했을 것이고, 정확도는 조용히 떨어졌을 것입니다. 측정이 없었다면 우리는 우리 자신의 노이즈를 그대로 출시했을지도 모릅니다.
그리고 진짜 레버는 새롭고 화려한 기법이 아니라, 진단이 가장 먼저 가리킨 사실이었습니다. 커버리지가 아니라 팀 안에서의 구별입니다. 목소리를 내려놓고 각자의 언어를 신호로 쓰자, 40% 초반이던 원시 LLM이 58%가 되었습니다(웜은 83%).
끝난 이야기가 아닙니다. 축이 둘 남았습니다. 하나는 첫 등장 화자(콜드스타트, 장부의 다음 레버)입니다. 시그니처는 이력이 있어야 작동합니다. 이력이 없는 첫 회의에서는 온톨로지가 그 빈자리를 메웁니다. 조직도와 역할, 도메인 지식이 역할 기반 제약을 걸어('이건 FE 리드 같다', '이 결정은 팀 리드만 한다') 시그니처가 침묵해도 후보를 좁힙니다. 다른 하나는 확신도 보정입니다. 앵커 게이트 이후, 0.8 이상의 확신으로 제시된 본인 외 예측의 실제 정확도는 14%에서 75%로 올랐습니다. 정직함은 되찾았지만 확신도를 더 정밀하게 조율하는 일은 아직 열려 있습니다(프롬프트 재조정은 실패했으므로 다음 시도는 다른 접근이 필요합니다).
이 사례의 교훈은 한 줄로 남습니다. 추측보다 측정이 먼저입니다. 그리고 측정 하네스는 기능이 아니라 자산입니다. 한 번 만들어 두면 이후의 모든 가설이 같은 잣대로 판정됩니다. 돌아보면 우리가 만든 가장 중요한 것은 화자 식별기가 아니었습니다. 어떤 아이디어가 진짜 신호인지 가려낼 수 있을 때까지 화자 식별을 계속 틀릴 수 있게 해준 측정 하네스였습니다.



댓글