hyungi 4d14ab69d9 feat(eval): v0.2 28 신규 case + 2026-05-23 baseline + analysis
PR-1 (725a4e1) v0.2 schema + harness 위에 신규 28 case 추가 → 51 case
완성 + 현재 모델로 baseline 박제 + 약점 카테고리 analysis md.

신규 28 case 분포 (계획 +28 = standards +6 / english_only +8 / mixed +5
/ exam +7 / failure_expected +2 / ocr_derived 0):
- standards 5 → 11 (KGS FP111/FU551 + 산안기준 후반 편 + 고압가스법)
- english_only 1 → 9 (Pressure Vessel Design Manual + ASME VIII/IX +
  Hydrogen ASME + Industrial Safety 영문 교재 + Structural Analysis)
- mixed 5 → 10 (한↔영 ASME / KGS-영문 / 양언어 압력용기)
- exam 0 → 7 (가스기사 study_questions → library 개념 docs 매핑)
- failure_expected 3 → 5 (KGS AC999 / 초전도 안전 관리법)
- ocr_derived 0 (TBD-O FAILED: extract_meta NULL 21385, chunks.source
  = RSS feed 명. OCR 식별 컬럼 부재 → +4 case 재배분, analysis 명시)

baseline 측정 결과 (corpus 21,385, hybrid mode, bge-m3 + bge-reranker-v2-m3):
- v0.1 Recall@10 0.646, MRR 0.724, NDCG 0.606, Top-3 0.891
- v0.2 graded NDCG 0.659, Recall@10 g≥2 0.695, g≥3 0.761
- latency p50 528ms / p95 1,664ms
- failure precision 0/5 (DS confidence threshold 미적용)

약점 top 3 (analysis md):
- mixed crosslingual 0.39 graded NDCG — TOP weakness, bge-m3
  multilingual 한계 추정
- korean_only natural language 0.51 — query rewrite 부재 추정
- failure_expected 0/5 — confidence cutoff 부재

Phase 2 dispatch 권고 (analysis md):
- 2A Embedding bge-m3 — 즉시 진입 (mixed/korean 동시 타격)
- 2B Reranker — M (2A 이후)
- 2C OCR-Marker — 선행 chore (OCR 식별 컬럼 추가) 필요
- 2D STT — 본 평가셋 외 (별 평가셋 필요)

Query rewrite 는 Phase 2Q/Search-PR 로 별도 분리.

영향 받는 파일:
- tests/search_eval/queries.yaml: 23 → 51 case (기존 23 변경 0, append only)
- tests/search_eval/baselines/v0_2_baseline_2026-05-23.json: 신규
- tests/search_eval/baselines/v0_2_baseline_2026-05-23_analysis.md: 신규

PR plan: ~/.claude/plans/pr-2-serialized-hummingbird.md
Phase 1 plan: ~/.claude/plans/phase-1-graded-eval-v0-2.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 03:32:55 +00:00

hyungi_Document_Server

Self-hosted 개인 지식관리(PKM) + 다국 뉴스 비교 분석 웹 애플리케이션.

모델 이름·엔드포인트·머신 정보는 운영 상태에 따라 변하므로 README 에 박지 않습니다. 운영 단일 진실 소스(SSOT): ~/.claude/projects/-Users-hyungiahn/memory/infra_inventory.md. 모델/엔드포인트/포트/SSH 어디서든 README 와 inventory 가 충돌하면 inventory 가 정답입니다.

기술 스택

  • 백엔드: FastAPI + SQLAlchemy 2.0 async, APScheduler cron
  • DB: PostgreSQL 16 + pgvector + pg_trgm (단일 pkm DB)
  • 프론트엔드: SvelteKit 5 (runes mode) + Tailwind CSS 4
  • 문서 파싱: kordoc 마이크로서비스 (HWP/HWPX/PDF → Markdown), LibreOffice headless (오피스), marker (PDF → markdown Phase 1B)
  • AI 파이프라인 (역할별, 자세한 모델 매핑은 inventory):
    • 분류/요약 본체: Mac mini MLX 26B (primary)
    • Triage / fallback / chat: GPU Ollama 4B
    • Embedding: GPU Ollama bge-m3 (1024d)
    • Reranker: GPU TEI 컨테이너 bge-reranker-v2-m3
    • OCR: docker compose ocr-service (Surya OCR GPU)
    • STT: Mac mini MLX Whisper large-v3
    • Premium (수동 trigger): Anthropic Claude (require_explicit_trigger)
  • 인증: JWT (access) + HttpOnly cookie (refresh) + TOTP 2FA
  • 인프라: Docker Compose, Caddy (HTTP only, 앞단 home-caddy 가 HTTPS 종료), Synology NAS NFS

주요 기능

  • 문서 자동 분류/태그/요약 — Triage(4B) → Deep summary(26B) tier 분리, 백로그 guard / 텍스트 슬라이스 / inconsistency 감지
  • 하이브리드 검색 — pgvector 벡터 + pg_trgm 전문검색 + reranker (bge-reranker-v2-m3) + Ask pipeline (HyDE / evidence_service)
  • 다국어 OCR — Surya OCR GPU (한/영/일/중/독/불 등), NFC/NFD 경로 정규화
  • 음성/영상 전사 — MLX Whisper large-v3, /audio /video 라우트 + direct play
  • 법령 변경 모니터링law_monitor cron, freshness decay (365일 반감기)
  • 이메일 자동 수집 — MailPlus IMAP, NFS 저장
  • Phase 4 Global Digest — 매일 04:00 KST 7일 rolling 뉴스 country×topic 2-level 비교 (/digest)
  • 야간 뉴스 브리핑 — 매일 05:10 KST KST 자정~05:00 5시간 윈도우, topic×country 비교 분석 1페이지 카드 (/news)
  • 자료실 (Library) — 카테고리 facet 분류 + AI 제안 1-click 승인
  • 메모/이벤트/공부 — 5초 행동 기록 메모, 일정/할 일/회고 events 도메인, 가스기사 학습 워크스페이스 (274 개념 + 2,100 기출)
  • 마크다운 canonical layer — extracted_images NAS 저장 + document_images 메타 + 단기 토큰 인증 (?token=)

Quick Start

git clone https://git.hyungi.net/hyungi/hyungi_document_server.git
cd hyungi_document_server

# 인증 정보 (DB 비밀번호, JWT secret, Claude API key 등)
cp credentials.env.example credentials.env
$EDITOR credentials.env

# AI 모델 / 엔드포인트 / 경로
$EDITOR config.yaml      # inventory 참조하면서 채움
$EDITOR .env             # POSTGRES_PASSWORD, MAC_MINI_HOST, NAS_NFS_PATH 등

docker compose up -d --build

운영 도메인 (GPU 서버 배포 기준): https://document.hyungi.net API 문서: https://document.hyungi.net/docs

디렉토리 구조

├── app/                FastAPI 백엔드
│   ├── api/              라우터 (documents, search, briefing, digest, memos, events, study, …)
│   ├── workers/          APScheduler / queue (briefing_worker, digest_worker, classify_worker, …)
│   ├── services/         도메인 로직 (briefing/, digest/, search/, clustering_common, …)
│   ├── ai/client.py      AIClient (call_triage / call_primary / call_fallback, parse_json_response)
│   ├── prompts/          *.txt 프롬프트 (분류, 요약, briefing_comparative, digest_topic, …)
│   ├── policy/           AI envelope + prompt_render
│   └── models/           SQLAlchemy ORM
├── frontend/           SvelteKit 5 (runes mode) + Tailwind
│   └── src/routes/       /news (아침 브리핑) /library /memos /audio /video /study /digest /ask …
├── services/
│   ├── kordoc/           HWP/HWPX/PDF 파싱 (Node.js)
│   ├── ocr/              Surya OCR GPU 서비스 (FastAPI)
│   └── marker/           PDF → markdown Phase 1B
├── migrations/         255+ SQL migrations (schema_migrations 추적)
├── docs/               설계 문서
└── tests/              pytest

gpu-server/ 폴더는 v1 잔재로 deprecated (현재 AI Gateway 는 ~/home-gateway/ 별 repo).

인프라 구성 (운영 기준)

머신 역할
GPU 서버 (메인) Docker Compose (fastapi, frontend, postgres pkm, kordoc, ocr-service, marker-service, reranker(TEI), caddy), Ollama (bge-m3, 4B chat), home-gateway 별 compose
Mac mini MLX 26B primary 추론 + MLX Whisper STT (HTTP 추론 endpoint only, ingress 역할 0)
Synology NAS 파일 원본 (/volume4/Document_Server/PKM/), Synology Office/Drive/Calendar/MailPlus, NFS export → GPU
VPS-2 (OVH) 메일 relay (relay.hyungi.net:587 SASL+TLS+DKIM+LE), Gitea bare mirror, Secondary MX

상세 IP / 모델 / 컨테이너 / drift / verify 명령은 infra_inventory.md 참조.

운영 변경 정책

  1. inventory 먼저 갱신
  2. config.yaml / credentials.env 갱신
  3. deploy (commit → push Gitea → GPU git pull && docker compose up -d --build)
  4. verify (smoke endpoints, postgres count, 모니터링)

순서를 어기면 drift. drift 발견 시 infra_inventory.md 의 Drift Log 에 등록 후 정정.

문서

  • 아키텍처 — DB 스키마, AI 전략, UI 설계
  • 배포 가이드 — Docker Compose 배포
  • 개발 단계 — Phase 별 roadmap (Phase 4 Global Digest / 야간 브리핑 등 신규 phase 는 inventory + plan 파일 우선)
S
Description
No description provided
Readme 14 MiB
Languages
Python 67%
Svelte 23.1%
Swift 5.3%
TypeScript 3.2%
Shell 0.5%
Other 0.9%