Phase 4 트러블슈팅 추가: 캐시 검색 구현 및 디버깅
- current_user_id 설정 누락 문제 해결 - ChromaDB TTL 필터링 오류 수정 (Python 후처리) - 캐시 히트 성공 및 성과 달성 - 교훈: user_id 전달 경로, ChromaDB 제약사항, 단계별 디버깅
This commit is contained in:
parent
30e47105f6
commit
9a7004d288
@ -404,4 +404,140 @@ if settings.USE_CONVERSATION_CACHE:
|
||||
✅ **운영 준비 완료**
|
||||
- cleanup.py 크론잡 준비
|
||||
- 모니터링 로그 추가
|
||||
- 안전한 에러 처리
|
||||
- 안전한 에러 처리
|
||||
|
||||
---
|
||||
|
||||
# Phase 4: 정밀 캐시 검색 + 다중 가중치
|
||||
|
||||
**날짜**: 2025-08-06
|
||||
**시작 시간**: 오전 11시 30분
|
||||
|
||||
## 오전 11시 30분
|
||||
|
||||
### Phase 4 구현
|
||||
|
||||
**목표**: 저장된 캐시 활용으로 API 비용 절감 및 응답 속도 개선
|
||||
|
||||
**구현 내용**:
|
||||
|
||||
1. **search_conversation_cache 메서드**
|
||||
- 다중 가중치 기반 검색
|
||||
- 의미 유사도 60%, 감정 20%, 시간 20%
|
||||
- 종합 점수 계산 및 필터링
|
||||
|
||||
2. **brain.py 캐시 우선 검색**
|
||||
```python
|
||||
# Phase 4: 캐시 우선 검색
|
||||
if settings.USE_CONVERSATION_CACHE and hasattr(self, 'current_user_id') and self.current_user_id:
|
||||
cached_results = await self.memory.search_conversation_cache(...)
|
||||
if cached_results:
|
||||
return cached_response
|
||||
```
|
||||
|
||||
3. **usage_count 추적**
|
||||
- 캐시 사용 횟수 기록
|
||||
- 백그라운드 업데이트
|
||||
|
||||
## 오전 11시 40분
|
||||
|
||||
### Phase 4 캐시 히트 미작동 문제
|
||||
|
||||
**증상**:
|
||||
- 캐시 저장은 정상 (Phase 3)
|
||||
- 캐시 검색이 작동하지 않음
|
||||
- cache_hit 로그 전혀 없음
|
||||
|
||||
**원인 분석**:
|
||||
1. API 엔드포인트 차이 의심 → 확인 결과 동일
|
||||
2. **실제 원인: current_user_id 설정 누락**
|
||||
```python
|
||||
# think() 메서드는 user_id를 받지만
|
||||
user_id = input_data.get("user_id", "unknown")
|
||||
|
||||
# 캐시 검색은 self.current_user_id를 확인
|
||||
if hasattr(self, 'current_user_id') and self.current_user_id:
|
||||
```
|
||||
|
||||
**해결**:
|
||||
```python
|
||||
# think() 메서드에 추가
|
||||
self.current_user_id = user_id
|
||||
```
|
||||
|
||||
## 오전 11시 45분
|
||||
|
||||
### ChromaDB TTL 필터링 오류
|
||||
|
||||
**오류 메시지**:
|
||||
```
|
||||
Expected operand value to be an int or a float for operator $gte,
|
||||
got 2025-08-06T02:41:04.090339 in query
|
||||
```
|
||||
|
||||
**문제**:
|
||||
- ChromaDB의 `$gte` 연산자는 숫자만 지원
|
||||
- datetime 문자열을 비교하려 해서 오류
|
||||
|
||||
**해결 방안 검토**:
|
||||
1. TTL을 타임스탬프로 저장 → 기존 데이터 호환성 문제
|
||||
2. **Python 후처리로 TTL 필터링** → 채택 ✅
|
||||
3. TTL 체크 제거 → 만료된 캐시 사용 위험
|
||||
|
||||
**구현**:
|
||||
```python
|
||||
# ChromaDB 쿼리에서 TTL 필터 제거
|
||||
results = self.conversation_cache.query(
|
||||
query_texts=[query],
|
||||
n_results=20, # 더 많이 가져옴
|
||||
where={"user_id": user_id}
|
||||
)
|
||||
|
||||
# Python에서 TTL 체크
|
||||
ttl_date = datetime.fromisoformat(ttl_date_str)
|
||||
if ttl_date < current_time:
|
||||
continue # 만료된 캐시 스킵
|
||||
```
|
||||
|
||||
## 오전 11시 52분
|
||||
|
||||
### Phase 4 성공
|
||||
|
||||
**테스트 결과**:
|
||||
- ✅ 캐시 히트 정상 작동
|
||||
- ✅ 유사한 질문에 동일 응답 반환
|
||||
- ✅ API 비용 절감 확인
|
||||
- ✅ 응답 속도 개선 확인
|
||||
|
||||
## Phase 4 교훈
|
||||
|
||||
1. **user_id 전달 경로 확인**
|
||||
- 각 메서드에서 필요한 변수 설정 확인
|
||||
- self.current_user_id 같은 인스턴스 변수 주의
|
||||
|
||||
2. **ChromaDB 제약사항 이해**
|
||||
- 문자열 비교 연산자 미지원
|
||||
- 숫자 타입만 비교 가능
|
||||
- 필요시 Python 후처리 활용
|
||||
|
||||
3. **단계별 디버깅**
|
||||
- 로그로 각 단계 실행 여부 확인
|
||||
- 조건문 체크 포인트 추가
|
||||
- 에러 메시지 정확히 분석
|
||||
|
||||
## Phase 4 성과
|
||||
|
||||
✅ **캐시 검색 시스템 완성**
|
||||
- 다중 가중치 기반 정밀 검색
|
||||
- TTL 만료 캐시 자동 필터링
|
||||
- usage_count로 인기도 추적
|
||||
|
||||
✅ **실질적 효과 달성**
|
||||
- API 비용 절감 시작
|
||||
- 응답 속도 대폭 개선
|
||||
- 일관된 품질의 응답 제공
|
||||
|
||||
✅ **안정적 운영**
|
||||
- 캐시 미스 시 자동 폴백
|
||||
- 에러 처리 완벽
|
||||
- 디버그 로깅 충실
|
||||
Loading…
x
Reference in New Issue
Block a user