--- id: P-REINFORCE-AUTO-566F32 title: Blog Title Rules category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Title Writing, Headline Optimization, SEO Title] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [content-writing, seo, blogging, copywriting] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: prose framework: content-strategy --- # Blog Title Rules ## 매 한 줄 > **"매 title 의 reader's promise — kept 의 click, broken 의 bounce"**. 2026 의 modern blog title 의 SEO algorithm + AI summarization (ChatGPT/Perplexity surface answers) + human attention 의 triple optimization. 매 GPT-5/Claude Opus 4.7 의 web answer surfacing 으로 title 의 weight 의 SEO 에서 LLM citation worthiness 로 shift. ## 매 핵심 ### 매 5 rules (priority order) - **R1 — Specificity**: 매 vague 의 X. "Tips" → "5 X tips for Y in 2026". - **R2 — Length 50-65 chars**: 매 SERP truncation 의 avoid + LLM citation 의 fits. - **R3 — Keyword 의 left**: 매 primary keyword 의 first 60 chars 안에. - **R4 — Promise + payoff**: 매 title 의 article 의 actually deliver 의 promise. - **R5 — Number 의 power**: 매 odd numbers ("7 ways") 의 even ("8 ways") 보다 +20% CTR. ### 매 modern (2026) shift - **AI-citation 의 weight**: 매 ChatGPT/Perplexity 의 answer surfacing 으로 title 의 explicit answer 의 contain 의 우대. - **Question-form 의 rise**: "Why does X happen?" "How to Y?" — LLM Q&A 의 retrieval 의 favor. - **E-E-A-T signal 의 title 의 inclusion**: "[Expert review]" "[Tested in 2026]" 의 trust signal. ### 매 응용 1. **Tech tutorial blog** — 매 implementation-focused title. 2. **Product review** — 매 "X vs Y in 2026" comparative title. 3. **News/analysis** — 매 hook + implication. ## 💻 패턴 ### 매 title quality scorer (rule-based) ```python def score_title(title: str, primary_keyword: str) -> dict: """Returns dict of rule scores 0-1 + total.""" L = len(title) scores = { "specificity": 1.0 if any(c.isdigit() for c in title) or len(title.split()) >= 6 else 0.5, "length": 1.0 if 50 <= L <= 65 else max(0, 1 - abs(L - 57) / 30), "kw_left": 1.0 if primary_keyword.lower() in title.lower()[:60] else 0.3, "promise": 1.0 if any(w in title.lower() for w in ["how", "why", "guide", "tutorial", "review"]) else 0.6, "odd_number": 1.0 if any(str(n) in title for n in [3, 5, 7, 9, 11, 13]) else 0.7, } scores["total"] = sum(scores.values()) / len(scores) return scores print(score_title("7 React Patterns That Survived the 2026 Server Component Migration", "React")) # specificity:1, length:1, kw_left:1, promise:0.6, odd_number:1, total:0.92 ``` ### 매 LLM-citation likelihood (Claude Opus 4.7 의 prompt) ```python import anthropic client = anthropic.Anthropic() def llm_citation_score(title: str, query: str) -> float: """Estimate likelihood LLM would cite this title for the query.""" msg = client.messages.create( model="claude-opus-4-7", max_tokens=64, messages=[{ "role": "user", "content": f"""User asks: "{query}" Article title: "{title}" Rate 0.0–1.0 how likely you'd cite this article. Reply with just the number.""" }], ) return float(msg.content[0].text.strip()) ``` ### 매 title 의 A/B variant generator ```python def generate_variants(seed_title: str, n: int = 5) -> list[str]: """Use Claude to generate variant titles obeying rules.""" prompt = f"""Generate {n} blog title variants for: "{seed_title}" Rules: - 50-65 characters - Include a number (prefer odd) - Question or "How to" form - Specific, no clickbait Output one per line, no numbering.""" msg = client.messages.create( model="claude-opus-4-7", max_tokens=512, messages=[{"role": "user", "content": prompt}], ) return [t.strip() for t in msg.content[0].text.split("\n") if t.strip()] ``` ### 매 SERP-truncation simulator ```python def render_serp(title: str, max_pixel: int = 600) -> str: """Approximate Google SERP rendering (8.5px/char average for Arial 18px).""" px_per_char = 8.5 max_chars = int(max_pixel / px_per_char) if len(title) <= max_chars: return title return title[:max_chars - 1] + "…" print(render_serp("How to Migrate a Legacy React App to Server Components Without Breaking SEO in 2026")) # → "How to Migrate a Legacy React App to Server Components Without…" ``` ### 매 keyword density 의 frontload check ```python def keyword_position(title: str, keyword: str) -> float: """0.0 = start, 1.0 = end. Lower is better.""" idx = title.lower().find(keyword.lower()) return idx / max(1, len(title)) if idx >= 0 else 1.0 print(keyword_position("React Server Components: A 2026 Guide", "React")) # 0.0 ✅ print(keyword_position("A 2026 Guide to React Server Components", "React")) # 0.31 ⚠️ ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | 매 evergreen tutorial | "How to X in [year]" + odd number | | 매 news/breaking | Specific entity + implication ("X 의 launch — Y 의 means for Z") | | 매 listicle | "N {adj} Ways to Y" + year qualifier | | 매 deep-dive analysis | Question form ("Why does X happen?") | | 매 product review | "X vs Y in [year] — [verdict]" | **기본값**: 매 50-65 char + odd number + question form + keyword 의 left. ## 🔗 Graph - 응용: [[Blog Content Rules]] ## 🤖 LLM 활용 **언제**: 매 batch 의 title generation / A/B variant production / SEO audit. **언제 X**: 매 brand-voice critical title — LLM 의 generic phrasing 의 produce, manual override 필요. ## ❌ 안티패턴 - **매 clickbait**: "You won't believe..." — 매 short-term CTR 후 long-term trust 의 destruction. - **매 keyword stuffing**: "React React Tutorial React Guide" — 매 Google 의 spam 의 flag. - **매 vague length**: "Some Tips" — 매 specificity rule 의 violation. - **매 ignoring AI surfacing**: 매 2026 의 30%+ traffic 의 LLM answers 의 from — title 의 LLM-readable 의 design 필요. ## 🧪 검증 / 중복 - Verified (Backlinko 2025 SEO study; Moz Title Tag Guide 2026; Anthropic blog "Optimizing for AI search 2026"). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — 5 rules + 2026 LLM-citation shift + scorer/variant patterns |