AMD 라벨링 / Supervised 파이프라인 가이드
자체 AMD(Answering Machine Detection)를 상용 수준으로 고도화하기 위한 라벨 데이터 수집 · 저장 · 검수 · 데이터셋 구축 전 과정을 정리한 운영 문서입니다. 핵심 원칙은 상담사 최소 개입 — 라벨링을 업무 부담이 아닌 예외 신고로 설계했습니다.
자체 AMD를 상용 솔루션 수준으로 끌어올리려면 우리 환경(국내 통신사 컬러링 · 안내멘트 · 음성사서함 · 무응답)에서 직접 수집한 라벨 데이터가 필수입니다. 외부 데이터셋만으로는 국내 ARS/컬러링 특성을 충분히 커버할 수 없습니다.
그래서 운영 구조 자체를 supervised(상담사 확인) 라벨 수집기로 만들었습니다. 단, 핵심 제약은 현장 부담 제로화입니다. 하루 수백 통을 처리하는 상담사에게 매 콜 분류를 시키면 라벨 노가다가 되어 데이터 품질도, 상담 품질도 망가집니다.
상담사 화면의 라벨 기능은 "분류 도구"가 아니라 "예외 신고 장치"입니다.
기본값 = 무입력 = 자동 확정. 상담사는 "AMD가 사람이라며 연결했는데 실제로는 기계였다" 싶을 때만 단 한 번 개입합니다.
모든 콜의 오디오와 AMD 판정은 통화 종료 시 자동으로 라벨에 기록됩니다(implicit). 상담사 개입은 이 자동 라벨을 정정(explicit)하는 용도로만 쓰이며, 세부 분류는 LLM 자동 QA(DeepSeek/TCM)가 담당합니다.
통화가 종료되면 모든 콜의 녹음 오디오 + AMD 판정이 상담사 개입 없이 자동으로 라벨에 기록됩니다. 상담사 화면에 추가 UI가 뜨는 경우는 단 하나입니다.
사람으로 연결된 콜만 발신/통화 카드 안에 슬림 바가 나타납니다. 기계로 판정된 콜(음성사서함 · 안내 · 컬러링 · 무응답)은 상담사 화면에 버튼이 뜨지 않고 implicit 자동 저장됩니다 — 세부 분류는 LLM 자동 QA(DeepSeek/TCM) 몫.
※ 위는 화면 미리보기입니다(비활성). 실제 동작은 TAD 클라에서.
- 기본값 = 사람 맞음: 사람으로 연결된 콜은 입력이 없으면 자동으로
human라벨로 확정됩니다. - [✗ 사람 아님] / N 단축키: "사람이라고 연결했는데 실제론 기계였다" 싶을 때만 한 번 누릅니다 → coarse 라벨
not_human으로 정정. - [↩ 되돌리기]: 잘못 눌렀으면 즉시 원복.
- 자동 확정 타이밍: 30초 경과 또는 다음 콜 시작 시 현재 라벨이 확정됩니다.
상담사가 하는 일은 사실상 "AMD가 사람이라며 연결했는데 기계였을 때 N 한 번"이 전부입니다. 그 외에는 평소대로 상담만 하면 라벨은 알아서 쌓입니다.
POST /api/amd/decision오디오용 presigned PUT URL 반환
직접 PUT (서버 디스크 안 거침)
POST /api/amd/uploaded→ 라벨
audio.uploaded=true오디오 wav가 서버 디스크를 경유하지 않고 클라이언트 → S3로 직접 전송되므로 서버 부하/디스크 사용이 없고, 라벨 메타와 오디오 객체가 분리되어도 decision_id로 결합됩니다.
상담사 또는 QA의 라벨 정정은 원본 라벨을 덮어쓰지 않습니다.
POST /api/amd/label/:decisionId # → amd/corrections/{id}/{ts}.json (별도 객체) # 원본 라벨은 불변(immutable) — 전체 정정 이력이 감사추적으로 남음
최신 정정이 effective 라벨이 되며, export 단계에서 원본 + 정정을 병합해 최종 클래스를 산출합니다.
tad)| 용도 | 키 패턴 |
|---|---|
| 라벨 | amd/labels/YYYY/MM/DD/{decision_id}.json |
| 오디오 | amd/audio/YYYY/MM/DD/{decision_id}.wav |
| 정정 | amd/corrections/{decision_id}/{ts}.json |
전화번호와 상담원 ID는 HMAC-SHA256 해시만 저장합니다 — number_hash, agent_id_hash. 원문은 저장하지 않습니다.
amd/labels/.../{decision_id}.json 주요 필드| 필드 | 설명 |
|---|---|
| schemaVersion | 스키마 버전 (호환성 관리) |
| decision_id | 콜 단위 고유 ID — 라벨·오디오·정정을 결합하는 키 |
| amd | { verdict, confidence, decision_offset_ms, features } — 엔진 판정 결과 · 신뢰도 · 판정까지 걸린 오프셋 · 추출 피처 |
| label | { class, method, usable, reason } — method: implicit / explicit / qa |
| audio | { key, sampleRate, channels, durationMs, bytes, sha256, uploaded } — S3 키 · 포맷 · 무결성 해시 · 업로드 여부 |
| meta | { device, appVersion, amdVersion, os, tz } — 수집 환경(드리프트 분석용) |
| qa_sample | QA 우선 검수 대상 여부 플래그 (아래 QA 섹션 참조) |
| serverReceivedAt | 서버 수신 시각 (ISO8601) |
전화번호·상담원ID는 스키마상 number_hash · agent_id_hash(HMAC-SHA256)로만 존재합니다.
상담사는 세부 8클래스를 고를 필요가 없습니다. 실시간 정정용 coarse 라벨은 하나뿐입니다.
세부 분류(8클래스 중 어디인지)는 LLM 자동 QA(DeepSeek/TCM)가 확정합니다.
엔진이 런타임에 내리는 판정은 3종입니다.
운영은 사람 recall 최우선(목표 98~99%)입니다. 사람을 기계로 오판해 끊는 것이 최악이므로, 애매하면 UNKNOWN을 허용해 사람을 놓치지 않는 방향으로 설계합니다.
qa_sample 플래그가 붙은 콜이 QA 우선 검수 대상입니다.
- usable=false 전수: UNKNOWN · 저신뢰(low confidence) · 너무 짧은(too short) 콜은 모두 검수.
- usable의 8% 랜덤: 정상 라벨도 8%를 랜덤 추출해 라벨 품질을 모니터링.
모인 라벨(not_human · implicit · qa_sample)의 8클래스 세부 분류는 사람이 아니라 LLM이 자동으로 합니다. 사람은 저신뢰·불일치 건만 스팟체크합니다.
- DeepSeek —
scripts/llm-classify.js: S3 라벨의 AMD features를 DeepSeek에 보내 8클래스 분류. 신뢰도 ≥0.8 자동수용(method:qa_llm), 미만은amd/qa_pending보류. 멱등·재시도. features만 전송 → 오디오·PII 국외 미전송 - TCM — 통화 녹취 STT+LLM 풀분석: 같은
decision_id로method:tcmcorrection을 써넣음(오디오+transcript 기반이라 더 정확). 연동은 TCM 연동 명세 참조. - 사람: 실시간 "✗ 사람 아님" 1클릭 + 저신뢰/불일치 스팟체크만. 일일이 듣지 않음.
출처마다 잘하는 축이 다릅니다. 단일 서열로 매기지 않고, export가 두 축을 분리해 처리합니다:
- is_human (사람인가 · 이진): 상담사(그 통화에 직접 있었음) > TCM > implicit. → 상담사가 가장 강함(현장 관측).
- 세부 8클래스 (어떤 기계인가): TCM(전체 오디오 STT+LLM) > 상담사(coarse) > DeepSeek(features) > implicit. → TCM이 가장 정확.
상담사 ↔ TCM이 사람/기계 판단에서 불일치하면 자동 채택하지 않고 needs_review 표시 + 학습 가중치 감쇠. 둘이 일치할 때가 가장 신뢰(gold). 사람도 급한 1클릭이라 휴먼에러 있음 · TCM은 STT오류 가능 → 일치가 진짜 신뢰
| 상황 | label_weight |
|---|---|
| 상담사 + TCM 일치 | 1.0 (gold) |
| TCM 단독 (세부분류) | 0.85 |
| 상담사 단독 | 0.9 |
| DeepSeek (features) | 0.35 |
| implicit (AMD 원본) | 0.1 |
| 상담사 ↔ TCM 불일치 (재검수) | 0.3 |
node scripts/export-amd-dataset.js
- 라벨 + 정정 병합 → 신뢰계층(사람 > TCM > DeepSeek > implicit)으로 effective_class + source + weight 부여
- 오디오 객체 존재를
HEAD요청으로 확인 - 학습용 JSONL manifest + source별 통계 출력
todo.md 참조통화 녹음·저장은 한국 통신비밀보호법 · 개인정보보호법 대상입니다. 운영 전 법무 검토 + 고지/동의 + 보존기간 + 암호화 + 파기정책이 반드시 갖춰져야 합니다. (전화번호는 HMAC 해시로 처리됨)
라벨 정정 빈도를 상담사 성과지표로 사용 금지. 평가에 엮이면 방어적 입력(정정 회피/남발)을 유발해 데이터가 오염됩니다. 어디까지나 품질 개선용으로만 인식하도록 안내하세요.