From 46c0db6321c245890de1e971665cd13d2f3d4e22 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Tue, 9 Sep 2025 14:12:14 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20RAG=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=B2=98=EB=A6=AC=20=EC=95=84=ED=82=A4?= =?UTF-8?q?=ED=85=8D=EC=B2=98=20=EC=95=84=EC=9D=B4=EB=94=94=EC=96=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 파일 저장 구조 설계 (HDD 활용, 해시 기반 중복 제거) - 처리 파이프라인 (텍스트 추출 → 청킹 → 임베딩) - 사용자 피드백 UI (실시간 진행 표시, 파일 카드) - 데이터베이스 스키마 및 보안 고려사항 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- ...250909_RAG_file_processing_architecture.md | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 ideas/250909_RAG_file_processing_architecture.md diff --git a/ideas/250909_RAG_file_processing_architecture.md b/ideas/250909_RAG_file_processing_architecture.md new file mode 100644 index 0000000..bb8ef65 --- /dev/null +++ b/ideas/250909_RAG_file_processing_architecture.md @@ -0,0 +1,125 @@ +# 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. 향후 확장 방안 +- 버전 관리: 동일 파일의 업데이트 추적 +- 협업 기능: 팀 단위 문서 공유 +- 자동 요약: 업로드 시 문서 요약 생성 +- 검색 고도화: 의미 기반 + 키워드 하이브리드 검색 \ No newline at end of file