docs: 하루종일 일정 등록 문제 해결 과정 보강
- UNKNOWN으로 분류된 메시지의 컨텍스트 보존 문제 추가 - confirm_conv 찾기 로직 개선 및 하루종일 정보 수집 강화 내용 추가 - skill-calendar 서비스 Google Calendar API date 필드 지원 추가 - 교훈 섹션에 UNKNOWN 분류 및 외부 API 스펙 확인 중요성 추가
This commit is contained in:
parent
a08f41b500
commit
1b4adb73fc
@ -118,42 +118,57 @@ if existing:
|
|||||||
|
|
||||||
## 하루종일 일정 등록 지원 (2025-11-18 추가)
|
## 하루종일 일정 등록 지원 (2025-11-18 추가)
|
||||||
|
|
||||||
### 문제
|
### 문제 상황
|
||||||
- "12월 25일 크리스마스 일정 등록해줘" → "시간은 하루종일" → 일정 등록 실패
|
- "12월 25일 크리스마스 일정 등록해줘" → "시간은 하루종일" → "ㅇㅇ" → 일정 등록 실패
|
||||||
- "하루종일" 표현이 슬롯 추출 및 시간 파싱에서 인식되지 않음
|
- "시간은 하루 종일"이 UNKNOWN으로 분류되어 `calendar_confirm` intent가 없음
|
||||||
- Google Calendar API의 all-day 이벤트 형식(`date` 필드) 미지원
|
- `confirm_conv`를 찾을 때 "12월 25일 크리스마스 일정 등록해줘" 메시지만 선택되어 하루종일 정보 누락
|
||||||
|
- `skill-calendar` 서비스에 `is_all_day` 파라미터가 없어서 Google Calendar API에 `dateTime` 필드를 보내 400 Bad Request 발생
|
||||||
|
|
||||||
|
### 원인 분석
|
||||||
|
1. **의도 분류 실패**: `calendar_handler.py:42-48`에서 `calendar_confirm` intent만 찾아서 실패 시 `recent[0]` 사용, 하루종일 정보가 없는 메시지 선택
|
||||||
|
2. **하루종일 정보 수집 실패**: `calendar_handler.py:70-88`에서 `confirm_conv`의 `llm_response`에만 의존, 최근 대화에서 하루종일 정보를 별도로 수집하지 않음
|
||||||
|
3. **Google Calendar API 형식 오류**: `skill-calendar/services/google_calendar_service.py:162-172`에서 하루종일일 때도 `dateTime` 필드 사용, 실제로는 `date` 필드 필요
|
||||||
|
|
||||||
### 해결 방안
|
### 해결 방안
|
||||||
1. **슬롯 추출 패턴 확장** (`router.py:348-360`)
|
1. **confirm_conv 찾기 로직 개선** (`calendar_handler.py:42-69`)
|
||||||
|
- 우선순위: 1) `calendar_confirm` intent, 2) "하루 종일" 포함 메시지, 3) 최신 대화
|
||||||
|
- 최근 대화에서 "하루 종일" 포함 메시지를 별도로 추적하여 `all_day_conv`로 저장
|
||||||
|
|
||||||
|
2. **하루종일 정보 수집 강화** (`calendar_handler.py:70-88`)
|
||||||
|
- `confirm_conv`의 `llm_response`에 하루종일이 없으면 최근 5개 대화에서 별도 수집
|
||||||
|
- `all_day_info` 변수로 저장하여 `time_range` 추출 시 활용
|
||||||
|
|
||||||
|
3. **슬롯 추출 패턴 확장** (`router.py:348-360`)
|
||||||
- 시간 패턴에 "하루종일", "종일", "all day" 추가
|
- 시간 패턴에 "하루종일", "종일", "all day" 추가
|
||||||
- 하루종일 표현을 "하루종일"로 정규화하여 슬롯에 저장
|
- 하루종일 표현을 "하루종일"로 정규화하여 슬롯에 저장
|
||||||
|
|
||||||
2. **LLM 응답에서 하루종일 패턴 직접 추출** (`calendar_handler.py:65-78`)
|
4. **시간 파싱 로직 개선** (`calendar_handler.py:591-629`)
|
||||||
- `extract_field`가 "(정보 없음)"을 반환하는 경우 대비
|
|
||||||
- LLM 응답과 원본 메시지에서 "하루 종일", "하루종일" 패턴 직접 검색
|
|
||||||
- 정규식 패턴: `r'하루\s*종일'`, `r'하루종일'`, `r'종일'`, `r'all\s*day'`
|
|
||||||
|
|
||||||
3. **시간 파싱 로직 개선** (`calendar_handler.py:505-572`)
|
|
||||||
- `parse_time_range` 함수에 하루종일 처리 로직 추가
|
- `parse_time_range` 함수에 하루종일 처리 로직 추가
|
||||||
- all-day 이벤트는 `date` 필드 사용 (예: "2025-12-25" → "2025-12-26")
|
- all-day 이벤트는 `date` 필드 사용 (예: "2025-12-25" → "2025-12-26")
|
||||||
- 반환값에 `is_all_day` 플래그 추가
|
- 반환값에 `is_all_day` 플래그 추가
|
||||||
|
|
||||||
4. **Google Calendar API 지원** (`calendar_skill.py:22-75`)
|
5. **skill-calendar 서비스 지원 추가** (`skill-calendar/routers/calendar.py:16-25`, `skill-calendar/services/google_calendar_service.py:115-186`)
|
||||||
- `create_event`에 `is_all_day` 파라미터 추가
|
- `CreateEventRequest`에 `is_all_day` 필드 추가
|
||||||
- all-day 이벤트인 경우 `is_all_day: true` 플래그를 skill-calendar로 전달
|
- `GoogleCalendarService.create_event`에 `is_all_day` 파라미터 추가
|
||||||
|
- 하루종일일 때 `date` 필드 사용 (일반 이벤트는 `dateTime` 필드)
|
||||||
|
|
||||||
5. **중복 체크 로직 개선** (`calendar_handler.py:100-131`)
|
6. **중복 체크 로직 개선** (`calendar_handler.py:191-196`)
|
||||||
- all-day 이벤트는 `date` 필드로 비교
|
- all-day 이벤트는 `date` 필드로 비교
|
||||||
- 일반 이벤트는 `dateTime` 필드로 비교
|
- 일반 이벤트는 `dateTime` 필드로 비교
|
||||||
|
|
||||||
### 커밋
|
### 구현 완료
|
||||||
- `7672831` (2025-11-18): 하루종일 일정 등록 지원 추가
|
- `85eee34` (2025-11-18): confirm_conv 찾기 로직 개선 - 하루종일 메시지 우선 사용
|
||||||
- `19ed7b6` (2025-11-18): LLM 응답에서 하루종일 패턴 직접 추출 로직 추가
|
- `7bb3524` (2025-11-18): 최근 대화에서 하루종일 정보 수집 로직 추가
|
||||||
- 배포: Gitea Actions 자동 배포 완료, rb8001 컨테이너 재시작 확인
|
- `9df9e9e` (2025-11-18): generator expression에서 re 모듈 스코프 문제 해결
|
||||||
|
- `9d150c3` (2025-11-18): 함수 내부 중복 import re 제거
|
||||||
|
- `2554576` (2025-11-18): skill-calendar 서비스에 하루종일 이벤트 지원 추가
|
||||||
|
- `d1b546a` (2025-11-18): skill-calendar 인덴테이션 오류 수정
|
||||||
|
- 배포: Gitea Actions 자동 배포 완료, rb8001 및 skill-calendar 컨테이너 재시작 확인
|
||||||
|
|
||||||
### 검증
|
### 검증
|
||||||
- "12월 25일 크리스마스 일정 등록해줘" → "시간은 하루종일" → 일정 등록 성공
|
- "12월 25일 크리스마스 일정 등록해줘" → "시간은 하루종일" → "ㅇㅇ" → 일정 등록 성공
|
||||||
- Google Calendar에서 all-day 이벤트로 정상 표시 확인
|
- Google Calendar에서 all-day 이벤트로 정상 표시 확인
|
||||||
|
- 로그 확인: `[Calendar] Found all-day message in recent conversation`, `[Calendar] Using all_day_info from recent conversations`, `Created event rd6u0uhuqhdcvse3adovmjfkac`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -231,6 +246,14 @@ docker logs rb8001 | grep "get_events"
|
|||||||
- **문제**: 같은 DB에 같은 데이터 중복 저장은 버그
|
- **문제**: 같은 DB에 같은 데이터 중복 저장은 버그
|
||||||
- **교훈**: 저장 로직은 단일 진입점 유지
|
- **교훈**: 저장 로직은 단일 진입점 유지
|
||||||
|
|
||||||
|
### 4. UNKNOWN으로 분류된 메시지의 컨텍스트 보존
|
||||||
|
- **문제**: "시간은 하루 종일"이 UNKNOWN으로 분류되어 `calendar_confirm` intent가 없었고, `confirm_conv`를 찾을 때 하루종일 정보가 없는 메시지만 선택됨
|
||||||
|
- **교훈**: 의도 분류가 실패해도 최근 대화에서 관련 정보(하루종일, 날짜 등)를 별도로 수집하여 보존해야 함. `confirm_conv`를 찾을 때 intent뿐만 아니라 메시지 내용도 고려해야 함
|
||||||
|
|
||||||
|
### 5. 외부 API 스펙 확인의 중요성
|
||||||
|
- **문제**: Google Calendar API의 하루종일 이벤트 형식(`date` 필드 vs `dateTime` 필드)을 확인하지 않고 구현
|
||||||
|
- **교훈**: 외부 API 통합 시 공식 문서를 먼저 확인하고 웹 검색으로 검증해야 함. 추측으로 구현하면 400 Bad Request 같은 에러 발생
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 관련 파일
|
## 관련 파일
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user