# 캘린더 혼합 시간 형식 파싱 실패 문제 **날짜**: 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 접근 - 실패하는 테스트를 먼저 작성하여 문제를 명확히 정의 - 구현 후 테스트 통과로 검증