AI PROMPTS · 루프 생성 전략
Python 자동화 생성 스크립트
직접 실행 가능한 완전한 Python 자동화 스크립트입니다. 재시도, 검증, 저장을 포함합니다.
루프 생성 전략
핵심 설명
직접 실행 가능한 완전한 Python 자동화 스크립트입니다. 재시도, 검증, 저장을 포함합니다.
Python 3.11+
#!/usr/bin/env python3
"""
pullh 데이터 자동 생성기
사용법: python generate.py --lang kotlin --start 33 --end 82 --provider anthropic
"""
import anthropic
import argparse
import json
import os
import time
from pathlib import Path
# ── 설정 ──────────────────────────────────────────
SYSTEM_PROMPT = """당신은 {lang} 전문 개발자이자 기술 강사입니다.
주어진 스키마에 정확히 맞는 JSON을 반환합니다.
코드는 실제 동작하며, 설명은 한국어로 작성합니다.
응답은 JSON만 반환하고 마크다운 코드 블록은 사용하지 마세요."""
def make_prompt(lang: str, num: int, existing_ids: list[str]) -> str:
prefix_map = {'kotlin':'k','python':'p','go':'g','java':'j'}
prefix = prefix_map[lang]
padded = f"{num:03d}"
cat_hint = suggest_category(num)
diff_hint = suggest_difficulty(num)
return f"""
언어: {lang.upper()}
번호: {num} (ID: {prefix}-{padded})
카테고리 힌트: {cat_hint}
난이도 힌트: {diff_hint}
기존 ID들(중복 금지): {existing_ids[-10:]}
다음 JSON 스키마에 맞춰 {lang} 학습 항목 1개를 생성하세요:
{{
"id": "{prefix}-{padded}",
"cat": "{cat_hint}",
"diff": "{diff_hint}",
"title": "항목 제목 (한국어, 30자 이내)",
"desc": "HTML 허용. 핵심 개념 2-3문장 설명.",
"code": "실제 동작하는 {lang} 코드. HTML span 태그로 문법 강조.",
"lang": "{lang}",
"tip": "실용적인 팁 1-2문장",
"mistake": "자주 하는 실수 1-2문장",
"tags": ["태그1", "태그2", "태그3"]
}}
span 클래스: kw(키워드), fn(함수), str(문자열), num(숫자), cm(주석), ty(타입), pk(패키지)
"""
def suggest_category(num: int) -> str:
cats = ['basics','functions','oop','collections','fp',
'async','errors','io','patterns','testing','perf']
return cats[num % len(cats)]
def suggest_difficulty(num: int) -> str:
if num % 5 == 0: return 'a'
if num % 3 == 0: return 'i'
return 'b'
def generate_item(client, lang: str, num: int,
existing_ids: list[str], max_retries: int = 3) -> dict | None:
prompt = make_prompt(lang, num, existing_ids)
for attempt in range(1, max_retries + 1):
try:
response = client.messages.create(
model = "claude-sonnet-4-5",
max_tokens = 2000,
system = SYSTEM_PROMPT.format(lang=lang),
messages= [{"role":"user","content": prompt}]
)
text = response.content[0].text.strip()
# 마크다운 코드 블록 제거 (혹시 있을 경우)
text = text.removeprefix("```json").removeprefix("```").removesuffix("```").strip()
item = json.loads(text)
# 필수 필드 검증
required = ['id','cat','diff','title','desc','code','lang','tip','mistake']
if all(k in item for k in required):
return item
else:
missing = [k for k in required if k not in item]
print(f" ⚠️ 누락 필드: {missing} (재시도 {attempt}/{max_retries})")
except json.JSONDecodeError as e:
print(f" ❌ JSON 파싱 실패 (재시도 {attempt}/{max_retries}): {e}")
except anthropic.RateLimitError:
wait = 2 ** attempt
print(f" ⏳ 레이트 리밋 — {wait}초 대기...")
time.sleep(wait)
except Exception as e:
print(f" ❌ 오류 (재시도 {attempt}/{max_retries}): {e}")
time.sleep(attempt)
return None
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--lang', default='kotlin',
choices=['kotlin','python','go','java'])
parser.add_argument('--start', type=int, default=33)
parser.add_argument('--end', type=int, default=82)
parser.add_argument('--delay', type=float, default=0.5,
help='요청 간 대기 시간(초)')
args = parser.parse_args()
client = anthropic.Anthropic(api_key=os.environ['ANTHROPIC_API_KEY'])
out_dir = Path('data/generated')
out_dir.mkdir(exist_ok=True)
existing_ids = []
success = 0
failed = []
print(f"🚀 {args.lang} 항목 생성: #{args.start} ~ #{args.end}")
print(f" 총 {args.end - args.start + 1}개 항목 예정\n")
for num in range(args.start, args.end + 1):
padded = f"{num:03d}"
print(f"⏳ [{padded}] 생성 중...", end=' ', flush=True)
item = generate_item(client, args.lang, num, existing_ids)
if item:
# 개별 JSON 저장
out_path = out_dir / f"{args.lang}_{padded}.json"
out_path.write_text(json.dumps(item, ensure_ascii=False, indent=2))
existing_ids.append(item['id'])
success += 1
print(f"✅ {item['title'][:30]}")
else:
failed.append(num)
print(f"❌ 실패")
time.sleep(args.delay)
print(f"\n{'='*50}")
print(f"완료: {success}개 성공, {len(failed)}개 실패")
if failed:
print(f"실패 번호: {failed}")
print(f"출력 위치: {out_dir}/")
if __name__ == '__main__':
main()Continue Learning
AI Prompts 학습을 이어가세요
총 20개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.