diff --git a/journey/plans/251223_짧은_후속_질문_LLM_우선_해결_계획.md b/journey/plans/251223_짧은_후속_질문_LLM_우선_해결_계획.md new file mode 100644 index 0000000..b8a3042 --- /dev/null +++ b/journey/plans/251223_짧은_후속_질문_LLM_우선_해결_계획.md @@ -0,0 +1,263 @@ +# 짧은 후속 질문 LLM 우선 해결 계획 + +**작성일**: 2025-12-23 +**목표**: 실패하는 질문 18개를 LLM 우선 접근 원칙으로 해결 +**원칙**: `DOCS/book/300_architecture/311_FastAPI_구조_원칙.md` 섹션 13 참고 + +--- + +## 문제 요약 + +**실패한 질문 18개** (총 23개 중 78%): +1. 짧은 후속 질문: "어디서?", "언제?", "누구랑?", "뭐야?" +2. 맥락 의존 질문: "그거 어떻게 됐어?", "결과는?", "그럼 어떻게 할까?" +3. 모호한 질문: "어떻게 생각해?", "괜찮아?" +4. 부정/거부 표현: "안 해도 돼", "취소해줘", "보내지 마" +5. 비교/선택 질문: "어느 게 나아?", "A와 B 중에 뭐가 좋아?" +6. 시간 관련 모호한 질문: "언제 했어?" +7. 상태 확인: "지금 뭐 하고 있어?", "작업 끝났어?" +8. 정보 요청: "너는 뭘 할 수 있어?" + +**현재 문제**: +- CONTEXT_FOLLOWUP Intent는 구현되어 있으나 패턴 매칭이 제대로 작동하지 않음 +- 규칙 기반 접근으로 복잡한 규칙 체인 구축 시도 +- LLM 호출을 피하려는 접근으로 정확도 저하 + +--- + +## 핵심 원칙 + +**LLM 우선 접근**: +- LLM을 기본으로 사용, 규칙은 성능 최적화용으로만 제한 +- 애매한 케이스는 LLM이 맥락을 해석하여 처리 +- 새로운 패턴마다 규칙 추가하지 말고 LLM 활용 + +**금지 사항**: +- ❌ LLM 호출을 피하기 위해 규칙/패턴 매칭으로 처리 +- ❌ 복잡한 규칙 체인 구축 +- ❌ 새로운 패턴마다 규칙 추가 + +--- + +## 해결 방안 (LLM 우선) + +### 1. LLM 기반 질문 확장 (Question Expansion) + +**구현 방법**: +``` +1. 짧은 질문 감지 (len <= 10 또는 확신도 < 0.7) +2. LLM에 질문 확장 요청 (Few-shot 예시 포함) +3. 확장된 질문으로 의도 분류 재시도 +``` + +**프롬프트 템플릿**: +``` +다음은 짧은 후속 질문입니다. 직전 대화 맥락을 참고하여 완전한 질문으로 확장하세요. + +예시: +- 직전: "11월 18일 오전 6시 40분에 검진이 있습니다" +- 짧은 질문: "어디서?" +- 확장: "검진은 어디서 하시나요?" + +- 직전: "이메일 보냈어" +- 짧은 질문: "결과는?" +- 확장: "이메일 발송 결과는 어떻게 되었나요?" + +- 직전: "일정 등록할까요?" +- 짧은 질문: "취소해줘" +- 확장: "일정 등록을 취소해주세요" + +직전 대화: +사용자: {previous_message} +로빙: {previous_response} + +현재 세션 슬롯: +{slot_info} + +현재 짧은 질문: {message} + +확장된 질문만 출력하세요: +``` + +**적용 대상**: +- 짧은 후속 질문 ("어디서?", "언제?", "누구랑?", "뭐야?") +- 맥락 의존 질문 ("그거 어떻게 됐어?", "결과는?", "그럼 어떻게 할까?") +- 부정/거부 표현 ("안 해도 돼", "취소해줘", "보내지 마") +- 모호한 질문 ("어떻게 생각해?", "괜찮아?") + +**구현 위치**: +- `rb8001/app/services/message_service.py`: CONTEXT_FOLLOWUP 처리 시 질문 확장 +- `rb8001/app/services/llm/llm_service.py`: 질문 확장 전용 메서드 추가 + +--- + +### 2. LLM 기반 의도 분류 (맥락 포함) + +**구현 방법**: +``` +1. FastPath (정규식) → 매우 명확한 케이스만 (인사, 명령어) +2. SemanticIntentClassifier (임베딩) → 확신도 < 0.7이면 LLM으로 +3. LLM 의도 분류 → 맥락 포함 질문으로 의도 분류 +``` + +**프롬프트 템플릿**: +``` +다음 사용자 질문의 의도를 분류하세요. 직전 대화 맥락을 참고하여 정확하게 분류하세요. + +직전 대화: +사용자: {previous_message} +로빙: {previous_response} + +현재 질문: {expanded_message} + +가능한 의도: +- email_send: 이메일 작성/발송 요청 +- email_read: 이메일 읽기 요청 +- calendar_event: 일정 등록 요청 +- calendar_query: 일정 조회 요청 +- calendar_delete: 일정 삭제 요청 +- web_search: 웹 검색 요청 +- context_followup: 직전 대화에 대한 후속 질문 +- cancel_request: 취소/거부 요청 +- comparison_query: 비교/선택 질문 +- status_check: 상태 확인 질문 +- capability_query: 기능 조회 질문 +- general_chat: 일반 대화 +- unknown: 알 수 없음 + +JSON 형식으로 출력: +{"intent": "의도명", "confidence": 0.0-1.0, "reasoning": "분류 이유"} +``` + +**적용 대상**: +- 확신도 < 0.7인 모든 질문 +- 맥락이 필요한 모든 질문 + +**구현 위치**: +- `rb8001/app/services/brain/intent_graph.py`: LLM 의도 분류 추가 +- `rb8001/app/services/llm/intent_parser.py`: 맥락 포함 의도 분류 강화 + +--- + +### 3. LangGraph 기반 다단계 워크플로우 + +**구현 방법**: +``` +1. 의도 분류 → LLM으로 맥락 포함 분류 +2. 질문 확장 → LLM으로 완전한 질문 생성 +3. 엔티티 추출 → LLM으로 맥락 기반 엔티티 추출 +4. 스킬 선택 → LLM으로 적절한 스킬 결정 +``` + +**LangGraph 노드 구성**: +- `classify_intent`: LLM 기반 의도 분류 +- `expand_question`: 짧은 질문 확장 +- `extract_entities`: 맥락 기반 엔티티 추출 +- `select_skill`: 적절한 스킬 선택 +- `execute_skill`: 스킬 실행 + +**조건부 분기**: +- 짧은 질문(len <= 10) → expand_question 노드 +- 확신도 < 0.7 → LLM 재분류 +- 맥락 필요 → 직전 대화 포함 + +**구현 위치**: +- `rb8001/app/services/brain/intent_graph_langgraph.py` (신규) +- 기존 `intent_graph.py`를 LangGraph로 전환 + +--- + +### 4. 세션 기반 맥락 관리 (LLM 활용) + +**구현 방법**: +``` +1. 세션 슬롯에 active_action 저장 (LLM이 추출) +2. 부정 표현 감지 시 LLM이 active_action 참고하여 해석 +3. 세션 상태를 LLM에 전달하여 맥락 유지 +``` + +**LLM 프롬프트**: +``` +현재 세션 상태: +- 활성 작업: {active_action} +- 슬롯 정보: {slot_info} +- 직전 대화: {previous_message} + +사용자 질문: {message} + +위 맥락을 참고하여 질문을 해석하고 적절한 의도로 분류하세요. +``` + +**구현 위치**: +- `rb8001/app/services/brain/session_manager.py`: 세션 상태를 LLM에 전달 +- `rb8001/app/services/message_service.py`: 세션 맥락 포함하여 LLM 호출 + +--- + +## 구현 단계 + +### Phase 1: LLM 질문 확장 (1주) +1. ✅ `llm_service.py`에 `expand_question()` 메서드 추가 +2. ✅ `message_service.py`에서 CONTEXT_FOLLOWUP 시 질문 확장 +3. ✅ Few-shot 예시로 정확도 향상 +4. ✅ 테스트: 실패한 짧은 질문 4개 해결 확인 + +### Phase 2: LLM 의도 분류 강화 (1주) +5. ✅ `intent_parser.py`에 맥락 포함 의도 분류 추가 +6. ✅ 확신도 < 0.7인 경우 LLM 재분류 +7. ✅ 맥락 의존 질문 LLM 처리 +8. ✅ 테스트: 실패한 맥락 의존 질문 3개 해결 확인 + +### Phase 3: LangGraph 워크플로우 (2주) +9. ✅ LangGraph 기반 의도 분류 워크플로우 구현 +10. ✅ 질문 확장 → 의도 분류 → 엔티티 추출 → 스킬 선택 +11. ✅ 조건부 분기 및 상태 관리 +12. ✅ 테스트: 전체 워크플로우 검증 + +### Phase 4: 세션 맥락 통합 (1주) +13. ✅ 세션 상태를 LLM에 전달 +14. ✅ 부정 표현 LLM 해석 +15. ✅ 비교/선택 질문 LLM 처리 +16. ✅ 테스트: 실패한 질문 18개 중 15개 이상 해결 확인 + +--- + +## 예상 효과 + +**정량적 목표**: +- 실패한 질문 18개 → 3개 이하로 감소 (78% → 13%) +- 짧은 후속 질문 정확도: 30% → 90% 이상 +- 맥락 의존 질문 정확도: 30% → 85% 이상 + +**정성적 개선**: +- 사용자 경험: 자연스러운 대화 흐름 유지 +- 시스템 신뢰도: LLM의 맥락 이해 능력 활용 +- 유지보수: 규칙 관리 부담 감소, LLM이 자동으로 패턴 학습 + +--- + +## 비용 최적화 + +**LLM 호출 최소화**: +- 매우 명확한 케이스(인사, 명령어)는 FastPath로 처리 +- 확장된 질문 캐싱 (동일 패턴 재사용) +- 배치 처리 가능한 경우 통합 + +**예상 비용 증가**: +- 짧은 질문당 1회 추가 LLM 호출 (질문 확장) +- 확신도 < 0.7인 경우 1회 추가 LLM 호출 (의도 재분류) +- 전체적으로 20-30% LLM 호출 증가 예상 + +--- + +## 참고 문서 + +- `DOCS/book/300_architecture/311_FastAPI_구조_원칙.md` (섹션 13: LLM 우선 접근 원칙) +- `DOCS/journey/research/context_followup_question_solutions.md` (연구 문서) +- `rb8001/tests/test_failed_questions_results.md` (테스트 결과) + +--- + +**작성일**: 2025-12-23 +**상태**: 계획 완료, 구현 대기 +