AI 뉴스 사이트를 운영하면서 매일 반복되는 콘텐츠 생성 작업을 완전히 자동화했다. Claude API와 shell script 하나로 뉴스 수집부터 마크다운 생성, 파일명 정리까지 원클릭으로 처리하는 시스템을 만든 과정을 정리한다.
배경: 무엇을 만들고 있는가
jidonglab.com은 AI 관련 뉴스와 개발 인사이트를 다루는 기술 블로그다. 매일 4-5개의 AI 뉴스를 한국어와 영어로 발행하는데, 기존에는 수동으로 각 뉴스를 작성하고 파일명을 정하고 메타데이터를 입력하는 작업이 시간을 많이 잡아먹었다.
이번 작업의 목표는 간단했다. "2026-03-14 AI 뉴스 4건 생성해줘"라고 명령 한 번으로 완성된 마크다운 파일 4개가 나오는 시스템을 만드는 것이다. 단순히 ChatGPT에 물어보는 수준이 아니라, 프로덕션에서 바로 쓸 수 있는 품질의 콘텐츠가 나와야 했다.
Claude API로 구조화된 콘텐츠 생성하기
AI 뉴스 자동 생성에서 가장 까다로운 부분은 일관된 품질과 형식을 보장하는 것이다. GPT-4나 Gemini 대신 Claude를 선택한 이유는 긴 컨텍스트 처리와 정확한 instruction following 때문이다.
효과적인 뉴스 생성 프롬프트 패턴
일반적인 "뉴스 써줘" 프롬프트는 쓸 수 없는 결과를 만든다. 실제 운영에서 검증한 프롬프트는 이렇다:
"2026-03-14 AI 뉴스 4건을 한국어로 작성해줘. 각 뉴스는:
- 제목: 40-60자 사이, 클릭을 유도하되 과장하지 마
- 본문: 3-4문단, 첫 문단은 핵심 요약, 마지막은 전망/의미
- 태그: ['AI', 'News'] 필수 + 관련 기업/기술명 2-3개
- 파일명: 날짜-핵심키워드-2-3단어.md 형식
다루지 말 것: 루머, 추측성 기사, 주식 관련 내용
중점: 기술적 진전, 정책 변화, 제품 출시, 연구 결과"
이 프롬프트의 핵심은 제약 조건을 명확히 한다는 점이다. "좋은 뉴스 써줘"가 아니라 글자 수, 구조, 피해야 할 주제까지 구체적으로 명시했다.
실패하는 프롬프트와 비교해보면:
"AI 관련 최신 뉴스 몇 개 써줘"
이렇게 쓰면 길이도 제각각이고, 마크다운 frontmatter도 누락되고, 파일명도 일관성이 없다.
shell script로 워크플로우 통합하기
generate-ai-news.sh 스크립트는 단순한 API 호출이 아니다. 전체 콘텐츠 생성 파이프라인을 orchestrate한다:
#!/bin/bash
DATE=${1:-$(date +%Y-%m-%d)}
COUNT=${2:-4}
LANG=${3:-ko}
# Claude API 호출
response=$(curl -s -X POST https://api.anthropic.com/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
--data "{
\"model\": \"claude-3-sonnet-20240229\",
\"max_tokens\": 4000,
\"messages\": [{
\"role\": \"user\",
\"content\": \"$PROMPT\"
}]
}")
# JSON 파싱 후 파일 생성
echo "$response" | jq -r '.content[0].text' | \
split_and_save_files "$DATE"
여기서 중요한 부분은 split_and_save_files 함수다. Claude가 4개 뉴스를 하나의 응답으로 주면, 이를 파싱해서 각각 별도 파일로 저장한다. 파일명도 본문에서 추출한 키워드를 기반으로 자동 생성한다.
멀티언어 콘텐츠 동시 생성
한국어와 영어 뉴스를 동시에 처리하는 전략도 중요하다. 각각 따로 API를 호출하는 대신, 하나의 요청에 두 언어를 포함시켰다:
"다음 4개 뉴스에 대해 한국어와 영어 버전을 모두 작성해줘.
단순 번역이 아니라 각 언어권 독자에게 맞는 톤과 예시를 사용해.출력 형식:
뉴스 1 (한국어)
[마크다운 내용]
News 1 (English)
[markdown content]"
이렇게 하면 API 비용도 절약하고, 두 언어 간 일관성도 보장된다. 번역 품질도 단순 translate보다 훨씬 자연스럽다.
Claude Code와 MCP로 파일 관리 자동화
뉴스 파일이 생성되면 기존 블로그 포스트들의 메타데이터도 업데이트해야 한다. 여기서 Claude Code의 MCP(Model Context Protocol) 기능이 빛을 발한다.
파일 시스템 접근 권한 설정
.claude/claude_desktop_config.json에서 파일 시스템 MCP 서버를 활성화했다:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem"],
"env": {
"ALLOWED_DIRECTORIES": ["/Users/jidong/projects/jidonglab.com/src/content"]
}
}
}
}
이제 Claude가 직접 콘텐츠 디렉토리에 접근해서 파일을 읽고 쓸 수 있다. 매번 파일 내용을 복붙할 필요가 없다.
배치 작업을 위한 프롬프팅
20개 블로그 포스트의 메타데이터를 일괄 수정하는 작업이 있었다. 이때 사용한 프롬프트:
"src/content/blog/ 디렉토리의 모든 .md 파일에서:
- frontmatter의
publishedDate필드를publishDate로 변경tags배열에서 중복 제거description이 150자 넘으면 요약파일 하나씩 처리하지 말고, 변경사항을 한 번에 보여준 다음 내가 확인하면 일괄 적용해."
이 방식의 장점은 AI가 실수할 가능성을 줄인다는 것이다. 20개 파일을 한번에 바꾸는 대신, 변경 계획을 먼저 검토할 수 있다.
git hooks와 연동
scripts/generate-ai-news.sh는 단순히 파일을 만들고 끝나지 않는다. 생성된 파일들을 자동으로 git에 커밋하고 배포까지 트리거한다:
# 파일 생성 후
git add src/content/ai-news/
git commit -m "feat: AI news $DATE ($COUNT posts, $LANG)"
# 배포 확인
if [[ "$DEPLOY" == "true" ]]; then
npm run build && npm run deploy
fi
pre-commit hook에서는 생성된 마크다운이 lint 규칙을 통과하는지 검증한다. AI가 만든 콘텐츠라도 사람이 작성한 것과 같은 품질 기준을 적용한다.
콘텐츠 품질 제어를 위한 validation 전략
AI 생성 콘텐츠의 가장 큰 문제는 일관성 없는 품질이다. 좋은 글과 엉성한 글이 섞여 나온다. 이를 해결하기 위한 몇 가지 패턴을 적용했다.
품질 체크리스트를 프롬프트에 포함
뉴스 생성 프롬프트에 자체 검증 단계를 추가했다:
"각 뉴스 작성 후 다음을 확인해:
- 제목이 내용과 일치하는가?
- 첫 문장에 핵심 내용이 들어있는가?
- 출처나 날짜 정보가 정확한가?
- 기술 용어 설명이 충분한가?
기준에 맞지 않으면 수정 후 최종본을 제출해."
이렇게 하면 Claude가 자체적으로 품질을 검토하고 개선한 버전을 준다. 한 번에 완벽한 결과를 얻기는 어렵지만, 명백한 오류나 부족한 부분은 많이 줄어든다.
템플릿 기반 구조화
자유 형식 글쓰기 대신 정해진 템플릿을 따르도록 했다:
---
title: "제목 (40-60자)"
description: "요약 (100-150자)"
publishDate: "YYYY-MM-DD"
tags: ["AI", "News", "키워드1", "키워드2"]
---
## 핵심 요약 (2-3문장)
## 주요 내용
- 구체적 사실 1
- 구체적 사실 2
- 구체적 사실 3
## 업계 영향
## 관련 링크
템플릿을 강제하면 AI가 빠뜨리는 부분을 줄일 수 있다. 또한 사람이 나중에 편집할 때도 어디를 고쳐야 할지 명확하다.
중복 제거와 키워드 관리
같은 뉴스를 다른 관점에서 중복 작성하는 문제도 있었다. 이를 해결하기 위해 최근 30일간 발행한 뉴스의 제목과 키워드를 프롬프트에 포함시켰다:
"최근 다룬 주제들: Anthropic Claude, NVIDIA H100, OpenAI GPT-5, Google Gemini...
이미 다룬 내용과 중복되지 않는 새로운 뉴스를 찾아서 작성해."
컨텍스트 길이 제한 때문에 전체 기사를 포함할 수는 없지만, 키워드와 요약 정도는 충분히 들어간다.
더 나은 방법은 없을까
현재 시스템은 작동하지만 개선할 부분들이 보인다.
RSS 피드 연동 자동화
지금은 수동으로 "오늘 뉴스 4건"이라고 요청하지만, RSS 피드를 모니터링해서 자동으로 새 소식을 감지하는 방식이 더 좋을 것이다. Anthropic의 새로운 MCP 서버 중 web scraping 관련 기능을 쓰면 구현 가능하다.
벡터 DB를 활용한 중복 감지
현재는 키워드 기반으로 중복을 피하지만, 의미적 유사도를 계산하는 방식이 더 정확하다. 생성된 뉴스를 embedding해서 기존 콘텐츠와 cosine similarity를 계산하면, 다른 키워드지만 비슷한 내용인 경우도 잡아낼 수 있다.
Claude 3.5 Sonnet의 tool use 활용
현재는 shell script에서 API를 직접 호출하지만, Claude의 tool use 기능으로 파일 생성, git 커밋, 배포까지 하나의 대화에서 처리할 수 있다. 특히 에러가 발생했을 때 AI가 스스로 디버깅하고 재시도하는 패턴을 구현하면 더 robust한 시스템이 될 것이다.
사용자 피드백 루프 구축
생성된 뉴스의 조회수, 체류 시간, 공유 횟수 등 지표를 Claude에게 피드백으로 주면 점점 더 나은 콘텐츠를 만들 수 있다. Google Analytics API와 연동해서 "지난주 가장 인기 있던 뉴스 스타일로 써줘" 같은 요청이 가능하다.
정리
- 구체적 제약 조건이 포함된 프롬프트가 일관된 품질을 보장한다
- MCP를 통한 파일 시스템 접근으로 Claude가 직접 콘텐츠를 관리할 수 있다
- 템플릿 기반 구조화가 자유 형식 글쓰기보다 안정적이다
- 워크플로우 전체를 자동화하면 사람의 개입 없이도 프로덕션 품질 콘텐츠가 나온다
이번 작업의 커밋 로그
a00b3bf — feat: AI news 2026-03-14 (4 posts, en)
069ca0d — feat: AI 뉴스 CLI 생성 스크립트 + 2026-03-14 뉴스 4건
6788360 — feat: AI 뉴스 자동 생성 (2026-03-14)
Top comments (0)