# Humanize KR 웹 서비스 스펙 (Phase 5에서만 로드) Humanize Korean 파이프라인을 일반 사용자용 웹앱으로 확장할 때 아키텍트가 따르는 참조. 기본 윤문 파이프라인이 안정화된 뒤에만 읽는다. ## 목차 1. 서비스 콘셉트 2. 기술 스택 3. 아키텍처 토폴로지 4. API 스펙 5. UX 플로우 6. 데이터 모델 7. 요금·쿼터·인증 8. 배포·운영 9. 확장 로드맵 ## 1. 서비스 콘셉트 **한 줄 설명**: AI가 쓴 한글을 붙여 넣으면 "사람이 쓴 것처럼" 윤문해주는 서비스. **핵심 가치**: - **근거 제시**: 어디가 왜 AI 티인지 카테고리별 하이라이트. - **내용 불변 보증**: 사실·수치·인용이 바뀌지 않았음을 diff로 시각화. - **한국어 특화**: 번역투·영어 용어 과다 등 한글 고유 패턴에 특화. **경쟁 차별점**: - 기존 영어 중심 humanizer(QuillBot·Hix·Undetectable AI)가 한국어에 약함. - 단순 재작성이 아닌 "탐지 → 근거 → 수술적 윤문" 3단계. ## 2. 기술 스택 - **프레임워크**: Next.js 15 App Router + React Server Components. - **런타임**: Vercel Fluid Compute (기본 Node.js 24 LTS). - **AI**: Vercel AI Gateway — Claude(탐지·윤문) + GPT(교차 검증 옵션). - **스타일**: Tailwind CSS v4 + shadcn/ui + Pretendard 자동 로딩. - **상태**: useActionState + SSE 스트리밍. - **캐시**: Runtime Cache API (입력 해시 기반 결과 재활용). - **DB (옵션)**: Neon Postgres (히스토리 저장 시만). - **인증 (옵션)**: Clerk Marketplace. - **이메일 (옵션)**: Resend (가입 확인·요금제 알림). ## 3. 아키텍처 토폴로지 ``` [Browser] ↓ POST /api/humanize (stream: true) [Routing Middleware] ├─ BotID 검증 ├─ 쿼터 확인 (Runtime Cache) └─ 언어 감지 (한글 아니면 400) ↓ [Next.js App Router · Fluid Compute] ↓ [Vercel Workflow — durable orchestration] ├─ step: detect() ← AI Gateway → Claude Haiku ├─ step: rewrite() ← AI Gateway → Claude Opus ├─ step: fidelity_audit() ← AI Gateway → Claude Sonnet └─ step: review() ← AI Gateway → GPT-5 (옵션) ↓ stream SSE [Browser EventSource] ``` Workflow는 각 step 실패 시 재시도·부분 응답을 허용한다. detect 단계 완료 즉시 하이라이트가 먼저 스트리밍되어 체감 지연을 줄인다. ## 4. API 스펙 ### `POST /api/humanize` **입력:** ```json { "text": "…", "genre": "auto | column | report | blog | formal", "min_severity": "S1 | S2 | S3", "options": { "preserve_formatting": false, "cross_validate_with_gpt": false, "stream": true } } ``` **응답 (SSE):** ``` event: detection_meta data: {"detected_count":37,"score":71.5,"estimated_genre":"column"} event: detection_finding data: {"id":"f001","category":"A-2","severity":"S1","start":142,"end":153,"text_span":"데이터 분석을 통해","reason":"..."} ... event: rewrite_chunk data: {"delta":"데이터를 분석해 인사이트를 얻는다."} ... event: audit_verdict data: {"verdict":"full_pass"} event: review_verdict data: {"verdict":"accept","quality_level":"A","score_after":18.2} event: final data: {"rewrite_text":"…","summary":{...}} ``` **에러 코드:** - 400: 입력 검증 실패 (비한국어·길이 초과·빈 문자열). - 401: 인증 필요 (유료 플랜 API). - 429: 쿼터 초과. - 502: AI Gateway upstream 실패. - 504: Workflow 타임아웃. ### 개별 라우트 - `POST /api/detect` — 탐지만 (리포트 JSON 반환). - `POST /api/rewrite` — 탐지 결과를 같이 주면 윤문만. - `POST /api/review` — 윤문본을 주면 재평가만. - `GET /api/runs/:id` — 저장된 히스토리 (인증 사용자). - `DELETE /api/runs/:id` — 히스토리 삭제. ## 5. UX 플로우 ### 화면 1 — 랜딩·입력 - 좌측: 붙여넣기 textarea (최대 10,000자, 현재 글자 수 표시). - 우측: 사이드 패널 - 장르 라디오 (자동·칼럼·리포트·블로그·공적). - 엄격도 슬라이더 (S1만 / S2+ / 전체). - 옵션 토글: "영어 인용 유지", "이모지 유지" (기본 꺼짐). - 하단: "윤문하기" 1 버튼. 익명 사용자는 남은 횟수 표시. ### 화면 2 — 처리 진행 (스트리밍) - 탐지 하이라이트가 실시간으로 문서에 그려짐. - 우측 사이드: 카테고리별 카운트 막대 그래프. - 윤문 시작되면 하단 영역에 토큰 스트림. ### 화면 3 — 좌우 diff 뷰 - 좌: 원문 + 카테고리 하이라이트. - 우: 윤문본 + 변경 영역 강조. - 상단 배지: `변경률 18% · S1 0 잔존 · 점수 71.5 → 18.2 · 등급 A`. - 우측 패널: 주요 변경 3~5건 (before/after 카드). ### 화면 4 — 완료·액션 - "윤문본 복사" / ".md 다운로드" / "2차 윤문" / "피드백 보내기" 버튼. - 하단 보증 문구: "내용은 수정되지 않았습니다. 사실·수치·인용은 원문과 동일합니다." ### 화면 5 — 히스토리 (인증 사용자) - 최근 50건의 run 목록. - 각 run 카드에 입력 시각·길이·점수 개선·등급. - 개별 클릭 시 화면 3(diff 뷰) 재현. ## 6. 데이터 모델 (Neon Postgres 옵션) ### 테이블 **users** (Clerk 연동) - `id` (Clerk user_id 매핑) - `plan` (anonymous / free / pro) - `quota_daily` (integer) - `created_at` **humanize_runs** - `id` (uuid) - `user_id` (nullable, 익명 허용) - `input_hash` (sha256, 중복 탐지용) - `input_length` - `estimated_genre` - `score_before`, `score_after` - `change_rate` - `quality_level` (A/B/C/D) - `created_at` - `retain_content` (bool — 사용자가 본문 저장 동의했는지) **run_contents** (retain_content = true 일 때만) - `run_id` - `input_text`, `rewrite_text` - `detection_json`, `diff_json` - `expires_at` (30일 후 자동 삭제) **feedback** - `run_id`, `user_id`, `type` (over_polish / under_polish / wrong_category / other), `comment`, `created_at` ## 7. 요금·쿼터·인증 | 플랜 | 가격 | 일 쿼터 | 글자 한도 | API | |------|------|---------|----------|-----| | Anonymous | 무료 | 5회 | 3,000자 | ✕ | | Free (로그인) | 무료 | 30회 | 5,000자 | ✕ | | Pro | $9/월 | 300회 | 10,000자 | ✓ (API 키 발급) | | Team | $29/월 | 1,500회 | 20,000자 | ✓ + 웹훅 | **BotID 검증**을 통해 익명 쿼터 남용을 차단. 쿼터는 Runtime Cache(IP + user hash)로 관리. ## 8. 배포·운영 - **환경**: `vercel.ts`로 설정 (vercel.json 사용 안 함). - **환경변수**: - `AI_GATEWAY_API_KEY` - `DATABASE_URL` (Neon) - `CLERK_SECRET_KEY` (옵션) - `RESEND_API_KEY` (옵션) - **Cron** (옵션): 일 1회 오래된 히스토리 정리 (`/api/cron/cleanup`). - **모니터링**: Vercel Analytics + AI Gateway observability 대시보드. - **Rolling Releases**로 신규 프롬프트 버전 점진 롤아웃. ## 9. 확장 로드맵 | 단계 | 내용 | |------|------| | **v0 MVP** | 익명·단일 호출·결과 저장 안 함. Phase 3까지만 (탐지+윤문+단일 검증) | | **v1** | Clerk 로그인·히스토리·장르 프리셋·교차 검증 옵션 | | **v2** | Pro/Team 플랜·API 키·웹훅·팀 계정 | | **v3** | Chrome Extension — 선택 영역 즉석 윤문·Google Docs 플러그인 | | **v4** | 한국어 외 일본어·중국어로 확장 (언어별 taxonomy 분리) | ## 10. 리스크 & 완화 - **악용(AI Detector 우회)**: 학계·저널리즘 맥락에서 논란. 서비스 설명에 "진실성 보증 도구 아님" 명시, 학술 제출용 사용을 약관에서 제한. - **저작권**: 입력 본문 저장 기본 OFF. 저장 시 TTL 30일. - **오탐·과윤문**: 등급 C/D일 때 "사람 검토 권고" 안내, 결과를 자동 게시하지 않음. - **프롬프트 주입**: 입력을 역할·시스템 프롬프트로 해석하지 않도록 격리. Claude·GPT 모두 user 메시지 슬롯에서만 처리.