docs: ChromaDB metadata None 에러 해결 및 channel 구분 문제 문서화
- ChromaDB metadata None 값 필터링 해결 완료 - conversation_logs channel_id 구분 문제 문서화 - Slack DM이 'web'으로 저장되는 문제 발견 - Frontend/Slack 채널 구분 개선안 제시
This commit is contained in:
parent
34b8d56587
commit
e5a38ee742
@ -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 | | 의도 분석 결과 |
|
||||
|
||||
@ -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가 기대하는 응답 형식
|
||||
|
||||
@ -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
|
||||
|
||||
55
troubleshooting/250828_ChromaDB_metadata_None_error.md
Normal file
55
troubleshooting/250828_ChromaDB_metadata_None_error.md
Normal 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" 확인
|
||||
@ -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% 해결
|
||||
|
||||
48
troubleshooting/250828_conversation_logs_channel_구분_개선.md
Normal file
48
troubleshooting/250828_conversation_logs_channel_구분_개선.md
Normal 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"으로 덮어씌워짐 (조사 필요)
|
||||
Loading…
x
Reference in New Issue
Block a user