diff --git a/research/intent_classification/README.md b/research/intent_classification/README.md index 8b04915..7b9e9af 100644 --- a/research/intent_classification/README.md +++ b/research/intent_classification/README.md @@ -57,9 +57,16 @@ ### 진행 중 (2025-11-17) - [x] 재학습 배치 스크립트 구현 (TDD) ✅ - [x] 재학습 전후 정확도 비교 측정 ✅ -- [ ] Active Learning 쿼리 전략 구현 (uncertainty sampling, margin sampling) -- [ ] 암묵적 피드백 수집 (재질문, 세션 종료 등) +- [x] Active Learning 쿼리 전략 구현 (uncertainty sampling, margin sampling) ✅ +- [x] 암묵적 피드백 수집 (재질문, 세션 종료 등) ✅ - [ ] Few-shot learning 기법 적용 +- [ ] 암묵적 피드백 통합 (conversation_service 연동) + +## 구현 문서 + +- [재학습 파이프라인 설계](./retraining_pipeline_plan.md) +- [Active Learning 쿼리 전략](./active_learning_query_strategy.md) +- [암묵적 피드백 수집](./implicit_feedback.md) ## 관련 연구 분야 diff --git a/research/intent_classification/active_learning_query_strategy.md b/research/intent_classification/active_learning_query_strategy.md new file mode 100644 index 0000000..841143a --- /dev/null +++ b/research/intent_classification/active_learning_query_strategy.md @@ -0,0 +1,104 @@ +# Active Learning 쿼리 전략 + +**작성일**: 2025-11-17 +**목적**: 라벨링 우선순위 결정을 통한 리뷰 큐 효율화 + +## 개요 + +Active Learning의 핵심은 **불확실성이 높은 샘플을 우선적으로 라벨링**하여 적은 데이터로도 모델 성능을 빠르게 개선하는 것입니다. 로빙 프로젝트에서는 리뷰 큐에 진입한 항목들을 우선순위에 따라 정렬하여 관리자가 효율적으로 라벨링할 수 있도록 지원합니다. + +## 구현된 전략 + +### 1. Uncertainty Sampling (엔트로피 기반) + +**원리**: 예측 분포의 엔트로피가 높을수록 모델이 불확실해하는 케이스입니다. + +**계산 방법**: +```python +entropy = -Σ(p * log2(p)) # 정규화된 엔트로피 +uncertainty_score = entropy / max_entropy +``` + +**특징**: +- 엔트로피가 높을수록 (0.0 ~ 1.0) 불확실성이 높음 +- 여러 의도에 비슷한 확률이 분산된 경우 우선순위 높음 +- 예: `calendar_query: 0.4, calendar_event: 0.35, document_analysis: 0.25` → 높은 불확실성 + +### 2. Margin Sampling (마진 기반) + +**원리**: 1위와 2위 의도의 점수 차이가 작을수록 모델이 애매하게 판단하는 케이스입니다. + +**계산 방법**: +```python +margin = top1_score - top2_score +margin_score = 1.0 - margin # 마진이 작으면 높은 점수 +``` + +**특징**: +- 마진이 작을수록 (0.0에 가까울수록) 불확실성이 높음 +- 두 의도가 거의 동일한 확률을 가진 경우 우선순위 높음 +- 예: `calendar_query: 0.45 vs calendar_event: 0.40` → 작은 마진 + +### 3. Confidence 기반 (기본) + +**원리**: 예측 confidence가 낮을수록 불확실한 케이스입니다. + +**계산 방법**: +```python +confidence_score = 1.0 - predicted_confidence +``` + +**특징**: +- 가장 단순한 전략 +- 절대적인 확신도가 낮은 경우 우선순위 높음 + +## 구현 위치 + +### 코드 구조 + +``` +app/brain/active_learning.py +├── calculate_entropy() # 엔트로피 계산 +├── calculate_uncertainty_score() # Uncertainty Score 계산 +├── calculate_margin_score() # Margin Score 계산 +└── prioritize_review_queue() # 우선순위 정렬 + +app/state/intent_review_repository.py +└── get_review_queue() # priority_strategy 파라미터 추가 +``` + +### API 사용 예시 + +```python +# Uncertainty sampling으로 정렬 +queue = get_review_queue( + db=session, + status="pending", + priority_strategy="uncertainty" +) + +# Margin sampling으로 정렬 +queue = get_review_queue( + db=session, + status="pending", + priority_strategy="margin" +) +``` + +## 테스트 커버리지 + +`tests/test_active_learning_query_strategy.py`: +- ✅ 높은/낮은 엔트로피 케이스 +- ✅ 작은/큰 마진 케이스 +- ✅ 우선순위 정렬 검증 +- ✅ 빈 데이터 처리 + +## 참고 문헌 + +- **PT4AL (2022)**: Self-Supervised Pretext Tasks for Active Learning +- **Sharma et al. (2015)**: Active Learning with Rationales for Text Classification + +--- + +**업데이트**: 2025-11-17 - Uncertainty/Margin Sampling 구현 완료 + diff --git a/research/intent_classification/implicit_feedback.md b/research/intent_classification/implicit_feedback.md new file mode 100644 index 0000000..4254215 --- /dev/null +++ b/research/intent_classification/implicit_feedback.md @@ -0,0 +1,114 @@ +# 암묵적 피드백 수집 + +**작성일**: 2025-11-17 +**목적**: 명시적 피드백(좋아요/싫어요) 외에 사용자 행동 패턴을 통한 암묵적 피드백 감지 + +## 개요 + +사용자가 명시적으로 피드백을 주지 않아도, 행동 패턴을 분석하면 시스템의 성능에 대한 암묵적 신호를 감지할 수 있습니다. 이를 통해 리뷰 큐 진입 조건을 확장하여 더 많은 개선 기회를 포착합니다. + +## 구현된 암묵적 피드백 유형 + +### 1. 재질문 (Re-question) + +**정의**: 같은 사용자가 짧은 시간 내에 유사한 질문을 반복하는 경우 + +**감지 조건**: +- 최근 5분 이내 메시지 중 +- 현재 메시지와 과거 메시지 간 공통 키워드 2개 이상 +- 유사한 의도로 추정되는 질문 반복 + +**예시**: +``` +사용자: "11월 19일 일정 조회해줘" (1분 전) +로빙: "11월 19일 일정: 14:00 심사" +사용자: "11월 19일 일정 알려줘" (현재) ← 재질문 감지 +``` + +**의미**: 이전 응답이 만족스럽지 않아 다시 질문하는 것으로 해석 + +### 2. 세션 종료 (Session Termination) + +**정의**: 응답 후 즉시 세션이 종료되는 경우 + +**감지 조건**: +- 응답 시간과 세션 종료 시간 차이가 5초 이내 +- 사용자가 응답을 확인하고 바로 나감 + +**예시**: +``` +로빙: "11월 19일 일정: 14:00 심사" (응답 시간: 10:00:00) +사용자: 세션 종료 (종료 시간: 10:00:03) ← 세션 종료 감지 +``` + +**의미**: 응답이 불만족스러워 즉시 이탈하는 것으로 해석 + +### 3. 무응답 (No Response) + +**정의**: 응답 후 사용자가 아무 말 없이 다른 메시지를 전송하는 경우 + +**감지 조건**: +- 마지막 응답 시간과 다음 메시지 시간 차이가 1분 이내 +- 응답에 대한 피드백 없이 다른 주제로 전환 + +**예시**: +``` +로빙: "11월 19일 일정: 14:00 심사" (응답 시간: 10:00:00) +사용자: "오늘 날씨 알려줘" (다음 메시지: 10:00:30) ← 무응답 감지 +``` + +**의미**: 이전 응답에 대한 피드백 없이 다른 질문으로 넘어가는 것으로 해석 + +## 구현 위치 + +### 코드 구조 + +``` +app/brain/intent_review.py +├── detect_implicit_feedback() # 암묵적 피드백 감지 +└── should_enqueue_for_implicit_feedback() # 리뷰 큐 진입 결정 +``` + +### 사용 예시 + +```python +# 재질문 감지 +is_re_question = detect_implicit_feedback( + current_message="11월 19일 일정", + recent_messages=[ + {"message": "11월 19일 일정 조회해줘", "timestamp": datetime.utcnow() - timedelta(minutes=1)}, + ], + feedback_type="re_question" +) + +# 세션 종료 감지 +is_termination = detect_implicit_feedback( + current_message=None, + recent_messages=[], + feedback_type="session_termination", + response_time=response_time, + session_end_time=session_end_time +) +``` + +## 통합 계획 + +현재는 감지 로직만 구현되어 있으며, 실제 `conversation_service.py`나 `save_conversation`에서 호출하여 리뷰 큐에 자동으로 진입시키는 통합은 다음 단계에서 진행 예정입니다. + +## 테스트 커버리지 + +`tests/test_implicit_feedback.py`: +- ✅ 재질문 패턴 감지 +- ✅ 세션 종료 감지 +- ✅ 무응답 감지 +- ✅ 리뷰 큐 진입 결정 + +## 참고 문헌 + +- **Impact of Feedback Type (2022)**: Implicit vs Explicit Feedback의 효용성 +- **Human-in-the-Loop Machine Learning**: 암묵적 피드백 수집 전략 + +--- + +**업데이트**: 2025-11-17 - 재질문/세션 종료/무응답 감지 로직 구현 완료 +