写一篇高质量SEO文章,前期调研最耗时。我搭了一套自动化流程:用SerpBase采集SERP数据,丢给LLM分析竞争格局,自动生成内容简报(content brief)。原来2小时的调研现在5分钟搞定。

一、内容简报为什么重要

内容简报(Content Brief)是写作者的生产指南,通常包含:

  • 目标关键词和搜索意图
  • 文章应该覆盖哪些子话题
  • 目标字数和结构建议
  • 竞品内容分析
  • 必须回答的问题(PAA)
  • 建议的标题和H2/H3大纲

传统做法是人工做这些调研,一篇brief要1-2小时。问题是:调研质量取决于执行者的经验,容易遗漏关键信息

二、自动化简报生成流程

输入关键词 → SerpBase采集SERP → 数据清洗 → LLM分析 → 生成Brief

2.1 SERP数据采集

import requests
from typing import Dict, List

API_KEY = "YOUR_KEY"
BASE_URL = "https://api.serpbase.dev/google/search"

def collect_serp_data(keyword: str) -> Dict:
    """采集关键词的完整SERP数据"""
    headers = {
        "X-API-Key": API_KEY,
        "Content-Type": "application/json"
    }
    body = {
        "q": keyword,
        "hl": "en",
        "gl": "us",
        "page": 1
    }
    
    r = requests.post(BASE_URL, headers=headers, json=body, timeout=30)
    data = r.json()
    
    return {
        "keyword": keyword,
        "organic": data.get("organic", []),
        "people_also_ask": data.get("people_also_ask", []),
        "related_searches": data.get("related_searches", []),
        "knowledge_graph": data.get("knowledge_graph"),
        "top_stories": data.get("top_stories", [])
    }

2.2 数据清洗和特征提取

def extract_brief_features(serp_data: Dict) -> Dict:
    """从SERP数据中提取简报所需的特征"""
    organic = serp_data["organic"]
    paa = serp_data["people_also_ask"]
    related = serp_data["related_searches"]
    
    features = {
        "keyword": serp_data["keyword"],
        
        # 竞品内容特征
        "top_results": [
            {
                "rank": item["rank"],
                "title": item.get("title", ""),
                "domain": item.get("display_link", ""),
                "snippet": item.get("snippet", "")[:200]
            }
            for item in organic[:5]
        ],
        
        # 内容类型分析
        "content_types": analyze_content_types(organic[:5]),
        
        # PAA问题
        "questions": [item.get("question", "") for item in paa],
        
        # 相关搜索(扩展话题)
        "related_topics": related[:10],
        
        # SERP特征
        "has_featured_snippet": len(paa) > 0,
        "has_knowledge_graph": serp_data.get("knowledge_graph") is not None,
        "has_news": len(serp_data.get("top_stories", [])) > 0,
        
        # 预估内容规格
        "suggested_word_count": estimate_word_count(organic[:5]),
        "avg_top_result_length": estimate_content_length(organic[:3])
    }
    
    return features

def analyze_content_types(organic: List[Dict]) -> Dict:
    """分析前5结果的内容类型"""
    types = {"listicle": 0, "how_to": 0, "guide": 0, "review": 0, "comparison": 0}
    
    for item in organic:
        title = item.get("title", "").lower()
        if any(w in title for w in ["best", "top", "vs"]):
            types["listicle"] += 1
        elif any(w in title for w in ["how to", "step", "guide"]):
            types["how_to"] += 1
        elif any(w in title for w in ["review", "reviews"]):
            types["review"] += 1
        elif any(w in title for w in ["comparison", "vs", "versus"]):
            types["comparison"] += 1
        else:
            types["guide"] += 1
    
    return types

def estimate_word_count(organic: List[Dict]) -> int:
    """根据竞品内容长度建议字数"""
    # 简化估算:如果都是长文,建议2000+;如果都是短文,建议1000-1500
    long_count = sum(1 for item in organic if len(item.get("snippet", "")) > 150)
    
    if long_count >= 3:
        return 2500
    elif long_count >= 2:
        return 1800
    else:
        return 1200

2.3 LLM Prompt设计

def build_brief_prompt(features: Dict) -> str:
    """构建生成Content Brief的LLM Prompt"""
    
    top_results_text = "\n".join([
        f"{i+1}. {r['title']} ({r['domain']})\n   {r['snippet']}"
        for i, r in enumerate(features["top_results"])
    ])
    
    questions_text = "\n".join([f"- {q}" for q in features["questions"][:8]])
    related_text = "\n".join([f"- {r}" for r in features["related_topics"][:8]])
    
    prompt = f"""你是一个资深SEO内容策略师。请基于以下SERP分析数据,为关键词"{features['keyword']}"生成一份详细的内容简报(Content Brief)。

## SERP数据

### 前5名搜索结果
{top_results_text}

### People Also Ask 问题
{questions_text}

### Related Searches(相关搜索)
{related_text}

### SERP特征
- 有Featured Snippet/PAA: {'是' if features['has_featured_snippet'] else '否'}
- 有Knowledge Graph: {'是' if features['has_knowledge_graph'] else '否'}
- 有新闻结果: {'是' if features['has_news'] else '否'}

## 请输出以下内容:

### 1. 搜索意图分析
- 主要意图(Informational/Commercial/Transactional)
- 用户真正想解决的问题

### 2. 内容类型建议
- 推荐的文章类型
- 目标字数:{features['suggested_word_count']}字左右

### 3. 文章大纲(H2/H3结构)
请给出详细的标题大纲,至少包含5个H2,每个H2下建议2-3个H3。

### 4. 必须覆盖的子话题
基于PAA和Related Searches,列出文章必须回答的问题和覆盖的话题。

### 5. 差异化建议
分析前5名内容的不足,建议我们如何做出更好的内容。

### 6. 标题建议
给出3个标题选项,包含目标关键词,有吸引力。

### 7. CTA建议
文章结尾应该引导用户做什么。

请用中文输出。"""
    
    return prompt

2.4 调用LLM生成简报

import openai

def generate_brief_with_llm(features: Dict, api_key: str) -> str:
    """用LLM生成内容简报"""
    prompt = build_brief_prompt(features)
    
    client = openai.OpenAI(api_key=api_key)
    
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "你是一个专业的SEO内容策略师,擅长分析搜索意图和规划内容结构。"},
            {"role": "user", "content": prompt}
        ],
        temperature=0.7,
        max_tokens=2500
    )
    
    return response.choices[0].message.content

三、完整流水线

def auto_generate_content_brief(keyword: str, serp_key: str, llm_key: str) -> Dict:
    """一键生成内容简报"""
    print(f"正在采集 '{keyword}' 的SERP数据...")
    serp_data = collect_serp_data(keyword)
    
    print("正在提取特征...")
    features = extract_brief_features(serp_data)
    
    print("正在生成简报...")
    brief_text = generate_brief_with_llm(features, llm_key)
    
    return {
        "keyword": keyword,
        "features": features,
        "brief": brief_text,
        "generated_at": datetime.now().isoformat()
    }

# 使用
brief = auto_generate_content_brief("docker compose tutorial", "SERPBSE_KEY", "OPENAI_KEY")
print(brief["brief"])

四、简报质量验证

生成brief后,需要验证LLM的建议是否靠谱:

def validate_brief(brief: Dict, serp_key: str) -> Dict:
    """验证brief的质量"""
    keyword = brief["keyword"]
    
    # 1. 检查建议的子话题是否覆盖了PAA
    headers = {
        "X-API-Key": serp_key,
        "Content-Type": "application/json"
    }
    body = {
        "q": keyword,
        "hl": "en",
        "gl": "us",
        "page": 1
    }
    
    r = requests.post("https://api.serpbase.dev/google/search", headers=headers, json=body, timeout=30)
    data = r.json()
    paa_questions = [item.get("question", "").lower() for item in data.get("people_also_ask", [])]
    
    brief_text = brief["brief"].lower()
    covered = sum(1 for q in paa_questions if any(word in brief_text for word in q.split()[:3]))
    coverage = covered / len(paa_questions) if paa_questions else 0
    
    return {
        "paa_coverage": f"{coverage:.0%}",
        "total_paa": len(paa_questions),
        "covered_paa": covered,
        "quality_score": "good" if coverage >= 0.7 else "needs_improvement"
    }

五、实战效果

我们团队用这个流程后的变化:

Before

  • 调研时间:1.5-2小时/篇
  • Brief质量:取决于写作者经验,参差不齐
  • 遗漏PAA问题:约30%的brief漏了关键问题

After

  • 调研时间:5-8分钟/篇
  • Brief质量:稳定,覆盖全面
  • PAA覆盖率:92%
  • 写作者满意度:4.5/5(“知道该写什么了”)

六、进阶:批量生成

def batch_generate_briefs(keywords: List[str], serp_key: str, llm_key: str) -> List[Dict]:
    """批量生成简报"""
    briefs = []
    
    for keyword in keywords:
        try:
            brief = auto_generate_content_brief(keyword, serp_key, llm_key)
            briefs.append(brief)
            print(f"✓ {keyword}")
            time.sleep(2)  # 避免LLM限流
        except Exception as e:
            print(f"✗ {keyword}: {e}")
    
    return briefs

# 生成10篇内容的brief
keywords = ["docker tutorial", "kubernetes basics", "ci/cd pipeline", "devops tools"]
briefs = batch_generate_briefs(keywords, SERP_KEY, LLM_KEY)

七、总结

LLM + SERP数据的组合,让内容调研从"体力活"变成了"自动化流水线"。

核心价值:

  1. 速度:2小时 → 5分钟
  2. 一致性:不再依赖个人经验
  3. 全面性:PAA、Related Searches自动覆盖
  4. 可扩展:批量生成,一次搞定一周的内容排期

成本:

  • SerpBase:$0.30/千次
  • LLM API:GPT-4大概$0.03/次
  • 一篇brief成本约$0.05

LLM生成的brief需要人工review。特别是差异化建议部分,LLM有时候会提一些不切实际的建议(比如"做一个交互式工具")。建议把brief当作"初稿",人类编辑做最终把关。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐