docs: ChromaDB 사용자 격리 문제 해결 완료 반영

- 250827_51124_critical_issues.md: ChromaDB 격리 해결 표시
- 250827_happybell80_긴급이슈점검및코드업데이트.md: 우선순위 업데이트
- 250826_rb8001_conversation_storage_failure.md: 사용자별 컬렉션 반영
- 250819_claude_사용자구분및ChromaDB격리문제.md: 전체 해결 상태 업데이트

관련: 250828_UUID_통합_및_사용자_격리_계획.md Phase 3 완료
This commit is contained in:
happybell80 2025-08-28 18:27:24 +09:00
parent 57d9df05ff
commit 09fab3d36c
4 changed files with 37 additions and 114 deletions

View File

@ -3,19 +3,20 @@
**날짜**: 2025-08-19 **날짜**: 2025-08-19
**작성자**: Claude (51124 서버) **작성자**: Claude (51124 서버)
**관련 서비스**: rb8001, rb10508_micro, ChromaDB, Slack **관련 서비스**: rb8001, rb10508_micro, ChromaDB, Slack
**상태**: ✅ 해결 완료 (2025-08-28) - [250828_UUID_통합_및_사용자_격리_계획.md](../troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md) 참조
## 발견된 문제 ## ~~발견된 문제~~ ✅ 해결됨
### 1. rb8001 사용자 구분 없음 ### 1. ~~rb8001 사용자 구분 없음~~ ✅ 해결
- **현상**: - **현상**:
- 종태님(U0925SXQFDK)을 "전희재님"으로 호칭 - ~~종태님(U0925SXQFDK)을 "전희재님"으로 호칭~~
- 모든 사용자 대화가 하나의 ChromaDB 컬렉션에 저장 - ~~모든 사용자 대화가 하나의 ChromaDB 컬렉션에 저장~~
- `robeing_rb8001_memories` 단일 컬렉션 사용 - ~~`robeing_rb8001_memories` 단일 컬렉션 사용~~
- **원인**: - **해결 (2025-08-28)**:
- 슬랙 직접 연결 (Gateway/JWT 미사용) - JWT 인증 구현 완료
- 사용자별 컬렉션 분리 로직 없음 - 사용자별 컬렉션 분리 (`rb8001_{user_uuid}`)
- ChromaDB에 모든 사용자 컨텍스트 혼재 - Slack ID → UUID 자동 변환 구현
### 2. 슬랙 봇 분리 문제 ### 2. 슬랙 봇 분리 문제
- **현상**: - **현상**:
@ -35,17 +36,17 @@
- **rb10508**: Gateway JWT를 통한 웹 user_id 사용 - **rb10508**: Gateway JWT를 통한 웹 user_id 사용
- **통합 매핑**: 없음 - **통합 매핑**: 없음
## 보안 및 프라이버시 위험 ## ~~보안 및 프라이버시 위험~~ ✅ 해결
### ChromaDB 데이터 혼재 ### ~~ChromaDB 데이터 혼재~~ ✅ 해결
- **문제**: 한 사용자가 다른 사용자의 대화 컨텍스트에 접근 가능 - **문제**: ~~한 사용자가 다른 사용자의 대화 컨텍스트에 접근 가능~~
- **예시**: 종태님이 "내 생일은?"이라고 물으면 희재님 생일 정보가 나올 수 있음 - **예시**: ~~종태님이 "내 생일은?"이라고 물으면 희재님 생일 정보가 나올 수 있음~~
- **심각도**: 높음 (개인정보 노출) - **해결**: 사용자별 컬렉션 완전 격리 (`rb8001_{user_uuid}`)
### 잘못된 컨텍스트 응답 ### ~~잘못된 컨텍스트 응답~~ ✅ 해결
- **문제**: 이전 사용자의 대화를 현재 사용자 것으로 인식 - **문제**: ~~이전 사용자의 대화를 현재 사용자 것으로 인식~~
- **예시**: "전희재님"이라고 잘못 호칭 - **예시**: ~~"전희재님"이라고 잘못 호칭~~
- **심각도**: 중간 (사용자 경험 저하) - **해결**: UUID 기반 사용자 식별 체계 통합
## 현재 아키텍처 분석 ## 현재 아키텍처 분석

View File

@ -44,9 +44,9 @@ LINE 1: ... VALUES ('rb8001', 'test_user_123', 'web', ...
| PostgreSQL 저장 | UUID 타입 체크 | ❌ 타입 에러 | | PostgreSQL 저장 | UUID 타입 체크 | ❌ 타입 에러 |
### 2.2 ChromaDB 상태 ### 2.2 ChromaDB 상태
- **정상 작동**: robeing_rb8001_memories 컬렉션에 저장 성공 - **정상 작동**: ~~robeing_rb8001_memories 컬렉션에 저장 성공~~ → **개선됨**: `rb8001_{user_uuid}` 사용자별 컬렉션 (2025-08-28)
- **로그**: "Stored memory: 852cb2556eb911413dfa2d33b76d04d1" - **로그**: "Stored memory: 852cb2556eb911413dfa2d33b76d04d1"
- **컬렉션 로드**: "Loaded existing collection: robeing_rb8001_memories" - **컬렉션 격리**: ✅ 사용자별 분리 완료 ([250828_UUID_통합_및_사용자_격리_계획.md](DOCS/troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md#phase-3))
### 2.3 PostgreSQL 스키마 문제 ### 2.3 PostgreSQL 스키마 문제
```sql ```sql

View File

@ -6,96 +6,17 @@
## 작성자 ## 작성자
Claude Code Claude Code
## 문제 1: ChromaDB 사용자 대화 격리 문제 ## ~~문제 1: ChromaDB 사용자 대화 격리 문제~~ ✅ 해결 완료 (2025-08-28)
### 문제 설명 ### 문제 설명
rb8001 서비스에서 ChromaDB 컬렉션 구조와 사용자 데이터 분리 방식 검토 필요 ~~rb8001 서비스에서 ChromaDB 컬렉션 구조와 사용자 데이터 분리 방식 검토 필요~~
**해결됨**: [250828_UUID_통합_및_사용자_격리_계획.md](DOCS/troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md) 참조
### 현재 구조 ### ✅ 해결 완료 (2025-08-28)
1. **rb8001 방식** - **Phase 3 완료**: 사용자별 ChromaDB 컬렉션 격리 구현
- 컬렉션명: `robeing_rb8001_memories` - **구현 내용**: `rb8001_{user_uuid}` 형식으로 사용자별 컬렉션 분리
- 모든 사용자 대화가 하나의 컬렉션에 저장 - **상세 내용**: [250828_UUID_통합_및_사용자_격리_계획.md](DOCS/troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md#phase-3) 참조
- metadata의 user_id 필드로 구분
2. **기술적 특성**
- 메모리 검색 시 필터링 의존
- 벡터 검색 후 메타데이터 필터 적용
- 사용자 간 데이터 논리적 분리
### 원인 분석
#### rb8001 코드 분석
```python
# /home/admin/ivada_project/rb8001/app/memory/manager.py:40
self.collection_name = f"robeing_{robeing_id}_memories"
# /home/admin/ivada_project/rb8001/app/router/router.py:327-336
await self.memory_manager.store_memory(
content=f"User: {message}\nAssistant: {response}",
metadata={
"user_id": user_id, # metadata에만 저장
"channel_id": channel,
"intent": intent,
"confidence": confidence
},
memory_type="conversation"
)
```
#### rb10508_micro 구조 (비교)
```python
# /home/admin/ivada_project/rb10508_micro/app/core/memory/storage.py:88
collection_name = f"{settings.ROBEING_ID}_{username if username else 'default'}_{memory_type}"
# 예: rb10508_test_김종태_episodic
```
### 해결 방안
#### 1. 즉시 적용 가능한 임시 조치
- 메모리 검색 시 user_id 필터링 강화
- `where` 조건에 user_id 필수 포함
#### 2. 근본적 해결책 (권장)
rb8001의 MemoryManager 클래스를 rb10508 방식으로 수정:
```python
# 수정 전
self.collection_name = f"robeing_{robeing_id}_memories"
# 수정 후
def get_collection_name(self, user_id: str, memory_type: str = "conversation"):
"""사용자별 컬렉션명 생성"""
return f"robeing_{self.robeing_id}_{user_id}_{memory_type}"
```
#### 3. 구현 시 고려사항
- 기존 데이터 마이그레이션 필요
- 컬렉션 생성 시점 조정 (사용자별 동적 생성)
- 메모리 검색 로직 수정
### 영향 범위
- **관련 서비스**: rb8001, rb10508_micro
- **처리 우선순위**: HIGH
- **데이터 구조**: 서비스별 차이 존재
### 테스트 방법
```bash
# 1. 현재 컬렉션 구조 확인
docker exec -it rb8001 python -c "
import chromadb
client = chromadb.PersistentClient(path='/app/chroma_db')
print(client.list_collections())
"
# 2. 특정 사용자 대화만 조회 테스트
curl -X POST http://localhost:8001/api/memory/search \
-H "Content-Type: application/json" \
-d '{
"query": "test",
"user_id": "U0925SXQFDK",
"limit": 5
}'
```
--- ---
@ -177,10 +98,10 @@ curl -X POST http://192.168.219.45:3000/api/gmail/refresh/U0925SXQFDK
``` ```
## 개선 방향 ## 개선 방향
1. **데이터 구조**: 사용자별 컬렉션 분리 검토 1. ~~**데이터 구조**: 사용자별 컬렉션 분리 검토~~ ✅ 완료
2. **서비스 표준화**: rb8001과 rb10508 구조 통일 검토 2. **서비스 표준화**: rb8001과 rb10508 구조 통일 검토
3. **코드 관리**: TODO 항목 추적 및 구현 3. **코드 관리**: TODO 항목 추적 및 구현
4. **토큰 관리**: OAuth 토큰 자동 갱신 체계 구축 4. ~~**토큰 관리**: OAuth 토큰 자동 갱신 체계 구축~~ ✅ 완료
## 참고 문서 ## 참고 문서
- rb10508_micro 메모리 구조: `/home/admin/ivada_project/rb10508_micro/app/core/memory/storage.py` - rb10508_micro 메모리 구조: `/home/admin/ivada_project/rb10508_micro/app/core/memory/storage.py`

View File

@ -91,8 +91,9 @@ model: Optional[Literal[..., "gemini-2.5-flash-lite"]] = None
## 3. 발견된 추가 이슈 ## 3. 발견된 추가 이슈
### 3.1 ChromaDB 사용자 격리 문제 🔴 ### 3.1 ~~ChromaDB 사용자 격리 문제~~ ✅ 해결 완료 (2025-08-28)
**심각도: HIGH** **심각도: ~~HIGH~~** → **해결됨**
**상세**: [250828_UUID_통합_및_사용자_격리_계획.md](DOCS/troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md#phase-3)
rb8001이 모든 사용자 대화를 하나의 ChromaDB 컬렉션에 저장: rb8001이 모든 사용자 대화를 하나의 ChromaDB 컬렉션에 저장:
- 컬렉션명: `robeing_rb8001_memories` (모든 Slack 사용자 공유) - 컬렉션명: `robeing_rb8001_memories` (모든 Slack 사용자 공유)
@ -131,10 +132,10 @@ rb8001이 모든 사용자 대화를 하나의 ChromaDB 컬렉션에 저장:
## 5. 후속 작업 필요 사항 ## 5. 후속 작업 필요 사항
### 우선순위 HIGH 🔴 ### 우선순위 HIGH 🔴
1. **ChromaDB 사용자 격리 구현** 1. ~~**ChromaDB 사용자 격리 구현**~~ ✅ 완료
- rb8001 MemoryManager 수정 - ~~rb8001 MemoryManager 수정~~
- 사용자별 컬렉션 생성 - ~~사용자별 컬렉션 생성~~
- 기존 데이터 마이그레이션 - ~~기존 데이터 마이그레이션~~
2. **Frontend-Backend 연동 재설계** 2. **Frontend-Backend 연동 재설계**
- user_preferences 테이블 구조 확장 - user_preferences 테이블 구조 확장