Tutorial 8: 自媒体内容创作 Agent

项目概述

本教程将构建一个完整的自媒体内容创作 Agent,它能够:

  1. 根据热点话题生成内容创意

  2. 撰写高质量的文章

  3. 生成配套的标题、摘要、标签

  4. 适配不同平台的风格要求

系统架构

┌─────────────────────────────────────────────────────────────┐
│                  Self-Media Content Agent                    │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                    Agent Core                         │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐  │   │
│  │  │ Planner │  │ Writer  │  │ Editor  │  │Optimizer│  │   │
│  │  └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘  │   │
│  └───────┼────────────┼────────────┼────────────┼───────┘   │
│          │            │            │            │            │
│  ┌───────┴────────────┴────────────┴────────────┴───────┐   │
│  │                      Tools                            │   │
│  │  ┌────────┐ ┌────────┐ ┌────────┐ ┌────────────────┐ │   │
│  │  │ 热点API │ │知识库  │ │ SEO工具│ │ 平台适配器     │ │   │
│  │  └────────┘ └────────┘ └────────┘ └────────────────┘ │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                              │
└─────────────────────────────────────────────────────────────┘

完整实现

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
from pydantic import BaseModel, Field
from typing import List, Optional
from dataclasses import dataclass
from enum import Enum
import json

# ========== 数据模型 ==========

class Platform(str, Enum):
    WECHAT = "微信公众号"
    ZHIHU = "知乎"
    XIAOHONGSHU = "小红书"
    TOUTIAO = "今日头条"
    WEIBO = "微博"

@dataclass
class PlatformConfig:
    name: str
    max_length: int
    style: str
    features: List[str]
    title_max_length: int

PLATFORM_CONFIGS = {
    Platform.WECHAT: PlatformConfig(
        name="微信公众号",
        max_length=3000,
        style="深度、有温度、引发共鸣",
        features=["图文混排", "长文阅读", "深度内容"],
        title_max_length=64
    ),
    Platform.ZHIHU: PlatformConfig(
        name="知乎",
        max_length=5000,
        style="专业、有理有据、数据支撑",
        features=["专业分析", "深度讨论", "引用来源"],
        title_max_length=50
    ),
    Platform.XIAOHONGSHU: PlatformConfig(
        name="小红书",
        max_length=1000,
        style="活泼、口语化、emoji丰富",
        features=["图片为主", "种草分享", "生活方式"],
        title_max_length=20
    ),
    Platform.TOUTIAO: PlatformConfig(
        name="今日头条",
        max_length=2000,
        style="通俗易懂、信息量大、吸引眼球",
        features=["资讯热点", "大众化", "快速阅读"],
        title_max_length=30
    ),
}

class ContentIdea(BaseModel):
    title: str = Field(description="内容标题")
    angle: str = Field(description="切入角度")
    target_audience: str = Field(description="目标受众")
    key_points: List[str] = Field(description="核心要点")
    estimated_engagement: str = Field(description="预估互动程度:高/中/低")

class ArticleOutline(BaseModel):
    title: str = Field(description="文章标题")
    hook: str = Field(description="开头钩子")
    sections: List[dict] = Field(description="章节列表,每个包含title和points")
    conclusion: str = Field(description="结论要点")
    cta: str = Field(description="行动号召")

class ArticleContent(BaseModel):
    title: str = Field(description="标题")
    content: str = Field(description="正文内容")
    summary: str = Field(description="摘要")
    tags: List[str] = Field(description="标签")
    platform: str = Field(description="目标平台")

# ========== 工具定义 ==========

@tool
def search_trending_topics(category: str, count: int = 5) -> str:
    """搜索指定分类的热门话题

    Args:
        category: 话题分类(科技/职场/生活/教育/财经)
        count: 返回话题数量
    """
    # 实际应用中可接入真实的热搜API
    trending = {
        "科技": [
            {"topic": "AI Agent开发实战", "heat": 95, "trend": "上升"},
            {"topic": "Claude vs GPT对比评测", "heat": 88, "trend": "稳定"},
            {"topic": "Cursor IDE效率提升技巧", "heat": 82, "trend": "上升"},
            {"topic": "RAG技术最佳实践", "heat": 78, "trend": "上升"},
            {"topic": "LangChain入门教程", "heat": 75, "trend": "稳定"},
        ],
        "职场": [
            {"topic": "AI时代的职业转型", "heat": 92, "trend": "上升"},
            {"topic": "远程办公效率指南", "heat": 85, "trend": "稳定"},
            {"topic": "程序员副业变现", "heat": 80, "trend": "上升"},
            {"topic": "技术面试通关秘籍", "heat": 76, "trend": "稳定"},
            {"topic": "35岁程序员的出路", "heat": 90, "trend": "上升"},
        ],
        "生活": [
            {"topic": "高效学习方法论", "heat": 88, "trend": "稳定"},
            {"topic": "数字极简主义", "heat": 75, "trend": "上升"},
            {"topic": "个人知识管理", "heat": 82, "trend": "上升"},
            {"topic": "时间管理实战", "heat": 79, "trend": "稳定"},
            {"topic": "阅读习惯养成", "heat": 72, "trend": "稳定"},
        ]
    }

    topics = trending.get(category, [])[:count]
    return json.dumps({"category": category, "topics": topics}, ensure_ascii=False)

@tool
def get_platform_guidelines(platform: str) -> str:
    """获取指定平台的内容创作指南

    Args:
        platform: 平台名称(微信公众号/知乎/小红书/今日头条)
    """
    try:
        p = Platform(platform)
        config = PLATFORM_CONFIGS[p]
        return json.dumps({
            "platform": config.name,
            "max_length": config.max_length,
            "style": config.style,
            "features": config.features,
            "title_max_length": config.title_max_length,
            "tips": [
                f"字数建议: {config.max_length//2}-{config.max_length}字",
                f"标题不超过{config.title_max_length}字",
                f"风格: {config.style}"
            ]
        }, ensure_ascii=False)
    except ValueError:
        return json.dumps({"error": f"不支持的平台: {platform}"}, ensure_ascii=False)

@tool
def analyze_content_potential(topic: str, platform: str) -> str:
    """分析话题在特定平台的内容潜力

    Args:
        topic: 话题名称
        platform: 目标平台
    """
    # 模拟分析结果
    analysis = {
        "topic": topic,
        "platform": platform,
        "potential_score": 85,
        "competition_level": "中等",
        "recommended_angles": [
            "入门教程型 - 适合新手",
            "实战案例型 - 展示具体应用",
            "避坑指南型 - 分享踩坑经验",
            "对比评测型 - 横向比较"
        ],
        "best_publish_time": "工作日早8点或晚8点",
        "estimated_read_time": "5-8分钟"
    }
    return json.dumps(analysis, ensure_ascii=False)

@tool
def generate_title_variants(topic: str, style: str, count: int = 5) -> str:
    """生成多个标题变体

    Args:
        topic: 文章主题
        style: 标题风格(吸引眼球/专业严谨/悬念式/数字式)
        count: 生成数量
    """
    # 实际应用中可以用LLM生成
    templates = {
        "吸引眼球": [
            f"震惊!{topic}竟然可以这样用",
            f"99%的人不知道的{topic}技巧",
            f"{topic},看完这篇就够了",
        ],
        "专业严谨": [
            f"{topic}技术深度解析",
            f"从原理到实践:{topic}完全指南",
            f"{topic}:架构设计与最佳实践",
        ],
        "悬念式": [
            f"学会{topic}后,我的工作效率提升了10倍",
            f"为什么大厂都在用{topic}?",
            f"{topic}的秘密,今天终于公开了",
        ],
        "数字式": [
            f"5分钟掌握{topic}核心要点",
            f"{topic}入门:7个必知技巧",
            f"3步搞定{topic},小白也能学会",
        ]
    }

    titles = templates.get(style, templates["数字式"])[:count]
    return json.dumps({"topic": topic, "style": style, "titles": titles}, ensure_ascii=False)

@tool
def check_content_quality(content: str) -> str:
    """检查内容质量并给出优化建议

    Args:
        content: 待检查的内容
    """
    word_count = len(content)
    paragraphs = content.split('\n\n')

    issues = []
    suggestions = []

    # 检查字数
    if word_count < 500:
        issues.append("内容过短")
        suggestions.append("建议扩充到800字以上")
    elif word_count > 5000:
        issues.append("内容过长")
        suggestions.append("建议精简或分成系列文章")

    # 检查段落
    if len(paragraphs) < 3:
        issues.append("段落过少")
        suggestions.append("建议增加分段,提升可读性")

    # 检查是否有小标题
    if '##' not in content and '**' not in content:
        suggestions.append("建议添加小标题或加粗重点")

    quality_score = 100 - len(issues) * 15

    return json.dumps({
        "word_count": word_count,
        "paragraph_count": len(paragraphs),
        "quality_score": max(quality_score, 60),
        "issues": issues,
        "suggestions": suggestions
    }, ensure_ascii=False)

# ========== 内容创作 Agent ==========

class ContentCreationAgent:
    """自媒体内容创作 Agent"""

    def __init__(self):
        self.llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)
        self.tools = [
            search_trending_topics,
            get_platform_guidelines,
            analyze_content_potential,
            generate_title_variants,
            check_content_quality
        ]

        self.agent_prompt = ChatPromptTemplate.from_messages([
            ("system", """你是专业的自媒体内容创作专家。你的职责是:

1. 发现热门话题和内容机会
2. 分析话题潜力和最佳切入角度
3. 根据平台特点创作高质量内容
4. 优化标题、摘要和标签

工作原则:
- 内容要有价值,不做标题党
- 适配不同平台的风格和用户习惯
- 注重可读性和互动性
- 保持专业性和原创性

请充分利用工具完成任务,给出专业、可执行的内容方案。"""),
            MessagesPlaceholder(variable_name="chat_history", optional=True),
            ("human", "{input}"),
            MessagesPlaceholder(variable_name="agent_scratchpad")
        ])

        self.agent = create_tool_calling_agent(
            self.llm,
            self.tools,
            self.agent_prompt
        )

        self.executor = AgentExecutor(
            agent=self.agent,
            tools=self.tools,
            verbose=True,
            max_iterations=15
        )

    def find_topics(self, category: str, platform: str) -> str:
        """发现适合的话题"""
        return self.executor.invoke({
            "input": f"""
            请帮我在「{category}」分类下找到适合在「{platform}」发布的话题。

            要求:
            1. 搜索当前热门话题
            2. 获取平台的内容指南
            3. 分析每个话题的潜力
            4. 推荐最适合的2-3个话题,并说明理由
            """
        })["output"]

    def create_outline(self, topic: str, platform: str) -> str:
        """创建文章大纲"""
        return self.executor.invoke({
            "input": f"""
            请为话题「{topic}」创建一份适合「{platform}」的文章大纲。

            要求:
            1. 获取平台指南,了解风格要求
            2. 设计吸引人的开头钩子
            3. 规划3-5个章节
            4. 设计有力的结尾和行动号召
            5. 生成多个标题备选
            """
        })["output"]

    def write_article(self, topic: str, platform: str, outline: str = None) -> str:
        """撰写完整文章"""
        outline_info = f"\n参考大纲:{outline}" if outline else ""

        return self.executor.invoke({
            "input": f"""
            请为「{platform}」撰写一篇关于「{topic}」的完整文章。
            {outline_info}

            要求:
            1. 获取平台指南,严格遵循风格要求
            2. 撰写完整的文章内容
            3. 检查内容质量并优化
            4. 生成标题、摘要和标签
            5. 确保内容有价值、可读性强
            """
        })["output"]

# ========== 使用示例 ==========

if __name__ == "__main__":
    agent = ContentCreationAgent()

    # 场景1:发现话题
    print("=" * 50)
    print("场景1:发现话题")
    print("=" * 50)
    topics = agent.find_topics("科技", "微信公众号")
    print(topics)

    # 场景2:创建大纲
    print("\n" + "=" * 50)
    print("场景2:创建大纲")
    print("=" * 50)
    outline = agent.create_outline("AI Agent开发实战", "知乎")
    print(outline)

    # 场景3:撰写文章
    print("\n" + "=" * 50)
    print("场景3:撰写文章")
    print("=" * 50)
    article = agent.write_article("LangChain入门", "小红书")
    print(article)

运行效果

运行上述代码,Agent 会:

  1. 调用 search_trending_topics 获取热门话题

  2. 调用 get_platform_guidelines 了解平台要求

  3. 调用 analyze_content_potential 分析话题潜力

  4. 调用 generate_title_variants 生成标题

  5. 调用 check_content_quality 检查并优化内容

最终输出一份完整的内容方案,包括:

  • 推荐话题及理由

  • 文章大纲

  • 完整内容

  • 标题、摘要、标签

下一步

在下一个教程中,我们将实现多平台发布 Agent,让内容能够自动发布到各个平台。

Tutorial 9: 多平台发布 Agent