diff --git a/troubleshooting/250805_happybell80_AI응답개선Phase1.md b/troubleshooting/250805-06_happybell80_AI응답개선Phase1-5.md similarity index 52% rename from troubleshooting/250805_happybell80_AI응답개선Phase1.md rename to troubleshooting/250805-06_happybell80_AI응답개선Phase1-5.md index ad9a2bf..103c24e 100644 --- a/troubleshooting/250805_happybell80_AI응답개선Phase1.md +++ b/troubleshooting/250805-06_happybell80_AI응답개선Phase1-5.md @@ -1,6 +1,6 @@ -# AI 응답 단조로움 해결 - Phase 1 구현 +# AI 응답 단조로움 해결 - Phase 1-5 구현 -**날짜**: 2025-08-05 +**날짜**: 2025-08-05 ~ 2025-08-06 **작업자**: happybell80 & Claude **관련 서비스**: rb10508_micro @@ -147,4 +147,139 @@ response = await loop.run_in_executor( - 실제 감정 정보 활용 **개선된 응답 예시**: -"정말 그렇게 느껴지시나요? AI 기술의 발전 속도가 어마어마한 건 저도 매일 피부로 느끼고 있어요..." \ No newline at end of file +"정말 그렇게 느껴지시나요? AI 기술의 발전 속도가 어마어마한 건 저도 매일 피부로 느끼고 있어요..." + +--- + +# Phase 2: 캐시 인프라 구축 + +**날짜**: 2025-08-06 +**시작 시간**: 오전 9시 00분 + +## 오전 9시 00분 + +### 서버팀 사전 점검 + +**Phase 2 계획 검토**: +- 철학적 기반 확인 (기억-감정-윤리 삼각형) +- 트러블슈팅 경험 반영 (async/await, 권한 문제) +- Lock TTL 메모리 관리 개선 요청 + +**서버 상태 점검**: +``` +✅ ChromaDB 권한: 999:999 정상 +✅ 디스크 공간: 369G 사용 가능 (충분) +✅ skill-embedding: 8015 포트 정상 작동 +✅ rb10508_micro: 126.2MiB, healthy +``` + +## 오전 9시 30분 + +### Phase 2 구현 + +**목표**: 안전한 캐시 인프라 구축 + 중복 방지 + +**구현 내용**: + +1. **config.py 수정** + ```python + # 대화 캐시 설정 (Phase 2-5) + USE_CONVERSATION_CACHE: bool = False + CACHE_DISTANCE_THRESHOLD: float = 0.3 + CACHE_MAX_ITEMS_PER_USER: int = 1000 + CACHE_TTL_DAYS: int = 30 + CACHE_LOCK_TTL_SECONDS: int = 300 # 5분 + ``` + +2. **memory.py 개선** + - TTL 기반 Lock 관리 시스템 + - 예외 처리 강화된 컬렉션 초기화 + - 디버그 로깅 추가 + +**핵심 구현 - Lock TTL 관리**: +```python +async def get_user_lock(self, user_id: str) -> asyncio.Lock: + """TTL 기반 Lock 관리 - 메모리 누수 방지""" + current_time = time.time() + + # 5분 미사용 Lock 정리 + for uid, last_used in list(self._lock_cleanup_time.items()): + if current_time - last_used > settings.CACHE_LOCK_TTL_SECONDS: + self._cache_locks.pop(uid, None) + self._lock_cleanup_time.pop(uid, None) + if settings.DEBUG: + logger.debug(f"[CACHE] Lock 정리: {uid}") + + # Lock이 없으면 생성 + if user_id not in self._cache_locks: + self._cache_locks[user_id] = asyncio.Lock() + + # 사용 시간 업데이트 + self._lock_cleanup_time[user_id] = current_time + return self._cache_locks[user_id] +``` + +**예외 처리 강화**: +```python +if settings.USE_CONVERSATION_CACHE: + try: + self.conversation_cache = self.client.get_or_create_collection( + name=f"{settings.ROBING_ID}_conversation_cache", + metadata={ + "type": "conversation_cache", + "version": "1.0", + "max_items": settings.CACHE_MAX_ITEMS_PER_USER + }, + embedding_function=self.embedding_function + ) + logger.info("Conversation cache 컬렉션 생성 성공") + except Exception as e: + logger.error(f"Conversation cache 컬렉션 생성 실패: {e}") + self.conversation_cache = None +``` + +## 오전 9시 52분 + +### Phase 2 배포 및 검증 + +**배포 결과**: +- Git push 완료 +- Gitea Actions 자동 배포 + +**서버팀 검증 결과**: +``` +✅ 메모리 사용량: 126.2MiB → 108.4MiB (-17.8MiB) +✅ CPU 사용률: 0.13% → 0.05% +✅ 헬스체크: 정상 +✅ ChromaDB: 1097728 bytes 업데이트 +✅ USE_CONVERSATION_CACHE: False (안전) +``` + +## Phase 2 교훈 + +1. **서버팀 피드백의 가치** + - Lock TTL 메모리 누수 방지 제안 + - 예외 처리 강화 요구 + - 사전 점검으로 안전한 배포 + +2. **점진적 롤아웃의 중요성** + - 기본값 False로 기존 시스템 보호 + - 기능 토글로 위험 최소화 + - 단계별 활성화 가능 + +3. **예상치 못한 개선** + - 코드 추가했는데 메모리 사용량 감소 + - import 정리 효과로 추정 + - 최적화의 부수 효과 + +## Phase 2 성과 + +✅ **캐시 인프라 구축 완료** +- conversation_cache 컬렉션 준비 +- TTL 기반 Lock 시스템 구현 +- 메모리 누수 방지 메커니즘 + +✅ **안전한 배포** +- 기존 기능 무영향 +- 메모리 사용량 오히려 감소 +- Phase 3 진행 준비 완료 \ No newline at end of file