[블로그 톤 기반 리뷰 생성 도구] 사이드프로젝트 시작! PRD 작성하기
사이드프로젝트를 진행 일지, 첫번째 페이지 입니다. ✨
내 블로그 톤을 분석하여 짧은 글을 작성하거나 몇가지 입력사항을 작성하면 퀄리티 높게 만들어주는 도구를 만들어보자.
사이드 프로젝트를 시작하게 된 계기
시작하게 된 계기는 단순합니다.
저는 기술블로그 뿐만 아니라 맛집을 돌아다니거나 제품 후기를 작성해주는 네이버 블로그에도 글을 작성하고 있었어요.
그런데, 글을 작성할수록 조회수에 대한 욕심(?)도 많아지고 어휘력이 부족하여 저의 생생한 후기를 남기기에도 뭔가 아쉬운 느낌이 들고 …
그리고 이걸 사이트를 만들어보자. 라고 크게 결심한 계기는 글을 작성하는데에만 1시간이 넘게 소요된다는 점 이였습니다.
AI 에게 나의 말투를 학습시켜 “이 리뷰를 좀 더 퀄리티 높게 다듬어줘.” 라고 지시를 내릴수도 있지만, 저는 저만의 서비스를 하나 만들어보고 싶었어요.
그러다가 점점 저 스스로도 감당할 수 없는 규모가 되어가고있어서 리프레시겸 나의 프로젝트는 어디까지 진행이 되었는가에 대해 한번 정리가 필요할것 같아 아직 완성되지 않았지만 글을 먼저 작성해봅니다.
해당 프로젝트의 PRD
PRD – 블로그 톤 기반 리뷰 자동 생성 도구 (로컬 버전)
“내 말투 그대로, 하지만 더 정확하게.”
내 블로그의 톤과 분위기를 AI가 학습하고, 외부 검색(RAG) 을 통해 실제 정보를 수집하여 고품질 리뷰를 생성하는 로컬 웹 도구입니다.
1. 핵심 가치 제안 (Core Value)
‘할루시네이션(거짓 정보) 제거’ 와 ‘초개인화’
| 가치 | 설명 | 기술적 구현 |
|---|---|---|
| 초개인화 문체 | 단순 흉내를 넘어, 실제 과거 글을 예시로 사용하여 미세한 어투까지 재현 | Few-shot Learning (샘플 데이터 추출) |
| 사실 기반 (RAG) | 불확실한 정보를 제거하기 위해 메뉴, 가격 등 실시간 정보 반영 | Tavily Search API 연동 |
| 데이터 프라이버시 | 내 글과 분석 데이터가 외부 서버가 아닌 내 컴퓨터에만 저장됨 | Local File System 저장 |
| 원클릭 자동화 | RSS 링크만 있으면 데이터 구축부터 1500자 글 완성까지 자동화 | Node.js Crawler + Claude API |
2. 데이터 흐름 (System Architecture)
전체 시스템은 크게 데이터 구축(Data Build) 단계와 리뷰 생성(Generation) 단계로 나뉩니다.
A. 데이터 구축 단계 (1회성)
RSS를 통해 블로그 데이터를 수집하고,
이를 분석용과 따라하기용(샘플) 으로 이원화하여 저장합니다.
B. 리뷰 생성 단계 (매회 실행)
사용자 입력과 검색 결과(Fact), 그리고 내 말투(Style)를 조합하여 최종 글을 완성합니다.
3. 상세 기능 요구사항
3.1 블로그 스타일 데이터 구축
초기 설정 단계로, 사용자의 블로그 아이덴티티를 추출합니다.
- 입력: 네이버 블로그 RSS 링크, 크롤링 할 글 개수
- 핵심 로직 (데이터 이원화):
mergedText: 스타일 분석을 위해 모든 텍스트를 하나로 합침.samples: 실제 글 작성 시 “참고 자료”로 쓰기 위해 개별 글을 배열로 저장.
- 출력:
/data/styles/my-style.json(분석 리포트)
3.2 사실 기반 리뷰 생성 (RAG)
- Logic Upgrade: 기존의 창작 의존 방식을 버리고 검색 기반 생성으로 변경.
- Process:
- Search:
"{위치} {가게명} 메뉴 가격 후기"쿼리로 Tavily API 검색. - Few-shot: 로컬 샘플 데이터 중 랜덤 3개를 뽑아 프롬프트에
Example로 주입. - Generate: Claude Haiku가 사실 정보(Context)를 내 말투(Style + Example)로 재구성.
- Search:
4. 기술 구조 (Tech Stack)
개발 환경
- Framework: Next.js 14+ (App Router)
- Styling: TailwindCSS
- Backend: Next.js API Routes
AI & Data Pipeline
| 구분 | 기술 스택 | 역할 |
|---|---|---|
| Crawler | axios + cheerio | 네이버 블로그 본문 정제 및 파싱 |
| Search | Tavily AI API | 실시간 웹 검색 및 핵심 컨텍스트 추출 |
| Analysis Model | Claude 3.5 Sonnet | 고성능 문체/스타일 분석 |
| Generation Model | Claude 3.5 Haiku | 고속/저비용 리뷰 생성 |
폴더 구조
blog-review-tool/
├── app/
│ ├── api/
│ │ ├── fetch-rss/ # RSS 크롤링 및 데이터 이원화
│ │ ├── analyze-style/ # 스타일 프로필 생성
│ │ └── generate-review/ # RAG + Few-shot 리뷰 생성
│ └── ...
├── lib/
│ ├── claude.ts # Anthropic API 클라이언트
│ ├── rss-crawler.ts # 크롤링 로직 (Merged + Samples)
│ ├── search.ts # [New] Tavily 검색 유틸
│ └── prompts.ts # 프롬프트 템플릿
└── data/ (git ignore)
├── styles/ # my-style.json
├── rss-content/ # blog-posts.txt, blog-samples.json
└── reviews/ # 결과물 저장5. API 명세
5.1 RSS 데이터 수집 및 구축
블로그 RSS를 크롤링하여 분석용 텍스트와 Few-shot 샘플 데이터를 동시에 로컬에 구축합니다.
Endpoint
POST /api/fetch-rssRequest Body
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| rssUrl | string | ✅ | 네이버 블로그 RSS 주소 |
| count | number | ✅ | 크롤링 할 최신 글 개수 (기본값: 5) |
Process Flow
- Fetch: RSS 피드를 파싱하여 글 링크 목록 추출
- Crawl: 각 글의 본문 HTML을 가져와 정제 (Text Only)
- Split & Save:
- blog-posts.txt: 스타일 분석을 위해 전체 텍스트 병합 저장
- blog-samples.json: 리뷰 생성 시 참고할 개별 샘플 배열 저장
5.2 리뷰 생성 (RAG + Style)
수집된 스타일과 외부 검색 정보를 결합하여 최종 리뷰를 생성합니다.
Endpoint
POST /api/generate-reviewRequest Body
| 파라미터 | 타입 | 설명 |
|---|---|---|
| storeName | string | 가게 이름 (예: 스타벅스 강남점) |
| location | string | 가게 위치 (예: 강남역) |
| pros | string[] | 사용자가 느낀 장점 키워드 |
| cons | string[] | 사용자가 느낀 단점 키워드 |
| extras | string | (선택) 추가적으로 반영할 자유 텍스트 |
Internal Logic
이것이 첫번째 PRD 그러나 …?
짬짬히 시간 될때마다 작업을 진행하여 API 연결 및 구현까지 10일정도 소요된 것 같아요.
그러나 프롬프트 엔지니어링의 실력이 부족한 탓인지 아직 퀄리티가 높은 리뷰로는 나오지 않고있습니다.
아쉬움이 가득한 첫번째 작업이였어요. 식견이 좁아서 그런지 다양한 도구들을 활용을 못하는것 같습니다.
크롤링이 아니라 네이버 블로그에서 제공해주는 블로그 데이터 내보내기를 통해 좀 더 정확한 나의 글을 주는 방향으로 진행하는 방향으로 조금 생각을 전환하고 있어요.
점점 규모가 커지다보니(?) 코드 퀄리티도 신경을 못쓰는것 같아 찝찝하기도 하고…
UI도 나쁘지 않지만 좀 더 UX를 생각해서 꾸미고싶은데 아직 갈 길이 한참 멀었네요.
첫번째 예시 사이트 입니다. 아직은 부끄러운 결과물 이에요.
