文章内容创作 · 热点与本地资料双选题
这是一个内容创作 skill:话题可以来自网络热榜,也可以来自本地资料库,但终点都是「一篇能直接发布的文章」。
- 工作流 H(网络选题):热榜 → 10 条候选 → 选定 → 写作简报 → 成稿
- 工作流 A(本地选题):资料 → 关键词蒸馏 → 排产表 → 话题标题 → 成稿
- 工作流 B(成稿生产线):选话题 → 回溯资料 → 定平台 → 成稿 → 配图 → 排版
何时使用
- 用户说「写篇文章」「写篇公众号 / 小红书 / 知乎」「帮我出个稿」
- 用户说「找点热门话题」「最近有什么热点可以写」「追个热点」
- 用户给一个文件夹或一批资料,说「提关键词」「找关键词」「关键词蒸馏」,随后要成稿
- 用户要「关键词排产」「选题计划」「内容日历」「按优先级安排产出顺序」
- 用户要把品牌资料 / 产品手册 / 客服问答 / 行业报告转成内容矩阵
- 用户给出行业或品牌,要求「先做核心词,再补长尾和场景」
- 用户从话题表里挑了一个话题,说「就写这个」「发公众号」「配个图」「排版好」
能力边界
- 只读源文档,绝不修改、移动、删除用户文件。
- 工作流 A 不联网取搜索量,热度用「语料词频 × 文档覆盖度」代理,结论中要说明这一点,不要编造百度指数/小红书笔记数。
- 工作流 H 会联网抓热榜。热度、排名必须来自实际抓到的页面;抓不到具体数字就留空,绝不估算或套用「阅读量 1.2 亿」这种没看到原文的说法。
- 网络来源必须带 URL。没有 URL 的来源标「未核验」,成稿里不得把它当作唯一依据。
- 扫描版 PDF(无文本层)、旧版
.doc/.ppt/.xls解析不出内容,遇到要如实报出文件名与原因,不要静默跳过。 - 不做竞品数据抓取;对比词只从语料里识别,缺竞品时提示用户补充。
- 成稿不编事实:价格、规格、占比、销量等数字只能来自
brief.json的facts,gaps里的问点必须标「待确认」或回头问用户。 - 配图不做虚假产品图:AI 只生成氛围图/场景图,实物包装必须用真实素材。
第 0 步 · 先问话题从哪来(每次调用都问)
动手前先问一句,不要默认走本地资料:
> 这次的话题,想从网络上抓热门,还是从你手上的资料里提取?
用 AskUserQuestion 给两个选项:
| 选项 | 说明 |
|---|---|
| 网络热门话题 | 我搜微博/知乎/小红书/抖音当下热榜,列 10 条给你挑 |
| 本地资料库 | 把你手上的文档跑一遍关键词蒸馏,按排产表出话题 |
路由:
| 用户回答 | 走哪条 |
|---|---|
| 网络热门话题 | 工作流 H(H1 → 用户挑选 → H3 → B3 起) |
| 本地资料库 | 工作流 A → B1 |
| 说不清 / 「你看着办」 | 追问一句「有没有已经想写的方向?」有方向走 H2 定向搜;完全没方向才走 A |
已经带着明确选题来的用户(「就写 XX」),不要多问这一层,直接进 B2/B3——第 0 步是给「不知道写什么」的人用的。
用户开口就点明路线的(「把这个文件夹做关键词蒸馏」「帮我追个热点」),也不重复问,说一句「按你选的本地/网络路线走」即可。只有没说清的时候,这一步必须问,不许默认。
运行环境
脚本:scripts/kw_pipeline.py(本 skill 目录下)。
| 子命令 | 作用 |
|---|---|
hot |
归一化网络热榜条目:去重、排序、编号 H01–H10 |
webbrief |
把网络调研证据整理成与 trace 同构的 brief.json |
extract |
递归解析文件夹 → corpus.json |
mine |
分词统计 + 句式挖掘 + 聚类 → candidates.json |
peek |
紧凑打印候选词(模型审阅用,避免整份 JSON 进上下文) |
apply |
把蒸馏判断合并回候选 → distilled.json |
build |
生成 xlsx 双表 + markdown 预览 |
topics |
打印可选话题表(T01…),供用户挑选 |
trace |
话题 → 原始资料:命中文件、可引用证据、硬事实、证据缺口 → brief.json |
sections |
文章切成 P01… 段落,标出建议配图位 → sections.json |
imageplan |
生成配图计划:锚点、图注、AI 提示词/本地图分配 → plan.json |
media |
按平台规格裁切压缩(3:4、1080 宽、体积控制) |
render |
按平台规则排版:公众号 HTML(内联样式)/小红书·知乎·抖音 md |
候选词有两条来源:分词通道(词与名词短语,产出核心词/扩展词/意图词)和句式通道(整句疑问句与对比句,产出问题词/对比词)。后者不能省——分词在动词处断句,永远切不出「每日坚果孕妇能吃吗」,而这正是 AI 搜索最常引用的形态。
解释器:先试 python,用 python -c "import openpyxl" 验证;不可用则用
C:/Users/admin/.workbuddy/binaries/python/versions/3.13.12/python.exe。
依赖:openpyxl 必需;jieba、python-docx、pypdf、python-pptx 强烈建议(缺 jieba 会自动降级为字符 n-gram,词表噪音明显变多);Pillow 用于配图裁切(缺了会降级为原图复制,不裁切)。缺哪个装哪个:
<PY> -m pip install openpyxl jieba python-docx pypdf python-pptx pillow
工作流 H · 网络热门话题
三个关卡:抓榜 → 用户挑 → 接成稿。抓榜用 WebSearch,后面全靠脚本收敛。
H1 · 抓一轮热榜,列前 10 条
不带领域先抓一轮。至少搜 4 次,覆盖不同平台和不同问法,别只搜一次就凑数:
微博热搜 今天/微博 热搜榜 <当前年月>知乎热榜 今天小红书 热门话题 <行业词>抖音 热点榜 今天- 垂类问法:
<行业词> 最近 讨论 热搜(例:零食 坚果 送礼 最近 讨论)
把结果整理成 hot_raw.json(字段见 references/hot-topic-sources.md),每条必须写 2–4 个 terms——热榜标题是整句,后面检索资料时靠 terms 才能命中:
{"source": "微博热搜 / 知乎热榜 / 小红书 综合", "query": "零食 坚果 送礼 热搜",
"items": [
{"rank": 3, "title": "每日坚果到底是不是智商税", "platform": "知乎", "heat": "热榜第 3 位,回答 1200+",
"angle": "拆配料表和单价", "terms": ["每日坚果", "智商税", "性价比"],
"questions": "配料表怎么看;单价多少合理;和散装比贵在哪", "url": "https://www.zhihu.com/hot"}
]}
<PY> <SKILL>/scripts/kw_pipeline.py hot --in hot_raw.json --out "<工作目录>/.kw/hot.json"
脚本会去掉重复同题(「每日坚果是不是智商税」和「每日坚果到底是不是智商税」会合成一条)、按 rank 排序、编号 H01–H10,打印成表格。
把这张表贴给用户,问选哪条。贴表格,不要贴 JSON;AskUserQuestion 一次只放得下 4 个选项,所以用文本给 10 条 + 一句「回复编号就行」。
数量不足 10 条会告警,此时补搜一轮再跑,不要拿 6 条硬凑。
H2 · 用户都不感兴趣 → 问方向,再搜 10 条
不要重贴同一批。先问方向:
> 这批里没有合适的?那你更想写哪个方向?
给 4 个按业务推的选项(例:产品科普 / 选购避坑 / 价格与促销 / 行业观察 / 招商加盟),允许用户自己填。
拿到领域词后带领域重搜一轮(query 里同时放领域词和平台名,例如「咖啡 加盟 热搜」「控糖 零食 小红书 热门」),结果写成 hot_raw2.json:
<PY> <SKILL>/scripts/kw_pipeline.py hot --in hot_raw2.json --tag 咖啡 --out "<工作目录>/.kw/hot2.json"
--tag只是过滤,不解决「搜不到」:提示 0 命中时说明这一轮没搜到该领域的榜,换 query 重搜,不要把上一轮的表当结果交差。- 最多重搜 3 轮。仍没有就直说「这个方向近一周没有明显热点」,给两条出路:转本地资料库(工作流 A),或直接按方向自拟一个话题走
trace --free。
H3 · 接成稿
选定 H03 后,先把这条热点相关的外部原文整理成 research.json(结构见 references/hot-topic-sources.md 第七节),再按「有没有本地资料」分两条:
有本地资料库(首选):热点 + 自有素材,观点有据、产品能落地
# 1) 先在本地资料里找证据
<PY> <SKILL>/scripts/kw_pipeline.py trace --seed "<工作目录>/.kw/hot.json" --pick H03 \
--corpus "<工作目录>/.kw/corpus.json" --out "<工作目录>/.kw/H03.local.json"
# 2) 再把这一轮网络检索的原文并进来(证据缺口按两边一起判)
<PY> <SKILL>/scripts/kw_pipeline.py webbrief --research research.json \
--merge "<工作目录>/.kw/H03.local.json" --out "<工作目录>/.kw/H03.brief.json"
--seed 会自动当作表外话题处理,用条目里的 terms 检索,questions 用来查证据缺口。只跑前一条命令也能用,但热点常涉及本地资料没有的外部数据(行业均价、政策、竞品动向),补上网络证据才不容易写空。
没有本地资料:只要网络证据
<PY> <SKILL>/scripts/kw_pipeline.py webbrief --research research.json \
--out "<工作目录>/.kw/H03.brief.json"
research.json 要求:每条 sources 至少 2 段原文(各 ≥10 字)+ URL;facts 只放带数字的句子。短句、无 URL、无原文的来源会被跳过或标「未核验」,并在输出里点名——这是脚本在替你守住「不编事实」,不要为了好看去补 URL。
两条路都产出同构的 brief.json,之后接 B3 · 问平台和篇幅,与本地路线完全一致。
热点的额外要求(写稿时执行):
- 标题沿用热榜原话的问法(「到底是不是智商税」),别改成四平八稳的百科标题——用户就是照那句话搜的
- 热点有保鲜期,
brief.json里meta.generated_at超过 3 天就别再发,重新抓一轮 - 不要硬贴品牌。热点与产品无关时,正文可以不提产品,只在结尾给一句相关建议
工作流 A · 关键词蒸馏与排产
A0 · 确认输入
必须明确三件事,缺一件就问(一次问完,别挤牙膏):
- 源文件夹绝对路径。
- 业务身份:语料是自有品牌、竞品资料,还是纯行业材料?——决定哪些词算「品牌词」。
- 输出位置:默认放在源文件夹的同级,
<源目录名>_关键词报告.xlsx。
路径不明确时先 ls/Glob 看目录内容再问,不要空手追问。
中间产物统一放 <输出目录>/.kw/,不要污染源目录。
A1 · 抽取文本
<PY> <SKILL>/scripts/kw_pipeline.py extract --src "<源目录>" --out "<工作目录>/.kw/corpus.json"
读返回值:
- 解析成功文件数 / 总文件数。成功率 < 60% 就停下来,把跳过清单和原因报给用户,让其补齐或另存格式,不要带着残缺语料往下跑。
- 总字符数 < 5000 说明语料太薄,关键词表会是噪声,直接告知用户。
A2 · 挖候选词
先加白名单再跑,避免品牌名被切碎:
<PY> <SKILL>/scripts/kw_pipeline.py mine \
--corpus "<工作目录>/.kw/corpus.json" \
--out "<工作目录>/.kw/candidates.json" \
--extra-words <品牌词> <产品词> <竞品词>
参数:--min-freq(默认 2,语料小时设 1)、--top(默认 400)、--dup-ratio(默认 0.86)。
跑完 peek --stats 看类型分布与簇数,超过 200 个簇时以 --top 150 重跑,只蒸馏头部(长尾边际价值递减,且人工判断质量会滑坡)。
A3 · 蒸馏(核心步骤,禁止跳过)
先读 references/keyword-taxonomy.md,它是分类与去重的唯一判据。
分批审阅候选,每批 60–80 条:
<PY> <SKILL>/scripts/kw_pipeline.py peek --candidates "<工作目录>/.kw/candidates.json" --limit 80 --offset 0
<PY> <SKILL>/scripts/kw_pipeline.py peek --candidates "<工作目录>/.kw/candidates.json" --limit 80 --offset 80
逐条判断,写成 decisions.json。只写判断,不要抄词频/得分/变体——那些由 apply 从 candidates 自动回填,手抄必错。id 和 keyword 二选一定位:知道 id 就写 id,只记得词面就写 keyword(apply 会连变体一起匹配;匹配不到的按人工补充处理,频次记 0)。
{
"title": "<品牌/主题> 关键词蒸馏与内容排产报告",
"decisions": [
{
"id": "C0001", "keep": true, "keyword": "每日坚果",
"type": "核心词", "subtype": "产品词", "priority": "核心", "intent": "中",
"reason": "主推产品词,跨 12 篇文档出现 128 次",
"topic": "每日坚果是什么?配料、营养与选购全景",
"format": "产品全景页", "platform": "官网 blog / 知乎",
"length": "2000–3000 字",
"questions": "配料构成;每日建议摄入量;如何辨别添加糖"
},
{ "id": "C0032", "keep": false, "keyword": "每日坚果旗舰",
"merged_into": "每日坚果", "reason": "包含归并:频次仅为长词 4%" }
],
"extra": [
{ "keyword": "竞品名", "type": "核心词", "subtype": "品牌词", "priority": "中",
"intent": "低", "reason": "语料提及但未成簇", "topic": "A vs B:5 个维度实测对比" }
]
}
decisions 每个字段的含义、以及话题标题的骨架模板,见 references/table-schema.md。
蒸馏必须满足的四条硬要求:
- 去重彻底:同义/近义/包含关系的写法合成一个词簇,其余进变体,绝不各占一行排产位。被合并的每一条都要在 decisions 里留
keep:false+merged_into+reason,最终产出「合并剔除记录」表供复核——静默丢弃等于没做。 - 分类互斥:一个词只归一类。冲突时按
意图词 > 对比词 > 问题词 > 扩展词 > 核心词取先。核心业务主词即便含交易意图,仍归核心词并在subtype注明。 - 优先级比例:核心 5–12 个且必须 ≥3 个;「高」不超过总数 35%;「中」不超过 40%。比例失衡说明门槛错了,回头调
--min-freq重跑,不要硬凑。 - 每词都要话题:
topic必须是可直接发布的标题(18–26 字、含数字或明确信息承诺),不能是关键词复读。
写完执行:
<PY> <SKILL>/scripts/kw_pipeline.py apply \
--candidates "<工作目录>/.kw/candidates.json" \
--decisions "<工作目录>/.kw/decisions.json" \
--out "<工作目录>/.kw/distilled.json"
返回值里「未表态候选」若 > 0,说明有候选没被审到——要么补判断,要么明确告诉用户「已按 top N 截断,剩余 M 个低频词未纳入」。
A4 · 出表
<PY> <SKILL>/scripts/kw_pipeline.py build \
--distilled "<工作目录>/.kw/distilled.json" \
--out "<输出目录>/<名称>_关键词报告.xlsx" \
--md "<输出目录>/<名称>_关键词报告.md" \
--corpus "<工作目录>/.kw/corpus.json"
生成的 xlsx 含四个工作表:概览(首屏)、关键词蒸馏表、优先级排产表、合并剔除记录。
排产表按 波次 W1→W4 排列,波次内再按 核心 > 高 > 中 > 低、同优先级按得分降序,序号即生产顺序:
| 波次 | 内容 |
|---|---|
| W1 核心打底 | 全部核心词,每词 1 篇主文 |
| W2 问题抢占 | 问题词(AI 搜索命中率最高) |
| W3 对比意图 | 对比词 + 意图词 |
| W4 长尾补齐 | 场景词 + 中低频长尾 |
用 present_files 交付 xlsx,并在回复里贴 markdown 的表格节选(蒸馏表前 10 行 + 排产表前 10 行足够),不要把整张表贴满屏。
A5 · 交付前自检
逐条确认,不过就回去改:
- [ ] 核心词 ≥3 个,且都是真实的品牌/产品/行业词,不是文档里的通用词
- [ ] 没有任何两行是同一个意思(抽查变体列,若两行的变体互相包含 → 合并失败)
- [ ] 「高」占比 ≤35%,「中」≤40%
- [ ] 问题词全部是疑问句式,不是陈述句;数量不少于问题类语料的 8 成
- [ ] 对比词都识别出了 ≥2 个可比对象
- [ ] 每条
reason非空且说清了保留逻辑 - [ ] 每条
topic都是能直接发的标题,含数字或明确信息承诺 - [ ] 排产表 W1 的每一行都是核心词,且核心词全部进了 W1
- [ ] 「合并剔除记录」非空(有去重就有记录)
工作流 B · 话题到成稿
七个关卡,每一关都要停下来等用户回答,不要一次问完所有问题,也不要替用户做决定。前四关是选择,后三关是执行。
从工作流 H 进来的,话题已经定了,跳过 B1,直接从 B2(有本地资料)或 B3(无本地资料、已用 webbrief)继续。
B1 · 让用户选话题
<PY> <SKILL>/scripts/kw_pipeline.py topics --distilled "<工作目录>/.kw/distilled.json" \
--out "<工作目录>/.kw/topics.json"
不要一次把整张话题表贴满屏。按波次给:先贴 W1 核心词(5–8 条),说明「后面还有 W2 问题词 N 条、W3 意图对比 N 条」,问用户要写哪个。用 AskUserQuestion 给 3–4 个候选更省事,选项写「关键词 + 话题标题」,让用户能看懂要写的是什么。
用户也可能自带话题。两种都要接:
- 用户选的是表内话题 → 直接进 B2,用 T 编号定位最准。
- 用户自带话题 → 先判断是否等价于表内某条(同义、包含关系)。等价就用表内那条;不等价就按用户的话走 B2 的自由话题模式,并且说明这个词不在排产表里,问要不要顺手补进表。
B2 · 回溯这个话题用到的资料
<PY> <SKILL>/scripts/kw_pipeline.py trace \
--distilled "<工作目录>/.kw/distilled.json" \
--corpus "<工作目录>/.kw/corpus.json" \
--topic "T03" \
--out "<工作目录>/.kw/T03.brief.json"
--topic 接受 T 编号、话题标题、关键词三种写法。匹配不上会列出最接近的 5 条并退出,此时把候选贴给用户确认,不要自己猜。
跑完读输出(不要整份 brief.json 进上下文,只在需要时读 sources[].evidence 的具体段落):
- 命中资料几篇——0 篇说明这个话题在语料里没根基,必须告诉用户「资料里没有这个话题的内容,需要补充资料或换个话题」。
gaps证据缺口——这些问点不能编。要在写之前告诉用户「以下 3 个点在资料里没找到答案,我会标待确认 / 你补充一下」。facts——所有数字的唯一来源。
自由话题模式:用户给的话题不在表里,或根本没有跑过排产表时,加 --free 跳过匹配,用 --terms 给检索词、--questions 给必须回答的问点:
<PY> <SKILL>/scripts/kw_pipeline.py trace --free \
--corpus "<工作目录>/.kw/corpus.json" \
--topic "坚果礼盒送人怎么选" --terms 坚果礼盒 送礼 长辈 \
--questions "预算怎么分档;包装体面度;送长辈的忌讳" \
--out "<工作目录>/.kw/送礼.brief.json"
B3 · 问平台和篇幅
只问一次,给清楚选项:
- 发哪里:公众号 / 小红书 / 知乎 / 抖音图文 / 官网长文(可多选)
- 篇幅:跟着平台默认走(公众号 1500–2500、小红书 600–900、知乎 2000+),除非用户另有要求
平台的硬规则见 references/platform-specs.md。用户选多个平台时,一篇主稿写完再改写成各平台版本——不要为每个平台单独写一遍,会前后矛盾。
B4 · 写初稿
按 references/content-playbook.md 选骨架(distilled.json 里每个词都有 format),用 brief.json 的 evidence 和 facts 组织内容,questions 字段里的问点逐条回答。
写成 markdown,放在 <工作目录>/draft.md,带 frontmatter:
---
title: 每日坚果是什么?配料、热量与选购全景
digest: 一袋 25g 里到底装了什么?从配料表到热量账,一次讲清。
---
正文……
写完先给用户看正文,不要直接排版。用户会改观点、改语气、删段落——排版完再改,锚点和字体全要重做。
B5 · 问是否需要段落配图
初稿确认后问一句:「要不要给段落配图?」用户说不要就跳到 B7。
要的话先切段,把可配图的位置摆给用户:
<PY> <SKILL>/scripts/kw_pipeline.py sections --article "<工作目录>/draft.md" \
--out "<工作目录>/sections.json"
输出里 ★ 是建议位。给用户看的是「段落编号 + 开头十几个字 + 为什么建议配图」,让用户挑,不要默认全配。用户说「你看着办」时,按 content-playbook.md 第四节的标准自己挑 3–5 段,并把选择理由说清楚。
B6 · 问配图来源,然后配图
选定段落后问:「用你自己的图片,还是 AI 生成?」两者都要先出计划:
# AI 生成
<PY> <SKILL>/scripts/kw_pipeline.py imageplan --sections sections.json \
--picks P04,P07,P10 --mode ai --brief brief.json --platform xhs --out plan.json
# 本地素材
<PY> <SKILL>/scripts/kw_pipeline.py imageplan --sections sections.json \
--picks P04,P07 --mode local --images "<素材目录>" --platform wechat --out plan.json
- AI 生成:逐条读
plan.json里的prompt,用生图工具一张一张生成,存到同一个目录,再media --plan plan.json --fill-dir <目录>按序补位。 - 本地素材:用
ViewImage逐张确认内容和段落对得上再用,不要只看文件名。素材不够就明确告诉用户缺几张。
<PY> <SKILL>/scripts/kw_pipeline.py media --plan plan.json --out out/<平台> --platform wechat
B7 · 按平台排版并交付
<PY> <SKILL>/scripts/kw_pipeline.py render --article draft.md --platform 公众号 \
--plan out/wechat/plan.json --out "out/wechat/<名称>_公众号版.html"
多个平台就每个平台各跑一次 media + render(media 会在各自目录写平台专用的 plan.json,互不覆盖)。
render 的规则体检要看完:标题超长、正文字数越界、标签缺失都是必须处理的问题,把结论如实报给用户,不要只报「已生成」。
最后用 present_files 交付:HTML 会直接预览,md 作为文件给出。
回复用户的格式
工作流 H(热门话题)
- 说明抓了哪几个平台的榜、什么时候抓的、共多少条。
- 表格:编号、话题、平台、热度、可写角度(10 条)。
- 一句「回复编号就行,也可以说要换方向」。
- 用户选定后:这条热点对应哪些资料、证据缺口在哪,再问平台。
工作流 A(关键词)
- 一句话结论:扫了多少文件、蒸出多少词、分了几类。
- 蒸馏结果:markdown 表格,按类型分组,每组列代表词 + 优先级。
- 排产计划:W1–W4 各自的篇数与首批话题标题(3–5 条样例)。
- 需要用户决策的点:语料缺口(如「没有竞品资料,对比词只有 2 条」)、被跳过的文件。
- 交付文件路径。
工作流 B(成稿)
- 这个话题命中了哪几篇资料(文件名 + 命中次数),让用户知道文章的数据从哪来。
- 证据缺口:哪些问点资料里没有,打算怎么处理。
- 正文(或正文文件),标题与字数。
- 配图清单:段落编号 → 图注 → 来源(本地/AI)。
- 排版体检结论 + 各平台交付文件路径。
常见故障
| 现象 | 处理 |
|---|---|
| 品牌名被切成「三只」「松鼠」 | 用 --extra-words 加白名单重跑 mine |
| 候选里混入目录项、页眉页脚 | 在 decisions 里 keep:false,原因写「噪声剔除」,不要只丢不说 |
| 词表里全是单字/碎片 | jieba 没装上,装了重跑;或提高 --min-freq |
| 一个问题词/对比词都没有 | 语料里没有问句形态。先 peek --type 问题词 确认,再让用户补 FAQ/客服记录类文档 |
apply 报「没有任何 keep=true 的词」 |
decisions 全被标成 keep:false;检查 keep 是否写成了字符串 "false"(脚本会自动纠正并告警) |
| 排产表铺满「高」 | 优先级门槛太低,回 A3 按比例重新分配 |
| 「未表态候选」数量很大 | 正常,说明只蒸馏了头部。交付时明确告知截断的尾部数量 |
| xlsx 打不开 | 检查输出路径是否被 Excel 占用,换文件名重试 |
trace 报「没能确定是哪个话题」 |
用 T 编号或完整标题重试;或把用户原话拆成几个关键词用 --terms 传入 |
trace 命中 0 篇 |
话题超出语料范围。要么让用户补资料,要么改写成语料覆盖得到的角度 |
trace 命中一堆不相关文档 |
拆句实词里混进了高频词;用 --terms 显式指定检索词,脚本会自动丢掉覆盖率 >60% 的实词 |
| 配图错位到别的段落 | 一定是 draft.md 在 sections 之后改过。重跑 sections 和 imageplan,锚点不会自动跟随改稿 |
media 提示「已放大,可能发虚」 |
原图太小。换图,不要硬放大;实物图更不能用 AI 补 |
| 公众号 HTML 粘贴后没图 | base64 被编辑器过滤。用 --no-embed 重排,再从 assets/ 手动上传图片 |
| 小红书正文超 1000 字 | 不是排版的错,是稿子长了。回 B4 删减,不要靠截断 |
| 热榜总是凑不满 10 条 | 只搜了一个平台。补搜微博/知乎/小红书/抖音 + 垂类问法,再跑一次 hot |
| 热榜里全是明星八卦、与业务无关 | 换垂类 query(行业词 + 品类词 + 最近),并给每条加 tag,用 --tag 过滤 |
hot 提示「0 条命中,已回退显示全部」 |
这一轮没搜到该领域,换 query 重搜;不要拿回退结果当领域答案 |
trace --seed 命中 0 篇 |
条目没写 terms,整句标题当检索词了。回 hot_raw.json 补 2–4 个检索词再跑 |
webbrief 说「来源没有可用原文」 |
只记了结论没记原文。回到搜索页把原句摘下来(≥10 字),或换更权威的来源 |
webbrief 标了「未核验」 |
来源没 URL。补 URL;补不到就在成稿里降级为「有说法称」,不当硬数据 |
| 热点文章发布时热度已过 | brief.json 的 meta.generated_at 超过 3 天要重抓,别拿旧榜当新热点 |