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:
parent
57d9df05ff
commit
09fab3d36c
@ -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 기반 사용자 식별 체계 통합
|
||||||
|
|
||||||
## 현재 아키텍처 분석
|
## 현재 아키텍처 분석
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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`
|
||||||
|
|||||||
@ -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 테이블 구조 확장
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user