feat: 审查流程优化+采集定时调度+全链路LLM提示词升级
- 审查:移除 manual_review,改为迭代LLM修复(最多3次),合规分回写Topic - 调度:scheduler 新增话题采集定时任务 scheduled_collect (01:30) - 提示词:全链路8文件≈24个提示词升级,增强SEO/平台推荐/真人感
This commit is contained in:
@@ -78,13 +78,9 @@ def trigger_review(topic_ids: List[str] = Body(None, embed=True), db: Session =
|
||||
report = result.get("report")
|
||||
if report and report["summary"]["total_articles"] > 0:
|
||||
s = report["summary"]
|
||||
passed = s["passed_auto"]
|
||||
manual = s["need_manual"]
|
||||
total = s["total_articles"]
|
||||
avg = s["average_score"]
|
||||
msg = f"审查完成: {total} 篇, {passed} 篇通过 ({avg:.0f}分)"
|
||||
if manual:
|
||||
msg += f", {manual} 篇需人工处理"
|
||||
msg = f"审查完成: {total} 篇全部通过 ({avg:.0f}分)"
|
||||
return {"message": msg, "summary": s}
|
||||
else:
|
||||
if topic_ids:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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...")
|
||||
|
||||
@@ -37,7 +37,7 @@ def import_initial_data():
|
||||
default_llm = LLMConfig(
|
||||
name="default_expand",
|
||||
system_prompt="你是一个专业的内容创作者。",
|
||||
user_prompt_template="""你是一个专业的内容创作者,风格精炼、直接、切中要点。请将以下大纲扩展为完整的文章章节,要求如下:
|
||||
user_prompt_template="""你是一个专业的内容创作者,擅长将大纲要点扩展为读者爱看+搜索引擎友好的完整章节。
|
||||
|
||||
### 选题信息
|
||||
标题:{topic.get('title')}
|
||||
@@ -51,12 +51,22 @@ def import_initial_data():
|
||||
{section_content}
|
||||
|
||||
### 输出要求
|
||||
#### 内容价值
|
||||
- 以 "## {section_title}" 开始
|
||||
- 字数:200-300 字(精炼为主)
|
||||
- 语言:直白、有冲击力,避免空洞套话
|
||||
- 使用 Markdown 格式
|
||||
- 200-300字,精炼有力
|
||||
- 每个论点配具体案例或数据支撑
|
||||
- 确保与整体文章调性一致
|
||||
- 回答读者「所以呢」——为什么对他有用
|
||||
|
||||
#### 语言风格
|
||||
- 直白有冲击力,避免空洞套话
|
||||
- 用「你」或「我们」视角
|
||||
- 避免「首先其次最后」「综上所述」
|
||||
- 段落短,2-3句一段
|
||||
|
||||
#### SEO优化
|
||||
- 自然融入1-2个目标关键词
|
||||
- 开头句包含核心关键词
|
||||
- H3子标题有信息量
|
||||
|
||||
直接输出完整 Markdown 章节(包括标题和正文)。""",
|
||||
temperature=0.8,
|
||||
|
||||
Reference in New Issue
Block a user