feat: 审查流程优化+采集定时调度+全链路LLM提示词升级

- 审查:移除 manual_review,改为迭代LLM修复(最多3次),合规分回写Topic
- 调度:scheduler 新增话题采集定时任务 scheduled_collect (01:30)
- 提示词:全链路8文件≈24个提示词升级,增强SEO/平台推荐/真人感
This commit is contained in:
Yuzhiran Dev
2026-05-14 21:52:02 +08:00
parent 1115223066
commit fef435cc78
15 changed files with 288 additions and 160 deletions
+15 -5
View File
@@ -93,7 +93,7 @@ def expand_content_with_llm(
section_content: str,
context: str = ""
) -> str:
prompt = f"""你是一个专业的内容创作者,风格精炼、直接、切中要点。请将以下大纲扩展为完整的文章章节
prompt = f"""你是一个专业的内容创作者,擅长将大纲要点扩展为读者爱看+搜索引擎友好的完整章节
### 选题信息
标题:{topic.get('title')}
@@ -107,12 +107,22 @@ def expand_content_with_llm(
{section_content}
### 输出要求
#### 内容价值
- 以 "## {section_title}" 开始
- 字数:200-300
- 语言:直白、有冲击力,避免空洞套话
- 使用 Markdown 格式
- 200-300字,精炼有力
- 每个论点配具体案例或数据支撑
- 确保与整体文章调性一致
- 回答读者「所以呢」——为什么对他有用
#### 语言风格
- 直白有冲击力,避免空洞套话
- 用「你」或「我们」视角
- 避免「首先其次最后」「综上所述」
- 段落短,2-3句一段
#### SEO优化
- 自然融入1-2个目标关键词
- 开头句包含核心关键词
- H3子标题有信息量
直接输出完整 Markdown 章节(包括标题和正文)。"""
if context:
+18 -1
View File
@@ -10,6 +10,7 @@ from apscheduler.triggers.cron import CronTrigger
from .generator import run_creator
from .optimizer import run_optimizer
from .sync import sync_all_topics
from .collector import run_collector
logger = logging.getLogger(__name__)
@@ -23,6 +24,14 @@ class TaskScheduler:
logger.warning("Scheduler already started")
return
# 使用 CronTrigger 设置每日固定时间点
self.scheduler.add_job(
self._run_collect,
CronTrigger(hour=1, minute=30),
id='scheduled_collect',
replace_existing=True,
max_instances=1,
coalesce=True
)
self.scheduler.add_job(
self._run_sync,
CronTrigger(hour=2, minute=30),
@@ -49,7 +58,7 @@ class TaskScheduler:
)
self.scheduler.start()
self._started = True
logger.info("Scheduler started with daily cron triggers (02:30, 03:30, 04:30)")
logger.info("Scheduler started with daily cron triggers (01:30 collect, 02:30 sync, 03:30 generate, 04:30 optimize)")
def shutdown(self):
if self.scheduler.running:
self.scheduler.shutdown()
@@ -79,6 +88,14 @@ class TaskScheduler:
except Exception as e:
logger.exception("[Scheduled] Optimization failed: %s", e)
def _run_collect(self):
try:
logger.info("[Scheduled] Starting topic collection...")
result = run_collector()
logger.info("[Scheduled] Collection completed: %s", result.get("output", "")[-200:])
except Exception as e:
logger.exception("[Scheduled] Collection failed: %s", e)
def _run_sync(self):
try:
logger.info("[Scheduled] Starting data sync...")