299 lines
10 KiB
Markdown
299 lines
10 KiB
Markdown
# 짧은 후속 질문 및 맥락 의존 질문 해결 방법 연구
|
|
|
|
**작성일**: 2025-12-23
|
|
**목적**: 실패하는 질문 18개 해결을 위한 구체적 방법론 제시
|
|
**참고**: 테스트 결과 `rb8001/tests/test_failed_questions_results.md`
|
|
|
|
---
|
|
|
|
## 문제 요약
|
|
|
|
**실패한 질문 유형**:
|
|
1. 짧은 후속 질문 (컨텍스트 필요): "어디서?", "언제?", "누구랑?", "뭐야?"
|
|
2. 맥락 의존 질문: "그거 어떻게 됐어?", "결과는?", "그럼 어떻게 할까?"
|
|
3. 모호한 질문: "어떻게 생각해?", "괜찮아?"
|
|
4. 부정/거부 표현: "안 해도 돼", "취소해줘", "보내지 마"
|
|
5. 비교/선택 질문: "어느 게 나아?", "A와 B 중에 뭐가 좋아?"
|
|
6. 시간 관련 모호한 질문: "언제 했어?"
|
|
7. 상태 확인: "지금 뭐 하고 있어?", "작업 끝났어?"
|
|
8. 정보 요청: "너는 뭘 할 수 있어?"
|
|
|
|
**현재 상태**: CONTEXT_FOLLOWUP Intent는 구현되어 있으나 패턴 매칭이 제대로 작동하지 않음
|
|
|
|
---
|
|
|
|
## 해결 방법론 (연구 기반)
|
|
|
|
### 0. LLM 기반 직접 발화 확장 (Question Expansion)
|
|
|
|
**이론적 배경**:
|
|
- 최신 연구(2024-2025): LLM을 활용한 질문 확장(Question Expansion) 기법
|
|
- Few-shot prompting으로 짧은 질문을 맥락 포함 완전한 질문으로 변환
|
|
- 코드베이스에 이미 유사 구현 존재: `message_router.py:_resolve_pronoun_via_llm` (대명사 해소)
|
|
|
|
**현재 구현 상태**:
|
|
- `message_service.py:225`: CONTEXT_FOLLOWUP 시 컨텍스트를 추가하지만 질문 자체는 확장하지 않음
|
|
- `message_router.py:268`: 대명사 해소는 구현되어 있으나 짧은 질문 확장은 미구현
|
|
|
|
**구현 방법**:
|
|
```
|
|
1. 짧은 질문 감지 (len <= 10 또는 패턴 매칭)
|
|
2. LLM에 질문 확장 요청 (Few-shot 예시 포함)
|
|
3. 확장된 질문으로 의도 분류 재시도
|
|
|
|
프롬프트 템플릿:
|
|
"다음은 짧은 후속 질문입니다. 직전 대화 맥락을 참고하여 완전한 질문으로 확장하세요.
|
|
|
|
예시:
|
|
- 직전: "11월 18일 오전 6시 40분에 검진이 있습니다"
|
|
- 짧은 질문: "어디서?"
|
|
- 확장: "검진은 어디서 하시나요?"
|
|
|
|
- 직전: "이메일 보냈어"
|
|
- 짧은 질문: "결과는?"
|
|
- 확장: "이메일 발송 결과는 어떻게 되었나요?"
|
|
|
|
직전 대화:
|
|
사용자: {previous_message}
|
|
로빙: {previous_response}
|
|
|
|
현재 짧은 질문: {message}
|
|
|
|
확장된 질문만 출력하세요:"
|
|
```
|
|
|
|
**장점**:
|
|
- 구현이 간단하고 즉시 적용 가능
|
|
- LLM의 자연어 이해 능력 활용
|
|
- Few-shot 예시로 정확도 향상
|
|
|
|
**단점**:
|
|
- LLM 호출 비용 증가 (짧은 질문마다 추가 호출)
|
|
- 응답 지연 시간 증가 (약 500ms-1s)
|
|
|
|
**비용 최적화**:
|
|
- 확신도 < 0.5인 경우에만 확장 시도
|
|
- 확장된 질문을 캐싱하여 동일 패턴 재사용
|
|
- 배치 처리로 여러 짧은 질문을 한 번에 확장
|
|
|
|
**참고 구현**:
|
|
- `rb8001/app/router/message_router.py:268-317`: 대명사 해소 유사 패턴
|
|
- `rb8001/app/services/message_service.py:206-228`: CONTEXT_FOLLOWUP 처리
|
|
|
|
---
|
|
|
|
### 1. Anaphora Resolution (지시어 해석) 기법
|
|
|
|
**이론적 배경**:
|
|
- 대화 시스템에서 "그거", "결과", "그럼" 같은 지시어(anaphora)는 이전 대화의 선행사(antecedent)를 참조
|
|
- 최신 연구(2024-2025)에서는 Transformer 기반 모델이 anaphora resolution에서 우수한 성능
|
|
|
|
**구현 방법**:
|
|
```
|
|
1. 최근 N턴 대화에서 명사구/엔티티 추출
|
|
2. 현재 질문의 지시어("그거", "결과")와 선행사 후보 매칭
|
|
3. 임베딩 유사도로 가장 가능성 높은 선행사 선택
|
|
4. 선행사를 포함한 확장 질문 생성 → LLM에 전달
|
|
```
|
|
|
|
**예시**:
|
|
- 입력: "그거 어떻게 됐어?"
|
|
- 이전 대화: "이메일 보냈어" → 선행사: "이메일"
|
|
- 확장: "이메일 어떻게 됐어?" → 정확한 의도 분류 가능
|
|
|
|
**참고 논문**: Neural Anaphora Resolution in Dialogue Systems (2024)
|
|
|
|
---
|
|
|
|
### 2. Hybrid LLM-ML 임계값 검증 (AppFolio 2024)
|
|
|
|
**이론적 배경**:
|
|
- `DOCS/journey/research/memory/classification/2024_hybrid_llm_ml_threshold.md` 참고
|
|
- ML 모델로 1차 분류, 확신도 낮은 케이스만 LLM 재검증
|
|
- 비용 효율적이면서 정확도 향상
|
|
|
|
**현재 문제**:
|
|
- 짧은 질문이 UNKNOWN으로 분류되면 바로 LLM으로 가지만, 맥락 없이 처리됨
|
|
|
|
**개선 방안**:
|
|
```
|
|
1. FastPath (정규식) → 실패
|
|
2. SemanticIntentClassifier (임베딩) → 확신도 < 0.5
|
|
3. 맥락 확장 (Anaphora Resolution) → 선행사 포함 질문 생성
|
|
4. LLM 재검증 → 맥락 포함 질문으로 의도 분류
|
|
```
|
|
|
|
**효과**:
|
|
- 75% 케이스 자동화 유지
|
|
- 맥락 포함으로 LLM 정확도 향상
|
|
- 비용 증가 최소화 (10-20% 범위)
|
|
|
|
---
|
|
|
|
### 3. 세션 기반 슬롯 관리 강화
|
|
|
|
**이론적 배경**:
|
|
- `DOCS/journey/troubleshooting/251117_short_followup_context_3phase_implementation.md` 참고
|
|
- 현재 SessionManager는 구현되어 있으나 Redis 미마이그레이션 상태
|
|
|
|
**문제**:
|
|
- "취소해줘", "보내지 마" 같은 부정 표현이 무엇을 취소/거부하는지 맥락 필요
|
|
- 세션 슬롯에 현재 진행 중인 작업 정보가 없음
|
|
|
|
**개선 방안**:
|
|
```
|
|
1. 세션 슬롯에 "active_action" 필드 추가
|
|
- 예: {active_action: "email_send", recipient: "김팀장", subject: "일정 확인"}
|
|
|
|
2. 부정 표현 감지 시 active_action 참조
|
|
- "취소해줘" → active_action이 "calendar_event"면 calendar_delete
|
|
- "보내지 마" → active_action이 "email_send"면 email_send_approval (거부)
|
|
|
|
3. Redis 마이그레이션으로 세션 영속성 확보
|
|
- 서버 재시작 시에도 세션 유지
|
|
- TTL 10분 → 30분으로 확장 (복잡한 작업 대응)
|
|
```
|
|
|
|
**참고**: Multi-turn Dialogue State Tracking (DST) 연구 (2024-2025)
|
|
|
|
---
|
|
|
|
### 4. 의도 확장: 새로운 Intent 추가
|
|
|
|
**필요한 Intent**:
|
|
1. **CANCEL_REQUEST**: 취소/거부 의도
|
|
- 패턴: "취소해줘", "안 해도 돼", "보내지 마", "하지 마"
|
|
- 처리: active_action 참조하여 구체적 취소 액션 결정
|
|
|
|
2. **COMPARISON_QUERY**: 비교/선택 질문
|
|
- 패턴: "어느 게 나아?", "A와 B 중에 뭐가 좋아?", "비교해줘"
|
|
- 처리: 이전 대화에서 비교 대상 추출, LLM으로 비교 분석
|
|
|
|
3. **STATUS_CHECK**: 상태 확인 질문
|
|
- 패턴: "작업 끝났어?", "지금 뭐 하고 있어?", "진행 상황은?"
|
|
- 처리: 세션의 active_action 상태 확인, 진행률 반환
|
|
|
|
4. **CAPABILITY_QUERY**: 기능 조회
|
|
- 패턴: "너는 뭘 할 수 있어?", "기능 알려줘", "할 수 있는 일은?"
|
|
- 처리: IntentType 목록을 자연어로 변환하여 반환
|
|
|
|
---
|
|
|
|
### 5. Ko-SRoBERTa 임베딩 활용 (고정밀 경로)
|
|
|
|
**이론적 배경**:
|
|
- `DOCS/journey/research/memory/embedding_search/2025_ko_sroberta_runtime_eval.md` 참고
|
|
- Ko-SRoBERTa는 의도 분류에서 75% 정확도 (기존 53.6% → 75.0%)
|
|
|
|
**현재 문제**:
|
|
- SemanticIntentClassifier가 skill-embedding(384d) 사용 중
|
|
- 짧은 질문의 임베딩 유사도가 낮아 UNKNOWN으로 분류
|
|
|
|
**개선 방안**:
|
|
```
|
|
1. 고정밀 파이프라인 전용 Ko-SRoBERTa 서비스 분리
|
|
- skill-embedding-highres (768d) 신규 서비스
|
|
|
|
2. 짧은 질문/맥락 의존 질문은 고정밀 경로 사용
|
|
- len(message) <= 10 또는 확신도 < 0.5인 경우
|
|
- Ko-SRoBERTa로 재임베딩 → 유사도 재계산
|
|
|
|
3. 맥락 포함 임베딩
|
|
- "어디서?" + 직전 발화 → 결합 임베딩
|
|
- 선행사 포함 질문으로 확장 후 임베딩
|
|
```
|
|
|
|
**효과**:
|
|
- 의도 분류 정확도 21pt 향상 (challenge set 기준)
|
|
- 짧은 질문도 맥락과 결합하여 정확도 향상
|
|
|
|
---
|
|
|
|
### 6. 대화 로그 분석 기반 패턴 학습
|
|
|
|
**이론적 배경**:
|
|
- 웹 검색 결과: 대화 로그 분석을 통한 의도 인식 개선
|
|
- HITL 피드백 루프 활용 (`DOCS/journey/research/intent_classification/README.md`)
|
|
|
|
**구현 방법**:
|
|
```
|
|
1. 실패한 질문 패턴 수집
|
|
- UNKNOWN으로 분류된 질문 + 직전 대화 맥락
|
|
- 리뷰 큐에 자동 진입 (low confidence)
|
|
|
|
2. 패턴 분석
|
|
- "어디서?" → 이전 의도가 calendar_event면 calendar_query
|
|
- "결과는?" → 이전 의도가 web_search면 web_search (재검색)
|
|
|
|
3. 규칙 기반 보완
|
|
- 패턴이 명확하면 FastPath에 규칙 추가
|
|
- 모호하면 LLM 프롬프트에 예시 추가
|
|
```
|
|
|
|
**참고**: Active Learning with Rationales (Sharma et al., 2015)
|
|
|
|
---
|
|
|
|
## 구현 우선순위
|
|
|
|
### Phase 1: 즉시 적용 가능 (1-2주)
|
|
1. ✅ Anaphora Resolution 기본 구현
|
|
- 지시어("그거", "결과") → 선행사 매칭
|
|
- 확장 질문 생성 로직
|
|
|
|
2. ✅ 새로운 Intent 추가
|
|
- CANCEL_REQUEST, COMPARISON_QUERY, STATUS_CHECK, CAPABILITY_QUERY
|
|
- FastPath 패턴 매칭 추가
|
|
|
|
3. ✅ 세션 active_action 필드 추가
|
|
- 부정 표현 처리 개선
|
|
|
|
### Phase 2: 중기 개선 (1개월)
|
|
4. ✅ Hybrid LLM-ML 임계값 검증 강화
|
|
- 맥락 확장 후 LLM 재검증
|
|
- 비용 효율성 유지
|
|
|
|
5. ✅ Ko-SRoBERTa 고정밀 경로
|
|
- skill-embedding-highres 서비스 분리
|
|
- 짧은 질문 전용 경로
|
|
|
|
### Phase 3: 장기 개선 (2-3개월)
|
|
6. ✅ Redis 세션 마이그레이션
|
|
- 세션 영속성 확보
|
|
- TTL 확장 (10분 → 30분)
|
|
|
|
7. ✅ 대화 로그 분석 자동화
|
|
- 실패 패턴 자동 학습
|
|
- 규칙 기반 보완 자동화
|
|
|
|
---
|
|
|
|
## 예상 효과
|
|
|
|
**정량적 목표**:
|
|
- 실패한 질문 18개 → 5개 이하로 감소 (72% → 22%)
|
|
- 짧은 후속 질문 정확도: 30% → 80% 이상
|
|
- 맥락 의존 질문 정확도: 30% → 70% 이상
|
|
|
|
**정성적 개선**:
|
|
- 사용자 경험: 자연스러운 대화 흐름 유지
|
|
- 시스템 신뢰도: 맥락 이해 능력 향상
|
|
- 운영 효율: UNKNOWN 감소로 리뷰 큐 부담 감소
|
|
|
|
---
|
|
|
|
## 참고 문헌
|
|
|
|
1. Neural Anaphora Resolution in Dialogue Systems (2024)
|
|
2. Hybrid LLM-ML Classification with Intelligent Threshold Verification (AppFolio, 2024)
|
|
3. Multi-turn Dialogue State Tracking (DST) Research (2024-2025)
|
|
4. Active Learning with Rationales (Sharma et al., 2015)
|
|
5. Ko-SRoBERTa Runtime Evaluation (2025-11-15)
|
|
6. Human-in-the-Loop Machine Learning (Narang)
|
|
|
|
---
|
|
|
|
**작성일**: 2025-12-23
|
|
**상태**: 연구 완료, 구현 대기
|
|
|