DOCS/ideas/250909_RAG_file_processing_architecture.md
happybell80 d2e7299686 docs: rb8001-skill-rag-file Slack 파일 연동 구조 문서화
- 트러블슈팅: rb8001에서 skill-rag-file 호출 구조 정리
- RAG 아키텍처: Slack 파일 처리 플로우 추가
- team_id 기반 저장 구조로 변경 (user_id → team_id)
- /mnt/hdd/data/documents/ 경로 업데이트
2025-09-16 00:25:35 +09:00

8.0 KiB
Raw Blame History

RAG 시스템 파일 처리 아키텍처

작성일: 2025-09-09

작성자: Claude (51123 서버 관리자)

관련 문서: OCR 구현 계획

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 지원 파일 형식

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 웹 프론트엔드

// 진행 상태 표시
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)

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),
  -- 로빙 철학 기반 추가 컬럼
  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 로빙의 문서 처리 이력을 포트폴리오화
  • 문서 간 연결망: 지식 그래프 구축, 연관 문서 자동 추천