지원 AI의 오류 측정 방법과 정확도가 숨기는 것
요약
본 글은 AI 지원 시스템의 오류 측정 지표가 단순히 '정확도(accuracy)'만으로는 부족함을 주장하며, 실제 실패 모드를 다섯 가지 유형으로 세분화하여 분석합니다. 각 실패 유형(조작, 탐지 실패, 오분류, 범위 외 답변, 거부)은 서로 다른 비용과 위험을 발생시키므로, 이를 종합적으로 측정할 필요가 있습니다.
핵심 포인트
- AI 오류는 단일 지표인 정확도로 측정하기 어렵다.
- 실패 모드는 '조작(Fabrication)', '탐지 실패', '오분류' 등 5가지로 분류된다.
- 각 실패 유형은 환불, 규제 위험, 해결 시간 등 고유한 비용을 발생시킨다.
- OlaBench와 같은 체계적인 프레임워크가 오류 분석에 유용하다.
제가 지원 또는 티케팅 시스템을 테스트하는 방식은 데모가 아니라 작업 북(task book)에 기반합니다. 사람들이 나중에 요구하는 수치는 정확도(accuracy)인데, 저는 이것만으로는 제공하지 않기로 했습니다. 제가 구축한 모든 현실적인 테스트 세트에서 평균값은 결과 파일에서 가장 정보량이 적은 것이었습니다.
다음 내용은 제가 현재 사용하는 방법과 공개 데이터로 실행하여 숫자를 확인할 수 있도록 한 내용입니다.
다섯 가지 실패 모드, 다섯 가지 다른 비용
지원 모델은 최소한 다섯 가지 방식으로 실패하며, 이들은 동일한 비용을 발생시키지 않습니다.
조작(Fabrication). 답변이 정책이나 기록에 없는 내용을 주장하는 경우입니다. 존재하지 않는 수수료, 잘못된 환불 기간, 꾸며낸 배송 날짜 등이 이에 해당합니다. 이것이 사람들이 '환각(hallucination)'이라고 부르는 것입니다. 제가 참고하는 분류 체계인 OlaBench는 이를 네 가지 하위 유형으로 나눕니다 — 사실적 환각(factual hallucination), 검색된 결과의 오용(misuse of retrieved results), 관련성 환각(relevance hallucination), 그리고 논리적 불일치(logical inconsistency)(OlaBench, arXiv:2510.22143v3, §3.1; v1 25 Oct 2025, v3 25 May 2026, retrieved 9 Oct 2026)). 잘 읽히지만 거짓인 문장은 비용을 발생시키며, 그 비용은 보통 몇 달 후에 도착합니다.
탐지 실패(Missed detection). 티켓에 법적 위협, 규제 기관의 이름, 안전 문제 또는 사기 신호가 포함되어 있는데 시스템이 이를 일상적인 것으로 처리하는 경우입니다. 거짓말을 한 것은 없습니다. 실패는 아무도 그것을 읽지 않는다는 점입니다. 채점표에서는 모델이 존재하는 대기열(queue)을 선택했기 때문에 종종 올바른 분류로 간주됩니다.
오분류/잘못된 라우팅(Misrouting). 답변은 합리적이지만 대기열이 잘못되어, 다른 기술을 가진 팀이 자체 정책을 적용하는 경우입니다. 측정 가능한 비용은 해결 시간과 반복 연락 횟수입니다.
범위 외 답변(Out-of-scope answers). 시스템이 애초에 구축되지 않은 질문 — 세금, 법률 자문, 다른 제공업체의 제품 등 — 에 답변하는 경우입니다. 내용은 정확할 수 있습니다. 노출 위험은 규제적입니다.
거부(Refusal). 시스템이 거절하거나, 루프에 빠지거나, 다른 곳으로 이관합니다. 답변 자체가 없기 때문에 점수화할 오류가 없습니다. 이 경우는 전송률(transfer rate) 또는 포함률(containment rate)로 추적되며 오류 계산에서 완전히 제외됩니다.
| 실패 유형 (Failure) | 문제점 (What is wrong) | 비용이 발생하는 곳 (Where the cost lands) | 일반적으로 보고되는 명칭 (Commonly reported as) |
|---|---|---|---|
| Fabrication | 콘텐츠 자체 | 환불, 선의 제공(goodwill), 분쟁 | 환각률 (hallucination rate) |
| ... | |||
| One accuracy figure blends these five at whatever ratio the sample happens to contain, and that ratio is set by whoever picked the sample. |
내가 수행한 작업 (What I ran)
나는 실제 모델이 보게 될 근거 진실 레이블(ground-truth label)과 텍스트가 있는 라우팅 태스크가 필요했습니다. 공공 민원 데이터에는 둘 다 있습니다.
미국 CFPB는 소비자 민원 데이터베이스(Consumer Complaint Database)를 CC0 라이선스 하에 공개합니다 (CFPB Consumer Complaint Database, 2026년 10월 9일 검색); 검색 API 자체 메타데이터는 18,274,023개의 기록을 보고하며, 라이선스는 CC0이고 마지막 업데이트 날짜는 2026-10-08입니다 (API metadata, 2026년 10월 9일 검색).
JSON 검색 엔드포인트는 15개의 필드를 반환하며 서술형(narrative) 내용은 없습니다 (field reference, 2026년 10월 9일 검색). 새로운 점은, 2026년 9월에 배포된 버전에서 민원 서술형 내용이 데이터베이스에서 제거되었다는 것입니다 (CFPB release notes, Release 24, September 2026). 그래서 저는 대신 Hugging Face 미러에서 텍스트를 가져왔습니다: BEE-spoke-data/consumer-finance-complaints (dataset card, CC0, mirror last modified 29 Dec 2025); 이 데이터셋의 has-text 설정은 1,689,573개의 행을 포함하고 있습니다 (split sizes, 2026년 10월 9일 검색).
작업(Task): 서술 내용만 읽고 제품 대기열을 예측합니다. 정답(Ground truth): CFPB가 발표하는 제품 라벨입니다. 저는 여기서 3,894건의 불만을 추출했습니다. 가장 오래된 것은 2015-03-20이며, 가장 최신은 2024-01-04입니다.
데이터에 따라 라벨 세트가 변경됨
원시(raw) 제품 필드에는 이 샘플에서 총 17개의 고유 문자열이 포함되어 있으며, 이것들이 17가지의 개별 제품을 의미하는 것은 아닙니다. 날짜 범위가 이를 보여줍니다.
| 발행된 제품 문자열 | 행 수 | 이 샘플에서 접수된 순서 (첫 → 마지막) |
|---|---|---|
| 신용 보고, 신용 복구 서비스 또는 기타 개인 소비자 보고서 | 1,892 | 2017-04-24 → 2023-08-24 |
| ... | ||
읽는 날짜를 따라가 보세요. 은행 계좌 또는 서비스(Bank account or service)는 여기서 마지막으로 2017-01-31에 나타나고, 체킹 또는 저축 계좌(Checking or savings account)는 처음으로 2017-04-24에 나타납니다. 세 개의 문자열이 2017년에 끝나고 그 다음 항목들이 같은 해를 시작합니다. 세 가지 신용 보고 관련 문자열은 연속적으로 배치되어 있습니다: 2015년에서 2017년, 2017년에서 2023년, 2023년부터 2024년까지입니다. 동일한 카테고리이지만 이름이 변경된 것입니다. |
저는 무언가를 점수화하기 전에 이 17개 문자열을 9가지 범주로 통합했습니다. 매핑은 스크립트에 있으며, 행별로 추론되는 것이 아니라 한 곳에 적용되었습니다. 이 단계를 거치지 않으면 정확도(accuracy)는 라벨 세트가 일치하지 않는 2016년 행과 2023년 행을 비교하게 되고, 모델은 분류 체계(taxonomy)에 대해 점수를 얻거나 비난받게 됩니다.
실시간 데이터베이스는 어떤 이름이 현재인지에 대해 미러와 의견이 다릅니다. 2026년에 접수된 불만을 집계했을 때, CFPB API는 신용카드(Credit card)와 선불카드(Prepaid card)를 별도로 나열하고 신용카드 또는 선불카드(Credit card or prepaid card)는 전혀 포함하지 않은 총 11개 제품 문자열을 반환합니다 (제품 집계, 2026-01-01 이후 접수된 불만, 2026년 10월 9일 검색). 저는 이 두 가지 분류 체계를 조정하지 않았습니다.
정확도 수치가 오해를 불러일으키는 세 가지 방법
불균형(Imbalance). 통합 후, 샘플은 다음과 같습니다:
| Collapsed category | Rows | Share |
|---|---|---|
| Credit reporting | 2,229 | 57.2% |
| ... | ||
| A predictor가 모든 티켓에 대해 "credit reporting"을 예측하는 경우의 점수는 여기서 0.572를 기록합니다. 이는 상수이며, 실제 모델의 점수와 충분히 가까워서 혼동될 수 있습니다. |
샘플 선택(Sample selection). 동일한 데이터, 동일한 모델, 두 가지 분할:
| Split | Test n | Accuracy | Macro F1 | Credit-reporting share of test set |
|---|---|---|---|---|
| Random 60/40 | 1,558 | 0.756 | 0.428 | 57.1% |
| Chronological, split at 2022-04-21 | 1,560 | 0.832 | 0.377 | 74.0% |
시간 순서(chronological)로 분할한 결과가 대부분의 카테고리에서 성능이 떨어짐에도 불구하고 7.6 포인트 더 높은 점수를 기록했습니다. 테스트 세트가 가장 큰 클래스에 더 집중되면서, 지배적인 클래스 예측기가 그 집중도를 높여 올린 것입니다. 0.832를 개선으로 보고 재훈련했다고 주장하는 사람은 자신의 샘플링을 진전이라고 오해하고 있는 것입니다.
커버리지(Coverage). 모델의 신뢰도에 따라 테스트 세트를 정렬하고 상위 슬라이스만 점수를 매겨보겠습니다:
| Coverage | Tickets scored | Accuracy on that slice |
|---|---|---|
| 100% | 1,558 | 0.756 |
| ... | ||
| 반 커버리지(half coverage)에서의 0.904는 보류된 데이터(held-out data)로 계산된 실제 수치이며, 이것만 단독으로 발표하면 시스템을 15 포인트 과소 설명하게 됩니다. 주목해야 할 점은 움직임을 멈추는 지점입니다. 50% 커버리지에서 10%까지 떨어지면서 정확도는 0.904에서 0.897로 하락합니다. 따라서 모델의 신뢰도와 실제 정확도가 후반부(tail)에서 분리됩니다. 그 후반부가 바로 오분류가 발생하는 곳입니다. |
평균치 아래, 랜덤 분할에 따른 카테고리별 상황:
| Category | Test n | Recall | Precision |
| --- | --- | --- |
| Credit reporting | 889 | 0.879 | 0.886 |
| ... |
세 개의 카테고리는 단 한 번도 정확하게 예측된 적이 없습니다. 정확도는 0.756입니다. Macro F1은 0.428입니다. 이 둘 사이의 간격이 이 모델에 대한 정직한 헤드라인입니다.
평균에서 위험도가 높은 오류를 분리해내기
여기서 유용하게 발표된 아이디어는 OlaBench의 위험 축인 '중요 비즈니스 위험률(Critical Business Risk Rate)'입니다. 이는 플랫폼 책임 인정, ICS 역할 오식별, 과도한 약속, 개인 또는 상점 비방 등 네 가지 유형 중 하나를 부적절하게 단정하는 응답만을 계산합니다. 이 네 가지는 규정 준수 노출, 사용자 분쟁 또는 평판 손상을 유발할 수 있는 고위험 실패 사례입니다 (618개 테스트 케이스), ICS 역할 오식별(228개), 과도한 약속(138개), 개인 또는 상점 비방(16개) (OlaBench, arXiv:2510.22143v3, §3.1 및 표 1; 2026년 5월 25일, 검색일 2026년 10월 9일). 이 수치는 환각률(hallucination rate) 옆에 별도의 숫자로 보고됩니다.
이것의 형태가 복사해야 할 것입니다. 즉, 종류별로 결과가 다른 실패 사례를 선택하고, 이를 개별적으로 계산하며, 둘 다 발표하되 절대 평균을 내지 마십시오.
라우팅 테스트(routing test)의 경우 세 가지 등급을 정의했고, 저는 다음과 같이 선택했습니다:
- Critical: 자금 또는 계정 접근에 대한 불만(예: 입출금, 송금)이 보고 대기열(reporting queue)로 들어가는 경우
- Material: 신용 또는 대출 분쟁이 다른 대출 또는 보고 가족으로 들어가는 경우
- Routine: 동일한 가족 내에서의 오라우팅(misroute)
| 등급 | 무작위 분할 (Random split) | 시간순 분할 (Chronological split) |
|---|---|---|
| Critical | 7 / 1,558 = 0.4% | 11 / 1,560 = 0.7% |
| ... |
두 분할은 어떤 등급을 읽느냐에 따라 자리를 바꿉니다: 더 보기 좋은 정확도(prettier accuracy)를 가진 쪽이 거의 두 배나 높은 치명적 오류율(critical error rate)을 숨기고 있습니다.
발표된 연구는 또한 동일한 이름의 지표가 모집단이 변경될 때 얼마나 많이 변할 수 있는지를 보여줍니다. OlaBench 논문은 벤치마크에서 OlaMind-Stage-2 모델에 대해 8.7%의 중요 비즈니스 위험률을 보고하며, 출시 후 라이브 대화에 대한 일일 수동 주석 작업에서는 0.05% 미만의 중요 비즈니스 위험률을 보고했습니다 (OlaBench, arXiv:2510.22143v3, §5.2 및 표 3; 2026년 5월 25일, 검색일 2026년 10월 9일). 둘 다 동일한 지표이지만, 서로 다른 주석가와 다른 모집단에서 측정되었습니다. 하나만 인용하는 것은 선택의 문제입니다.
이러한 수치가 생성된 방법
- 데이터. CFPB 소비자 불만 데이터베이스의 CC0 미러에서 가져온 3,894건의 불만 사례(설정
has-text, 1,689,573행). 추출은 분할된 영역에서 무작위 오프셋으로 연속된 100개 행을 40페이지에 걸쳐 뽑았으며, 불만 ID로 중복 제거되었습니다. 시드(seed)는 20261009입니다. 서술이 80자 미만인 행은 제외되었습니다. 이는 독립적인 추출이 아닌 클러스터화된 추출입니다. - 라벨 정제. 위 표의 날짜 범위를 사용하여 17개의 게시된 제품 문자열을 9개 카테고리로 축소했습니다. 매핑은 각 행별로 추론되는 것이 아니라 스크립트에 작성되어 있습니다.
- 모델. 단어 유니그램 및 바이그램에 대한 다항분포 나이브 베이즈(Multinomial naive Bayes)를 사용하며, 라플라스 평활화(Laplace smoothing) $\alpha = 1$, 학습 시 최소 두 번 이상 관찰된 특징을 사용합니다. Python 표준 라이브러리만 사용했습니다.
- 분할. 시드 7로 무작위 60/40 분할을 했으며, 수신일(received-date) 순서의 상위 60퍼센타일에 대한 시간적 분할은 2022년 4월 21일에 해당합니다.
- 선택적 정확도. 모델의 최대 사후 확률(maximum posterior probability)로 정렬된 테스트 행 중 상위 k개를 점수화했습니다.
- 위 표의 모든 숫자는 하나의 스크립트가 해당 샘플에 대해 출력한 것입니다.
- 고의적인 선택. 이 파이프라인에는 점수화 과정까지도 언어 모델은 전혀 사용되지 않았습니다. 그 자체가 모델인 측정 도구는 고유의 오류를 지니므로, OlaBench는 자체의 크기(오류)를 공개합니다. 즉, 그 심사관(judge)은 위험 식별(risk identification)에서 인간 주석가와 91.7%, 환각 탐지(hallucination detection)에서 82.6%로 일치하며, 5,000개 이상의 인간 주석화된 사례에 걸쳐 그러합니다(OlaBench, arXiv:2510.22143v3, §3.3 및 표 2; 2026년 5월 25일, 검색일 2026년 10월 9일). 사람들과 위험 축에서 8%의 불일치를 보이는 심사관은 측정할 수 있는 모든 것의 하한선을 설정합니다.
제가 확인할 수 없었던 것
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기