Tutorial 10: 完整自媒体工作流

项目概述

本教程将整合前面所有知识,构建一个完整的自媒体 AI Agent 系统,实现:

  1. 内容策划 - 发现热点、分析潜力、制定计划

  2. 内容创作 - 生成大纲、撰写文章、优化内容

  3. 多平台适配 - 自动适配不同平台风格

  4. 自动发布 - 一键发布到多个平台

  5. 数据追踪 - 监控发布效果、生成报告

系统架构

┌─────────────────────────────────────────────────────────────────────┐
│                    Self-Media AI Agent System                        │
│                                                                      │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │                      Orchestrator                            │    │
│  │          (工作流编排器 - 协调各个子Agent)                    │    │
│  └──────────────────────────┬──────────────────────────────────┘    │
│                             │                                        │
│    ┌────────────────────────┼────────────────────────┐              │
│    │                        │                        │              │
│    ▼                        ▼                        ▼              │
│  ┌──────────┐        ┌──────────┐        ┌──────────────────┐      │
│  │ Planner  │        │ Creator  │        │    Publisher     │      │
│  │  Agent   │───────►│  Agent   │───────►│      Agent       │      │
│  │ 内容策划  │        │ 内容创作  │        │    多平台发布     │      │
│  └──────────┘        └──────────┘        └──────────────────┘      │
│       │                   │                       │                 │
│       ▼                   ▼                       ▼                 │
│  ┌──────────────────────────────────────────────────────────────┐  │
│  │                    Shared Resources                           │  │
│  │  ┌────────┐  ┌────────┐  ┌────────┐  ┌────────────────────┐  │  │
│  │  │知识库   │  │ 模板库  │  │ 配置   │  │    状态存储        │  │  │
│  │  │  RAG   │  │Prompts │  │ Config │  │   State Store     │  │  │
│  │  └────────┘  └────────┘  └────────┘  └────────────────────┘  │  │
│  └──────────────────────────────────────────────────────────────┘  │
│                                                                      │
└─────────────────────────────────────────────────────────────────────┘

完整实现

项目结构

selfmedia_agent/
├── __init__.py
├── config.py           # 配置管理
├── models.py           # 数据模型
├── tools/              # 工具集
│   ├── __init__.py
│   ├── research.py     # 话题研究工具
│   ├── writing.py      # 写作工具
│   └── publishing.py   # 发布工具
├── agents/             # Agent 定义
│   ├── __init__.py
│   ├── planner.py      # 策划 Agent
│   ├── creator.py      # 创作 Agent
│   └── publisher.py    # 发布 Agent
├── knowledge/          # 知识库
│   └── writing_tips.txt
└── main.py             # 主入口

配置管理 (config.py)

from dataclasses import dataclass, field
from typing import Dict, List, Optional
from enum import Enum
import os
from dotenv import load_dotenv

load_dotenv()

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

@dataclass
class PlatformConfig:
    name: str
    max_length: int
    style: str
    title_max_length: int
    best_publish_times: List[str]
    credentials: Dict = field(default_factory=dict)

@dataclass
class AgentConfig:
    model_name: str = "gpt-4o-mini"
    temperature: float = 0.7
    max_iterations: int = 15
    verbose: bool = True

class Config:
    """全局配置"""

    # API Keys
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

    # Agent 配置
    AGENT = AgentConfig()

    # 平台配置
    PLATFORMS = {
        Platform.WECHAT: PlatformConfig(
            name="微信公众号",
            max_length=3000,
            style="深度、有温度、引发共鸣",
            title_max_length=64,
            best_publish_times=["08:00", "12:00", "20:00"]
        ),
        Platform.ZHIHU: PlatformConfig(
            name="知乎",
            max_length=5000,
            style="专业、有理有据",
            title_max_length=50,
            best_publish_times=["10:00", "21:00"]
        ),
        Platform.XIAOHONGSHU: PlatformConfig(
            name="小红书",
            max_length=1000,
            style="活泼、口语化、emoji",
            title_max_length=20,
            best_publish_times=["12:00", "19:00"]
        ),
    }

数据模型 (models.py)

from dataclasses import dataclass, field
from typing import List, Dict, Optional
from datetime import datetime
from enum import Enum

class ContentStatus(str, Enum):
    DRAFT = "draft"
    READY = "ready"
    PUBLISHED = "published"
    FAILED = "failed"

@dataclass
class ContentIdea:
    topic: str
    angle: str
    target_audience: str
    platforms: List[str]
    priority: int = 1
    created_at: datetime = field(default_factory=datetime.now)

@dataclass
class ContentOutline:
    title: str
    hook: str
    sections: List[Dict[str, str]]
    conclusion: str
    cta: str

@dataclass
class Article:
    id: str
    title: str
    content: str
    summary: str
    tags: List[str]
    outline: Optional[ContentOutline] = None
    status: ContentStatus = ContentStatus.DRAFT
    created_at: datetime = field(default_factory=datetime.now)

@dataclass
class AdaptedArticle:
    original_id: str
    platform: str
    title: str
    content: str
    summary: str
    tags: List[str]
    cover_suggestion: str
    status: ContentStatus = ContentStatus.READY

@dataclass
class PublishRecord:
    article_id: str
    platform: str
    success: bool
    post_url: Optional[str] = None
    error_message: Optional[str] = None
    published_at: Optional[datetime] = None
    stats: Dict = field(default_factory=dict)

主系统实现 (main.py)

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 langchain.memory import ConversationBufferWindowMemory
from typing import List, Dict, Optional
from datetime import datetime
import json
import uuid

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

@tool
def search_hot_topics(category: str, count: int = 5) -> str:
    """搜索热门话题

    Args:
        category: 分类(科技/职场/生活/教育)
        count: 数量
    """
    topics = {
        "科技": [
            {"topic": "AI Agent 开发", "heat": 95, "trend": "🔥上升"},
            {"topic": "Cursor IDE 技巧", "heat": 88, "trend": "📈上升"},
            {"topic": "RAG 最佳实践", "heat": 82, "trend": "➡️稳定"},
        ],
        "职场": [
            {"topic": "AI 时代职业转型", "heat": 92, "trend": "🔥上升"},
            {"topic": "远程办公效率", "heat": 78, "trend": "➡️稳定"},
        ]
    }
    return json.dumps(topics.get(category, [])[:count], ensure_ascii=False)

@tool
def analyze_topic(topic: str) -> str:
    """分析话题潜力

    Args:
        topic: 话题名称
    """
    return json.dumps({
        "topic": topic,
        "potential": "高",
        "competition": "中等",
        "recommended_angles": ["入门教程", "实战案例", "避坑指南"],
        "best_platforms": ["知乎", "微信公众号"]
    }, ensure_ascii=False)

@tool
def create_outline(topic: str, platform: str, angle: str) -> str:
    """创建文章大纲

    Args:
        topic: 话题
        platform: 目标平台
        angle: 切入角度
    """
    return json.dumps({
        "title": f"{topic}{angle}",
        "hook": "你是否也遇到过这样的困扰...",
        "sections": [
            {"title": "背景介绍", "points": ["问题描述", "为什么重要"]},
            {"title": "核心方法", "points": ["方法1", "方法2", "方法3"]},
            {"title": "实战案例", "points": ["案例分析", "代码演示"]},
            {"title": "常见问题", "points": ["FAQ1", "FAQ2"]},
        ],
        "conclusion": "总结核心要点",
        "cta": "关注获取更多干货"
    }, ensure_ascii=False)

@tool
def write_section(section_title: str, points: str, style: str) -> str:
    """撰写文章章节

    Args:
        section_title: 章节标题
        points: 要点(逗号分隔)
        style: 写作风格
    """
    # 实际应用中这里会调用 LLM 生成内容
    return f"""
## {section_title}

{points}

这是一段根据 {style} 风格生成的内容示例...
"""

@tool
def adapt_for_platform(content: str, source_platform: str, target_platform: str) -> str:
    """将内容适配到目标平台

    Args:
        content: 原始内容
        source_platform: 来源平台
        target_platform: 目标平台
    """
    adaptations = {
        "小红书": "已将内容改为口语化风格,添加了emoji 📚✨",
        "知乎": "已将内容改为专业风格,添加了数据引用",
        "微信公众号": "已优化排版,添加了引导关注"
    }
    return json.dumps({
        "target_platform": target_platform,
        "adaptation_note": adaptations.get(target_platform, "已完成适配"),
        "content_preview": content[:100] + "..."
    }, ensure_ascii=False)

@tool
def publish_content(platform: str, title: str, content: str) -> str:
    """发布内容到平台

    Args:
        platform: 目标平台
        title: 标题
        content: 内容
    """
    # 模拟发布
    post_id = str(uuid.uuid4())[:8]
    return json.dumps({
        "success": True,
        "platform": platform,
        "post_id": post_id,
        "url": f"https://{platform.lower()}.com/p/{post_id}",
        "published_at": datetime.now().isoformat()
    }, ensure_ascii=False)

@tool
def get_content_stats(platform: str, post_id: str) -> str:
    """获取内容数据统计

    Args:
        platform: 平台
        post_id: 文章ID
    """
    import random
    return json.dumps({
        "platform": platform,
        "post_id": post_id,
        "views": random.randint(1000, 10000),
        "likes": random.randint(50, 500),
        "comments": random.randint(10, 100),
        "shares": random.randint(5, 50)
    }, ensure_ascii=False)

# ========== 主 Agent 系统 ==========

class SelfMediaAgentSystem:
    """自媒体 AI Agent 系统"""

    def __init__(self):
        self.llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

        # 所有工具
        self.tools = [
            search_hot_topics,
            analyze_topic,
            create_outline,
            write_section,
            adapt_for_platform,
            publish_content,
            get_content_stats
        ]

        # 对话记忆
        self.memory = ConversationBufferWindowMemory(
            k=10,
            return_messages=True,
            memory_key="chat_history"
        )

        # 系统提示
        self.system_prompt = """你是专业的自媒体 AI 助手,具备以下能力:

🎯 **内容策划**
- 发现热门话题和内容机会
- 分析话题潜力和最佳切入角度
- 制定内容发布计划

✍️ **内容创作**
- 创建结构化的文章大纲
- 撰写高质量的文章内容
- 优化标题、摘要和标签

📱 **多平台运营**
- 适配不同平台的内容风格
- 自动发布到多个平台
- 追踪内容表现数据

工作原则:
1. 内容要有价值,不做标题党
2. 适配平台特点,尊重用户习惯
3. 数据驱动,持续优化
4. 保持专业性和原创性

请根据用户需求,合理使用工具完成任务。每次任务完成后,给出清晰的总结和下一步建议。
"""

        self.prompt = ChatPromptTemplate.from_messages([
            ("system", self.system_prompt),
            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.prompt)
        self.executor = AgentExecutor(
            agent=self.agent,
            tools=self.tools,
            verbose=True,
            max_iterations=20,
            handle_parsing_errors=True
        )

    def chat(self, message: str) -> str:
        """与 Agent 对话"""
        history = self.memory.load_memory_variables({})["chat_history"]

        result = self.executor.invoke({
            "input": message,
            "chat_history": history
        })

        # 保存对话历史
        self.memory.save_context(
            {"input": message},
            {"output": result["output"]}
        )

        return result["output"]

    def plan_content(self, category: str, platforms: List[str], days: int = 7) -> str:
        """制定内容计划"""
        platforms_str = "、".join(platforms)
        return self.chat(f"""
        请帮我制定一个{days}天的内容计划:

        - 内容领域:{category}
        - 目标平台:{platforms_str}

        要求:
        1. 搜索当前热门话题
        2. 分析每个话题的潜力
        3. 为每天安排一个内容主题
        4. 说明每个内容的切入角度和目标平台
        """)

    def create_content(self, topic: str, platform: str, style: str = None) -> str:
        """创作内容"""
        style_info = f",风格要求:{style}" if style else ""
        return self.chat(f"""
        请帮我创作一篇关于「{topic}」的文章,发布到「{platform}{style_info}

        请执行以下步骤:
        1. 分析话题,确定最佳切入角度
        2. 创建详细的文章大纲
        3. 逐章节撰写内容
        4. 生成标题、摘要和标签
        """)

    def publish_to_platforms(self, content: str, title: str, platforms: List[str]) -> str:
        """发布到多个平台"""
        platforms_str = "、".join(platforms)
        return self.chat(f"""
        请将以下内容发布到这些平台:{platforms_str}

        标题:{title}

        内容:
        {content}

        请执行以下步骤:
        1. 为每个平台适配内容风格
        2. 发布到各平台
        3. 汇报发布结果
        """)

    def get_performance_report(self, post_ids: Dict[str, str]) -> str:
        """获取发布效果报告"""
        posts_info = "\n".join([f"- {p}: {pid}" for p, pid in post_ids.items()])
        return self.chat(f"""
        请获取以下文章的数据表现:

        {posts_info}

        请生成一份数据报告,包括:
        1. 各平台的阅读量、点赞、评论、分享数据
        2. 数据对比分析
        3. 优化建议
        """)

    def full_workflow(self, topic: str, platforms: List[str]) -> str:
        """执行完整工作流"""
        platforms_str = "、".join(platforms)
        return self.chat(f"""
        请执行完整的自媒体内容工作流:

        话题:{topic}
        目标平台:{platforms_str}

        完整流程:
        1. 分析话题潜力和最佳切入角度
        2. 创建文章大纲
        3. 撰写完整文章
        4. 为每个平台适配内容
        5. 发布到所有平台
        6. 生成发布报告

        请逐步执行,每一步都给出详细输出。
        """)

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

def main():
    print("=" * 60)
    print("自媒体 AI Agent 系统")
    print("=" * 60)

    agent = SelfMediaAgentSystem()

    # 交互式对话
    print("\n欢迎使用自媒体 AI Agent!")
    print("你可以:")
    print("1. 让我帮你发现热门话题")
    print("2. 让我帮你创作文章")
    print("3. 让我帮你发布到多个平台")
    print("4. 输入 'quit' 退出")
    print("-" * 60)

    while True:
        user_input = input("\n你: ").strip()

        if user_input.lower() in ['quit', 'exit', 'q']:
            print("再见!")
            break

        if not user_input:
            continue

        print("\nAgent 正在处理...")
        response = agent.chat(user_input)
        print(f"\nAgent: {response}")

if __name__ == "__main__":
    main()

使用示例

# 创建 Agent 系统
agent = SelfMediaAgentSystem()

# 场景1:制定内容计划
plan = agent.plan_content(
    category="科技",
    platforms=["微信公众号", "知乎"],
    days=7
)
print(plan)

# 场景2:创作内容
content = agent.create_content(
    topic="AI Agent 开发入门",
    platform="知乎",
    style="专业但易懂"
)
print(content)

# 场景3:多平台发布
result = agent.publish_to_platforms(
    content="...",
    title="AI Agent 开发入门指南",
    platforms=["微信公众号", "知乎", "小红书"]
)
print(result)

# 场景4:完整工作流
full_result = agent.full_workflow(
    topic="LangChain 实战教程",
    platforms=["微信公众号", "知乎"]
)
print(full_result)

部署建议

  1. 环境配置

    # 创建 .env 文件
    OPENAI_API_KEY=your-api-key
    
    # 安装依赖
    pip install langchain langchain-openai python-dotenv
    
  2. 生产环境优化

    • 使用 Redis 存储对话历史

    • 添加请求限流和重试机制

    • 实现异步发布队列

    • 添加监控和告警

  3. 扩展方向

    • 接入真实的平台 API

    • 添加图片生成能力

    • 实现定时发布功能

    • 添加数据分析仪表板

总结

通过本系列教程,我们学习了:

  1. LangChain 基础 - LLM、Prompts、Chains

  2. 高级特性 - Memory、Agents、Tools

  3. RAG 技术 - 知识库构建与检索

  4. 实战应用 - 自媒体内容创作与发布

现在你已经掌握了使用 LangChain 构建 AI Agent 的核心技能,可以将这些知识应用到更多场景中!

🎉 恭喜完成全部教程!