小红书热点话题指南(SOP v2.1 · 通用版)
> 一句话:把「平台在推什么」和「你能靠它赚钱」拆成两条独立的线算,
> 中间用契合度搭桥,最后产出能直接发、也能直接拿去提案的选题清单。
一、技能定位与适用场景
定位
面向小红书内容选题的周期性洞察工作流:多公开源采集 → 清洗去重 → 三因子动量评分 →
三契合筛选 → 赛道配额精选 → 标题与脚本 Brief → HTML 报告 → QA 闸门验收。
核心设计哲学:动量与契合严格分离。
动量分只回答「平台在推什么」,契合度只回答「你借得动吗」。
混在一起加权出来的榜,看着科学,实际既蹭不到流量也接不到单。
适用
| 场景 | 适用性 |
|---|---|
| 个人博主定期找选题、排内容日历 | ✅ 本技能主场景 |
| 博主向品牌提案前,挑选有数据背书的切入点 | ✅ |
| 品牌方/代运营为达人矩阵做选题分发 | ✅ |
| 从热点反向倒推内容脚本(首图/节奏/植入点/标签) | ✅ |
| 跨平台<|hy_place▁holder▁no▁813|>到抖音/视频号做趋势预判 | ⚠️ 需自行替换数据源 |
不适用(硬边界,别硬来)
- 小红书官方后台真实热度值不公开。 本技能输出的是模型综合分(0-100),
用于横向排序,不能对外对赌、不能当成平台原值报给客户。 - 不接付费数据源(千瓜/新红/蝉妈妈付费版),只用公开可见内容。
- 不登录账号、不抓取个人后台数据,不触碰任何需要授权的私有数据。
- 不产出视频/图片素材,只产出选题决策与脚本 Brief(7 项字段)。
- Briefs 必须人工写。脚本/封面/植入点/标签组合只有账号主理人知道,
系统只能做骨架降级和 QA 拦截,不能代写。
二、触发条件与关键词
出现以下任一情况即应加载本技能:
显式触发
- 「小红书热点」「热门话题榜」「话题热度值」
- 「帮我找选题」「爆款选题」「内容日历」
- 「趋势洞察」「热点分析」「最近什么话题火」
- 「用小红书热点话题指南跑一下」
隐式触发
- 用户给出小红书账号 + 内容赛道 + 目标人群,要求出选题
- 用户要向品牌提案,需要数据支撑的话题切入点
- 周期性复用场景:「这个月再跑一次」
不触发
- 只问单个话题的数据查询(直接检索即可,不必走全流程)
- 要求生成/剪辑视频素材
- 要求接入官方后台真实数据
三、标准输入 / 输出格式
3.1 标准输入(用户最少给 4 项)
| # | 输入项 | 落点 | 必填 |
|---|---|---|---|
| 1 | 账号名 + 账号 ID | params.account |
✅ |
| 2 | 内容类型(人设)+ 最多 5 个赛道及配额 | params.tabs |
✅ |
| 3 | 目标人群(年龄段/城市线级/偏好) | params.audience |
✅ |
| 4 | 变现品类 + 时间窗口 | params.monetize / params.window |
✅ |
| 5 | 标题视角(personal_first / brand / dual) | params.title_pov |
选填,默认 personal_first |
| 6 | 报告深度(full / light / full+excel) | params.depth |
选填,默认 full |
3.2 标准输出
| 产物 | 说明 |
|---|---|
小红书热点话题洞察报告_<人设>_<起>_<止>.html |
五节:执行摘要 / 方法论 / TOP100 榜单 / 10 张深度卡 / 数据局限 |
topic_scores.csv |
全量评分池(UTF-8-BOM,12 列),Excel 直开不乱码 |
top10.json |
TOP10 结构化数据(含 params 快照,便于复现) |
qa_report.txt |
validate.py 输出,退出码 0 绿 / 2 黄 / 1 红 |
run_manifest.json |
本次运行的参数冻结快照 |
3.3 CSV 字段规范(12 列)
动量排名 | 话题 | 类目 | 热度值(动量综合分) | 热度增量 | 互动增量 | 流量扶持
| 原始热度证据 | 来源 | 时间分级 | 调性风险 | 采集窗口
> ⚠️ CSV 保留全量评分池,HTML 只渲染 TOP100。
> 两者行数天然不等,QA 按 min(TOPN, 池)+1 校验,不要写成 池+1。
四、内置参数表
4.1 params.json 完整 Schema
{
"account": {"name": "Maggie的小红书", "id": "105999974", "persona": "欧洲旅行/购物/看展/探店"},
"audience": {"age": "20-49岁", "city_tier": "一二线", "taste": "时尚高端 + 运动 + 美妆", "gender": "女"},
"monetize": ["时尚服饰", "美妆快消", "香氛"],
"tabs": {"旅行购物": 3, "看展美学": 3, "时尚美妆": 4},
"title_pov": "personal_first",
"window": "2026-10-12~2026-10-19",
"depth": "full",
"weights": {
"W_H": 0.40, "W_I": 0.30, "W_F": 0.30,
"W_P": 0.40, "W_A": 0.30, "W_M": 0.30,
"W_MOMENTUM": 0.60, "W_FIT": 0.40, "BONUS_NODE": 5
},
"ts_decay": {"1": 1.00, "2": 0.96, "3": 0.92},
"fit_min": 70.0,
"topn": 100,
"blacklist_extra": ["性暗示擦边", "医美前后对比"],
"auto_set_window": true
}
4.2 权重含义
| 键 | 含义 | 默认 |
|---|---|---|
W_H / W_I / W_F |
动量三分量:热度增量 / 互动增量 / 流量扶持 | 0.40 / 0.30 / 0.30 |
W_P / W_A / W_M |
契合三分量:人设契合 / 人群契合 / 变现契合 | 0.40 / 0.30 / 0.30 |
W_MOMENTUM / W_FIT |
综合分中动量与契合的占比 | 0.60 / 0.40 |
BONUS_NODE |
强时效节点(如大促截止)加成 | 5 分 |
ts_decay |
时间衰减:1=当周日榜 2=当月趋势 3=季度报告 | 1.00 / 0.96 / 0.92 |
fit_min |
契合门槛,不过 gate 不进 TOP10 | 70.0 |
4.3 candidates.json Schema
[
{"tag": "#阿普瑞风", "track": "时尚美妆", "p": 88, "a": 90, "m": 92, "bonus": 0}
]
p人设契合:你拍得出来吗(素材里有吗?人设会不会崩?)a人群契合:你的粉丝会看吗(年龄/城市/审美对得上吗?)m变现契合:品牌会为它买单吗(能不能自然植入?硬塞就不给过)bonus时效加成,默认 0
> 这三 个 0-100 分目前依赖人工标定,是整个链路里唯一的主观环节。
> 换账号时必须重打,不能照抄上一个账号的分值。
4.4 内置黑名单(14 词,硬剔除)
政策 / 国务院 / 两会 / 中央 / 领导人 / 性别对立 / 女权 / 男权 /
税务 / 监管 / 美联储 / 关税 / 选举 / 制裁
账号专属禁忌通过 blacklist_extra 追加,运行时自动合并去重。
4.5 已固化的踩坑清单(每次执行前扫一眼)
| 坑 | 固化对策 |
|---|---|
#红叶 / #赏枫 双占位重复计数 |
语义合并映射表必须强制走一遍 |
| 手填动量分导致与榜单错位 | mrank / mscore 必须程序化读 CSV;QA-5 逐条比对,发现手填直接红牌 |
topic_scores.csv 被 Excel 打开另存成 xlsx 二进制(文件头变 PK),下游脚本全废 |
validate.py 加 magic-byte 检查,命中即 FATAL;归档强制留 topic_scores_<run_id>.csv 备份 |
| 报告行数与 CSV 条数对不上 | 明确:CSV 留全量池、报告只渲染 TOP100;QA-7 按 min(TOPN,池)+1 校验 |
| 常青大词永远霸榜(#OOTD 之类) | 基础热度值不计分,只作参考列与同分破平 |
| 中后段名次被当精确排序 | 报告必须写死「约 70% 话题互动增量落默认分,中后段相邻名次不具显著性」 |
| 跨赛道递补突破原赛道配额 | 递补项打 supplement:True,QA-6 配额校验只算非递补项 |
换账号后新选题缺 Brief,report.py KeyError 崩溃 |
优雅降级为骨架卡(__NEEDS_BRIEF__),QA-7 红牌拦下,禁止带占位符交付 |
| TOP10 不足 10 条被误判红牌 | 改黄牌,要求报告显式写「本期无合格选题,禁止凑数」 |
4.6 通用化使用(v2.1 核心)
换一个新的小红书账号,只需要三步:
cp scripts/params.example.json params.json # 改账号/人群/变现/赛道配额/时间窗口
cp scripts/candidates.example.json candidates.json # 重打每条候选的 p/a/m
python score.py && python select.py && python report.py && python validate.py .
脚本中不存在任何账号专属硬编码:报告抬头、文件名(小红书热点话题洞察报告_<人设slug>_<窗口>.html)、
赛道名、配额、门槛、黑名单,全部从 params.json 读取。
五、S1–S10 工作流
每一步都写明 ①数据源 ②处理与计算 ③存储 ④异常处理 ⑤质量校验。
S1 参数冻结
| 项 | 内容 |
|---|---|
| ① 数据源 | 用户 brief(三.1 的 4-6 项) |
| ② 处理 | 8 个决策点填齐;使用了默认值的必须显式标注,不许静默补默认 |
| ③ 存储 | run_manifest.json |
| ④ 异常 | 必填项缺失 → 停止,回问用户,不猜 |
| ⑤ 校验 | 检查 window 格式合法、tabs 配额合计 = 10 |
S2 多源采集
| 项 | 内容 |
|---|---|
| ① 数据源 | 7 类公开源:①小红书热点/热搜榜 ②时尚·美妆·旅行类目榜 ③千瓜/新红公开报告 ④NeoDrop 日榜复盘 ⑤Vogue 等时尚媒体趋势白皮书 ⑥跨平台热搜回流(微博/抖音)⑦大促与节点日历(双11/黑五/圣诞市集/年末派对季) |
| ② 采集字段 | 九件套:话题名 | 热度原始值 | 热度增量 h | 互动增量 i | 流量扶持 f | 类目 | 来源 | 时间分级 ts | 调性风险 risk |
| ② 采集范围 | 时间窗口对齐 params.window(默认近 7 天),目标入池 110–130 条 |
| ② 更新频率 | 月度滚动,或大促/节点前按需重跑 |
| ② 关键约束 | 采集时即按档位把原始值映射到 0–100,禁止事后补分。事后补分 = 编数据 |
| ③ 存储 | topics_data.py(TOPICS 列表,dict 结构) |
| ④ 异常 | 单源 0 命中 → 换关键词重试 2 次 → 仍失败则记录并换备用源补采 |
| ⑤ 校验 | 入池 ≥ 110 条;类目 ≥ 5 个;来源 ≥ 5 类 |
> 档位映射参考:平台原生热度值 ≥100 万 → 90+;10 万级 → 75;万级 → 60;
> 互动环比 +100% 以上 → i ≥ 85。具体以当期数据分布为准,须在报告中写明映射依据。
S3 清洗去重
| 项 | 内容 |
|---|---|
| ② 字面去重 | norm(t) = strip().lstrip('#').replace(' ','').lower();命中则合并来源字段 |
| ② 语义去重 | 语义映射表强制执行(#红叶→#赏枫、#citywalk→#城市漫步 等)。疑似同义但无把握 → 不合并,仅标注「疑似同义」——错合并比不合并伤害大 |
| ② 禁忌剔除 | 14 词黑名单硬剔除 + blacklist_extra 追加 |
| ② 调性处理 | 调性有风险的话题 保留在榜但打 risk 标记交用户人肉判断,不静默删除 |
| ③ 存储 | dedup_log.csv(记录合并/剔除明细) |
| ④ 异常 | 干净池 < 100 → 如实少给,禁止凑数,并在报告中说明是干净池不足还是采集不足 |
| ⑤ 校验 | 重复率 ≤ 15%;禁忌词命中 = 0;类目 ≥ 5 |
S4 动量评分
S = (0.40 × h + 0.30 × i + 0.30 × f) × TS_DECAY[ts]
| 项 | 内容 |
|---|---|
| ② 计算 | 三因子加权后乘时间衰减(ts=1 不衰减,ts=2 ×0.96,ts=3 ×0.92) |
| ② 关键约束 | 基础热度值不计入分数,只作参考列与同分破平用——否则常青大词永远霸榜 |
| ② 排序 | S 降序;同分按话题名字典序破平(保证可复现) |
| ③ 存储 | topic_scores.csv,UTF-8-BOM,12 列 |
| ④ 异常 | h/i/f 缺失 → 禁止留空,用同类目中位数补并显式标注 |
| ⑤ 校验 | 分数 ∈ (0, 100];排名连续无跳号;归一化后无重复 |
S5 TOP100 榜单
| 项 | 内容 |
|---|---|
| ② 处理 | 取 S 降序前 topn(默认 100);同时追加写入 history/momentum_history.csv 供跨期对比 |
| ③ 存储 | 榜单(CSV 前 100 行)+ history/momentum_history.csv |
| ④ 异常 | 干净池不足 100 → 取全量,报告写明实际条数 |
| ⑤ 校验 | 排名 1..N 连续;条数 = min(topn, 干净池) |
S6 三契合筛选
契合度 F = 0.40 × p + 0.30 × a + 0.30 × m
综合分 = 0.60 × 动量分 + 0.40 × F + bonus
| 项 | 内容 |
|---|---|
| ② 计算 | p/a/m 来自 candidates.json;动量分与排名必须从 CSV 程序化读取,禁止手填 |
| ② 门槛 | F >= fit_min(默认 70)才进候选;落选记录写进报告「淘汰明细」 |
| ③ 存储 | candidates.json(标定值)+ top10.json(结果) |
| ④ 异常 | candidate 的 tag 在 CSV 中找不到 → 警告并跳过(疑似下榜或改名);track 不在 tabs 中 → 跳过 |
| ⑤ 校验 | QA-5 逐条比对动量一致性;QA-6 校验契合算式与门槛 |
S7 配额精选
| 项 | 内容 |
|---|---|
| ② 处理 | 过门槛项按赛道分组,组内按综合分降序,各取 tabs 配额;总和 = 10 |
| ② 递补 | 某赛道不足 → 跨赛道按综合分递补,递补项打 supplement:True(配额校验豁免) |
| ③ 存储 | top10.json |
| ④ 异常 | 全部候选不足 10 → 如实少给,报告写「本期无合格选题,禁止凑数」 |
| ⑤ 校验 | 非递补项满足配额;无重复话题;不足 10 条时判黄牌而非红牌 |
S8 标题 + 脚本 Brief
| 项 | 内容 |
|---|---|
| ② 标题公式 | 三条路:<br>A 数字钩子 + 身份标签 + 利益承诺(「3 个零游客机位」)<br>B 反常识 + 场景(「别只盯加拿大」)<br>C 圈层暗号 + 解决方案(「请 3 休 13」) |
| ② Brief 7 项 | angle 切入角度 / title 标题 / form 内容形式 / cover 首图 / rhythm 脚本节奏 / place 植入点 / tags 标签组合 |
| ② 广告法筛查 | 标题须过极限词检查(最/第一/顶级/国家级/根治/100%) |
| ③ 存储 | briefs.py(BRIEFS 字典,按 tag 索引) |
| ④ 异常 | 新话题无 Brief → 降级为骨架卡(__NEEDS_BRIEF__),禁止编内容填充 |
| ⑤ 校验 | QA-7 扫描占位符,命中即红牌 |
S9 HTML 报告
| 项 | 内容 |
|---|---|
| ② 结构 | 五节:执行摘要 → 方法论(含评分规则)→ TOP100 榜单 → 10 张深度卡 → 数据局限说明 |
| ② 视觉 | 白底 / 近黑 / 衬线标题 / 细线分隔(高端时尚风),与已有交付物保持同源 CSS 基线 |
| ② 必写 | 数据局限说明必须写,且须包含「约 70% 话题互动增量落默认分,中后段名次不具显著性」 |
| ③ 存储 | 小红书热点话题洞察报告_<人设slug>_<窗口>.html |
| ④ 异常 | 缺 Brief / 缺数据时,宁可降级为骨架卡并在报告标注,也不静默省略 |
| ⑤ 校验 | 表格行数、卡片数、占位符(QA-7) |
S10 质检验收
| 项 | 内容 |
|---|---|
| ① 输入 | topic_scores.csv + top10.json + HTML 报告 |
| ② 校验项 | QA-1 条数与排名连续性<br>QA-2 禁忌零命中 + 类目覆盖 ≥5<br>QA-3 分数域与必填完整性<br>QA-4 归一化后无重复<br>QA-5 TOP10 动量与 CSV 一致(禁手填)<br>QA-6 门槛与配额<br>QA-7 报告完整性(含 magic-byte 检查) |
| ② 退出码 | 0 = 绿(可交付)<br>2 = 黄(可交付但须说明,如含递补项/类目偏窄/不足 10 条)<br>1 = 红(禁止交付,回退修复,不许降级通过) |
| ③ 存储 | qa_report.txt + 归档 topic_scores_<run_id>.csv 备份 |
| ④ 异常 | 红灯 → 定位到具体 QA 项 → 回退到对应步骤修复 → 重跑,不接受「差不多算了」 |
六、执行约束与边界
6.1 硬约束(违反即红牌)
- 动量与契合严格分离——动量不掺契合,契合不改动量。
- 动量分禁止手填——必须程序化读 CSV。
- 干净池不足 100 时如实少给,禁止用低质话题凑数。
- Brief 禁止编造——新话题降级为骨架卡 + QA 拦截。
- 红灯不许交付,不许「降级通过」。
- 数据局限必须在报告中写明,不许只在对话里说。
- 报价等敏感商业信息绝不写入对外 HTML 报告——报告是要给品牌方看的。
6.2 已知待办(下一版解决)
candidates.json的p/a/m仍依赖人工标定,其中m(变现契合)是全链路唯一无分项支撑的主观分。
拟替换为分项加权:m = 0.35×渠道可载 + 0.30×品类匹配 + 0.20×层级匹配 + 0.15×排他无冲突。
所需 11 个变现字段(6 必填)与字段说明见
xhs_workflow/变现信息需求与指令模板.html。- v3.0 拟将脚本结构 / 视觉基线 / 标签池 / 植入位置进一步配置化。
当前版本冻结在 v2.1,不做 v3.0 重构——短期单账号场景下收益不抵改造成本。
七、参考实现
scripts/ 下脚本按序执行:
cd <工作目录>
# 0. 准备配置
cp <skill>/scripts/params.example.json params.json
cp <skill>/scripts/candidates.example.json candidates.json
cp <skill>/scripts/topics_data.py . # 需替换为当期采集数据
# 1. 跑链路
python score.py # S3+S4+S5 → topic_scores.csv
python select.py # S6+S7 → top10.json
python report.py # S9 → HTML 报告(内部 import briefs.py)
python validate.py . # S10 → qa_report.txt,退出码 0/2/1
| 脚本 | 阶段 | 职责 |
|---|---|---|
topics_data.py |
S2 | 原始话题池(样例 119 条,2026-10-12~10-19 窗口) |
score.py |
S3-S5 | 清洗去重 + 三因子评分 → topic_scores.csv |
select.py |
S6-S7 | 三契合 + 配额 + 跨赛道递补 → top10.json |
briefs.py |
S8 | 标题 + 7 项脚本 Brief(按 tag 索引) |
report.py |
S9 | HTML 报告生成(读 params.json 拼抬头与文件名) |
validate.py |
S10 | QA 闸门,退出码 0 绿 / 2 黄 / 1 红 |
校验过的输出(2026-10-19 基线)
TOP10 逐字一致:阿普瑞风 / OOTS / 双11预售清单 / 赏枫 / 宝格丽万花绮镜 /
麂皮绒接管秋冬衣橱 / 换季换香秋冬木质香 / 请3休13法意游 / 维也纳美景宫·花的姿态 / 在场入梦照片展。
validate.py 全绿,退出码 0。换账号配置跑对照测试亦通过。
八、历史版本
| 版本 | 路径 | 状态 |
|---|---|---|
| v1.0 | ~/.workbuddy/skills/小红书热点话题洞察_个人账号__archived_2026-10-19/ |
已退役归档,勿用 |
| v2.0 | — | 被 v2.1 覆盖 |
| v2.1 | ~/.workbuddy/skills/小红书热点话题指南/ |
当前版本(通用化) |
| — | ~/.workbuddy/skills/小红书热点趋势分析和洞察_AMV/ |
American Vintage 品牌版 v2.2,独立基线,别混用 |
> 💡 技能目录外的工作副本(脚本 + 当期数据)保留在 workspace 的 xhs_travel_beauty/。
> SKILL.md 若被环境清理,可从该目录的脚本反推重建;建议同时保留一份 HTML 工作流手册。