docs: 짧은 후속 질문 LLM 우선 해결 계획 추가
This commit is contained in:
parent
460cff4861
commit
8b5959d1fa
263
journey/plans/251223_짧은_후속_질문_LLM_우선_해결_계획.md
Normal file
263
journey/plans/251223_짧은_후속_질문_LLM_우선_해결_계획.md
Normal file
@ -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
|
||||
**상태**: 계획 완료, 구현 대기
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user