- calendar_mixed_time_format_parsing: JSON 블록 제거 내용 추가 - naverworks_briefing_2stage: config 제거 및 설정 관리 원칙 추가
3.6 KiB
3.6 KiB
캘린더 혼합 시간 형식 파싱 실패 문제
날짜: 2025-11-22 작성자: Claude 관련 파일:
rb8001/app/router/calendar_handler.pyrb8001/app/llm/llm_service.pyrb8001/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
혼합 형식 패턴 추가:
# 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
우선순위 변경:
- JSON 형식 (새로 추가)
- 구조화된 필드 (기존)
- 자연어 파싱 (기존)
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 테스트 작성
검증 방법
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 접근
- 실패하는 테스트를 먼저 작성하여 문제를 명확히 정의
- 구현 후 테스트 통과로 검증