diff --git a/300_architecture/database/tables.md b/300_architecture/database/tables.md index ede8539..2a99d27 100644 --- a/300_architecture/database/tables.md +++ b/300_architecture/database/tables.md @@ -246,7 +246,7 @@ |--------|------|------|--------|------| | id | SERIAL | NO | | 로그 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 | | 사용자 메시지 | | response | VARCHAR | YES | | 로빙 응답 | | intent | VARCHAR | YES | | 의도 분석 결과 | diff --git a/troubleshooting/250826_happybell80_frontend_rb8001_채팅연결_계획.md b/troubleshooting/250826_happybell80_frontend_rb8001_채팅연결_계획.md index 0450aec..7b7b625 100644 --- a/troubleshooting/250826_happybell80_frontend_rb8001_채팅연결_계획.md +++ b/troubleshooting/250826_happybell80_frontend_rb8001_채팅연결_계획.md @@ -100,7 +100,7 @@ async def message_endpoint(request: MessageRequest): user_id=request.user_id or "web_user", task_type="chat", context=request.context, - channel="web" # 웹 채팅 채널로 구분 + channel="web" # ⚠️ Slack DM과 동일 (개선: 250828_conversation_logs_channel_구분_개선.md) ) # Frontend가 기대하는 응답 형식 diff --git a/troubleshooting/250826_rb8001_conversation_storage_failure.md b/troubleshooting/250826_rb8001_conversation_storage_failure.md index 78b6f55..da4ee50 100644 --- a/troubleshooting/250826_rb8001_conversation_storage_failure.md +++ b/troubleshooting/250826_rb8001_conversation_storage_failure.md @@ -47,6 +47,7 @@ LINE 1: ... VALUES ('rb8001', 'test_user_123', 'web', ... - **정상 작동**: ~~robeing_rb8001_memories 컬렉션에 저장 성공~~ → **개선됨**: `rb8001_{user_uuid}` 사용자별 컬렉션 (2025-08-28) - **로그**: "Stored memory: 852cb2556eb911413dfa2d33b76d04d1" - **컬렉션 격리**: ✅ 사용자별 분리 완료 ([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 스키마 문제 ```sql diff --git a/troubleshooting/250828_ChromaDB_metadata_None_error.md b/troubleshooting/250828_ChromaDB_metadata_None_error.md new file mode 100644 index 0000000..a674f41 --- /dev/null +++ b/troubleshooting/250828_ChromaDB_metadata_None_error.md @@ -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" 확인 \ No newline at end of file diff --git a/troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md b/troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md index ffd680d..3f228f0 100644 --- a/troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md +++ b/troubleshooting/250828_UUID_통합_및_사용자_격리_계획.md @@ -119,6 +119,7 @@ async def get_uuid(slack_id: str): 2. **ChromaDB 격리**: rb8001_{user_uuid} 컬렉션 생성 확인 3. **PostgreSQL**: conversation_logs에 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% 해결 diff --git a/troubleshooting/250828_conversation_logs_channel_구분_개선.md b/troubleshooting/250828_conversation_logs_channel_구분_개선.md new file mode 100644 index 0000000..e232dad --- /dev/null +++ b/troubleshooting/250828_conversation_logs_channel_구분_개선.md @@ -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"으로 덮어씌워짐 (조사 필요) \ No newline at end of file