docs: rb8001 대화 저장 문제 분석 - ChromaDB는 성공, PostgreSQL UUID 에러
This commit is contained in:
parent
64d622b30d
commit
556e81022c
@ -148,14 +148,14 @@ conversation_data = {
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 State Service DB 설정
|
||||
### 5.2 ~~State Service~~ robeing-monitor 내장 state_service DB 설정
|
||||
```bash
|
||||
# /home/heejae/robeing-state-service/.env
|
||||
# 변경 전 (잘못된 DB)
|
||||
DATABASE_URL=postgresql://robeings:robeings@localhost:5433/auth_db
|
||||
|
||||
# 변경 후 (올바른 DB)
|
||||
# robeing-monitor가 state 기능 통합 (별도 State Service 불필요)
|
||||
# /home/admin/ivada_project/robeing-monitor/.env
|
||||
DATABASE_URL=postgresql://robeings:robeings@localhost:5433/main_db
|
||||
|
||||
# 대화 저장 엔드포인트 (robeing-monitor 내부)
|
||||
# POST /api/logs/{robeing_id}/conversation
|
||||
```
|
||||
|
||||
---
|
||||
@ -166,7 +166,7 @@ DATABASE_URL=postgresql://robeings:robeings@localhost:5433/main_db
|
||||
2. ⏳ gmail_tokens의 slack_id → slack_user_id로 컬럼명 변경
|
||||
3. ⏳ 51124 서버 코드가 slack_user_id 사용하도록 수정
|
||||
4. ⏳ 저장 후 배치 작업으로 slack_user_id → user_id 매핑
|
||||
5. ⏳ State Service 환경변수 수정 (auth_db → main_db)
|
||||
5. ✅ ~~State Service 환경변수 수정~~ (robeing-monitor가 state 기능 통합, 포트 9024로 실행 중)
|
||||
|
||||
---
|
||||
|
||||
|
||||
219
troubleshooting/250826_rb8001_conversation_storage_failure.md
Normal file
219
troubleshooting/250826_rb8001_conversation_storage_failure.md
Normal file
@ -0,0 +1,219 @@
|
||||
# rb8001 PostgreSQL 대화 저장 UUID 타입 에러
|
||||
|
||||
## 작성일: 2025-08-26
|
||||
## 작성자: 51124 서버 담당
|
||||
## 상태: 부분 해결 (ChromaDB ✅, PostgreSQL ❌)
|
||||
## 영향: PostgreSQL conversation_logs 저장 실패 (UUID 타입 불일치)
|
||||
|
||||
---
|
||||
|
||||
## 1. 문제 상황
|
||||
|
||||
### 1.1 증상
|
||||
- **PostgreSQL**: UUID 타입 에러로 저장 실패
|
||||
- **ChromaDB**: 정상 저장 성공 ✅
|
||||
- **대화 이력**: ChromaDB는 저장되나 PostgreSQL 조회 불가
|
||||
- **영향 범위**: 모든 비-UUID 형식 user_id 사용자
|
||||
|
||||
### 1.2 실제 테스트 결과
|
||||
```bash
|
||||
# 테스트 요청
|
||||
curl -X POST http://localhost:8001/api/message \
|
||||
-d '{"text": "테스트 저장 확인", "user_id": "test_user_123"}'
|
||||
|
||||
# 로그 확인
|
||||
INFO: ChromaDB: Conversation saved for user test_user_123
|
||||
ERROR: PostgreSQL save failed: invalid input syntax for type uuid: "test_user_123"
|
||||
|
||||
# 실제 에러
|
||||
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type uuid: "test_user_123"
|
||||
LINE 1: ... VALUES ('rb8001', 'test_user_123', 'web', ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 원인 분석
|
||||
|
||||
### 2.1 실제 저장 로직 구현 상태
|
||||
| 구성요소 | 상태 | 실제 동작 |
|
||||
|---------|------|----------|
|
||||
| router.py:290-297 | `_save_conversation()` 호출됨 | ✅ 정상 호출 |
|
||||
| router.py:309-365 | `_save_conversation()` 구현됨 | ✅ 구현 완료 |
|
||||
| memory_manager.store_memory() | ChromaDB 저장 | ✅ 성공 |
|
||||
| PostgreSQL 저장 | UUID 타입 체크 | ❌ 타입 에러 |
|
||||
|
||||
### 2.2 ChromaDB 상태
|
||||
- **정상 작동**: robeing_rb8001_memories 컬렉션에 저장 성공
|
||||
- **로그**: "Stored memory: 852cb2556eb911413dfa2d33b76d04d1"
|
||||
- **컬렉션 로드**: "Loaded existing collection: robeing_rb8001_memories"
|
||||
|
||||
### 2.3 PostgreSQL 스키마 문제
|
||||
```sql
|
||||
-- conversation_logs 테이블 스키마
|
||||
user_id UUID -- 문제: UUID 타입만 허용
|
||||
slack_user_id VARCHAR(100) -- 추가됨 (250826 문서)
|
||||
|
||||
-- 실제 저장 시도
|
||||
INSERT INTO conversation_logs (user_id, ...)
|
||||
VALUES ('test_user_123', ...) -- 실패: UUID 형식 아님
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 코드 분석
|
||||
|
||||
### 3.1 실제 구현된 저장 코드
|
||||
```python
|
||||
# rb8001/app/router/router.py:290-297
|
||||
async def _call_internal_llm(...):
|
||||
# LLM 호출
|
||||
result = await self.llm_service.process_request(llm_request)
|
||||
|
||||
# 저장 함수 호출 (실제로 구현됨)
|
||||
if result.get("success") and result.get("content"):
|
||||
await self._save_conversation(
|
||||
message=message,
|
||||
response=result.get("content"),
|
||||
user_id=user_id, # 여기서 "test_user_123" 같은 문자열 전달
|
||||
channel=channel,
|
||||
intent=task_type,
|
||||
confidence=result.get("confidence", 0.8)
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
# router.py:338-344
|
||||
conversation_log = ConversationLog(
|
||||
robeing_id=settings.ROBEING_ID,
|
||||
user_id=user_id, # UUID 타입 필요한데 문자열 전달 -> 에러
|
||||
channel_id=channel,
|
||||
message=message,
|
||||
response=response,
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
### 3.2 robeing-monitor 엔드포인트도 404
|
||||
```bash
|
||||
curl -X POST http://localhost:9024/api/logs/rb8001/conversation
|
||||
# 404 Not Found
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 영향도
|
||||
|
||||
### 4.1 기능 영향
|
||||
- **대화 이력 조회**: 불가능
|
||||
- **컨텍스트 유지**: 불가능 (매 대화가 새 대화)
|
||||
- **학습/개선**: 불가능 (데이터 없음)
|
||||
- **감사 로그**: 없음
|
||||
|
||||
### 4.2 서비스별 상태
|
||||
| 서비스 | 대화 기능 | ChromaDB 저장 | PostgreSQL 저장 |
|
||||
|--------|----------|---------------|-----------------|
|
||||
| Slack (U091UNVE41M) | ✅ 작동 | ✅ 성공 | ❌ UUID 에러 |
|
||||
| Frontend (test_user) | ✅ 작동 | ✅ 성공 | ❌ UUID 에러 |
|
||||
| DM | ✅ 작동 | ✅ 성공 | ❌ UUID 에러 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 해결 방안
|
||||
|
||||
### 5.1 즉시 필요한 작업
|
||||
1. **UUID 변환 로직 추가**: Slack ID나 일반 문자열을 UUID로 변환
|
||||
2. **slack_user_id 필드 활용**: user_id 대신 slack_user_id 사용
|
||||
3. **스키마 수정 고려**: user_id를 nullable로 만들기
|
||||
|
||||
### 5.2 코드 수정 예시
|
||||
```python
|
||||
# rb8001/app/router/router.py의 _save_conversation() 수정
|
||||
import uuid
|
||||
|
||||
async def _save_conversation(self, ...):
|
||||
# UUID 변환 로직 추가
|
||||
try:
|
||||
# UUID 형식 체크
|
||||
uuid.UUID(user_id)
|
||||
user_uuid = user_id
|
||||
except ValueError:
|
||||
# UUID가 아니면 생성 또는 None
|
||||
namespace = uuid.UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8')
|
||||
user_uuid = str(uuid.uuid5(namespace, user_id))
|
||||
|
||||
# PostgreSQL 저장 시
|
||||
conversation_log = ConversationLog(
|
||||
robeing_id=settings.ROBEING_ID,
|
||||
user_id=user_uuid, # UUID 사용
|
||||
slack_user_id=user_id if not is_uuid else None, # 원본 ID 저장
|
||||
channel_id=channel,
|
||||
message=message,
|
||||
response=response,
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 검증 방법
|
||||
|
||||
### 6.1 저장 확인
|
||||
```bash
|
||||
# 테스트 메시지 전송
|
||||
curl -X POST http://localhost:8001/api/message \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"text": "테스트", "user_id": "test_user"}'
|
||||
|
||||
# PostgreSQL 확인
|
||||
psql -h localhost -p 5433 -U robeings -d main_db \
|
||||
-c "SELECT * FROM conversation_logs ORDER BY timestamp DESC LIMIT 1;"
|
||||
|
||||
# ChromaDB 확인 (수정 후)
|
||||
docker exec rb8001 python -c "
|
||||
from chromadb import PersistentClient
|
||||
client = PersistentClient('/code/chroma_db')
|
||||
print('Collections:', client.list_collections())
|
||||
"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 주의사항
|
||||
|
||||
### 7.1 ChromaDB 복구
|
||||
- 백업 없이 초기화 시 기존 데이터 손실
|
||||
- 메타데이터 수동 복구 어려움
|
||||
- 재생성이 더 안전할 수 있음
|
||||
|
||||
### 7.2 대용량 처리
|
||||
- 저장 로직 추가 시 응답 지연 가능
|
||||
- 비동기 처리 고려 필요
|
||||
- 에러 시 응답은 정상 반환되도록
|
||||
|
||||
---
|
||||
|
||||
## 8. 관련 파일
|
||||
|
||||
### 51124 서버
|
||||
- `/home/admin/ivada_project/rb8001/app/brain/state_client.py` - 저장 함수
|
||||
- `/home/admin/ivada_project/rb8001/app/memory/manager.py` - ChromaDB 관리
|
||||
- `/home/admin/ivada_project/rb8001/app/router/router.py` - 라우팅 로직
|
||||
- `/home/admin/ivada_project/rb8001/main.py` - 엔드포인트
|
||||
|
||||
### 데이터 위치
|
||||
- ChromaDB: `/home/admin/ivada_project/rb8001/chroma_db/`
|
||||
- PostgreSQL: `main_db.conversation_logs` 테이블
|
||||
|
||||
---
|
||||
|
||||
## 9. 예상 소요 시간
|
||||
- 코드 수정: 30분
|
||||
- 테스트: 30분
|
||||
- ChromaDB 복구: 1시간 (재생성 시)
|
||||
|
||||
## 10. 우선순위
|
||||
**중간** - ChromaDB는 정상 작동하므로 기본 기능은 유지됨. PostgreSQL 저장만 실패
|
||||
|
||||
## 11. 수정 후 상태
|
||||
- **ChromaDB**: ✅ 정상 저장 및 조회 가능
|
||||
- **PostgreSQL**: ❌ UUID 타입 에러로 저장 실패 (수정 필요)
|
||||
Loading…
x
Reference in New Issue
Block a user