DOCS/journey/ideas/250909_RAG_file_processing_architecture.md
Claude-51124 22557e7132 docs: 오래된 트러블슈팅 아카이브 및 구조 정리
- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동
- book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서)
- 빈 폴더 제거 (journey/assets/*)
2025-11-17 14:06:05 +09:00

209 lines
8.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RAG 시스템 파일 처리 아키텍처
## 작성일: 2025-09-09
## 작성자: Claude (51123 서버 관리자)
## 관련 문서: [OCR 구현 계획](./250909_ocr_skill_implementation_plan.md)
## 1. 개요
로빙의 RAG(Retrieval-Augmented Generation) 시스템을 위한 파일 업로드, 처리, 저장 아키텍처 설계.
사용자가 업로드한 문서를 로빙이 "기억"하고 대화에 활용할 수 있도록 하는 시스템.
## 2. 핵심 원칙
### 2.1 로빙 철학 기반
- **선택적 기억 저장**: 모든 파일이 아닌 의미 있는 정보만 저장 (정보엔트로피 + 감정편차 + 주제연관도 기준)
- **파일을 "경험"으로 축적**: 단순 데이터가 아닌 로빙의 성장 경험치로 변환
- **사용자별 격리**: 각 사용자의 지식베이스를 완전히 분리
- **투명한 피드백**: 처리 과정을 실시간으로 사용자에게 전달
### 2.2 기억 모듈 원칙 (220_기억모듈 설계 기반)
- **저장 우선도 공식**: `우선도 = α*정보엔트로피 + β*감정편차 + γ*주제연관도`
- **깜놀 메모리 우선**: 놀람 지표가 높은 문서/섹션 우선 저장
- **에빙하우스 망각곡선**: 시간 경과에 따른 가치 하락 모델 적용
- **요약 후 압축**: 임계값 이하 정보는 LLM 요약 후 원본 삭제
## 3. 파일 저장 아키텍처
### 3.1 디렉토리 구조
```
/mnt/hdd/data/documents/ (변경: uploads → data/documents)
├── {team_id}/ (변경: user_id → team_id)
│ ├── 2025-09/
│ │ ├── {sha256_hash}_original.pdf
│ │ ├── {sha256_hash}_extracted.txt
│ │ └── {sha256_hash}_metadata.json
│ └── 2025-10/
```
### 3.2 저장 전략
- **HDD 활용**: 대용량 파일은 `/mnt/hdd/data/documents/`에 저장 (업계 표준)
- **해시 기반 중복 제거**: SHA256으로 동일 파일 중복 저장 방지
- **월별 분리**: YYYY-MM 형식으로 월별 디렉토리 구성
- **메타데이터 보존**: 원본 파일명, 업로드 시간, MIME 타입, uploaded_by 등 JSON 저장
- **51124 접근**: SSHFS로 /mnt/51123data/documents/ 마운트하여 접근
## 4. 처리 파이프라인
### 4.1 단계별 프로세스
#### 4.1.1 웹 업로드 방식
```
1. 파일 수신 (nginx → gateway → skill-rag-file:8508)
2. 바이러스 검사 & 파일 타입 검증
3. 원본 저장 (/mnt/hdd/data/documents/{team_id}/)
4. 텍스트 추출 (python-docx/PyPDF2)
5. 임베딩 생성 (skill-embedding:8515)
6. ChromaDB 저장 (rb8001_{team_id}_documents 컬렉션)
7. PostgreSQL team_document 테이블 저장
```
#### 4.1.2 Slack 파일 방식 (신규)
```
1. Slack 파일 업로드 이벤트
2. rb8001:8001 /slack/events 수신
3. rb8001 → skill-rag-file:8508 /upload 호출
4. Slack API로 파일 다운로드 (bot_token 사용)
5. 이후 웹 업로드와 동일한 처리
```
#### 4.1.3 상세 처리 과정
- PDF: 구조 분석 (제목 계층, 표/그림, 참조/인용)
- 청킹: 1000 토큰 단위, 200 토큰 오버랩
- 캐싱: 자주 접근하는 문서는 구조화 형태로 저장
- 정보엔트로피 계산: 예측 불가능성 측정
- 감정편차 분석: 문서의 감정 트리거 강도
- 주제연관도: 사용자 관심사와의 코사인 유사도
### 4.2 지원 파일 형식
- 문서: PDF, DOCX, TXT, MD
- 스프레드시트: XLSX, CSV
- 프레젠테이션: PPTX
- 이미지 내 텍스트: PNG, JPG (OCR 구현 계획: [→250909_ocr_skill_implementation_plan.md](./250909_ocr_skill_implementation_plan.md))
### 4.3 경험치(XP) 획득 시스템 (스탯 설계 원칙 기반)
```
파일 처리 XP = BaseScore × Impact × Novelty × ConfidenceAdj × Diminish
- BaseScore: 텍스트 추출 성공률 (0-1)
- Impact: 추출된 정보의 활용도 (회상 빈도로 측정)
- Novelty: KL Divergence(기존 지식 vs 새 정보)
- ConfidenceAdj: OCR/추출 신뢰도 보정
- Diminish: 동일 유형 파일 반복 처리 시 체감 (1/(1+k*streak))
```
### 4.4 스탯 성장 매핑
| 행동 | 경험치 | 영향 스탯 |
|------|--------|----------|
| PDF 구조 분석 성공 | +3 | 연산(Compute) |
| 새로운 지식 임베딩 | +5 | 기억(Memory) |
| 사용자 질문에 파일 정보 활용 | +7 | 기억(Memory) |
| 감정 트리거 문서 처리 | +4 | 공감(Empathy) |
| 멀티 파일 연관 분석 | +6 | 통솔(Leadership) |
## 5. 사용자 피드백 UI
### 5.1 웹 프론트엔드
```javascript
// 진행 상태 표시
const stages = [
{ step: 1, label: "업로드중", progress: 25 },
{ step: 2, label: "분석중", progress: 50 },
{ step: 3, label: "임베딩중", progress: 75 },
{ step: 4, label: "완료", progress: 100 }
];
// WebSocket/SSE로 실시간 업데이트
socket.on('processing_update', (data) => {
updateProgressBar(data.progress);
showCurrentStage(data.stage);
});
```
### 5.2 파일 카드 UI 컴포넌트
- 썸네일/아이콘 (파일 타입별)
- 파일명, 크기, 업로드 시간
- 처리 상태: "✓ 로빙이 학습완료"
- 검색 가능 청크 수: "32개 섹션 분석됨"
- 삭제/재처리 버튼
### 5.3 슬랙 인터페이스
```
사용자: [파일 업로드]
로빙: 📎 파일을 받았어요! 처리를 시작합니다...
[스레드에서 진행 상황 업데이트]
└─ 📄 텍스트 추출 완료
└─ 🔍 32개 섹션으로 분석 중...
└─ ✅ '사업계획서.pdf' 학습 완료!
이제 이 문서에 대해 질문해주세요.
```
## 6. 데이터베이스 스키마
### 6.1 PostgreSQL (main_db)
```sql
CREATE TABLE user_documents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES user(id),
filename VARCHAR(255),
file_hash VARCHAR(64),
file_size BIGINT,
mime_type VARCHAR(100),
upload_path TEXT,
chunk_count INTEGER,
processing_status VARCHAR(50),
-- 로빙 철학 기반 추가 컬럼
info_entropy FLOAT, -- 정보엔트로피 값
emotion_score FLOAT, -- 감정편차 점수
relevance_score FLOAT, -- 주제연관도
priority_score FLOAT, -- 종합 우선도 (α*entropy + β*emotion + γ*relevance)
xp_gained INTEGER, -- 획득한 경험치
recall_count INTEGER DEFAULT 0, -- 회상 횟수 (Impact 측정용)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
processed_at TIMESTAMP,
last_recalled_at TIMESTAMP -- 마지막 회상 시간 (망각곡선 적용용)
);
```
### 6.2 ChromaDB 컬렉션
- 컬렉션명: `user_{user_id}_documents`
- 메타데이터:
- document_id, chunk_index, source_file, page_number
- info_entropy, emotion_score (청크별 가치 평가)
- created_at, last_accessed (망각곡선 적용)
- structural_type (제목/본문/표/참조 등, PDF 구조 분석 결과)
## 7. 보안 고려사항
- 파일 크기 제한: nginx `client_max_body_size 1000M`
- 허용 확장자 화이트리스트
- 바이러스 스캔 (ClamAV 연동 고려)
- 경로 순회 공격 방지
- 사용자별 용량 쿼터 관리
## 8. 시스템 구성
### 8.1 서비스 정보
- **서비스명**: skill-rag-file
- **포트**: 8508
- **컨테이너명**: skill-rag-file
- **API 엔드포인트**:
- POST /upload - 파일 업로드
- GET /search - RAG 검색
- GET /healthz - 헬스체크
## 9. 향후 확장 방안
### 9.1 단기 (1-2개월)
- **적응형 임계값**: 최근 데이터 분포 기반 동적 우선도 임계값 조정
- **베이지안 파라미터 갱신**: 처리 성공률 기반 α, β, γ 가중치 자동 튜닝
- **A/B 테스트**: 청킹 크기, 오버랩 비율 최적화
### 9.2 중기 (3-6개월)
- **버전 관리**: 동일 파일의 업데이트 추적 + 델타 저장
- **협업 기능**: 팀 단위 문서 공유 (레벨 15+ 로빙만 허용)
- **자동 요약**: 업로드 시 문서 요약 생성 + 감정 분석
- **멀티 암드 밴딧**: 파일 유형별 최적 처리 전략 자동 선택
### 9.3 장기 (6-12개월)
- **검색 고도화**: 의미 기반 + 키워드 + 구조 정보 하이브리드 검색
- **스카웃 시스템**: 레벨 20 로빙의 문서 처리 이력을 포트폴리오화
- **문서 간 연결망**: 지식 그래프 구축, 연관 문서 자동 추천