Wenlan
Wenlan is a source-backed AI knowledge base and LLM wiki for AI work: organize documents and decisions into pages you can find, inspect, and review.
翻訳待ち
Loading the full README. The saved excerpt is shown below.
이력서 PDF 하나 던지는 대신, 나와 대화할 수 있는 링크를 내보세요. 이력서를 입력하면 그 내용만 근거로 답하는 AI 클론 이 만들어지고, /@슬러그 주소 하나로 웹 이력서 + 실시간 채팅 을 공유합니다. 데모는 로그인 없이 볼 수 있습니다. @kimdev는 코드에 넣어 둔 가상의 프론트엔드 개발자 "김개발" 이고, 실제 사용자 데이터는 노출되지 않습니다. PDF 이력서는 끝까지 읽히기 어렵고, 웹 포트폴리오는 정적이라 "이 사람한테 직접 물어보고 싶은 것" 을 확인할 방법이 없습니다. CloneCV는 이력서에 있는 사실만 근거로 1인칭으로 답하는 AI를 붙여, 면접관의 경험을 읽기 → 대화로 바꾸는 실험입니다. 핵심 과제는 "그럴듯하게 말하는 챗봇"이 아니라 이력서에 없는 말을 지어내지 않는 챗봇을 만드는 것이었습니다. • 웹 이력서 열람(데스크톱 섹션 내비게이션, 모바일 대응) + 포트폴리오 이미지 · PDF · 영상 • AI 채팅 — 스트리밍 답변, 이력서에 근거가 있는 추천 질문 3개, 답하기 어려우면 직접 문의 폼 • 카카오톡 · X · 링크 공유Read the full README ↗
데모는 로그인 없이 볼 수 있습니다.
@kimdev는 코드에 넣어 둔 가상의 프론트엔드 개발자 "김개발" 이고, 실제 사용자 데이터는 노출되지 않습니다.
| 기간 | 2026.07 ~ 2026.09 (진행 중) |
| 인원 | 1인 개발 — 기획 · 설계 · 프론트엔드 · 백엔드 · DB · 배포 |
| 개발 방식 | 요구사항 → 기능 명세 → 아키텍처 문서를 먼저 쓰고, AI 페어 프로그래밍(Cursor → Claude Code)으로 구현 |
| 주요 기술 | Next.js 16 · React 19 · TypeScript · Supabase(Postgres, RLS, pgvector) · Gemini · Upstash Redis |
| 규모 | 기능 명세 F-01 ~ F-33 · DB 마이그레이션 26개 · 단위 테스트 213개 · Playwright E2E 4종 |
| 운영 비용 | Gemini · Upstash · Supabase 무료 티어 안에서 운영 |
PDF 이력서는 끝까지 읽히기 어렵고, 웹 포트폴리오는 정적이라 "이 사람한테 직접 물어보고 싶은 것" 을 확인할 방법이 없습니다. CloneCV는 이력서에 있는 사실만 근거로 1인칭으로 답하는 AI를 붙여, 면접관의 경험을 읽기 → 대화로 바꾸는 실험입니다. 핵심 과제는 "그럴듯하게 말하는 챗봇"이 아니라 이력서에 없는 말을 지어내지 않는 챗봇을 만드는 것이었습니다.
면접관(방문자) — 로그인 없이 /@슬러그
지원자(소유자)
/@my-name 형태의 고유 주소/dashboard/edit) — 10개 섹션, 사이드바에서 순서 변경·섹션 on/off
published 상태로 전환/dashboard)
/dashboard 디자인 탭)
/@슬러그 접속 — 로그인 없음@kimdevflowchart LR
V["면접관<br/>/@slug"] --> PX
O["지원자<br/>/dashboard"] --> PX
subgraph VC["Vercel · Next.js 16 App Router"]
PX["proxy.ts<br/>/@slug → /[id] rewrite<br/>세션 갱신 · 관리자 확인"]
RSC["Server Components<br/>공개 프로필 · 대시보드"]
API["Route Handlers<br/>/api/chat · /api/prompt/generate<br/>/api/resume/import-pdf · export-pdf"]
end
PX --> RSC
PX --> API
subgraph SB["Supabase"]
AUTH["Auth<br/>이메일 · Google OAuth"]
DB[("Postgres + RLS<br/>pgvector")]
ST["Storage<br/>사진 · 포트폴리오"]
end
RSC --> DB
API --> AUTH
API --> DB
API --> ST
API --> GM["Google Gemini<br/>채팅 스트리밍 · PDF 추출 · 임베딩"]
API --> RD["Upstash Redis<br/>레이트리밋"]
발행 시점에 무거운 일을 끝내 둡니다. 소유자가 발행하면 /api/prompt/generate가 한 번에 처리합니다.
system_prompts.coverage(jsonb)에 저장합니다.gemini-embedding-001(768차원)로 pgvector 색인을 만듭니다.덕분에 채팅 요청 경로에서는 추가 계산이나 DB 조회 없이 저장된 결과만 읽습니다.
lib/chat/handle-chat-request.ts)sequenceDiagram
autonumber
participant B as 방문자 브라우저
participant C as /api/chat
participant R as Upstash
participant D as Supabase
participant G as Gemini
B->>C: 질문 (500자 이하)
C->>R: 레이트리밋 (분당 5 · 일 50)
C->>D: 시스템 프롬프트 + coverage, FAQ, RAG 청크 병렬 조회
Note over C: FAQ와 맞으면 준비된 답변 블록 주입<br/>아니면 관련 청크 focus 블록 (플래그 on일 때)
C->>G: 스트리밍 생성 (실패 시 다음 모델로 폴백)
G-->>B: SSE로 토큰 전달
Note over C: 민감정보 필터 → 거절 답변인지 판정
alt 답변 성공
C->>G: 꼬리질문 생성
Note over C: coverage로 검증하고<br/>부족하면 답변 가능한 질문으로 채움
else 거절
C-->>B: 직접 문의 폼 제안 (2차 호출 생략)
end
C->>D: chat_messages 기록 (answer_status · 모델 · 토큰)
C-->>B: 다음 추천 질문 3개
RAG_RETRIEVAL_ENABLED 플래그로 제어 (기본 off = 전체 컨텍스트 방식, 색인은 항상 수행)GEMINI_MODELS 체인의 다음 모델로 재시도인사말은 짧게 고정되어 있습니다.
안녕하세요, {이름}의 AI 챗봇입니다! 궁금하신 점이 있으시면 편하게 물어보세요.
This is the beginning of the README. Read the rest at the original. Read the full README ↗