Claude CLI와 Python을 활용한 무료 자율 콘텐츠 파이프라인 구축 (최대 계획, 토큰당 비용 0원)
요약
Anthropic Max plan의 Claude CLI를 활용하여 추가 비용 없이 자율적인 콘텐츠 생성 파이프라인을 구축하는 방법을 소개합니다. Python의 subprocess를 이용해 CLI를 호출하고, 품질 검증을 위한 '판사(Judge)' 단계를 포함하여 안정적인 자동화 워크플로우를 구현합니다.
핵심 포인트
- API 대신 Claude CLI를 사용하여 토큰당 비용을 0원으로 절감
- Python subprocess를 활용한 비대화형 CLI 호출 방식
- 호출당 하나의 책임(One responsibility per call) 원칙 적용
- 모델을 활용한 품질 게이트(Quality Gate) 구축으로 출력물 검증
- cron 또는 작업 스케줄러를 이용한 경량화된 실행 구조
저는 제가 손대지 않아도 매일 아침 기사 초안을 작성하는 작은 콘텐츠 파이프라인을 운영하고 있습니다. 흥미로운 점은 자동화 그 자체가 아니라, 이미 지불하고 있는 구독료 외에는 비용이 전혀 들지 않는다는 것입니다. 짜증 나는 부분들을 포함하여 이것이 실제로 어떻게 작동하는지 설명하겠습니다.
비용 절감 비결: API 대신 CLI 사용
Anthropic API는 토큰(token)당 비용을 청구합니다. 하루에 여러 개의 긴 초안을 생성하는 파이프라인의 경우, 비용이 빠르게 쌓여 루프를 돌 때마다 불안해질 수 있습니다. Max plan에서의 Claude CLI는 다릅니다. 이는 고정된 월간 구독 방식입니다. 토큰 미터를 확인하지 않고도 속도 제한(rate limits)이 허용하는 한 얼마든지 호출할 수 있습니다.
따라서 핵심 아이디어는 간단합니다. import anthropic과 API 키를 사용하는 대신, claude 명령어를 셸(shell)로 호출하고 표준 출력(stdout)을 캡처하는 것입니다. 동일한 모델을 사용하면서도 토큰당 비용 계산을 하지 않습니다.
import subprocess
def claude(prompt: str, timeout: int = 300) -> str:
...
claude -p는 비대화형(non-interactively)으로 실행됩니다. 프롬프트(prompt)를 입력받아 답변을 출력하고 종료됩니다. 이 단일 함수가 Python과 모델 사이의 전체 가교 역할을 합니다.
파이프라인 구조화
저는 오케스트레이션(orchestration)을 일반 Python으로 유지하는데, 이는 디버깅이 쉽고 별도의 프레임워크가 필요 없기 때문입니다. 각 채널(블로그 포스트, 요약, 태그)은 프롬프트를 생성하고 claude()를 호출하는 단순한 함수일 뿐입니다.
def generate_post(topic: str) -> dict:
body = claude(f"Write a 700-word dev article about: {topic}. "
"Return Markdown only.")
...
중요한 패턴은 **호출당 하나의 책임(one responsibility per call)**을 갖는 것입니다. 단일 프롬프트에서 기사, 제목, 태그를 모두 요청하면 검증하기 어려운 뒤엉킨 덩어리가 생성됩니다. 별도의 호출은 속도는 느리지만, 각 출력물은 매우 쉽게 확인할 수 있습니다.
품질 게이트 (이 부분이 중요합니다)
자율 생성(Autonomous generation)은 표류하기 마련입니다. 제가 겪은 가장 흔한 실패 사례는 제목은 무언가를 약속하는데 본문은 다른 내용을 전달하는 것이었습니다. 따라서 무엇인가가 저장되기 전에, 두 번째 호출이 판사 역할을 수행합니다:
def passes_gate(title: str, body: str) -> bool:
verdict = claude(
f"Does this body match its title? Title: {title}\n\n"
...
만약 검증에 실패하면, 해당 항목은 폐기되고 로그에 기록되며 — 절대 게시되지 않습니다. 모델을 사용하여 자신의 출력을 검사하는 것이 완벽하지는 않지만, 명백한 이탈(drift)을 저렴한 비용으로 잡아낼 수 있으며, Max 플랜(Max plan)에서는 추가 검증 호출을 실행하더라도 추가 비용이 들지 않습니다.
매일 아침 실행하기
Windows에서는 작업 스케줄러(Task Scheduler)를 사용하고, Linux에서는 cron을 사용합니다. 스크립트는 초안을 폴더에 작성하고, 로그에 한 줄을 추가한 뒤 종료됩니다. 데몬(daemon)이나 항상 켜져 있는 봇이 아닙니다. 실행되고 종료되는 단일 프로세스는 수명이 긴 서비스(long-lived service)보다 훨씬 다루기 쉽습니다.
# crontab: 매일 07:00
0 7 * * * /usr/bin/python3 /home/me/pipeline/run.py >> /home/me/pipeline/run.log 2>&1
타임스탬프와 함께 실행당 하나의 로그를 유지하세요. 어느 날 아침에 쓰레기 같은 결과물이 생성된다면, 로그만이 모델, 프롬프트(prompt), 또는 게이트(gate) 중 무엇이 잘못되었는지 알려주는 유일한 수단이 됩니다.
솔직한 한계점
- 게시가 아닌 초안 작성. 생성과 게이트 검증은 맡기지만, 플랫폼에 최종 게시하는 단계는 수동 또는 반자동 상태로 유지합니다. 소중한 계정에 완전히 자동화된 게시를 수행하는 것은 계정 정지(ban) 및 당혹스러운 실수의 위험이 있으며, 그럴 가치가 없습니다.
- 속도 제한(Rate limits)은 실재합니다. Max 플랜은 관대하지만, 루프를 너무 타이트하게 돌리면 제한에 걸릴 수 있습니다. 지수 백오프(backoff)를 포함한 재시도 로직을 추가하고 실행당 항목 수를 제한하세요.
- 구독 약관. 스크립트에서 CLI를 구동할 때는 Anthropic의 이용 정책과 속도 제한을 준수해야 합니다. 이는 개인적인 자동화를 위한 것이지, 생성물을 재판매하기 위한 것이 아닙니다.
- 품질은 "훌륭한 첫 번째 초안"이지 "즉시 배포" 수준이 아닙니다. 게이트는 명백한 실패를 제거할 뿐, 글을 진정으로 좋게 만들지는 않습니다. 여전히 사람이 편집해야 합니다.
요점
전체 파이프라인은 세 가지 요소로 구성됩니다: claude -p를 감싸는 subprocess 래퍼 (wrapper), 작고 단일 목적을 가진 생성 함수들, 그리고 무언가가 저장되기 전에 실행되는 모델 기반 판사 (model-as-judge) 게이트이며, 이는 스케줄러 (scheduler)에 의해 하루에 한 번 실행됩니다. Max 플랜은 "추가 호출마다 비용이 발생한다"는 상황을 "호출이 사실상 무료다"라는 상황으로 바꾸어 놓으며, 이는 설계 방식 자체를 변화시킵니다. 즉, 검증 단계 (verification passes), 재시도 (retries), 그리고 일회용 초안 (throwaway drafts)을 마음껏 사용할 수 있게 됩니다. 하나의 채널로 시작하여 모든 것을 기록하고, 출력물을 신뢰할 수 있을 때까지 게시 (publish) 단계는 사람이 직접 수행하십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기