From b37e33f8e620e489cf78b6c7ce7eeb942eab4244 Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Sat, 22 Nov 2025 13:37:22 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EC=BA=98=EB=A6=B0=EB=8D=94=20=ED=98=BC?= =?UTF-8?q?=ED=95=A9=20=EC=8B=9C=EA=B0=84=20=ED=98=95=EC=8B=9D=20=ED=8C=8C?= =?UTF-8?q?=EC=8B=B1=20=EB=AC=B8=EC=A0=9C=20=ED=8A=B8=EB=9F=AC=EB=B8=94?= =?UTF-8?q?=EC=8A=88=ED=8C=85=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 --- ...1122_calendar_mixed_time_format_parsing.md | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 journey/troubleshooting/251122_calendar_mixed_time_format_parsing.md diff --git a/journey/troubleshooting/251122_calendar_mixed_time_format_parsing.md b/journey/troubleshooting/251122_calendar_mixed_time_format_parsing.md new file mode 100644 index 0000000..0cf9199 --- /dev/null +++ b/journey/troubleshooting/251122_calendar_mixed_time_format_parsing.md @@ -0,0 +1,105 @@ +# 캘린더 혼합 시간 형식 파싱 실패 문제 + +**날짜**: 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. 자연어 파싱 (기존) + +--- + +## 구현 완료 (2025-11-22) + +### 수정된 파일 +- `rb8001/app/router/calendar_handler.py`: 혼합 시간 형식 파싱, JSON 파싱 로직 추가 +- `rb8001/app/llm/llm_service.py`: 구조화된 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 접근 +- 실패하는 테스트를 먼저 작성하여 문제를 명확히 정의 +- 구현 후 테스트 통과로 검증 +