# 하이브리드 의도 분류 성능 비교 테스트

**날짜**: 2026-01-03
**작성자**: Auto
**관련 파일**: `rb8001/scripts/test_intent_classification_comparison.py`, `rb8001/app/services/brain/decision_engine.py`, `rb8001/app/services/brain/semantic_classifier.py`

---

## 문제 상황

하이브리드 의도 분류 시스템 개선을 위해 FastPath(정규식), 제로샷 임베딩, 병행 비교 3가지 방법의 성능을 비교 검증 필요.

---

## 테스트 방법

**테스트 데이터**: 141개 질문
- `tests/data/intent_eval_samples.json`: 95개
- `tests/data/intent_eval_challenge.json`: 28개
- 실패한 질문 패턴: 18개

**테스트 방법**:
1. FastPath만: `DecisionEngine.analyze_intent()` (정규식 기반)
2. 제로샷 임베딩만: `SemanticIntentClassifier.top_k()` + confidence
3. 병행 비교: FastPath와 임베딩 모두 실행 후 confidence 비교하여 선택

---

## 테스트 결과

| 방법 | 정확도 | 평균 응답 시간 | 정확도 순위 |
|------|--------|---------------|------------|
| FastPath만 | 49.6% (70/141) | 72.0ms | 1위 |
| 제로샷 임베딩만 | 23.4% (33/141) | 80.4ms | 3위 |
| 병행 비교 | 49.6% (70/141) | 153.6ms | 1위 |

---

## 문제 분석

### 1. 제로샷 임베딩 성능 저하 (23.4%)

**원인**:
- `intent_prototypes` DB 미초기화 또는 384d→768d 차원 불일치
- 단일 description 기반 prototype으로 유사도 계산 부정확
- IntentType enum 값과 intent_prototypes의 intent 이름 불일치

**리서치 기준 대비**: 75% 정확도 달성 가능 (multi-centroid 방식)

### 2. 병행 비교 실패

**원인**:
- 제로샷 임베딩 정확도가 낮아 FastPath 결과만 선택됨
- 두 결과가 다를 때 confidence 차이 0.3 이상 기준이 너무 높음
- 대부분 케이스에서 FastPath가 항상 선택되어 병행 비교 의미 없음

### 3. FastPath 한계 (49.6%)

**주요 오류 패턴**:
- "핀테크 업계 오늘 기사 검색" → web_search (실제: news_fetch)
- "어제 받은 메일 두 줄로 정리" → email_read (실제: email_summary)
- 유사한 intent 구분 어려움

---

## 개선 방향

1. Multi-centroid 방식 도입 (`seed_multi_centroid_prototypes.py`, version=3)
2. Few-shot LLM 프롬프트 개선 (Top-3 후보 활용, `intent_parser.py:26-91`)
3. 하이브리드 3단계: FastPath → multi-centroid embedding → Few-shot LLM

---

## 교훈

### 프로덕션 테스트의 중요성
- 리서치 문서의 이론적 성능과 실제 성능 차이 확인 필수
- intent_prototypes DB 초기화 상태와 차원 일치 여부 사전 확인

### 단계적 개선 전략
- FastPath 유지 (명확 패턴 처리)
- multi-centroid embedding으로 75%+ 달성 목표

---

## 개선 결과 (2026-01-03)

### Multi-centroid 방식 적용

**구현 내용**:
- `scripts/seed_multi_centroid_prototypes.py`: intent_eval_samples.json에서 123개 샘플 수집 후 K-means로 multi-centroid 생성
- 14개 intent에 각 3개 centroid 생성 (version=3, source="multi_centroid_{idx}")
- `intent_store.py`: `load_multi_prototypes_db()` 추가하여 여러 centroid 로드
- `semantic_classifier.py`: multi-centroid와의 최대 유사도 계산으로 정확도 개선
- **커밋**: `247496a` (rb8001)

**성능 개선**:

| 방법 | 적용 전 | 적용 후 | 개선율 |
|------|---------|---------|--------|
| FastPath만 | 49.6% (70/141) | 72.3% (102/141) | +22.7%p |
| 제로샷 임베딩만 | 23.4% (33/141) | 70.2% (99/141) | +46.8%p |
| 병행 비교 | 49.6% (70/141) | 70.9% (100/141) | +21.3%p |

**주요 개선 사항**:
- 제로샷 임베딩 정확도 3배 향상 (23.4% → 70.2%)
- FastPath 72.3% (최고 성능), 병행 비교 70.9%

**남은 과제**: Few-shot LLM 프롬프트 개선으로 75%+ 목표

---

## 구현 상세

**코드**: `intent_store.py:70-118` (multi-centroid 로드), `semantic_classifier.py:41-86` (최대 유사도 계산)

**버전**: version=3 (multi-centroid), version=2 (단일), version=1 (legacy)

---

## 참고

- 계획 문서: `journey/plans/archive/251017_intent_analysis_improvement_plan.md`
- 리서치 문서: `journey/research/intent_classification/README.md`
- 프롬프트 설계 원칙: `book/300_architecture/313_Gemini_프롬프트_설계_원칙.md`
- 테스트 결과: `rb8001/tests/results/intent_classification_comparison.json`

