diff --git a/ideas/250909_RAG_file_processing_architecture.md b/ideas/250909_RAG_file_processing_architecture.md index fc3aa23..8fb848d 100644 --- a/ideas/250909_RAG_file_processing_architecture.md +++ b/ideas/250909_RAG_file_processing_architecture.md @@ -26,8 +26,8 @@ ### 3.1 디렉토리 구조 ``` -/mnt/hdd/uploads/ -├── {user_id}/ +/mnt/hdd/data/documents/ (변경: uploads → data/documents) +├── {team_id}/ (변경: user_id → team_id) │ ├── 2025-09/ │ │ ├── {sha256_hash}_original.pdf │ │ ├── {sha256_hash}_extracted.txt @@ -36,32 +36,44 @@ ``` ### 3.2 저장 전략 -- **HDD 활용**: 대용량 파일은 `/mnt/hdd/uploads/`에 저장 (SSD 용량 절약) +- **HDD 활용**: 대용량 파일은 `/mnt/hdd/data/documents/`에 저장 (업계 표준) - **해시 기반 중복 제거**: SHA256으로 동일 파일 중복 저장 방지 - **월별 분리**: YYYY-MM 형식으로 월별 디렉토리 구성 -- **메타데이터 보존**: 원본 파일명, 업로드 시간, MIME 타입 등 JSON 저장 +- **메타데이터 보존**: 원본 파일명, 업로드 시간, MIME 타입, uploaded_by 등 JSON 저장 +- **51124 접근**: SSHFS로 /mnt/51123data/documents/ 마운트하여 접근 ## 4. 처리 파이프라인 ### 4.1 단계별 프로세스 + +#### 4.1.1 웹 업로드 방식 ``` -1. 파일 수신 (nginx → gateway) +1. 파일 수신 (nginx → gateway → skill-rag-file:8508) 2. 바이러스 검사 & 파일 타입 검증 -3. 원본 저장 (/mnt/hdd/uploads/{user_id}/) -4. 텍스트 추출 (Apache Tika or python-docx/PyPDF2) - - PDF: 구조 분석 (제목 계층, 표/그림, 참조/인용) [250_스킬_사례_분석 기반] - - 청킹: 1000 토큰 단위, 200 토큰 오버랩 - - 캐싱: 자주 접근하는 문서는 구조화 형태로 저장 -5. 정보 가치 평가 (기억 모듈 원칙 적용) - - 정보엔트로피 계산: 예측 불가능성 측정 - - 감정편차 분석: 문서의 감정 트리거 강도 - - 주제연관도: 사용자 관심사와의 코사인 유사도 -6. 임베딩 생성 (skill-embedding 서비스) - - 선택적 임베딩: 우선도 임계값 이상만 처리 -7. ChromaDB 저장 (user_{user_id} 컬렉션) -8. PostgreSQL 메타데이터 저장 + 경험치 기록 +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 diff --git a/troubleshooting/250916_rb8001_skill-rag-file_연동_구조.md b/troubleshooting/250916_rb8001_skill-rag-file_연동_구조.md new file mode 100644 index 0000000..8be0a45 --- /dev/null +++ b/troubleshooting/250916_rb8001_skill-rag-file_연동_구조.md @@ -0,0 +1,82 @@ +# rb8001-skill-rag-file Slack 파일 처리 연동 구조 + +## 작성일: 2025-09-16 +## 작성자: Claude (51123 서버 관리자) + +## 1. 현재 상황 +- skill-rag-file: 구조만 생성, 미구현 상태 +- rb8001: Slack 메시지 수신 중 (파일 처리 로직 없음) +- team_document 테이블: 스펙만 존재, 실제 미생성 + +## 2. 구현 필요 플로우 + +### Slack 파일 수신 → rb8001 → skill-rag-file +``` +Slack 파일 업로드 + ↓ (Event API) +rb8001:8001 /slack/events + ↓ (파일 타입 확인) +rb8001 file_handler + ↓ (HTTP POST) +skill-rag-file:8508 /upload + ↓ +파일 저장 + DB 기록 + ChromaDB 벡터화 +``` + +## 3. rb8001 수정 필요사항 + +### 파일 이벤트 핸들러 추가 +- 위치: rb8001/app/api/slack_events.py +- Slack file_shared 이벤트 처리 +- files:read 스코프 확인 필요 + +### skill-rag-file 호출 함수 +```python +# rb8001/app/services/rag_service.py (신규) +async def upload_to_rag(file_url, filename, team_id, user_id): + response = await httpx.post( + "http://localhost:8508/upload", + json={ + "file_url": file_url, + "filename": filename, + "team_id": team_id, + "uploaded_by": user_id + } + ) +``` + +## 4. skill-rag-file 구현 필요사항 + +### 엔드포인트 +- POST /upload: 파일 수신 및 처리 +- POST /search: 벡터 검색 +- GET /healthz: 헬스체크 + +### 주요 기능 +- Slack 파일 다운로드 (bot_token 사용) +- 텍스트 추출 (PyPDF2, python-docx) +- PostgreSQL team_document 저장 +- ChromaDB rb8001_{team_id}_documents 벡터화 + +## 5. 테이블 생성 (51123) +```sql +CREATE TABLE team_document ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + team_id UUID NOT NULL REFERENCES team(id), + filename VARCHAR(255) NOT NULL, + file_hash VARCHAR(64) NOT NULL, + storage_path VARCHAR(500), + text_content TEXT, + metadata JSONB DEFAULT '{}', + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX idx_team_doc_hash ON team_document(team_id, file_hash); +``` + +## 6. 확인 사항 +- [ ] rb8001 Slack 앱 files:read 스코프 +- [ ] skill-rag-file Git 레포 실제 구현 +- [ ] 51124 서버 Docker 컨테이너 배포 +- [ ] /mnt/51123data/documents/ 마운트 확인 \ No newline at end of file