## ADDED Requirements ### Requirement: 智能选题推荐入口 系统 SHALL 提供 `TopicEngine` 类(`services/topic_engine.py`),暴露 `recommend_topics(count=5)` 方法,整合热点数据、历史权重、内容趋势,返回排序后的推荐选题列表。 #### Scenario: 有历史权重数据时推荐 - **WHEN** `content_weights.json` 中存在至少 5 篇笔记的权重数据 - **THEN** `recommend_topics()` SHALL 返回融合了热点分析和历史表现权重的推荐列表,每项包含 `topic`、`score`、`reason`、`source`("hotspot" / "weight" / "trend")字段 #### Scenario: 无历史数据时退回热点推荐 - **WHEN** `content_weights.json` 为空或不存在 - **THEN** `recommend_topics()` SHALL 仅基于热点探测结果返回推荐,`source` 全部为 "hotspot" #### Scenario: 推荐结果去重 - **WHEN** 热点数据和权重数据中存在语义相近的主题(如"春季穿搭"和"早春穿搭") - **THEN** 系统 SHALL 合并为一个推荐项,取较高分数,避免重复推荐 ### Requirement: 多维度选题评分 系统 SHALL 为每个候选主题计算综合评分,评分维度包括:热点热度(0-40 分)、历史互动权重(0-30 分)、内容稀缺度(0-20 分)、时效性(0-10 分)。 #### Scenario: 评分维度完整 - **WHEN** 调用 `score_topic(topic)` 方法 - **THEN** 返回的字典 SHALL 包含 `total_score`、`hotspot_score`、`weight_score`、`scarcity_score`、`timeliness_score` 五个字段,各分项之和等于 `total_score` #### Scenario: 已有高赞笔记的主题稀缺度降低 - **WHEN** 某主题在最近 7 天内已发布过 2 篇以上笔记 - **THEN** 该主题的 `scarcity_score` SHALL 不超过 5 分 ### Requirement: 选题附带创作角度 系统 SHALL 为每个推荐选题生成 1-3 个具体的创作角度建议(`angles` 字段),帮助用户快速进入创作状态。 #### Scenario: 角度建议格式 - **WHEN** `recommend_topics()` 返回推荐列表 - **THEN** 每项的 `angles` 字段 SHALL 为字符串列表,每个角度不超过 30 字,描述具体的切入点(如"从预算角度对比三款产品") ### Requirement: 热点数据整合 `TopicEngine` SHALL 通过调用 `hotspot.py` 的搜索功能获取实时热点数据,并通过 `analytics_service.py` 获取历史权重数据,不直接访问 MCP 或 LLM。 #### Scenario: 依赖注入 - **WHEN** 初始化 `TopicEngine` 时 - **THEN** 构造函数 SHALL 接受 `analytics_service: AnalyticsService` 参数,不在内部直接实例化依赖