From cd0973eae9d49aa5003320a8ae80e7d62dee8ce7 Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Tue, 23 Dec 2025 18:32:53 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EA=B3=84=ED=9A=8D=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=20=EA=B0=84=EA=B2=B0=ED=99=94=20-=20=EB=AC=B8=EC=84=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20=EC=9B=90=EC=B9=99=20=EC=A4=80=EC=88=98=20?= =?UTF-8?q?(100=EC=A4=84=20=EC=9D=B4=ED=95=98,=20=ED=95=B5=EC=8B=AC?= =?UTF-8?q?=EB=A7=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._후속_질문_LLM_우선_해결_계획.md | 266 +++--------------- 1 file changed, 36 insertions(+), 230 deletions(-) diff --git a/journey/plans/251223_짧은_후속_질문_LLM_우선_해결_계획.md b/journey/plans/251223_짧은_후속_질문_LLM_우선_해결_계획.md index b8a3042..040baba 100644 --- a/journey/plans/251223_짧은_후속_질문_LLM_우선_해결_계획.md +++ b/journey/plans/251223_짧은_후속_질문_LLM_우선_해결_계획.md @@ -2,262 +2,68 @@ **작성일**: 2025-12-23 **목표**: 실패하는 질문 18개를 LLM 우선 접근 원칙으로 해결 -**원칙**: `DOCS/book/300_architecture/311_FastAPI_구조_원칙.md` 섹션 13 참고 +**원칙**: `311_FastAPI_구조_원칙.md` 섹션 13 참고 +**테스트 결과**: `rb8001/tests/test_failed_questions_results.md` --- -## 문제 요약 +## 문제 **실패한 질문 18개** (총 23개 중 78%): -1. 짧은 후속 질문: "어디서?", "언제?", "누구랑?", "뭐야?" -2. 맥락 의존 질문: "그거 어떻게 됐어?", "결과는?", "그럼 어떻게 할까?" -3. 모호한 질문: "어떻게 생각해?", "괜찮아?" -4. 부정/거부 표현: "안 해도 돼", "취소해줘", "보내지 마" -5. 비교/선택 질문: "어느 게 나아?", "A와 B 중에 뭐가 좋아?" -6. 시간 관련 모호한 질문: "언제 했어?" -7. 상태 확인: "지금 뭐 하고 있어?", "작업 끝났어?" -8. 정보 요청: "너는 뭘 할 수 있어?" +- 짧은 후속: "어디서?", "언제?", "누구랑?", "뭐야?" +- 맥락 의존: "그거 어떻게 됐어?", "결과는?", "그럼 어떻게 할까?" +- 모호한: "어떻게 생각해?", "괜찮아?" +- 부정/거부: "안 해도 돼", "취소해줘", "보내지 마" +- 비교/선택: "어느 게 나아?", "A와 B 중에 뭐가 좋아?" +- 시간 모호: "언제 했어?" +- 상태 확인: "지금 뭐 하고 있어?", "작업 끝났어?" +- 정보 요청: "너는 뭘 할 수 있어?" -**현재 문제**: -- CONTEXT_FOLLOWUP Intent는 구현되어 있으나 패턴 매칭이 제대로 작동하지 않음 -- 규칙 기반 접근으로 복잡한 규칙 체인 구축 시도 -- LLM 호출을 피하려는 접근으로 정확도 저하 - ---- - -## 핵심 원칙 - -**LLM 우선 접근**: -- LLM을 기본으로 사용, 규칙은 성능 최적화용으로만 제한 -- 애매한 케이스는 LLM이 맥락을 해석하여 처리 -- 새로운 패턴마다 규칙 추가하지 말고 LLM 활용 - -**금지 사항**: -- ❌ LLM 호출을 피하기 위해 규칙/패턴 매칭으로 처리 -- ❌ 복잡한 규칙 체인 구축 -- ❌ 새로운 패턴마다 규칙 추가 +**현재 문제**: CONTEXT_FOLLOWUP Intent 구현되어 있으나 패턴 매칭 미작동, 규칙 기반 접근으로 정확도 저하 --- ## 해결 방안 (LLM 우선) -### 1. LLM 기반 질문 확장 (Question Expansion) +### 1. LLM 질문 확장 +- 짧은 질문(len <= 10 또는 확신도 < 0.7) → LLM이 맥락 포함 완전한 질문으로 확장 +- 구현: `llm_service.py:expand_question()`, `message_service.py:206-228` 수정 +- Few-shot 예시로 정확도 향상 -**구현 방법**: -``` -1. 짧은 질문 감지 (len <= 10 또는 확신도 < 0.7) -2. LLM에 질문 확장 요청 (Few-shot 예시 포함) -3. 확장된 질문으로 의도 분류 재시도 -``` +### 2. LLM 의도 분류 강화 +- 확신도 < 0.7 → LLM이 맥락 포함하여 재분류 +- 구현: `intent_graph.py`, `intent_parser.py` 맥락 포함 분류 추가 -**프롬프트 템플릿**: -``` -다음은 짧은 후속 질문입니다. 직전 대화 맥락을 참고하여 완전한 질문으로 확장하세요. +### 3. LangGraph 워크플로우 +- 질문 확장 → 의도 분류 → 엔티티 추출 → 스킬 선택 +- 구현: `intent_graph_langgraph.py` (신규) -예시: -- 직전: "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 호출 +### 4. 세션 맥락 통합 +- 세션 상태를 LLM에 전달하여 맥락 유지 +- 구현: `session_manager.py`, `message_service.py` 세션 맥락 포함 --- ## 구현 단계 -### 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개 이상 해결 확인 +| Phase | 작업 | 기간 | +|-------|------|------| +| 1 | LLM 질문 확장 구현 | 1주 | +| 2 | LLM 의도 분류 강화 | 1주 | +| 3 | LangGraph 워크플로우 | 2주 | +| 4 | 세션 맥락 통합 | 1주 | --- -## 예상 효과 +## 목표 -**정량적 목표**: -- 실패한 질문 18개 → 3개 이하로 감소 (78% → 13%) +- 실패한 질문 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 -**상태**: 계획 완료, 구현 대기 +## 참고 +- `311_FastAPI_구조_원칙.md` (섹션 13: LLM 우선 접근 원칙) +- `context_followup_question_solutions.md` (연구 문서)