- ChromaDB → Qdrant 전체 치환 (28건) - nomic-embed-text → bge-m3 (1024차원) 전체 치환 (12건) - Qwen2.5-VL-7B → Surya OCR (:8400) 전체 치환 (5건) - VRAM 다이어그램 갱신 (~11.3GB → ~7-8GB) - 3-Tier 라우팅 전략, 모델 협업 파이프라인 갱신 - Komga 만화 서버 GPU 서버 이전 반영 - embed_to_chroma.py 삭제 (embed_to_qdrant.py로 대체) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1369 lines
66 KiB
Markdown
1369 lines
66 KiB
Markdown
# Mac mini M4 Pro — PKM 허브 아키텍처 설계
|
|
|
|
## 시스템 개요
|
|
|
|
Mac mini M4 Pro(64GB RAM, 4TB SSD)를 중심으로, DEVONthink를 **중앙 지식 허브**로 두고, Omni 제품군으로 **실행/계획**, Synology NAS로 **저장/백업**, AI(Claude API + MLX/Ollama)로 **지능화**하는 통합 PKM 시스템.
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Mac mini M4 Pro (허브) │
|
|
│ │
|
|
│ ┌─────────────┐ ┌──────────────┐ ┌─────────────────┐ │
|
|
│ │ DEVONthink │◄──│ DEVONagent │ │ DEVONsphere │ │
|
|
│ │ (지식 허브) │ │ (리서치 엔진) │ │ (시스템 검색) │ │
|
|
│ └──────┬──────┘ └──────────────┘ └─────────────────┘ │
|
|
│ │ │
|
|
│ ┌──────┴──────────────────────────────────────────────┐ │
|
|
│ │ 자동화 레이어 (AppleScript + Shortcuts) │ │
|
|
│ └──────┬──────────────┬───────────────┬───────────────┘ │
|
|
│ │ │ │ │
|
|
│ ┌──────▼──────┐ ┌─────▼─────┐ ┌──────▼──────┐ │
|
|
│ │ OmniFocus │ │ OmniPlan │ │ OmniGraffle │ │
|
|
│ │ (작업 실행) │ │ (프로젝트) │ │ (시각화) │ │
|
|
│ └─────────────┘ └───────────┘ └─────────────┘ │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────┐ │
|
|
│ │ AI 레이어 (Ollama + Claude API) │ │
|
|
│ │ 태깅 · 분류 · RAG · 요약 · 리서치 │ │
|
|
│ └─────────────────────────────────────────────────────┘ │
|
|
└───────────────────────────┬─────────────────────────────────┘
|
|
│ WebDAV / SMB
|
|
┌────────────────┼────────────────┐
|
|
┌──────────▼──────────┐ ┌───────────▼───────────┐
|
|
│ Synology DS1525+ │ │ GPU 서버 (리눅스) │
|
|
│ 백업·메일·채팅 아카이브│ │ 비전·임베딩·리랭킹·Plex │
|
|
└─────────────────────┘ └───────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## DEVONthink 데이터베이스 구조
|
|
|
|
기존 도메인별 DB를 유지하면서, 운영용 DB만 추가하는 **하이브리드 구조**입니다.
|
|
64GB RAM이면 13개 DB를 동시에 열어도 문제없습니다.
|
|
|
|
### DB 설계
|
|
|
|
**운영 레이어 (신규 추가)** — 자동화 파이프라인용
|
|
|
|
| DB 이름 | 용도 | 저장 위치 | 동기화 |
|
|
|---|---|---|---|
|
|
| **📥 Inbox** | 미분류 자료 임시 보관, AI 분류 후 도메인 DB로 이동 | 내장 SSD | CloudKit |
|
|
| **📧 Archive** | 이메일(MailPlus), 채팅 로그, 영수증 | 내장 SSD | WebDAV (NAS) |
|
|
| **🏗️ Projects** | 활성 프로젝트 문서 (OmniFocus 연동) | 내장 SSD | CloudKit |
|
|
|
|
**지식 레이어 (기존 유지)** — 도메인별 전문 지식 저장소
|
|
|
|
| DB 이름 | 용도 | 저장 위치 | 동기화 |
|
|
|---|---|---|---|
|
|
| **00_Note_BOX** | 일반 메모, 스크랩, 잡다한 노트 | 내장 SSD | WebDAV (NAS) |
|
|
| **01_Philosophie** | 철학, 사상, 인문학 자료 | 내장 SSD | WebDAV (NAS) |
|
|
| **02_Language** | 어학 학습, 번역, 언어학 자료 | 내장 SSD | WebDAV (NAS) |
|
|
| **03_Engineering** | 공학 전반 기술 문서 | 내장 SSD | WebDAV (NAS) |
|
|
| **04_Industrial safety** | 산업안전, 규정, 인증 문서 | 내장 SSD | WebDAV (NAS) |
|
|
| **05_Programming** | 개발, 코드, IT 기술 자료 | 내장 SSD | WebDAV (NAS) |
|
|
| **07_General Book** | 일반 도서, 독서 노트 | 내장 SSD | WebDAV (NAS) |
|
|
| **97_Production drawing** | 생산 도면, CAD, 설계 자료 | 내장 SSD | WebDAV (NAS) |
|
|
| **99_Reference Data** | 범용 레퍼런스, 규격표 | 내장 SSD | WebDAV (NAS) |
|
|
| **99_Technicalkorea** | 한국 기술 규정, 국내 기술 자료 | 내장 SSD | WebDAV (NAS) |
|
|
|
|
### 자동 분류 라우팅 — Inbox → 도메인 DB
|
|
|
|
AI 태깅 후 Smart Rule이 태그 기반으로 적절한 도메인 DB로 자동 이동시킵니다:
|
|
|
|
```
|
|
Inbox 진입 → AI 태깅(Ollama) → Smart Rule 라우팅:
|
|
|
|
태그 매핑:
|
|
#주제/기술/AI-ML, #주제/기술/서버관리 → 05_Programming
|
|
#주제/기술/네트워크 → 03_Engineering
|
|
$유형/이메일, $유형/채팅로그 → Archive
|
|
#주제/산업안전 → 04_Industrial safety
|
|
#주제/도면, #주제/설계 → 97_Production drawing
|
|
#주제/철학, #주제/인문 → 01_Philosophie
|
|
#주제/어학, #주제/번역 → 02_Language
|
|
#주제/독서 → 07_General Book
|
|
#주제/규정/한국 → 99_Technicalkorea
|
|
#주제/규격, #주제/레퍼런스 → 99_Reference Data
|
|
미분류 / 복합 태그 → 00_Note_BOX (기본 폴백)
|
|
```
|
|
|
|
### 태그 체계 (Taxonomy)
|
|
|
|
계층적 태그 시스템을 설계합니다:
|
|
|
|
```
|
|
태그 구조:
|
|
├── @상태/
|
|
│ ├── 처리중
|
|
│ ├── 검토필요
|
|
│ ├── 완료
|
|
│ └── 아카이브
|
|
├── #주제/
|
|
│ ├── 기술/
|
|
│ │ ├── 서버관리
|
|
│ │ ├── 네트워크
|
|
│ │ └── AI-ML
|
|
│ ├── 산업안전/
|
|
│ │ ├── 법령 ← 10_Legislation 라우팅
|
|
│ │ ├── 위험성평가 ← 50_Practice/Risk_Assessment
|
|
│ │ ├── 순회점검 ← 50_Practice/Patrol_Inspection
|
|
│ │ ├── 안전교육 ← 50_Practice/Education
|
|
│ │ ├── 사고사례 ← 40_Cases
|
|
│ │ ├── 신고보고 ← 60_Compliance
|
|
│ │ ├── 안전관리자 ← 70_Safety_Manager
|
|
│ │ ├── 보건관리자 ← 75_Health_Manager
|
|
│ │ └── 규격기준 ← 80_Reference
|
|
│ ├── 업무/
|
|
│ └── 개인/
|
|
├── $유형/
|
|
│ ├── 논문 ← 30_Papers 라우팅 (DB 불문)
|
|
│ ├── 법령 ← 10_Legislation 라우팅
|
|
│ ├── 기사
|
|
│ ├── 메모
|
|
│ ├── 이메일
|
|
│ ├── 채팅로그
|
|
│ ├── 도면
|
|
│ └── 체크리스트
|
|
└── !우선순위/
|
|
├── 긴급
|
|
├── 중요
|
|
└── 참고
|
|
```
|
|
|
|
### DB별 그룹 구조 (Internal Group Structure)
|
|
|
|
각 도메인 DB 내부에 통일된 넘버링 체계(10 단위)로 그룹을 구성합니다.
|
|
00_Inbox는 AI가 해당 DB로 라우팅했지만 하위 그룹까지 확정 못한 문서의 임시 보관소입니다.
|
|
|
|
#### 04_Industrial Safety → [상세 설계서 참조](computer:///sessions/amazing-vigilant-hypatia/mnt/outputs/04-industrial-safety-blueprint.md)
|
|
|
|
10_Legislation (법령/해외법령), 20_Theory, 30_Papers, 40_Cases,
|
|
50_Practice (9개 실무 하위그룹), 60_Compliance, 70_Safety_Manager,
|
|
75_Health_Manager, 80_Reference, 90_Archive
|
|
+ 법령 자동 수집 시스템 (한국/미국/일본/EU API 모니터링)
|
|
+ DEVONagent 안전 분야 검색 세트 7종 (주간 ~50~85건, 양 조절 전략 포함)
|
|
|
|
※ 나머지 도메인 DB(03_Engineering, 05_Programming 등)도 동일한 넘버링 패턴으로 확장 예정
|
|
|
|
---
|
|
|
|
### 커스텀 메타데이터
|
|
|
|
DEVONthink 4의 커스텀 메타데이터 필드를 활용합니다.
|
|
단, AI 처리 결과의 저장은 **역할 분리 원칙**을 따릅니다:
|
|
|
|
| 필드명 | 타입 | 용도 |
|
|
|---|---|---|
|
|
| `omnifocusTaskID` | 텍스트 | OmniFocus 작업 역링크 |
|
|
| `sourceURL` | URL | 원본 출처 |
|
|
| `synologyPath` | 텍스트 | NAS 원본 경로 |
|
|
| `lastAIProcess` | 날짜 | 마지막 AI 처리 일시 |
|
|
| `sourceChannel` | 텍스트 | 유입 경로 (tksafety/devonagent/law_monitor/inbox_route/email/web_clip/manual) |
|
|
| `dataOrigin` | 텍스트 | 데이터 출처 구분 (work = 자사 업무 / external = 외부 참고) |
|
|
|
|
> `sourceChannel`과 `dataOrigin`은 04_Industrial Safety에서 우선 적용하고,
|
|
> 안정화 후 다른 도메인 DB로 확장합니다.
|
|
> 상세 규칙: [04-industrial-safety-blueprint.md § 8. 유입 경로 추적 체계](computer:///sessions/amazing-vigilant-hypatia/mnt/outputs/04-industrial-safety-blueprint.md) 참조
|
|
|
|
### AI 결과물 저장 전략 — 중복 저장 금지
|
|
|
|
GPU 서버에서 처리된 AI 결과물은 **각자 목적에 맞는 곳에만** 저장합니다.
|
|
DEVONthink와 Qdrant에 같은 정보를 이중으로 넣지 않습니다.
|
|
|
|
```
|
|
처리 결과 저장 위치 이유
|
|
───────────────────────────────────────────────────────
|
|
벡터 임베딩 Qdrant만 시맨틱 검색 전용, DEVONthink에선 쓸모없음
|
|
비전 OCR 텍스트 DEVONthink 본문에 병합 검색 가능한 텍스트가 되어야 하므로 필수
|
|
리랭킹 점수 저장 안 함 (휘발) 쿼리 시점에만 의미 있는 일회성 데이터
|
|
태그/분류 DEVONthink 태그만 Smart Group, 브라우징에 활용
|
|
요약 저장 안 함 RAG로 언제든 재생성 가능, 별도 보관 불필요
|
|
OmniFocus 역링크 DEVONthink 메타데이터 양방향 참조에 필요
|
|
```
|
|
|
|
**핵심 원칙:**
|
|
- Qdrant = 벡터 검색 엔진. 여기엔 임베딩만 들어감
|
|
- DEVONthink = 원본 문서 + 사람이 읽는 메타데이터(태그, 링크)
|
|
- 요약/분석은 RAG로 실시간 생성하면 되므로 별도 캐싱 불필요
|
|
- Surya OCR 결과만 DEVONthink 본문에 반드시 병합 (검색성 확보)
|
|
|
|
---
|
|
|
|
## 법령 자동 수집 및 변경 알림 시스템
|
|
|
|
→ [산업안전 상세 설계서 §3](computer:///sessions/amazing-vigilant-hypatia/mnt/outputs/04-industrial-safety-blueprint.md) 참조
|
|
|
|
한국(매일), 미국(주1), 일본(주1), EU(월1) 법령 API를 `law_monitor.py`로 폴링.
|
|
변경 감지 시 DEVONthink 자동 저장 + Synology Chat 알림 + OmniFocus 작업 생성.
|
|
각국 법령은 저작권 보호 대상이 아니므로 수집에 법적 문제 없음.
|
|
|
|
---
|
|
|
|
## 자동화 파이프라인
|
|
|
|
### 문서 수집 파이프라인 (Ingestion)
|
|
|
|
```
|
|
[입력 소스] [처리] [출력]
|
|
|
|
웹 클리핑 ──────┐
|
|
DEVONagent ────┤ ┌──────────────┐
|
|
스캔 문서 ──────┼──► Inbox ──►│ Smart Rule │──► 자동 태깅
|
|
이메일 ────────┤ │ + Ollama API │ + 적절한 DB로 이동
|
|
파일 드롭 ──────┘ │ + GPU 서버 │ + 벡터 인덱싱 (Qdrant)
|
|
└──────────────┘ + OCR 텍스트 병합 (스캔 시)
|
|
▼
|
|
OmniFocus 작업 생성
|
|
(액션 아이템 감지 시)
|
|
```
|
|
|
|
### Smart Rules 설계
|
|
|
|
**Rule 1: AI 자동 태깅 + 도메인 DB 라우팅 (새 문서 도착 시)**
|
|
```
|
|
트리거: Inbox DB에 새 문서 추가
|
|
조건: 태그가 비어있음
|
|
동작:
|
|
1. 이미지/스캔 문서 → GPU 서버 Surya OCR(:8400)로 OCR → 본문에 병합
|
|
2. Mac mini 35B → 태그 + 분류 대상 DB 생성 → DEVONthink 태그에만 저장
|
|
3. GPU 서버 bge-m3 → 벡터화 → Qdrant에만 저장
|
|
4. 태그 기반 도메인 DB 자동 이동:
|
|
#주제/프로그래밍, #주제/AI-ML → 05_Programming
|
|
#주제/공학, #주제/네트워크 → 03_Engineering
|
|
#주제/산업안전, #주제/규정 → 04_Industrial safety
|
|
#주제/도면, #주제/설계 → 97_Production drawing
|
|
#주제/철학, #주제/인문 → 01_Philosophie
|
|
#주제/어학, #주제/번역 → 02_Language
|
|
#주제/독서, #주제/서평 → 07_General Book
|
|
#주제/규격, #주제/레퍼런스 → 99_Reference Data
|
|
#주제/한국기술, #주제/국내규정 → 99_Technicalkorea
|
|
미분류 / 복합 태그 → 00_Note_BOX (폴백)
|
|
※ 요약은 별도 저장하지 않음 (RAG로 실시간 생성)
|
|
```
|
|
|
|
**Rule 2: 이메일 아카이브 자동 정리**
|
|
```
|
|
트리거: Archive DB에 새 이메일 추가
|
|
조건: MIME 타입이 이메일
|
|
동작:
|
|
1. 발신자 기준 그룹 자동 생성/분류
|
|
2. 첨부파일 추출 → 태그 기반 도메인 DB로 복제 (기술문서→03, 도면→97 등)
|
|
3. GPU 서버에서 벡터 임베딩 → Qdrant 인덱싱
|
|
※ 이메일 요약은 저장하지 않음 (RAG로 검색 시 생성)
|
|
```
|
|
|
|
**Rule 3: 프로젝트 문서 → OmniFocus 연동**
|
|
```
|
|
트리거: Projects DB에 새 문서 추가
|
|
조건: 텍스트에 "TODO", "할일", "□" 패턴 존재
|
|
동작:
|
|
1. AppleScript로 텍스트에서 액션 아이템 추출
|
|
2. OmniFocus에 작업 생성 (DEVONthink 링크 포함)
|
|
3. 커스텀 메타데이터에 OmniFocus Task ID 저장
|
|
```
|
|
|
|
### 핵심 AppleScript 모듈
|
|
|
|
#### 모듈 A: Ollama 연동 스크립트
|
|
|
|
```applescript
|
|
-- DEVONthink 4 Smart Rule에서 호출
|
|
-- 문서를 Ollama API로 보내 태그 생성 + GPU 서버로 벡터 인덱싱
|
|
on performSmartRule(theRecords)
|
|
repeat with theRecord in theRecords
|
|
set docText to plain text of theRecord
|
|
set docUUID to uuid of theRecord
|
|
|
|
if length of docText > 4000 then
|
|
set docText to text 1 thru 4000 of docText
|
|
end if
|
|
|
|
-- Step 1: Mac mini MLX 35B → 태그 + 분류 대상 DB/그룹 생성
|
|
set shellCmd to "curl -s http://localhost:8800/v1/chat/completions -H 'Content-Type: application/json' -d '{" & ¬
|
|
"\"model\": \"mlx-community/Qwen3.5-35B-A3B-4bit\"," & ¬
|
|
"\"messages\": [{\"role\":\"user\",\"content\":\"다음 문서를 분석하고 JSON으로 응답해줘.\\n" & ¬
|
|
"{\\\"tags\\\": [최대5개_한글태그],\\n" & ¬
|
|
" \\\"domain_db\\\": \\\"DB이름\\\",\\n" & ¬
|
|
" \\\"sub_group\\\": \\\"하위그룹경로\\\"}\\n\\n" & ¬
|
|
"domain_db 선택지: 00_Note_BOX, 01_Philosophie, 02_Language, " & ¬
|
|
"03_Engineering, 04_Industrial safety, 05_Programming, " & ¬
|
|
"07_General Book, 97_Production drawing, 99_Reference Data, " & ¬
|
|
"99_Technicalkorea\\n" & ¬
|
|
"sub_group 예시: 10_Legislation/Notice, 50_Practice/Risk_Assessment, " & ¬
|
|
"40_Cases/Domestic 등 (해당 DB의 그룹 경로)\\n\\n" & ¬
|
|
docText & "\"," & ¬
|
|
"\"stream\": false" & ¬
|
|
"}'"
|
|
|
|
set jsonResult to do shell script shellCmd
|
|
|
|
-- Step 2: 태그 파싱 → DEVONthink 태그 설정
|
|
set parseCmd to "echo " & quoted form of jsonResult & ¬
|
|
" | python3 -c \"import sys,json; " & ¬
|
|
"r=json.loads(sys.stdin.read()); " & ¬
|
|
"d=json.loads(r['response']); " & ¬
|
|
"print(d.get('domain_db','00_Note_BOX') + '|' + " & ¬
|
|
"d.get('sub_group','00_Inbox') + '|' + " & ¬
|
|
"','.join(d.get('tags',[])))\""
|
|
|
|
try
|
|
set classResult to do shell script parseCmd
|
|
set AppleScript's text item delimiters to "|"
|
|
set resultParts to text items of classResult
|
|
set targetDB to item 1 of resultParts
|
|
set targetGroup to item 2 of resultParts
|
|
set tagResult to item 3 of resultParts
|
|
set AppleScript's text item delimiters to ""
|
|
|
|
-- 태그 설정
|
|
set tags of theRecord to tagResult
|
|
|
|
-- Step 3: 도메인 DB로 이동 + 하위 그룹 라우팅
|
|
set targetDatabase to missing value
|
|
repeat with db in databases
|
|
if name of db is targetDB then
|
|
set targetDatabase to db
|
|
exit repeat
|
|
end if
|
|
end repeat
|
|
|
|
if targetDatabase is not missing value then
|
|
-- 하위 그룹 경로 확인/생성 후 이동
|
|
set groupPath to "/" & targetGroup
|
|
set targetLocation to create location groupPath in targetDatabase
|
|
move record theRecord to targetLocation
|
|
end if
|
|
end try
|
|
|
|
-- Step 4: GPU 서버 → 벡터 임베딩 → Qdrant 인덱싱 (비동기)
|
|
do shell script "python3 ~/scripts/embed_to_qdrant.py " & ¬
|
|
quoted form of docUUID & " &"
|
|
|
|
-- Step 5: 처리 완료 표시
|
|
add custom meta data (current date) ¬
|
|
for "lastAIProcess" to theRecord
|
|
|
|
end repeat
|
|
end performSmartRule
|
|
```
|
|
|
|
#### 모듈 B: DEVONthink ↔ OmniFocus 양방향 연동
|
|
|
|
```applescript
|
|
-- DEVONthink 4 문서에서 OmniFocus 작업 생성
|
|
on createOmniFocusTask(theRecord)
|
|
tell application id "DNtp"
|
|
set docName to name of theRecord
|
|
set docLink to reference URL of theRecord
|
|
set docUUID to uuid of theRecord
|
|
end tell
|
|
|
|
tell application "OmniFocus"
|
|
tell default document
|
|
set newTask to make new inbox task with properties {
|
|
name: "처리: " & docName,
|
|
note: "DEVONthink 문서: " & docLink & return & ¬
|
|
"UUID: " & docUUID
|
|
}
|
|
set taskID to id of newTask
|
|
end tell
|
|
end tell
|
|
|
|
-- DEVONthink에 역링크 저장
|
|
tell application id "DNtp"
|
|
add custom meta data taskID ¬
|
|
for "omnifocusTaskID" to theRecord
|
|
end tell
|
|
|
|
return taskID
|
|
end createOmniFocusTask
|
|
```
|
|
|
|
#### 모듈 C: Claude API 심층 분석
|
|
|
|
```applescript
|
|
-- 복잡한 문서 분석이 필요할 때 Claude API 호출
|
|
-- (Ollama 대비 고품질 분석이 필요한 경우)
|
|
on analyzeWithClaude(theRecord)
|
|
tell application id "DNtp"
|
|
set docText to plain text of theRecord
|
|
end tell
|
|
|
|
-- Claude API 키는 macOS Keychain에 저장
|
|
set apiKey to do shell script ¬
|
|
"security find-generic-password -s 'claude-api-key' -w"
|
|
|
|
set shellCmd to "curl -s https://api.anthropic.com/v1/messages " & ¬
|
|
"-H 'x-api-key: " & apiKey & "' " & ¬
|
|
"-H 'anthropic-version: 2023-06-01' " & ¬
|
|
"-H 'content-type: application/json' " & ¬
|
|
"-d '{\"model\":\"claude-sonnet-4-6\"," & ¬
|
|
"\"max_tokens\":2048," & ¬
|
|
"\"messages\":[{\"role\":\"user\"," & ¬
|
|
"\"content\":\"다음 문서를 심층 분석해줘. " & ¬
|
|
"핵심 개념, 관련 키워드, 액션 아이템, " & ¬
|
|
"관련 문서 검색을 위한 시맨틱 태그를 JSON으로: " & ¬
|
|
docText & "\"}]}'"
|
|
|
|
set result to do shell script shellCmd
|
|
return result
|
|
end analyzeWithClaude
|
|
```
|
|
|
|
---
|
|
|
|
## Synology NAS 연동
|
|
|
|
### WebDAV 동기화 설정
|
|
|
|
Synology에서 WebDAV Server 패키지를 설치하고 DEVONthink 4 동기화를 설정합니다.
|
|
|
|
```
|
|
WebDAV 동기화 (구성 완료):
|
|
· URL: https://webdav.hyungi.net/Document_Server/DEVONThink/
|
|
· 기존 도메인 DB 10개 — 이미 동기화 중
|
|
|
|
신규 DB 동기화 추가:
|
|
· Archive, Projects → WebDAV 동기화에 포함
|
|
· Inbox → CloudKit 별도 동기화 (MacBook 연동용)
|
|
```
|
|
|
|
### MailPlus → DEVONthink 아카이브
|
|
|
|
```
|
|
방법 1: IMAP 직접 연결
|
|
- DEVONthink 4 → File → Import → Email
|
|
- MailPlus IMAP 서버: [NAS-IP]:993 (SSL)
|
|
- 주기적으로 가져오기 (Smart Rule로 자동화)
|
|
|
|
방법 2: 자동화 스크립트 (권장)
|
|
- MailPlus API → Python 스크립트 → DEVONthink Apple Event
|
|
- Cron 또는 launchd로 주기 실행
|
|
```
|
|
|
|
### Synology Chat → DEVONthink 아카이브
|
|
|
|
```python
|
|
#!/usr/bin/env python3
|
|
"""
|
|
Synology Chat 메시지를 DEVONthink 4로 아카이브하는 스크립트
|
|
launchd로 매일 1회 실행
|
|
"""
|
|
import requests
|
|
import subprocess
|
|
import json
|
|
from datetime import datetime, timedelta
|
|
|
|
SYNOLOGY_URL = "https://[NAS-IP]:5001"
|
|
CHAT_TOKEN = "YOUR_CHAT_BOT_TOKEN" # Keychain에서 가져오는 것 권장
|
|
|
|
def fetch_chat_messages(channel_id, since_days=1):
|
|
"""Synology Chat API로 메시지 가져오기"""
|
|
since = datetime.now() - timedelta(days=since_days)
|
|
url = f"{SYNOLOGY_URL}/webapi/entry.cgi"
|
|
params = {
|
|
"api": "SYNO.Chat.Post",
|
|
"method": "list",
|
|
"version": 1,
|
|
"token": CHAT_TOKEN,
|
|
"channel_id": channel_id,
|
|
"limit": 100
|
|
}
|
|
resp = requests.get(url, params=params, verify=False)
|
|
return resp.json().get("data", {}).get("posts", [])
|
|
|
|
def send_to_devonthink(text, title, tags):
|
|
"""AppleScript를 통해 DEVONthink 4에 문서 생성"""
|
|
script = f'''
|
|
tell application id "DNtp"
|
|
set theDB to open database "/path/to/Archive.dtBase2"
|
|
set theGroup to get record at "/Chat Archive/{datetime.now().strftime('%Y/%m')}" in theDB
|
|
if theGroup is missing value then
|
|
set theGroup to create location "/Chat Archive/{datetime.now().strftime('%Y/%m')}" in theDB
|
|
end if
|
|
set theRecord to create record with {{
|
|
name: "{title}",
|
|
type: markdown,
|
|
plain text: "{text}",
|
|
tags: "{tags}"
|
|
}} in theGroup
|
|
end tell
|
|
'''
|
|
subprocess.run(["osascript", "-e", script])
|
|
|
|
if __name__ == "__main__":
|
|
messages = fetch_chat_messages("general")
|
|
digest = "\\n".join([f"**{m['user']}**: {m['msg']}" for m in messages])
|
|
title = f"Chat Digest - {datetime.now().strftime('%Y-%m-%d')}"
|
|
send_to_devonthink(digest, title, "채팅로그,아카이브")
|
|
```
|
|
|
|
### 백업 전략
|
|
|
|
```
|
|
┌─────────────────────────────────────────────┐
|
|
│ 백업 3-2-1 전략 │
|
|
├─────────────────────────────────────────────┤
|
|
│ │
|
|
│ Mac mini (원본) │
|
|
│ └── DEVONthink DB (내장 SSD 4TB) │
|
|
│ │ │
|
|
│ ├── [실시간] WebDAV Sync → NAS SSD │
|
|
│ │ (DEVONthink 내장 동기화) │
|
|
│ │ │
|
|
│ ├── [매일] Time Machine → NAS HDD │
|
|
│ │ (전체 시스템 백업) │
|
|
│ │ │
|
|
│ └── [주간] Hyper Backup → 외부/클라우드 │
|
|
│ (NAS에서 2차 백업) │
|
|
│ │
|
|
│ NAS 스토리지 배치: │
|
|
│ ├── SSD (SAT5220 480GB): WebDAV Sync Store │
|
|
│ ├── HDD RAID: Time Machine + Hyper Backup │
|
|
│ └── SSD (EVO 870 4TB): 문서/사진 서비스 볼륨 │
|
|
└─────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## AI 통합 아키텍처
|
|
|
|
### 하드웨어별 모델 배치
|
|
|
|
**Mac mini는 메인 범용 모델**, **GPU 서버는 특화 모델 팜 + 미디어 서버**로 역할을 분리합니다.
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ 🖥️ Mac mini M4 Pro (메인 AI 허브) │
|
|
│ 64GB 통합메모리 · Neural Engine │
|
|
│ │
|
|
│ ┌───────────────────────────────────┐ ┌─────────────────────┐ │
|
|
│ │ 🧠 메인 모델 │ │ 📡 클라우드 │ │
|
|
│ │ Qwen3.5-35B-A3B (4Q) │ │ Claude API │ │
|
|
│ │ │ │ (Sonnet 4.6) │ │
|
|
│ │ MoE: 35B 파라미터, 3B 활성 │ │ │ │
|
|
│ │ 메모리: ~20GB │ │ 심층 분석 │ │
|
|
│ │ 속도: ~80 tok/s │ │ 복잡한 요약 │ │
|
|
│ │ │ │ 리서치 합성 │ │
|
|
│ │ 용도: │ │ 보고서 생성 │ │
|
|
│ │ · Smart Rule 자동 태깅/분류 │ │ │ │
|
|
│ │ · 문서 요약 │ │ 응답: ~3초 │ │
|
|
│ │ · 메타데이터 생성 │ │ 비용: API 과금 │ │
|
|
│ │ · 액션 아이템 추출 │ └─────────────────────┘ │
|
|
│ │ · RAG 질의 응답 │ │
|
|
│ │ · DEVONagent 결과 분석 │ │
|
|
│ │ │ │
|
|
│ │ 품질: 9B 대비 현저히 높음 │ │
|
|
│ │ 비용: 무료 (로컬) │ │
|
|
│ └───────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
로컬 네트워크 API
|
|
(http://gpu-server:11434)
|
|
│
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ ⚡ GPU 서버 (특화 모델 팜 + 미디어) │
|
|
│ RTX 4070 Ti Super 16GB VRAM │
|
|
│ │
|
|
│ ┌──────────────────────┐ ┌──────────────────────────────────┐ │
|
|
│ │ 📄 Surya OCR │ │ 🔍 리랭커 (Reranker) │ │
|
|
│ │ FastAPI :8400 │ │ bge-reranker-v2-m3 │ │
|
|
│ │ VRAM: ~2-3GB │ │ VRAM: ~1GB │ │
|
|
│ │ │ │ │ │
|
|
│ │ 용도: │ │ 용도: │ │
|
|
│ │ · 스캔 문서 OCR │ │ · RAG 검색 품질 극대화 │ │
|
|
│ │ · 이미지 텍스트 추출 │ │ · 임베딩 검색 후 정밀 재정렬 │ │
|
|
│ │ · 만화 말풍선 OCR │ │ · Top-K → Top-N 정확도 향상 │ │
|
|
│ │ · 한/영/일 다국어 │ │ │ │
|
|
│ └───────────────────────┘ └──────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌──────────────────────┐ ┌──────────────────────────────────┐ │
|
|
│ │ 🔗 임베딩 모델 │ │ 📊 VRAM 배분 │ │
|
|
│ │ bge-m3 (1024차원) │ │ │ │
|
|
│ │ VRAM: ~1.5GB │ │ Surya OCR: ~2-3GB │ │
|
|
│ │ │ │ 리랭커: ~1GB │ │
|
|
│ │ 용도: │ │ 임베딩: ~1.5GB │ │
|
|
│ │ · 문서 벡터 임베딩 │ │ Plex HW 트랜스: ~1-2GB │ │
|
|
│ │ · RAG 인덱싱 │ │ ───────────────────── │ │
|
|
│ │ · 쿼리 임베딩 │ │ 합계: ~7-8GB / 16GB │ │
|
|
│ │ │ │ 여유: ~8-9GB ✅ │ │
|
|
│ │ ※ GPU 가속으로 │ │ │ │
|
|
│ │ 대량 임베딩 시 유리 │ │ │ │
|
|
│ └──────────────────────┘ └──────────────────────────────────┘ │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ 🎬 미디어 + 만화 서비스 │ │
|
|
│ │ Plex Media Server — GPU 하드웨어 트랜스코딩 │ │
|
|
│ │ Komga — 만화 서버 (Docker, NFS → NAS /Comic) │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 임베딩을 GPU 서버로 이전하는 이유
|
|
|
|
임베딩 모델(bge-m3)을 Mac mini에서 GPU 서버로 이전하는 것을 **권장**합니다:
|
|
|
|
| 비교 항목 | Mac mini에서 실행 | GPU 서버에서 실행 |
|
|
|---|---|---|
|
|
| **대량 인덱싱 속도** | CPU 기반, 느림 | CUDA 가속, 5-10배 빠름 |
|
|
| **Mac mini 부하** | 35B 모델 + 임베딩 동시 시 경합 | 35B 모델 전용, 쾌적 |
|
|
| **VRAM 영향** | 해당 없음 | +1.5GB (bge-m3, 1024차원) |
|
|
| **네트워크 레이턴시** | 없음 | 2.5G 네트워크, 1ms 미만 |
|
|
| **배치 처리** | 문서 100개 인덱싱 시 수분 | 문서 100개 인덱싱 시 수십초 |
|
|
| **Qdrant 위치** | Mac mini 유지 | Mac mini 유지 (변동 없음) |
|
|
|
|
**결론:** 임베딩 모델은 단일 요청 레이턴시보다 **배치 처리량**이 중요합니다.
|
|
GPU 서버의 CUDA 가속을 활용하면 대량 문서 인덱싱이 훨씬 빨라지고,
|
|
Mac mini의 통합메모리를 35B 모델에 온전히 할당할 수 있습니다.
|
|
bge-m3는 ~1.5GB로 GPU 서버 VRAM 16GB 대비 여유 충분하고,
|
|
2.5G 네트워크 환경이라 API 호출 레이턴시도 무시할 수준입니다.
|
|
|
|
다만 **Qdrant는 Mac mini에 유지**합니다. RAG 질의 시 벡터 검색 →
|
|
리랭킹 → 35B 응답 생성이 연속으로 일어나는데, 벡터 DB가 로컬에 있어야
|
|
이 파이프라인이 가장 빠릅니다.
|
|
|
|
### 3-Tier AI 라우팅 전략
|
|
|
|
```
|
|
┌──────────────────────────────┐
|
|
│ 작업 라우터 (AppleScript) │
|
|
│ 문서 유형 + 복잡도 기반 분기 │
|
|
└──────────┬───────────────────┘
|
|
│
|
|
┌────────────────────┼────────────────────┐
|
|
▼ ▼ ▼
|
|
┌─────────────────┐ ┌──────────────┐ ┌────────────────────┐
|
|
│ Tier 1: 로컬 │ │ Tier 2: API │ │ Tier 3: 특화 │
|
|
│ Mac mini │ │ Claude │ │ GPU 서버 │
|
|
│ (메인) │ │ (클라우드) │ │ (보조) │
|
|
├─────────────────┤ ├──────────────┤ ├────────────────────┤
|
|
│ Qwen3.5-35B-A3B │ │ Sonnet 4.6 │ │ Surya OCR (:8400) │
|
|
│ 4Q / ~80 tok/s │ │ │ │ bge-reranker-v2-m3 │
|
|
│ │ │ │ │ bge-m3 (1024차원) │
|
|
├─────────────────┤ ├──────────────┤ ├────────────────────┤
|
|
│ · 자동 태깅/분류 │ │ · 심층 분석 │ │ · 스캔/이미지 OCR │
|
|
│ · 문서 요약 │ │ · 리서치 합성 │ │ · RAG 리랭킹 │
|
|
│ · 메타데이터 │ │ · 보고서 생성 │ │ · 문서 임베딩/인덱싱│
|
|
│ · 액션아이템추출 │ │ · 복잡한 추론 │ │ · 만화 텍스트 추출 │
|
|
│ · RAG 응답생성 │ │ · 다국어 번역 │ │ · 한/영/일 다국어 │
|
|
├─────────────────┤ ├──────────────┤ ├────────────────────┤
|
|
│ 속도: ~80 tok/s │ │ 속도: ~3초 │ │ 속도: GPU 가속 │
|
|
│ 비용: 무료 │ │ 비용: 과금 │ │ 비용: 무료 │
|
|
│ 품질: ★★★★☆ │ │ 품질: ★★★★★ │ │ 품질: 영역별 최고 │
|
|
└─────────────────┘ └──────────────┘ └────────────────────┘
|
|
```
|
|
|
|
**라우팅 규칙 (상세):**
|
|
|
|
| 조건 | 라우팅 | 이유 |
|
|
|---|---|---|
|
|
| 텍스트 문서 + 태깅/분류/요약 | Tier 1 (Mac mini 35B) | 메인 범용, 품질 충분 |
|
|
| 이미지 포함 문서 / 스캔 PDF | Tier 3 → Tier 1 | Surya OCR로 텍스트 추출 후 35B로 분석 |
|
|
| 심층 분석 / 긴 보고서 생성 | Tier 2 (Claude API) | 최고 품질 필요 시 |
|
|
| RAG 검색 결과 리랭킹 | Tier 3 (GPU reranker) | 검색 정확도 극대화 |
|
|
| RAG 최종 응답 생성 | Tier 1 (Mac mini 35B) | 컨텍스트 기반 응답 |
|
|
| 새 문서 벡터 인덱싱 | Tier 3 (GPU embed) | CUDA 가속 배치 처리 |
|
|
| 대량 배치 (100+ 문서) | Tier 1 + Tier 3 병렬 | 양쪽 분산 처리 |
|
|
| 만화 OCR (Komga 연동) | Tier 3 (GPU Surya OCR) | GPU 서버 로컬 처리 |
|
|
|
|
### 모델 간 협업 파이프라인
|
|
|
|
```
|
|
예시: 스캔 문서가 DEVONthink에 들어왔을 때
|
|
|
|
1. [Smart Rule 트리거] 새 PDF 감지, 이미지 기반 문서로 판단
|
|
│
|
|
2. [GPU 서버 · Surya OCR :8400]
|
|
이미지/스캔 PDF → OCR 텍스트 추출 → DEVONthink 본문에 병합
|
|
│
|
|
3. [Mac mini · Qwen3.5-35B-A3B]
|
|
추출된 텍스트로 태그 생성 → DEVONthink 태그에만 저장
|
|
│
|
|
4. [GPU 서버 · bge-m3]
|
|
문서 벡터 임베딩 → Qdrant에만 저장
|
|
│
|
|
5. [결과] DEVONthink에는 본문(OCR)+태그+처리일시만
|
|
Qdrant에는 벡터만. 요약은 저장하지 않음 (RAG로 실시간 생성)
|
|
|
|
|
|
예시: RAG 질의 시
|
|
|
|
1. [사용자 질문] "서버 마이그레이션 관련 자료 정리해줘"
|
|
│
|
|
2. [GPU 서버 · bge-m3] 쿼리 임베딩
|
|
│
|
|
3. [Mac mini · Qdrant] 벡터 유사도 검색 → Top-20 후보
|
|
│
|
|
4. [GPU 서버 · bge-reranker-v2-m3]
|
|
Top-20 → 정밀 리랭킹 → Top-5 선정
|
|
│
|
|
5. [Mac mini · Qwen3.5-35B-A3B]
|
|
Top-5 컨텍스트 + 질문 → 종합 답변 생성
|
|
(x-devonthink-item:// 출처 링크 포함)
|
|
```
|
|
|
|
### GPU 서버 Ollama 멀티모델 운영
|
|
|
|
```bash
|
|
# GPU 서버 Ollama 설정 (/etc/systemd/system/ollama.service)
|
|
# 환경변수:
|
|
OLLAMA_HOST=0.0.0.0:11434 # 네트워크 노출
|
|
OLLAMA_NUM_PARALLEL=2 # 동시 요청 2개
|
|
OLLAMA_MAX_LOADED_MODELS=3 # 동시 로드 모델 3개 (비전+리랭커+임베딩)
|
|
OLLAMA_KEEP_ALIVE=10m # 미사용 시 10분 후 언로드
|
|
|
|
# 모델 다운로드
|
|
# Surya OCR은 별도 systemd 서비스로 운영 (:8400)
|
|
ollama pull bge-reranker-v2-m3 # 리랭커 (~1GB)
|
|
ollama pull bge-m3 # 임베딩 (~1.5GB, 1024차원)
|
|
|
|
# Mac mini에서 GPU 서버 호출 예시
|
|
# 비전 분석
|
|
curl http://gpu-server:11434/api/generate \
|
|
-d '{"model":"qwen2.5-vl:7b-instruct-q8_0", ...}'
|
|
|
|
# 임베딩 (배치)
|
|
curl http://gpu-server:11434/api/embed \
|
|
-d '{"model":"bge-m3", "input":["문서1 텍스트", "문서2 텍스트", ...]}'
|
|
```
|
|
|
|
**`keep_alive` 활용 전략:**
|
|
- Surya OCR: systemd 서비스로 상시 구동 (포트 8400)
|
|
- 리랭커: `keep_alive: "10m"` — RAG 쿼리 시 활성
|
|
- 임베딩: `keep_alive: "30m"` — 새 문서 인덱싱 빈도에 맞춰
|
|
|
|
세 모델 모두 상주시켜도 ~9.3GB로 16GB VRAM의 58% 수준입니다.
|
|
|
|
### RAG 시스템 구성
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────┐
|
|
│ RAG 파이프라인 │
|
|
│ │
|
|
│ [DEVONthink DB] (Mac mini) │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ [문서 추출] ← Smart Rule (새 문서 추가 시 트리거) │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ [청킹] → 의미 단위로 텍스트 분할 (500토큰) │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ [임베딩] → GPU 서버 Ollama (bge-m3, CUDA) │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ [벡터 저장] → Qdrant (Mac mini 로컬) │
|
|
│ │ │
|
|
│ ─ ─ ─ ─ ─ ─ 쿼리 시 ─ ─ ─ ─ ─ ─ │
|
|
│ │ │
|
|
│ [질문 입력] │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ [쿼리 임베딩] → GPU 서버 (bge-m3) │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ [유사도 검색] → Qdrant (Mac mini, Top-20) │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ [리랭킹] → GPU 서버 (bge-reranker, Top-5 선정) │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ [컨텍스트 조합] + 원본 DEVONthink 링크 │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ [LLM 응답] → Mac mini (35B) 또는 Claude API │
|
|
│ └── 출처 링크 포함 (x-devonthink-item://UUID) │
|
|
└─────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### DEVONagent + AI 리서치 자동화
|
|
|
|
#### 검색 세트 전체 구성
|
|
|
|
```
|
|
Mac mini 자동 스케줄 (9개 검색 세트)
|
|
|
|
안전 분야 (7종, 상세 → 산업안전 설계서 §4 참조):
|
|
├── [SS-01] 🇰🇷 한국 산업안전 뉴스 매일 06:00 15~25건/주
|
|
├── [SS-02] 🇰🇷 중대재해·판례 매일 06:15 5~10건/주
|
|
├── [SS-04] 🇺🇸 미국 안전 동향 주 1회 (월) 10~15건/주
|
|
├── [SS-05] 🇯🇵 일본 안전 동향 주 1회 (수) 5~10건/주
|
|
├── [SS-06] 🇪🇺 유럽 안전 동향 월 2회 2~4건/주
|
|
├── [SS-07] 🌐 국제 안전 전문지 주 1회 (금) 5~10건/주
|
|
└── [SS-08] 📚 학술 논문 (안전공학) 주 1회 (토) 5~10건/주
|
|
|
|
기술/일반 (2종):
|
|
├── [SS-03] 🇰🇷 한국 기술 뉴스 (IT/AI) 매일 06:30 10~15건/주
|
|
└── [SS-09] 🔧 IT/개발 뉴스 매일 06:30 10~15건/주
|
|
|
|
전체 하루 평균: ~15~20건 (안전 8~12 + 기술 5~8)
|
|
|
|
MacBook 수동 (필요 시)
|
|
├── Quick Research (미팅 전 주제 조사)
|
|
└── Deep Dive (특정 사안 심층 리서치)
|
|
|
|
※ 안전 분야 검색 세트 상세 (소스, 쿼리, 양 조절 전략)
|
|
→ 산업안전 설계서 §4 참조
|
|
```
|
|
|
|
#### 수집 결과 자동 처리 흐름
|
|
|
|
```
|
|
DEVONagent 수집 완료
|
|
│
|
|
▼
|
|
DEVONthink Inbox 도착 (자동 전송)
|
|
│
|
|
▼
|
|
Smart Rule 1차: AI 태깅 + 도메인 DB 판단
|
|
│
|
|
├─ 산업안전 관련 → 04_Industrial Safety/00_Inbox
|
|
├─ IT/기술 관련 → 05_Programming 또는 03_Engineering
|
|
└─ 기타 → 00_Note_BOX
|
|
│
|
|
▼
|
|
Smart Rule 2차: 하위 그룹 라우팅
|
|
│
|
|
├─ 뉴스 기사 ($유형/기사)
|
|
│ ├─ 사고사례 키워드 → 40_Cases/Domestic/
|
|
│ ├─ 법령 개정 키워드 → 10_Legislation/KR_Archive/
|
|
│ ├─ 해외 태그 → 40_Cases/International/
|
|
│ └─ 일반 안전뉴스 → 00_Inbox/ (수동 분류 대기)
|
|
│
|
|
├─ 판례 ($유형/법령 + 사고사례)
|
|
│ → 60_Compliance/Audit/
|
|
│
|
|
├─ 논문 ($유형/논문)
|
|
│ → 30_Papers/
|
|
│
|
|
└─ KOSHA Guide / 기술지침
|
|
→ 80_Reference/Standards/
|
|
│
|
|
▼
|
|
Qdrant 벡터 인덱싱 (비동기)
|
|
→ RAG 검색에 즉시 반영
|
|
│
|
|
▼
|
|
주간 다이제스트 생성 (Claude API)
|
|
├── 한 주간 수집된 자료 종합 분석
|
|
├── 핵심 트렌드 및 인사이트 추출
|
|
└── OmniOutliner로 구조화된 보고서 생성
|
|
```
|
|
|
|
---
|
|
|
|
## Omni 제품군 통합
|
|
|
|
### 통합 맵
|
|
|
|
```
|
|
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
│ OmniFocus │◄───►│ DEVONthink │◄───►│ OmniOutliner │
|
|
│ (작업 관리) │ │ (지식 허브) │ │ (구조화 사고) │
|
|
└──────┬──────┘ └──────┬───────┘ └──────────────┘
|
|
│ │ ▲
|
|
│ │ │
|
|
▼ ▼ │
|
|
┌─────────────┐ ┌──────────────┐ │
|
|
│ OmniPlan │ │ OmniGraffle │──────────────┘
|
|
│ (프로젝트) │ │ (시각화) │
|
|
└─────────────┘ └──────────────┘
|
|
```
|
|
|
|
### 연동 시나리오
|
|
|
|
**시나리오 A: 리서치 → 계획 → 실행**
|
|
```
|
|
DEVONagent로 주제 리서치
|
|
→ 결과가 DEVONthink에 축적
|
|
→ AI가 자동 분류 및 요약
|
|
→ OmniOutliner로 리서치 결과 구조화
|
|
→ OmniPlan으로 프로젝트 타임라인 수립
|
|
→ OmniFocus에 실행 가능한 작업 분배
|
|
→ OmniGraffle로 아키텍처/프로세스 다이어그램 작성
|
|
→ 모든 산출물이 DEVONthink에 저장 (역링크 유지)
|
|
```
|
|
|
|
**시나리오 B: 문서 처리 파이프라인**
|
|
```
|
|
문서 도착 (스캔, 이메일, 웹클립)
|
|
→ DEVONthink OCR 처리 (필요 시)
|
|
→ Ollama 자동 분류 + 태깅
|
|
→ 액션 아이템 감지 → OmniFocus 작업 생성
|
|
→ 관련 프로젝트 연결 → OmniPlan 업데이트
|
|
→ 정기 리뷰 시 DEVONsphere로 관련 자료 탐색
|
|
```
|
|
|
|
### OmniFocus 통합 스크립트
|
|
|
|
```applescript
|
|
-- DEVONthink 4에서 선택된 문서의 액션 아이템을
|
|
-- OmniFocus 프로젝트로 일괄 생성
|
|
tell application id "DNtp"
|
|
set selectedRecords to selection
|
|
repeat with theRecord in selectedRecords
|
|
set docName to name of theRecord
|
|
set docLink to reference URL of theRecord
|
|
set docText to plain text of theRecord
|
|
end repeat
|
|
end tell
|
|
|
|
-- AI로 액션 아이템 추출
|
|
set extractCmd to "curl -s http://localhost:8800/v1/chat/completions -H 'Content-Type: application/json' -d '{" & ¬
|
|
"\"model\":\"mlx-community/Qwen3.5-35B-A3B-4bit\"," & ¬
|
|
"\"messages\":[{\"role\":\"user\",\"content\":\"다음 텍스트에서 할 일(TODO)만 추출해서 " & ¬
|
|
"한 줄에 하나씩 출력해줘:\\n" & docText & "\"}]}'"
|
|
set aiResult to do shell script extractCmd
|
|
|
|
-- OmniFocus에 작업 생성
|
|
tell application "OmniFocus"
|
|
tell default document
|
|
set theProject to first flattened project where name is "DEVONthink Actions"
|
|
|
|
set taskLines to paragraphs of aiResult
|
|
repeat with taskLine in taskLines
|
|
if length of taskLine > 2 then
|
|
make new task with properties {
|
|
name: taskLine,
|
|
note: "출처: " & docLink,
|
|
project: theProject
|
|
}
|
|
end if
|
|
end repeat
|
|
end tell
|
|
end tell
|
|
```
|
|
|
|
---
|
|
|
|
## MacBook Pro 외부 사용 연동
|
|
|
|
MacBook Pro (M3)는 **소비 + 수집 클라이언트**로 위치시킵니다.
|
|
외부에서 자료를 열람/검색하고, DEVONagent로 현장 리서치를 수행하며,
|
|
DEVONsphere로 시스템 전역 검색을 하되, AI 처리는 홈 서버에 위임하는 구조입니다.
|
|
|
|
### 동기화 구성
|
|
|
|
```
|
|
┌─────────────────────┐ ┌──────────────────┐
|
|
│ MacBook Pro (M3) │ ◄── CloudKit ──► │ Mac mini (허브) │
|
|
│ │ ◄── WebDAV ──► │ │
|
|
│ DEVONthink 4 │ 동기화 DB: │ DEVONthink 4 │
|
|
│ · Inbox (CloudKit) │ · Inbox │ · 전체 13개 DB │
|
|
│ · Projects (CK) │ · Projects │ │
|
|
│ · 05_Programming │ · 자주 쓰는 │ │
|
|
│ · 03_Engineering │ 도메인 DB (WebDAV)│ │
|
|
│ │ │ │
|
|
│ DEVONagent Pro │ → 결과를 Inbox에 │ DEVONagent Pro │
|
|
│ (현장 리서치) │ → CloudKit 동기화 │ (자동 스케줄) │
|
|
│ │ │ │
|
|
│ DEVONsphere Express │ (로컬 전역 검색) │ DEVONsphere │
|
|
│ │ │ │
|
|
│ OmniFocus │ ◄── 자체 동기화 ──► │ OmniFocus │
|
|
│ OmniOutliner │ ◄── 자체 동기화 ──► │ OmniOutliner │
|
|
└─────────────────────┘ └──────────────────┘
|
|
```
|
|
|
|
**동기화 전략:**
|
|
- Inbox, Projects → CloudKit (빠른 동기화, 용량 작음)
|
|
- 자주 참조하는 도메인 DB → WebDAV 선택 동기화 (예: 05_Programming, 03_Engineering 등 업무에 따라 선택)
|
|
- 나머지 도메인 DB → 맥북에 동기화하지 않음 (용량 절약, 필요 시 Tailscale RAG로 검색)
|
|
- Archive → 맥북에 동기화하지 않음 (MailPlus 메일은 웹으로 직접 접근)
|
|
- 필요 시 Archive를 선택적으로 WebDAV 동기화 가능
|
|
|
|
### DEVONsphere Express — 맥북의 만능 검색 입구
|
|
|
|
DEVONthink를 열지 않고도 **단축키 하나로** 모든 자료를 즉시 찾는 도구입니다.
|
|
맥북에서는 특히 가치가 높습니다:
|
|
|
|
```
|
|
검색 범위:
|
|
├── DEVONthink 동기화 DB (Inbox, Projects, 선택한 도메인 DB들)
|
|
├── DEVONthink Archive DB ← MailPlus 메일이 여기로 IMAP 임포트됨
|
|
├── 로컬 파일 (문서, 다운로드 등)
|
|
├── 브라우저 북마크 / 히스토리
|
|
└── 연락처
|
|
|
|
⚠️ Synology MailPlus 메일 검색:
|
|
DEVONsphere의 "Mail" 검색은 Apple Mail.app 전용입니다.
|
|
MailPlus를 쓰는 경우, 메일은 IMAP → DEVONthink Archive DB로
|
|
자동 임포트되므로 DEVONthink DB 검색을 통해 메일도 검색됩니다.
|
|
즉, MailPlus 메일도 DEVONsphere에서 찾을 수 있습니다.
|
|
|
|
사용 시나리오:
|
|
· 미팅 중 "그 보고서 어디 있었지?" → Ctrl+Cmd+Space → 즉시 검색
|
|
· "지난달 받은 견적서 어디 있지?" → Archive DB의 MailPlus 메일에서 검색
|
|
· 브라우저에서 읽다가 관련 자료 찾기 → DEVONsphere가 유사도까지 표시
|
|
· DEVONthink 열기 귀찮을 때 빠르게 문서 미리보기
|
|
· Spotlight보다 정확한 결과 (DEVONthink AI 유사도 기반)
|
|
```
|
|
|
|
**설정 팁:**
|
|
- 시작 시 자동 실행 (로그인 항목에 추가)
|
|
- 메모리: ~50MB 수준, 배터리 영향 무시
|
|
- 단축키: `Ctrl+Cmd+Space` (기본값, Spotlight와 충돌 시 변경)
|
|
|
|
### DEVONagent Pro — 맥북에서의 역할 분담
|
|
|
|
Mac mini에서는 **자동 스케줄 리서치**, 맥북에서는 **현장 수동 리서치**로
|
|
역할을 나눕니다.
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────┐
|
|
│ DEVONagent 역할 분담 │
|
|
├────────────────────────┬────────────────────────────────┤
|
|
│ Mac mini (자동화) │ MacBook Pro (현장) │
|
|
├────────────────────────┼────────────────────────────────┤
|
|
│ 스케줄 검색 세트 │ 수동 딥 리서치 │
|
|
│ · 매일 06:00 자동 실행 │ · 미팅 전 주제 사전 조사 │
|
|
│ · 기술뉴스, 학술논문 등 │ · 새 프로젝트 킥오프 자료 수집 │
|
|
│ · 결과 → Inbox → AI 태깅│ · 현장에서 발생한 주제 즉시 리서치│
|
|
│ │ │
|
|
│ 배치 + 자동화 중심 │ 인터랙티브 + 즉시성 중심 │
|
|
├────────────────────────┴────────────────────────────────┤
|
|
│ 공통: 결과는 모두 DEVONthink Inbox → CloudKit 동기화 │
|
|
│ → Mac mini Smart Rule이 자동 태깅 + Qdrant 인덱싱 │
|
|
└─────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
**맥북에서 DEVONagent가 브라우저보다 나은 점:**
|
|
- 여러 검색엔진(Google, Bing, DuckDuckGo, 학술 DB 등)을 동시에 돌림
|
|
- 결과를 자동 중복 제거 + 관련도 정렬
|
|
- 한 번에 DEVONthink Inbox로 전송 (개별 웹클리핑 불필요)
|
|
- 검색 세트를 저장해두면 같은 주제 후속 리서치가 빠름
|
|
|
|
**맥북 전용 검색 세트 추천:**
|
|
|
|
```
|
|
검색 세트 예시:
|
|
· "Quick Research" — Google + DuckDuckGo + Wikipedia, 상위 20개 결과
|
|
→ 미팅 전 빠른 사전 조사용
|
|
· "Academic Deep" — Google Scholar + arXiv + Semantic Scholar
|
|
→ 논문/기술 자료 심층 검색용
|
|
· "Industry News" — 커스텀 RSS/사이트 기반
|
|
→ 업계 동향 현장 체크용
|
|
```
|
|
|
|
**워크플로우: 외부 미팅 시나리오**
|
|
```
|
|
미팅 30분 전
|
|
→ DEVONagent "Quick Research"로 상대방/주제 검색
|
|
→ 결과 한 번에 Inbox로 전송
|
|
→ DEVONsphere로 내 기존 자료 중 관련 문서 탐색
|
|
→ 두 결과를 조합해 미팅 준비 완료
|
|
|
|
미팅 중
|
|
→ DEVONsphere로 키워드 즉시 검색 (관련 자료 찾기)
|
|
→ 메모를 DEVONthink Inbox에 마크다운으로 작성
|
|
|
|
미팅 후
|
|
→ CloudKit 동기화 → Mac mini가 자동 처리
|
|
→ 태깅 + 인덱싱 완료 → 다음에 RAG로 "지난 미팅 내용" 질의 가능
|
|
```
|
|
|
|
### 외부에서 RAG 접근
|
|
|
|
맥북에서도 내 지식베이스에 질문하고 싶을 때를 위한 두 가지 방안:
|
|
|
|
**방안 A: Tailscale VPN (권장)**
|
|
```
|
|
MacBook Pro → Tailscale → Mac mini:11434 (Ollama)
|
|
→ Mac mini:8000 (RAG API)
|
|
|
|
장점: 설정 간단, 어디서든 접속, 별도 포트포워딩 불필요
|
|
구현: Mac mini에 간단한 RAG API 서버 (FastAPI) 하나 띄우면
|
|
맥북에서 웹 브라우저나 Shortcuts로 질의 가능
|
|
```
|
|
|
|
**방안 B: Synology 경유 역방향 프록시**
|
|
```
|
|
MacBook Pro → Synology DDNS → 역방향 프록시 → Mac mini RAG API
|
|
|
|
장점: 이미 NAS 인프라 활용, HTTPS 자동 (Let's Encrypt)
|
|
단점: NAS 설정 필요, 보안 관리 포인트 추가
|
|
```
|
|
|
|
### 맥북에서의 워크플로우
|
|
|
|
```
|
|
[외부 작업 시]
|
|
DEVONthink에서 자료 검색/열람 (동기화된 DB)
|
|
→ 웹클리핑/메모 → Inbox에 저장 → CloudKit으로 Mac mini에 동기화
|
|
→ Mac mini Smart Rule이 자동 태깅 + 인덱싱 (비동기)
|
|
→ 다음에 맥북 열면 결과 동기화되어 있음
|
|
|
|
[RAG 질의 시]
|
|
Tailscale 연결 → RAG API에 자연어 질문
|
|
→ Mac mini에서 GPU 임베딩 → Qdrant 검색 → 리랭킹 → 35B 응답
|
|
→ 결과에 x-devonthink-item:// 링크 포함
|
|
→ 맥북 DEVONthink에서 해당 문서 바로 열기
|
|
|
|
[OmniFocus 연동]
|
|
맥북에서 완료한 작업 → 자체 동기화로 Mac mini에 반영
|
|
→ Mac mini AppleScript가 DEVONthink 메타데이터 업데이트
|
|
```
|
|
|
|
### 맥북에 Ollama 로컬을 올릴 필요가 있는가?
|
|
|
|
**권장: 올리지 않음.** M3 맥북에서 35B 모델을 돌리면 배터리 소모가 크고,
|
|
주 용도가 DEVONthink 브라우징+검색이라면 DEVONthink 자체 검색 +
|
|
VPN 경유 RAG API로 충분합니다. 오프라인이 필요한 상황이라면
|
|
가벼운 모델(Qwen3.5-3B 등)을 올리는 것은 선택 가능합니다.
|
|
|
|
---
|
|
|
|
## 일일 워크플로우
|
|
|
|
### 아침 루틴 (자동)
|
|
```
|
|
06:00 DEVONagent 자동 검색 실행
|
|
06:30 검색 결과 → DEVONthink Inbox
|
|
06:31 Smart Rule → Ollama 자동 분류/태깅
|
|
07:00 MailPlus 새 메일 → DEVONthink Archive
|
|
07:01 Chat 메시지 다이제스트 → DEVONthink Archive
|
|
```
|
|
|
|
### 작업 시 (수동 + 반자동)
|
|
```
|
|
DEVONsphere Express로 관련 자료 즉시 검색
|
|
DEVONthink에서 문서 작업 → 자동으로 OmniFocus 작업 생성
|
|
OmniOutliner로 아이디어 구조화 → DEVONthink에 저장
|
|
RAG 시스템으로 내 지식베이스에 질문
|
|
```
|
|
|
|
### Daily Digest (자동 — 매일 20:00)
|
|
|
|
전체 DB의 하루 변화를 자동 집계하여 MD 파일 + OmniFocus 액션으로 분리 배달합니다.
|
|
|
|
```
|
|
실행 주체: pkm_daily_digest.py (launchd, 매일 20:00)
|
|
|
|
수집 대상:
|
|
DEVONthink → 오늘 추가/수정된 문서 (모든 DB)
|
|
법령 모니터 → 법령 제·개정 감지 건
|
|
DEVONagent → 오늘 수집된 뉴스/자료 수
|
|
TKSafety → 동기화된 업무 데이터 (활성화 시)
|
|
OmniFocus → 오늘 완료/추가/기한초과 작업
|
|
|
|
출력 1 — MD 다이제스트 (읽기용):
|
|
저장: 00_Note_BOX/Daily_Digest/2026-03-24_digest.md
|
|
형식:
|
|
|
|
┌─────────────────────────────────────────────┐
|
|
│ 📋 PKM Daily Digest — 2026-03-24 (월) │
|
|
├─────────────────────────────────────────────┤
|
|
│ │
|
|
│ ■ 문서 현황 │
|
|
│ 신규 12건 | 수정 3건 | 자동분류 10건 │
|
|
│ Inbox 미처리 2건 │
|
|
│ │
|
|
│ ■ DB별 변동 │
|
|
│ 04_Industrial Safety +5 (뉴스3, 법령1, 업무1)│
|
|
│ 03_Engineering +3 │
|
|
│ 05_Programming +2 │
|
|
│ 99_Reference Data +2 │
|
|
│ │
|
|
│ ■ 법령 변경 │
|
|
│ ⚠ 산업안전보건법 시행규칙 일부개정 │
|
|
│ (시행일: 2026-04-01) │
|
|
│ ⚠ OSHA CFR 1926.502 — Fall Protection │
|
|
│ (Proposed Rule Change) │
|
|
│ │
|
|
│ ■ 주요 뉴스 (DEVONagent 수집) │
|
|
│ · 국내 안전: 8건 수집 │
|
|
│ · 해외 안전: 4건 수집 │
|
|
│ · 상위 3건 요약 (Ollama 35B 생성) │
|
|
│ │
|
|
│ ■ TKSafety 동기화 (활성화 시) │
|
|
│ 위험성평가 2건 | 순회점검 1건 │
|
|
│ 시정조치 overdue 1건 ⚠ │
|
|
│ │
|
|
│ ■ OmniFocus 요약 │
|
|
│ 완료 5건 | 신규 3건 | 기한초과 1건 │
|
|
│ │
|
|
│ ■ 시스템 상태 │
|
|
│ Qdrant 벡터: 12,847개 (+15) │
|
|
│ Inbox 잔여: 2건 │
|
|
│ NAS 동기화: 정상 │
|
|
└─────────────────────────────────────────────┘
|
|
|
|
출력 2 — OmniFocus 액션 (행동이 필요한 것만):
|
|
자동 생성 조건:
|
|
· 법령 변경 감지 → "법령 변경 검토: [법령명]" (프로젝트: PKM/법령리뷰)
|
|
· Inbox 미처리 3건 이상 → "Inbox 정리 필요 (N건 미분류)"
|
|
· 시정조치 overdue → "시정조치 기한초과: [내용]" (긴급 플래그)
|
|
· 분류 실패 문서 존재 → "수동 분류 필요 (N건)"
|
|
· Qdrant 인덱싱 실패 → "벡터 인덱싱 오류 점검"
|
|
|
|
출력 3 — Synology Chat 알림 (선택, 한 줄 요약):
|
|
"📋 오늘 다이제스트: 신규 12건, 법령변경 2건, overdue 1건 ⚠"
|
|
→ DEVONthink 다이제스트 파일 링크 포함
|
|
```
|
|
|
|
```
|
|
데이터 수집 방법 (AppleScript + Python 혼합):
|
|
|
|
1. DEVONthink 문서 수집 — AppleScript
|
|
tell application id "DNtp"
|
|
set todayDocs to search "date:today" in database "..."
|
|
end tell
|
|
→ 각 DB별 today 신규/수정 건수 집계
|
|
|
|
2. 법령 변경 — law_monitor.py 로그 파싱
|
|
~/logs/law_monitor/ 에서 오늘자 변경 감지 로그 읽기
|
|
|
|
3. DEVONagent 수집 현황 — DEVONagent 로그 또는 Inbox 카운트
|
|
오늘 수집된 문서 중 sourceChannel = devonagent 카운트
|
|
|
|
4. OmniFocus 현황 — AppleScript
|
|
tell application "OmniFocus"
|
|
set todayCompleted to completed tasks whose completion date is today
|
|
end tell
|
|
|
|
5. 시스템 상태 — Python
|
|
Qdrant collection.count(), NAS ping, sync 로그 확인
|
|
|
|
6. 상위 뉴스 요약 — Ollama 35B
|
|
오늘 수집된 뉴스 중 상위 3건을 2-3문장으로 요약
|
|
|
|
7. MD 생성 → DEVONthink 00_Note_BOX/Daily_Digest/에 저장
|
|
8. 액션 아이템 → OmniFocus에 자동 생성
|
|
9. (선택) Synology Chat webhook으로 알림 전송
|
|
```
|
|
|
|
```
|
|
보관 정책:
|
|
· Daily Digest MD: 90일 보관 후 90_Archive로 이동 (Smart Rule)
|
|
· 주간 요약: 매주 월요일, 지난 7일 다이제스트를 Ollama로 요약 → 주간 리포트 생성
|
|
· 월간 통계: 매월 1일, 문서 증가 추이/DB별 성장/법령 변경 이력 → 월간 리포트
|
|
```
|
|
|
|
### 저녁 리뷰 (반자동)
|
|
```
|
|
20:00 Daily Digest 자동 생성 (위 참조)
|
|
20:01 OmniFocus에 액션 아이템 자동 추가
|
|
DEVONthink Inbox 비우기 (AI가 대부분 처리, 검토만)
|
|
OmniFocus 리뷰 → 완료 작업의 DEVONthink 메타데이터 업데이트
|
|
주간 리뷰 시: Claude API로 한 주 다이제스트 자동 생성
|
|
```
|
|
|
|
---
|
|
|
|
## 설치 및 구성 순서
|
|
|
|
### Phase 1: 기반 설치 (Day 1)
|
|
```
|
|
□ DEVONthink 4 설치 및 라이선스
|
|
□ DEVONagent Pro 설치
|
|
□ DEVONsphere Express 설치
|
|
□ OmniFocus, OmniOutliner, OmniGraffle, OmniPlan 설치
|
|
□ Ollama 확인 (이미 설치됨)
|
|
□ GPU 서버에 bge-m3, bge-reranker 다운로드 + Surya OCR 서비스 설치
|
|
□ Qdrant (Docker, Mac mini) — pkm_documents 컬렉션 (1024차원, Cosine)
|
|
□ Python 환경 설정 (venv 권장)
|
|
□ Plex Media Server를 GPU 서버로 이전
|
|
```
|
|
|
|
### Phase 2: DEVONthink 설정 (Day 2-3)
|
|
```
|
|
□ 운영 DB 생성 (Inbox, Archive, Projects) — 기존 10개 도메인 DB는 유지
|
|
□ 기존 도메인 DB 점검 (00_Note_BOX ~ 99_Technicalkorea) — 그룹 구조 정리
|
|
□ 태그 체계 생성
|
|
□ 커스텀 메타데이터 필드 설정
|
|
□ Smart Rules 구성 (AI 자동 분류, 이메일 정리, OmniFocus 연동)
|
|
□ AppleScript 모듈 설치 및 테스트
|
|
```
|
|
|
|
### Phase 3: Synology 연동 (Day 3-4)
|
|
```
|
|
□ WebDAV Server 설치 및 HTTPS 설정
|
|
□ DEVONthink WebDAV 동기화 구성
|
|
□ MailPlus IMAP → DEVONthink 가져오기 설정
|
|
□ Chat 아카이브 스크립트 설정 (launchd)
|
|
□ Time Machine 백업 대상 설정
|
|
```
|
|
|
|
### Phase 4: AI 파이프라인 (Day 4-5)
|
|
```
|
|
□ Ollama 태깅/분류 프롬프트 최적화
|
|
□ Claude API 키 Keychain 등록
|
|
□ RAG 파이프라인 구축 (GPU bge-m3 임베딩 + Mac mini Qdrant + MLX 35B 응답)
|
|
□ DEVONthink Smart Rule과 AI 연동 테스트
|
|
□ DEVONagent 자동 검색 스케줄 설정
|
|
```
|
|
|
|
### Phase 5: Omni 통합 (Day 5-6)
|
|
```
|
|
□ OmniFocus 프로젝트 구조 설정
|
|
□ DEVONthink ↔ OmniFocus AppleScript 테스트
|
|
□ OmniOutliner 템플릿 생성
|
|
□ 전체 워크플로우 End-to-End 테스트
|
|
```
|
|
|
|
### Phase 6: 최적화 (Day 7+)
|
|
```
|
|
□ AI 분류 정확도 모니터링 및 프롬프트 튜닝
|
|
□ 자주 쓰는 워크플로우 Keyboard Maestro/Shortcuts 등록
|
|
□ 성능 모니터링 (RAM, CPU 사용량)
|
|
□ 기존 데이터 마이그레이션 (있을 경우)
|
|
```
|
|
|
|
---
|
|
|
|
## 하드웨어 리소스 예상
|
|
|
|
### Mac mini M4 Pro (64GB 통합메모리)
|
|
|
|
```
|
|
서비스 RAM CPU/GPU 비고
|
|
─────────────────────────────────────────────────────────────
|
|
DEVONthink 4 4-8GB 낮음 DB 크기에 따라
|
|
DEVONagent Pro 1-2GB 간헐적 검색 시에만
|
|
OmniFocus 0.5GB 낮음
|
|
OmniPlan 0.5GB 낮음
|
|
OmniOutliner 0.3GB 낮음
|
|
OmniGraffle 0.5GB 낮음
|
|
MLX (Qwen3.5-35B-A3B 4bit) ~20GB 중간 MoE: 3B만 활성
|
|
Qdrant (Docker) 1-2GB 낮음
|
|
Roon Core 2-4GB 낮음
|
|
Komga 0.5GB 낮음
|
|
기타 시스템 4-6GB -
|
|
|
|
합계 예상 ~35-44GB
|
|
여유분 ~20-29GB ✅ 충분
|
|
```
|
|
|
|
**MoE 모델의 이점:** Qwen3.5-35B-A3B는 총 35B 파라미터이지만 추론 시 3B만
|
|
활성화되므로, 실제 연산량은 9B 모델보다 가벼우면서도 품질은 35B급입니다.
|
|
M4 Pro의 통합메모리 + Neural Engine 조합으로 ~80 tok/s를 달성하며,
|
|
이는 Smart Rule 자동화에 실용적인 속도입니다.
|
|
|
|
Plex를 GPU 서버로 이전하고 임베딩도 GPU로 넘김으로써, Mac mini는 이전 대비
|
|
약 2GB 정도 여유가 더 생겼습니다.
|
|
|
|
### GPU 서버 (RTX 4070 Ti Super 16GB VRAM)
|
|
|
|
```
|
|
서비스 VRAM 상태 비고
|
|
─────────────────────────────────────────────────────────────
|
|
Surya OCR (systemd) ~2-3GB 상주 문서/만화 OCR
|
|
bge-reranker-v2-m3 ~1GB 상주 RAG 리랭킹
|
|
bge-m3 (1024차원) ~1.5GB 상주 임베딩 (CUDA 가속)
|
|
Plex HW Transcoding ~1-2GB 간헐적 NVENC/NVDEC 활용
|
|
시스템 오버헤드 ~2GB -
|
|
|
|
상주 AI 합계 ~9.3GB / 16GB ✅ 여유
|
|
Plex 트랜스코딩 포함 시 ~11.3GB / 16GB ✅ 가능
|
|
```
|
|
|
|
**VL 모델 8Q 업그레이드 효과:**
|
|
이전 4Q 대비 8Q는 VRAM을 ~3GB 더 사용하지만, 코더 모델을 제거하면서 확보한
|
|
여유분으로 충분히 커버됩니다. 비전 분석 품질이 눈에 띄게 향상되어,
|
|
스캔 문서 OCR 보완이나 사진 태깅 정확도가 올라갑니다.
|
|
|
|
**Plex GPU 서버 이전 효과:**
|
|
RTX 4070 Ti Super의 NVENC/NVDEC 하드웨어 인코더를 활용하면
|
|
Mac mini의 소프트웨어 트랜스코딩 대비 전력 효율과 성능이 크게 개선됩니다.
|
|
VRAM은 트랜스코딩 시에만 1-2GB 일시 사용하므로 AI 모델과 충돌하지 않습니다.
|