# 캘린더 혼합 시간 형식 파싱 실패 문제

**날짜**: 2025-11-22
**작성자**: Claude
**관련 파일**: 
- `rb8001/app/router/calendar_handler.py`
- `rb8001/app/llm/llm_service.py`
- `rb8001/tests/test_calendar_mixed_time_format_parsing.py`

---

## 문제 상황

### 사용자 시나리오
```
사용자: "11월 27일 검진 화성시 동탄산단4길 9-9 칸트론, 레이저셀, 원스 외 80명 08:40~약11시반"
로빙: "네, 11월 27일 검진 일정을 등록해 드릴게요. 구글 캘린더에 등록해드릴까요?"
사용자: "ㅇㅇ"
로빙: "✅ 구글 캘린더에 일정을 등록했습니다!
      일시: 2025-11-27 08:40 ~ 08:40" ❌
```

**문제**: 종료 시간이 시작 시간과 동일하게 등록됨 (08:40 ~ 08:40)

---

## 원인 분석

### 1. 시간 범위 파싱 실패
- `extract_time_range_generic()`이 "08:40~약11시반" 같은 혼합 형식을 처리하지 못함
- 기존 패턴:
  - HH:MM ~ HH:MM (정상 작동)
  - "오후 1시부터 4시까지" (정상 작동)
  - 혼합 형식 (HH:MM ~ 약X시반) 처리 불가

### 2. LLM 응답 구조화 부족
- LLM이 자연어만 반환하여 정규식으로 재파싱 필요
- 구조화된 JSON 형식 미사용

---

## 해결 방안

### 1. 혼합 시간 형식 파싱 추가
**파일**: `rb8001/app/router/calendar_handler.py:674-690`

혼합 형식 패턴 추가:
```python
# 4. 혼합 형식: "08:40~약11시반", "08:40~11시반" 등
mixed_pattern = r"(\d{1,2}):(\d{2})\s*[~-]\s*(약)?\s*(\d{1,2})시\s*(반|(\d{1,2})분)?"
```

### 2. LLM 구조화된 JSON 응답 요구
**파일**: `rb8001/app/llm/llm_service.py:156-180`

프롬프트 수정:
- JSON 형식으로 구조화된 정보 반환 요구
- 시간 범위 파싱 규칙 명시 ("08:40~약11시반" → "08:40 ~ 11:30")

### 3. JSON 파싱 로직 추가
**파일**: `rb8001/app/router/calendar_handler.py:570-600`

`parse_llm_json_response()` 함수 추가:
- ```json { ... } ``` 패턴 파싱
- { ... } 패턴 파싱

### 4. calendar_handler에서 JSON 우선 사용
**파일**: `rb8001/app/router/calendar_handler.py:118-125`

우선순위 변경:
1. JSON 형식 (새로 추가)
2. 구조화된 필드 (기존)
3. 자연어 파싱 (기존)

### 5. LLM 응답에서 JSON 블록 제거
**파일**: `rb8001/app/router/router.py:821-830`

사용자에게는 자연어 메시지만 표시:
- ```json { ... } ``` 패턴 제거
- { ... } 패턴 제거
- JSON은 파싱용으로만 사용, 사용자 응답에는 포함하지 않음

---

## 구현 완료 (2025-11-22)

### 수정된 파일
- `rb8001/app/router/calendar_handler.py`: 혼합 시간 형식 파싱, JSON 파싱 로직 추가
- `rb8001/app/llm/llm_service.py`: 구조화된 JSON 응답 요구 프롬프트 수정
- `rb8001/app/router/router.py`: calendar_confirm 응답에서 JSON 블록 제거
- `rb8001/tests/test_calendar_mixed_time_format_parsing.py`: TDD 테스트 작성

### 검증 방법
```bash
cd /home/admin/ivada_project/rb8001
docker exec -it rb8001 python3 tests/test_calendar_mixed_time_format_parsing.py
```

---

## 교훈

### 1. 시간 형식 다양성 대응
- 사용자가 입력하는 시간 형식은 매우 다양함 (HH:MM, 자연어, 혼합 형식)
- 정규식 패턴을 하나씩 추가하는 것보다, 시작/종료 시간을 각각 독립적으로 파싱하는 방식이 확장 가능

### 2. LLM 구조화된 응답 활용
- LLM이 자연어만 반환하면 정규식으로 재파싱해야 하는 한계
- 구조화된 JSON 형식을 요구하면, 파싱 로직이 단순해지고 정확도 향상

### 3. TDD 접근
- 실패하는 테스트를 먼저 작성하여 문제를 명확히 정의
- 구현 후 테스트 통과로 검증

