# RAG 시스템 파일 처리 아키텍처 ## 작성일: 2025-09-09 ## 작성자: Claude (51123 서버 관리자) ## 1. 개요 로빙의 RAG(Retrieval-Augmented Generation) 시스템을 위한 파일 업로드, 처리, 저장 아키텍처 설계. 사용자가 업로드한 문서를 로빙이 "기억"하고 대화에 활용할 수 있도록 하는 시스템. ## 2. 핵심 원칙 - **로빙의 철학 반영**: 파일을 단순 데이터가 아닌 "경험"으로 축적 - **사용자별 격리**: 각 사용자의 지식베이스를 완전히 분리 - **투명한 피드백**: 처리 과정을 실시간으로 사용자에게 전달 ## 3. 파일 저장 아키텍처 ### 3.1 디렉토리 구조 ``` /mnt/hdd/uploads/ ├── {user_id}/ │ ├── 2025-09/ │ │ ├── {sha256_hash}_original.pdf │ │ ├── {sha256_hash}_extracted.txt │ │ └── {sha256_hash}_metadata.json │ └── 2025-10/ ``` ### 3.2 저장 전략 - **HDD 활용**: 대용량 파일은 `/mnt/hdd/uploads/`에 저장 (SSD 용량 절약) - **해시 기반 중복 제거**: SHA256으로 동일 파일 중복 저장 방지 - **월별 분리**: YYYY-MM 형식으로 월별 디렉토리 구성 - **메타데이터 보존**: 원본 파일명, 업로드 시간, MIME 타입 등 JSON 저장 ## 4. 처리 파이프라인 ### 4.1 단계별 프로세스 ``` 1. 파일 수신 (nginx → gateway) 2. 바이러스 검사 & 파일 타입 검증 3. 원본 저장 (/mnt/hdd/uploads/{user_id}/) 4. 텍스트 추출 (Apache Tika or python-docx/PyPDF2) 5. 청킹 (1000 토큰 단위, 200 토큰 오버랩) 6. 임베딩 생성 (skill-embedding 서비스) 7. ChromaDB 저장 (user_{user_id} 컬렉션) 8. PostgreSQL 메타데이터 저장 ``` ### 4.2 지원 파일 형식 - 문서: PDF, DOCX, TXT, MD - 스프레드시트: XLSX, CSV - 프레젠테이션: PPTX - 이미지 내 텍스트: PNG, JPG (OCR 옵션) ## 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 users(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), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, processed_at TIMESTAMP ); ``` ### 6.2 ChromaDB 컬렉션 - 컬렉션명: `user_{user_id}_documents` - 메타데이터: document_id, chunk_index, source_file, page_number ## 7. 보안 고려사항 - 파일 크기 제한: nginx `client_max_body_size 1000M` - 허용 확장자 화이트리스트 - 바이러스 스캔 (ClamAV 연동 고려) - 경로 순회 공격 방지 - 사용자별 용량 쿼터 관리 ## 8. 향후 확장 방안 - 버전 관리: 동일 파일의 업데이트 추적 - 협업 기능: 팀 단위 문서 공유 - 자동 요약: 업로드 시 문서 요약 생성 - 검색 고도화: 의미 기반 + 키워드 하이브리드 검색