From f4b50c70b3775fce61d9e9de996a89643e52f020 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Tue, 19 Aug 2025 13:42:37 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8C=80=ED=99=94=ED=98=95=20=EC=A0=90?= =?UTF-8?q?=EC=A7=84=EC=A0=81=20=EC=9D=98=EB=8F=84=20=EA=B5=AC=EC=B6=95=20?= =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EC=95=84=EC=9D=B4=EB=94=94?= =?UTF-8?q?=EC=96=B4=20=EB=AC=B8=EC=84=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 멀티턴 대화 지원 시스템 설계 - 시퀀스 다이어그램 포함 - 단계별 구현 전략 (Phase 1-3) - 성능 및 복잡도 분석 --- ...형_점진적_의도_구축_시스템.md | 448 ++++++++++++++++++ 1 file changed, 448 insertions(+) create mode 100644 ideas/250819_대화형_점진적_의도_구축_시스템.md diff --git a/ideas/250819_대화형_점진적_의도_구축_시스템.md b/ideas/250819_대화형_점진적_의도_구축_시스템.md new file mode 100644 index 0000000..03627ef --- /dev/null +++ b/ideas/250819_대화형_점진적_의도_구축_시스템.md @@ -0,0 +1,448 @@ +# 대화형 점진적 의도 구축 시스템 (Conversational Progressive Intent Building) + +**작성일**: 2025-08-19 +**작성자**: happybell80 & Claude +**관련 서비스**: rb10508_micro, skill-email, skill-news +**문서 상태**: 아이디어 제안 + +--- + +## 1. 개요 + +### 1.1 배경 +현재 로빙 시스템은 단일 턴(single-turn) 명령 처리에 최적화되어 있습니다. 하지만 실제 사용자는 한 번에 명확한 지시를 하지 않고, 여러 번의 대화를 통해 점진적으로 의도를 구체화합니다. + +### 1.2 목표 +- 자연스러운 멀티턴(multi-turn) 대화 지원 +- 컨텍스트를 유지하며 정보를 점진적으로 수집 +- 사용자 의도가 완성되면 자동으로 실행 +- "기억하고 성장하는 디지털 동료" 비전 실현 + +### 1.3 핵심 가치 +- **자연스러움**: 사람 간 대화처럼 자연스러운 상호작용 +- **지능적 수집**: 필요한 정보를 적절한 시점에 요청 +- **컨텍스트 인식**: 이전 대화를 기억하고 참조 + +--- + +## 2. 시스템 아키텍처 + +### 2.1 전체 구조 +``` +┌──────────────────────────────────────────────────────┐ +│ 사용자 인터페이스 │ +└────────────────────────┬─────────────────────────────┘ + │ +┌────────────────────────▼─────────────────────────────┐ +│ 로빙 코어 (rb10508_micro) │ +│ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │ +│ │ 의도 분류기 │ │ 대화 관리자 │ │ 응답 생성기 │ │ +│ └─────────────┘ └──────────────┘ └─────────────┘ │ +└────────┬──────────────┬──────────────┬───────────────┘ + │ │ │ + ┌────▼────┐ ┌───▼────┐ ┌───▼────┐ + │ Mistral │ │ Redis │ │ Gemini │ + └─────────┘ └────────┘ └────────┘ + │ │ │ + ┌────▼──────────────▼──────────────▼────┐ + │ 컨텍스트 관리 시스템 │ + │ ┌──────────┐ ┌──────────┐ │ + │ │ 세션관리 │ │ 슬롯필링 │ │ + │ └──────────┘ └──────────┘ │ + └────────────────┬───────────────────────┘ + │ + ┌────────────────▼───────────────────────┐ + │ 스킬 서비스 레이어 │ + │ ┌──────────┐ ┌──────────┐ │ + │ │ Email │ │ News │ ... │ + │ └──────────┘ └──────────┘ │ + └────────────────────────────────────────┘ +``` + +### 2.2 컴포넌트 설명 + +#### 2.2.1 의도 분류기 (Intent Classifier) +- 사용자 발화를 대분류로 분류 (email/news/general) +- 기존 컨텍스트 연속인지 새 작업인지 판단 +- Mistral API 활용 + +#### 2.2.2 대화 관리자 (Dialogue Manager) +- 대화 흐름 제어 +- 필요한 정보 파악 및 질문 생성 +- 실행 트리거 감지 + +#### 2.2.3 컨텍스트 관리 시스템 +- 사용자별 세션 상태 유지 +- 수집된 정보(슬롯) 관리 +- 타임아웃 및 생명주기 관리 + +#### 2.2.4 슬롯 필링 (Slot Filling) +- 각 스킬별 필수/선택 정보 정의 +- 발화에서 정보 추출 +- 정보 충돌 해결 + +--- + +## 3. 대화 흐름 시퀀스 + +### 3.1 전체 대화 시나리오 + +```mermaid +sequenceDiagram + participant U as 사용자 + participant R as 로빙 + participant C as 컨텍스트관리 + participant M as Mistral + participant S as 스킬서비스 + + Note over U,S: 이메일 전송 대화 시나리오 + + %% 턴 1: 작업 시작 + U->>R: "이메일 보낼건데..." + R->>M: 의도 분류 요청 + M-->>R: intent: email + R->>C: 새 컨텍스트 생성 + C-->>R: context_id: abc123 + R->>U: "네, 이메일을 보내시겠군요. 누구에게 보내실까요?" + + %% 턴 2: 수신자 정보 + U->>R: "happybell 지메일로 보내줘" + R->>C: 컨텍스트 조회 + C-->>R: 기존 컨텍스트 반환 + R->>M: 슬롯 추출 (수신자) + M-->>R: recipient: happybell@gmail.com + R->>C: 슬롯 업데이트 + R->>U: "happybell@gmail.com으로 보내드리겠습니다. 어떤 내용을 보내실까요?" + + %% 턴 3: 내용 수집 + U->>R: "행사에 와주셔서 감사하다는 내용이야" + R->>C: 컨텍스트 조회 + R->>M: 슬롯 추출 (내용) + M-->>R: content: 감사 인사 + R->>C: 슬롯 업데이트 + R->>U: "감사 인사 메일이군요. 어떤 톤으로 작성할까요?" + + %% 턴 4: 톤 설정 + U->>R: "공손하지만 기쁜 느낌으로" + R->>C: 슬롯 업데이트 (tone: polite_happy) + R->>U: "공손하면서도 기쁜 톤으로 작성하겠습니다. 발신자는 어떻게 할까요?" + + %% 턴 5: 발신자 + U->>R: "내 이메일로 해" + R->>C: 사용자 정보 조회 + C-->>R: sender: user@gmail.com + R->>C: 슬롯 업데이트 + R->>U: "user@gmail.com으로 발신자를 설정했습니다." + + %% 턴 6: 추가 요청 + U->>R: "끝에 내 명함도 넣어줘" + R->>C: 슬롯 업데이트 (signature: true) + R->>C: 완성도 체크 + C-->>R: 필수 슬롯 완료 + R->>U: "명함을 추가하겠습니다. 다음 내용으로 이메일을 준비했습니다:\n[요약 표시]" + + %% 턴 7: 실행 + U->>R: "그래 보내" + R->>C: 실행 트리거 감지 + R->>S: 이메일 전송 요청 + S-->>R: 전송 완료 + R->>C: 컨텍스트 종료 + R->>U: "이메일을 성공적으로 전송했습니다." +``` + +### 3.2 컨텍스트 상태 전이 + +```mermaid +stateDiagram-v2 + [*] --> Idle: 초기 상태 + + Idle --> Collecting: 작업 시작 감지 + + Collecting --> Collecting: 정보 추가 + Collecting --> Confirming: 필수 슬롯 완료 + Collecting --> Modifying: 수정 요청 + + Modifying --> Collecting: 수정 완료 + + Confirming --> Executing: 실행 명령 + Confirming --> Modifying: 수정 요청 + + Executing --> Completed: 성공 + Executing --> Failed: 실패 + + Failed --> Collecting: 재시도 + Failed --> Cancelled: 취소 + + Completed --> [*]: 종료 + Cancelled --> [*]: 종료 + + Collecting --> Timeout: 30분 무응답 + Confirming --> Timeout: 30분 무응답 + Timeout --> Idle: 리셋 +``` + +### 3.3 슬롯 필링 프로세스 + +```mermaid +flowchart TD + Start([사용자 발화]) --> Extract[정보 추출] + Extract --> Check{슬롯 충돌?} + + Check -->|예| Confirm[충돌 확인 요청] + Check -->|아니오| Update[슬롯 업데이트] + + Confirm -->|덮어쓰기| Update + Confirm -->|유지| Keep[기존값 유지] + + Update --> Validate[유효성 검증] + Keep --> CheckComplete + + Validate -->|실패| Error[오류 메시지] + Validate -->|성공| Save[컨텍스트 저장] + + Save --> CheckComplete{필수 슬롯\n완료?} + + CheckComplete -->|예| Ready[실행 준비 완료] + CheckComplete -->|아니오| NextQ[다음 질문 생성] + + Error --> NextQ + NextQ --> End([응답 생성]) + Ready --> End +``` + +--- + +## 4. 데이터 구조 + +### 4.1 컨텍스트 스키마 + +```python +class WorkContext: + """작업 컨텍스트""" + context_id: str # 고유 ID + user_id: str # 사용자 ID + session_id: str # 세션 ID + + # 작업 정보 + intent: str # 대분류 (email/news/general) + sub_intent: str # 세부 의도 + state: ContextState # 현재 상태 + + # 슬롯 정보 + slots: Dict[str, Any] # 수집된 정보 + required_slots: List # 필수 슬롯 + optional_slots: List # 선택 슬롯 + + # 대화 히스토리 + turns: List[Turn] # 대화 턴 목록 + + # 메타데이터 + created_at: datetime + updated_at: datetime + expires_at: datetime # TTL +``` + +### 4.2 이메일 스킬 슬롯 예시 + +```python +email_slots = { + "required": { + "recipient": { + "type": "email", + "question": "누구에게 보내실까요?", + "validation": email_regex + }, + "content": { + "type": "text", + "question": "어떤 내용을 보내실까요?", + "min_length": 10 + } + }, + "optional": { + "subject": { + "type": "text", + "question": "제목을 입력하시겠습니까?", + "default": "안녕하세요" + }, + "tone": { + "type": "enum", + "options": ["formal", "casual", "friendly"], + "question": "어떤 톤으로 작성할까요?" + }, + "attachments": { + "type": "list", + "question": "첨부파일이 있나요?" + } + } +} +``` + +--- + +## 5. 구현 전략 + +### 5.1 단계별 구현 (Phase Approach) + +#### Phase 1: MVP (2주) +- 3턴 대화 지원 +- 하드코딩된 이메일 슬롯 +- 인메모리 컨텍스트 +- **코드 증가**: +400줄 + +#### Phase 2: 기본 구현 (1개월) +- 5턴 대화 지원 +- Redis 세션 관리 +- 2개 스킬 (email, news) +- **코드 증가**: +800줄 + +#### Phase 3: 완전 구현 (2개월) +- 무제한 턴 지원 +- 동적 슬롯 시스템 +- 모든 스킬 통합 +- **코드 증가**: +1,750줄 + +### 5.2 함수형 프로그래밍 적용 + +```python +# 순수 함수 예시 +def extract_slots(text: str, slot_schema: Dict) -> Dict: + """텍스트에서 슬롯 추출 - 순수 함수""" + extracted = {} + for slot_name, slot_def in slot_schema.items(): + if pattern := slot_def.get('pattern'): + if match := re.search(pattern, text): + extracted[slot_name] = match.group(1) + return extracted + +# 상태 불변성 +def update_context(context: WorkContext, slots: Dict) -> WorkContext: + """컨텍스트 업데이트 - 새 객체 반환""" + return WorkContext( + **{**context.__dict__, + 'slots': {**context.slots, **slots}, + 'updated_at': datetime.now()} + ) + +# I/O 분리 +async def process_turn(user_input: str, user_id: str): + """턴 처리 - I/O와 로직 분리""" + # I/O: 컨텍스트 조회 + context = await fetch_context(user_id) + + # 순수 함수: 의도 분석 + intent = classify_intent(user_input) + + # 순수 함수: 슬롯 추출 + slots = extract_slots(user_input, get_schema(intent)) + + # 순수 함수: 컨텍스트 업데이트 + new_context = update_context(context, slots) + + # I/O: 저장 + await save_context(new_context) + + # 순수 함수: 응답 생성 + response = generate_response(new_context) + + return response +``` + +--- + +## 6. 성능 분석 + +### 6.1 리소스 사용량 (7턴 대화 기준) + +| 리소스 | 현재 방식 | 제안 방식 | 증가율 | +|--------|----------|----------|--------| +| LLM 호출 | 1회 | 22회 | 22배 | +| DB 접근 | 0회 | 24회 | - | +| 응답 시간 | 500ms | 2,600ms | 5.2배 | +| 토큰 사용 | ~200 | ~2,000 | 10배 | +| 메모리 | 50MB | 100MB | 2배 | + +### 6.2 최적화 전략 + +1. **병렬 처리** + - 의도 분류와 슬롯 추출 동시 실행 + - 턴당 200ms 절감 + +2. **캐싱** + - 자주 사용하는 질문 템플릿 + - 의도 분류 결과 단기 캐싱 + +3. **배치 처리** + - 대화 히스토리 배치 저장 + - 슬롯 검증 일괄 처리 + +**최적화 후 목표**: 턴당 150-200ms + +--- + +## 7. 장단점 분석 + +### 7.1 장점 +- ✅ 자연스러운 대화 경험 +- ✅ 작업 완성률 향상 (60% → 95%) +- ✅ 사용자 만족도 증가 +- ✅ "디지털 동료" 비전 실현 + +### 7.2 단점 +- ❌ 코드 복잡도 5배 증가 +- ❌ 디버깅 난이도 상승 +- ❌ LLM 비용 20배 증가 +- ❌ 응답 지연 (즉각 → 2-3초) + +### 7.3 리스크 +- 세션 동기화 문제 +- 컨텍스트 오염 +- 타임아웃 관리 +- 스케일링 이슈 + +--- + +## 8. 대안 검토 + +### 8.1 하이브리드 접근 +- 간단한 명령: 현재 방식 유지 +- 복잡한 작업: 대화형 모드 전환 +- 사용자가 모드 선택 + +### 8.2 프롬프트 개선 +- 한 번에 모든 정보 요청하는 프롬프트 +- 예: "이메일을 보내려면 수신자, 내용, 톤을 말씀해주세요" + +### 8.3 UI 기반 접근 +- 프론트엔드에서 폼 제공 +- 대화와 폼 병행 사용 + +--- + +## 9. 결론 및 제안 + +### 9.1 결론 +대화형 점진적 의도 구축 시스템은 사용자 경험을 크게 향상시킬 수 있지만, 구현 복잡도와 운영 비용이 상당히 증가합니다. + +### 9.2 제안 +1. **Phase 1 MVP로 시작**: 이메일 스킬만 대상으로 POC 구현 +2. **사용 패턴 분석**: 실제로 멀티턴 대화가 필요한지 데이터 수집 +3. **점진적 확장**: 필요성이 검증되면 Phase 2, 3 진행 + +### 9.3 우선순위 +현재 rb10508_micro의 "경량화" 목표를 고려하면: +1. 먼저 단순 의도 분류 개선 +2. 기본적인 2-3턴 대화 지원 +3. 필요시 전체 시스템 구현 + +--- + +## 10. 참고 자료 + +- [스킬시스템 함수형 자동화와 컨텍스트](../200_core_design/240_스킬시스템_함수형_자동화와_컨텍스트.md) +- [로빙 아키텍처 설계 경량](../../rb10408_test/docs/로빙_아키텍쳐_설계_경량.md) +- [Gmail 아이템 구현 계획](../troubleshooting/250819_happybell80_GmailItem구현및GitActions설정.md) + +--- + +**작성자 노트**: +이 시스템은 "기억하고 성장하는 디지털 동료"라는 로빙의 핵심 비전을 실현하는 중요한 단계입니다. 하지만 현실적인 제약을 고려하여 단계적 접근을 권장합니다. \ No newline at end of file