docs: ChromaDB metadata None 에러 해결 및 channel 구분 문제 문서화

- ChromaDB metadata None 값 필터링 해결 완료
- conversation_logs channel_id 구분 문제 문서화
- Slack DM이 'web'으로 저장되는 문제 발견
- Frontend/Slack 채널 구분 개선안 제시
This commit is contained in:
happybell80 2025-08-28 19:59:33 +09:00
parent 34b8d56587
commit e5a38ee742
6 changed files with 107 additions and 2 deletions

View File

@ -246,7 +246,7 @@
|--------|------|------|--------|------| |--------|------|------|--------|------|
| id | SERIAL | NO | | 로그 ID | | id | SERIAL | NO | | 로그 ID |
| robeing_id | VARCHAR | YES | | 로빙 ID | | robeing_id | VARCHAR | YES | | 로빙 ID |
| channel_id | VARCHAR | YES | | 채널 ID | | channel_id | VARCHAR | YES | | 채널 ID (web=Frontend/Slack DM 혼재, C로 시작=Slack 채널) ⚠️ |
| message | VARCHAR | YES | | 사용자 메시지 | | message | VARCHAR | YES | | 사용자 메시지 |
| response | VARCHAR | YES | | 로빙 응답 | | response | VARCHAR | YES | | 로빙 응답 |
| intent | VARCHAR | YES | | 의도 분석 결과 | | intent | VARCHAR | YES | | 의도 분석 결과 |

View File

@ -100,7 +100,7 @@ async def message_endpoint(request: MessageRequest):
user_id=request.user_id or "web_user", user_id=request.user_id or "web_user",
task_type="chat", task_type="chat",
context=request.context, context=request.context,
channel="web" # 웹 채팅 채널로 구분 channel="web" # ⚠️ Slack DM과 동일 (개선: 250828_conversation_logs_channel_구분_개선.md)
) )
# Frontend가 기대하는 응답 형식 # Frontend가 기대하는 응답 형식

View File

@ -47,6 +47,7 @@ LINE 1: ... VALUES ('rb8001', 'test_user_123', 'web', ...
- **정상 작동**: ~~robeing_rb8001_memories 컬렉션에 저장 성공~~**개선됨**: `rb8001_{user_uuid}` 사용자별 컬렉션 (2025-08-28) - **정상 작동**: ~~robeing_rb8001_memories 컬렉션에 저장 성공~~**개선됨**: `rb8001_{user_uuid}` 사용자별 컬렉션 (2025-08-28)
- **로그**: "Stored memory: 852cb2556eb911413dfa2d33b76d04d1" - **로그**: "Stored memory: 852cb2556eb911413dfa2d33b76d04d1"
- **컬렉션 격리**: ✅ 사용자별 분리 완료 ([250828_UUID_통합_및_사용자_격리_계획.md](DOCS/troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md#phase-3)) - **컬렉션 격리**: ✅ 사용자별 분리 완료 ([250828_UUID_통합_및_사용자_격리_계획.md](DOCS/troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md#phase-3))
- **None 값 처리**: ⚠️ ChromaDB는 metadata에 None 값 허용 안 함 → 필터링 필요 ([250828_ChromaDB_metadata_None_error.md](250828_ChromaDB_metadata_None_error.md))
### 2.3 PostgreSQL 스키마 문제 ### 2.3 PostgreSQL 스키마 문제
```sql ```sql

View File

@ -0,0 +1,55 @@
# ChromaDB metadata None 값 에러
**날짜**: 2025-08-28
**서비스**: rb8001
**상태**: ✅ 해결 완료
## 문제
- Frontend 접속 시 ChromaDB 저장 실패
- 에러: "Expected metadata value to be a str, int, float or bool, got None which is a NoneType"
- PostgreSQL은 None 허용하여 정상 저장됨
## 확인된 원인
```python
# rb8001/app/router/router.py:358-364
metadata = {
"user_id": user_id, # UUID (정상)
"slack_user_id": slack_user_id, # Frontend일 때 None ✅ 확인됨
"channel": channel, # Frontend일 때 None 가능성
"intent": intent # None 가능성
}
```
## 해결책
```python
# None 값 필터링 추가
metadata = {
k: v for k, v in {
"user_id": user_id,
"slack_user_id": slack_user_id,
"channel": channel,
"intent": intent
}.items() if v is not None
}
```
## 수정 위치
- 파일: `rb8001/app/router/router.py`
- 라인: 358-364
- 메소드: `store_conversation()`
## 검증 데이터
- **51124 로그**: ChromaDB 에러 메시지 확인됨
- **PostgreSQL**: slack_user_id=None 저장 확인됨
- **사용자**: happybell80 (UUID: 1e16e9d5-59f3-54da-a661-8abeabff4230)
## 테스트 결과 ✅
1. Frontend 대화 → ChromaDB 저장 성공 (컬렉션: rb8001_1e16e9d5-59f3-54da-a661-8abeabff4230)
2. PostgreSQL → 정상 저장 확인
3. None 값 필터링 → 정상 작동
4. 메모리 ID: 7c751907f061cb588b95b1ec6cae7b78 생성 확인
## 해결 완료
- 수정 커밋: 454fddf
- 배포: Gitea Actions 자동 배포 완료
- 검증: "Conversation saved to both storages" 확인

View File

@ -119,6 +119,7 @@ async def get_uuid(slack_id: str):
2. **ChromaDB 격리**: rb8001_{user_uuid} 컬렉션 생성 확인 2. **ChromaDB 격리**: rb8001_{user_uuid} 컬렉션 생성 확인
3. **PostgreSQL**: conversation_logs에 UUID 저장 확인 3. **PostgreSQL**: conversation_logs에 UUID 저장 확인
4. **Slack 변환**: Slack ID → UUID 자동 변환 작동 4. **Slack 변환**: Slack ID → UUID 자동 변환 작동
5. **metadata None 처리**: Frontend 접속 시 slack_user_id=None 필터링 구현 ([250828_ChromaDB_metadata_None_error.md](250828_ChromaDB_metadata_None_error.md))
### 성과 ### 성과
- 보안 취약점 100% 해결 - 보안 취약점 100% 해결

View File

@ -0,0 +1,48 @@
# conversation_logs 채널 구분 개선
**날짜**: 2025-08-28
**테이블**: conversation_logs
**상태**: 🔴 해결 필요
## 현재 상황 (DB 확인)
| channel_id | 건수 | 실제 내역 |
|------------|------|-----------|
| web | 55 | Frontend(46) + Slack DM(9) 혼재 ❌ |
| C0920L68267 | 10 | Slack 채널 ✅ |
| dm_summary | 3 | 시스템 ✅ |
**문제**: Slack DM이 "D..."로 저장되지 않고 "web"으로 저장됨
## 코드 위치
- **Frontend**: `rb8001/main.py:73``channel="web"` 하드코딩
- **Slack**: `rb8001/app/router/slack_handler.py:169``event.get("channel")`
## 해결 방안
### Phase 1: 즉시 수정
```python
# rb8001/main.py:73
channel = "frontend" # "web" → "frontend"
# Slack은 event['channel'] 그대로 사용 (C/D/G 프리픽스 자동 구분)
```
### Phase 2: DB 스키마 개선 (선택)
```sql
ALTER TABLE conversation_logs
ADD COLUMN thread_ts VARCHAR(20), -- 쓰레드 구분
ADD COLUMN channel_type VARCHAR(20); -- public_channel/private_channel/im/mpim
```
## Slack 채널 ID 체계
- **C로 시작**: 공개/비공개 채널
- **D로 시작**: 1:1 DM
- **G로 시작**: 그룹 DM/MPIM
- **쓰레드**: 같은 channel_id + thread_ts로 구분
## 예상 결과
- Frontend: `"frontend"`
- Slack 채널: `"C..."`
- Slack DM: `"D..."` (현재 "web"으로 잘못 저장 중)
**근본 원인**: Slack DM event['channel']이 중간에 "web"으로 덮어씌워짐 (조사 필요)