Tutorial 8: 自媒体内容创作 Agent
项目概述
本教程将构建一个完整的自媒体内容创作 Agent,它能够:
根据热点话题生成内容创意
撰写高质量的文章
生成配套的标题、摘要、标签
适配不同平台的风格要求
系统架构
┌─────────────────────────────────────────────────────────────┐
│ 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 会:
调用
search_trending_topics获取热门话题调用
get_platform_guidelines了解平台要求调用
analyze_content_potential分析话题潜力调用
generate_title_variants生成标题调用
check_content_quality检查并优化内容
最终输出一份完整的内容方案,包括:
推荐话题及理由
文章大纲
完整内容
标题、摘要、标签
下一步
在下一个教程中,我们将实现多平台发布 Agent,让内容能够自动发布到各个平台。