통화 후 요약 스포크 — D-1·D-2·D-3 구현
무엇을
POST /hub/calls/{call_id}/close 뒤에 붙는 실제 요약·분류·후속조치 추출을 만든다.
계약·배선·DTO 는 w7-postcall-contract에서 끝났고 지금은 501 이다.
경계
계약 티켓이 적어 둔 그대로다 — 요약·분류를 실제로 하는 것은 ai/ 이고,
server/ 는 계약·배선·저장까지다. 이 티켓이 ai/ 몫이다.
이미 타입에 박혀 있는 제약 둘
- DTO 이름이
CallSummaryDraft다. D-2 유형 분류는 모델 판정이므로 확정이 아니라 초안이고,confirmed는 모델이True를 실어 보내도 서버가False로 덮는다. 확정은 상담원이 화면에서 한다 - 인터랙터가
summary_text에 손대지 않는다. 손대면 모델 출력과 화면 표시가 달라져 환각 추적이 끊긴다 — 6주차 환각 건수 비교가 무의미해진다
절대 원칙 9(판정은 규칙이, 설명만 LLM이)를 계약 형태로 옮긴 것이므로 스포크가 이것을 되돌리지 않는다.
SEC-1
받는 것도 돌려주는 것도 마스킹 완료본뿐이다. 통화 후 처리라고 원문을 다시 꺼내오지 않는다 — 애초에 저장돼 있지 않다.
완료 조건
- D-1 요약 · D-2 유형 분류 · D-3 후속조치 추출
- 501 이 사라지고
/health스포크 목록에 뜬다 - D-2 분류 정확도를 잰다. 감정분석 기반 상담품질 평가는 사람을 점수 매기는 용도로 쓰지 않는다(부록 A-1)
2026-09-15 — 장민석 님 규칙 초안 위에 얹었다. 새로 만든 것은 D-1 모델 요약과 D-2 유형 제안이다
501 은 이미 w4-postcall-rule-draft(장민석, decisions/306)가 규칙 발췌 초안으로 걷었다. 그 티켓이
«LLM 요약은 w7-postcall-spoke 로 남는다» 고 적었으므로 바꾸지 않고 위에 얹었다(ai/apps/postcall_summary/, 이름이 postcall 이 아닌 것은 서버 모듈과 경로가 겹쳐서다).
마스킹 자막 ─▶ 규칙 초안(server/apps/postcall) 발췌 요약 · 유형 None · 약속 발화 후속조치
├▶ D-1 kanana 요약 → 규칙 검사 자막에 없는 숫자·금지 표현·길이 → 걸리면 발췌 요약 그대로
└▶ D-2 고객 발화 검색 → TERM 장 투표 2 대중교통 · 3 생활하수도 · 4 일반행정 · 5 코로나19 (1·6장·MANUAL 은 투표 안 함)
D-3 은 규칙 초안 것을 그대로 쓴다 — 모델이 «할 일» 을 지어내면 상담원 할 일로 저장된다
- 유형은 모델이 판정하지 않는다(절대 원칙 9) — 검색이 조항을 고르고 장→유형은 표로 고정했다. 결과는 제안이고
confirmed는 항상 False - 요약 끝에
(모델 요약 초안)을 붙인다. 모델 문장 자체는 고치지 않는다(환각 추적) - 서버: 생성과 같은 스위치(
OLLAMA_URL+GENERATION_MODEL)일 때만postcall_model이 꽂힌다 — 지금 운영은 규칙 초안 그대로다
실측 — 골든셋 D 케이스가 0건이라 AI Hub 실제 대화셋으로 쟀다
측정일 2026-09-15 · 커밋 38f2fc3-dirty · AI Hub 민원 질의응답 validation · 다산콜센터 대화셋 1,009개(카테고리 라벨) · 로컬 MPS
ELASTICSEARCH_URL=http://localhost:9200 .venv/bin/python scripts/eval_postcall.py --device mps
라벨 분포: 대중교통 243 · 일반행정 313 · 코로나19 196 · 생활하수도 257
D-2 유형 제안 정확도 대중교통 생활하수도 일반행정 코로나19 제안 없음
BM25 0.678 (684/1009) 0.745 0.790 0.601 0.571 53
dense + rerank 0.872 (880/1009) 0.996 0.992 0.725 0.796 6
D-1 모델 요약 (kanana, 표본 50 · 시드 20260915)
화면에 모델 요약 42 · 규칙 발췌로 반려 8 (금지 표현 8 · 자막에 없는 숫자 2 — 한 건에 둘 다 걸린 것 포함)
지연 p50 1.88s · p95 3.01s (통화 후 처리라 4.3절 실시간 예산 대상이 아니다)
읽는 법
- D-2 틀린 쪽은 일반행정·코로나19 다 — 일반행정이 대중교통(42)·코로나19(22)로, 코로나19 가 일반행정(24)으로 간다. 지원금·방역 수칙 문의가 두 장에 걸쳐 있기 때문으로 보인다(가설 — 확인 안 함)
- ⚠ 누수 가능성: 지식베이스 TERM 은 이 데이터셋의 고객의도 체계를 따라 팀이 썼다. 장 구성과 카테고리가 맞는 것은 그 때문이다 — 이 정확도는 «다산 민원을 이 체계로 가를 수 있는가» 이지 다른 콜센터로 옮겨 가는 값이 아니다
- ⚠ 대화셋은 텍스트다 — STT 오류가 없다. 실제 통화에서는 더 낮다
- D-1 요약의 품질은 재지 않았다 — 정답 요약이 없다. 잰 것은 규칙 검사 통과율과 지연뿐이다. 숫자 검사는 자막에 같은 숫자가 어디든 있으면 통과라 약하다 (「5만원」의 5 가 다른 문장에 있어도 통과한다). 반려 8건의 금지 표현이 정당한 문맥(보험 「보장」 등)인지는 보지 않았다
- 발췌 규칙 초안의 D-3 품질도 여전히 측정 불가(라벨 없음)