docs: rb8001-skill-rag-file Slack 파일 연동 구조 문서화
- 트러블슈팅: rb8001에서 skill-rag-file 호출 구조 정리 - RAG 아키텍처: Slack 파일 처리 플로우 추가 - team_id 기반 저장 구조로 변경 (user_id → team_id) - /mnt/hdd/data/documents/ 경로 업데이트
This commit is contained in:
parent
bc8e2665f4
commit
d2e7299686
@ -26,8 +26,8 @@
|
|||||||
|
|
||||||
### 3.1 디렉토리 구조
|
### 3.1 디렉토리 구조
|
||||||
```
|
```
|
||||||
/mnt/hdd/uploads/
|
/mnt/hdd/data/documents/ (변경: uploads → data/documents)
|
||||||
├── {user_id}/
|
├── {team_id}/ (변경: user_id → team_id)
|
||||||
│ ├── 2025-09/
|
│ ├── 2025-09/
|
||||||
│ │ ├── {sha256_hash}_original.pdf
|
│ │ ├── {sha256_hash}_original.pdf
|
||||||
│ │ ├── {sha256_hash}_extracted.txt
|
│ │ ├── {sha256_hash}_extracted.txt
|
||||||
@ -36,32 +36,44 @@
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 3.2 저장 전략
|
### 3.2 저장 전략
|
||||||
- **HDD 활용**: 대용량 파일은 `/mnt/hdd/uploads/`에 저장 (SSD 용량 절약)
|
- **HDD 활용**: 대용량 파일은 `/mnt/hdd/data/documents/`에 저장 (업계 표준)
|
||||||
- **해시 기반 중복 제거**: SHA256으로 동일 파일 중복 저장 방지
|
- **해시 기반 중복 제거**: SHA256으로 동일 파일 중복 저장 방지
|
||||||
- **월별 분리**: YYYY-MM 형식으로 월별 디렉토리 구성
|
- **월별 분리**: YYYY-MM 형식으로 월별 디렉토리 구성
|
||||||
- **메타데이터 보존**: 원본 파일명, 업로드 시간, MIME 타입 등 JSON 저장
|
- **메타데이터 보존**: 원본 파일명, 업로드 시간, MIME 타입, uploaded_by 등 JSON 저장
|
||||||
|
- **51124 접근**: SSHFS로 /mnt/51123data/documents/ 마운트하여 접근
|
||||||
|
|
||||||
## 4. 처리 파이프라인
|
## 4. 처리 파이프라인
|
||||||
|
|
||||||
### 4.1 단계별 프로세스
|
### 4.1 단계별 프로세스
|
||||||
|
|
||||||
|
#### 4.1.1 웹 업로드 방식
|
||||||
```
|
```
|
||||||
1. 파일 수신 (nginx → gateway)
|
1. 파일 수신 (nginx → gateway → skill-rag-file:8508)
|
||||||
2. 바이러스 검사 & 파일 타입 검증
|
2. 바이러스 검사 & 파일 타입 검증
|
||||||
3. 원본 저장 (/mnt/hdd/uploads/{user_id}/)
|
3. 원본 저장 (/mnt/hdd/data/documents/{team_id}/)
|
||||||
4. 텍스트 추출 (Apache Tika or python-docx/PyPDF2)
|
4. 텍스트 추출 (python-docx/PyPDF2)
|
||||||
- PDF: 구조 분석 (제목 계층, 표/그림, 참조/인용) [250_스킬_사례_분석 기반]
|
5. 임베딩 생성 (skill-embedding:8515)
|
||||||
- 청킹: 1000 토큰 단위, 200 토큰 오버랩
|
6. ChromaDB 저장 (rb8001_{team_id}_documents 컬렉션)
|
||||||
- 캐싱: 자주 접근하는 문서는 구조화 형태로 저장
|
7. PostgreSQL team_document 테이블 저장
|
||||||
5. 정보 가치 평가 (기억 모듈 원칙 적용)
|
|
||||||
- 정보엔트로피 계산: 예측 불가능성 측정
|
|
||||||
- 감정편차 분석: 문서의 감정 트리거 강도
|
|
||||||
- 주제연관도: 사용자 관심사와의 코사인 유사도
|
|
||||||
6. 임베딩 생성 (skill-embedding 서비스)
|
|
||||||
- 선택적 임베딩: 우선도 임계값 이상만 처리
|
|
||||||
7. ChromaDB 저장 (user_{user_id} 컬렉션)
|
|
||||||
8. PostgreSQL 메타데이터 저장 + 경험치 기록
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### 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.2 지원 파일 형식
|
||||||
- 문서: PDF, DOCX, TXT, MD
|
- 문서: PDF, DOCX, TXT, MD
|
||||||
- 스프레드시트: XLSX, CSV
|
- 스프레드시트: XLSX, CSV
|
||||||
|
|||||||
82
troubleshooting/250916_rb8001_skill-rag-file_연동_구조.md
Normal file
82
troubleshooting/250916_rb8001_skill-rag-file_연동_구조.md
Normal file
@ -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/ 마운트 확인
|
||||||
Loading…
x
Reference in New Issue
Block a user