关于 topic-brief
这项研究技能将特定主题的公开新闻整理为可用于微信公众号的独立 HTML 简报,并规范资料搜集、时间核验、用户确认和报告生成。
主要功能
- 01收集主题与时间范围
- 02按时间筛选新闻资料
- 03来源白名单与主题排除规则
- 04起草前确认报告方向
- 05将 JSON 渲染为 HTML
适用场景
- 01制作区域新闻观察简报
- 02汇总一段时期的行业动态
- 03生成微信公众号简报
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ genli-ai/ market-research-skills --skill topic-brief安装后在 Claude Code 中输入/topic-brief确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdSKILL.zh.mdlib/__init__.pyfix_quotes.pyrenderer.pyschema.pywriter.pyprompts/system.mdreference/brand_red_belt_and_road.example.jsonregion_india.example.jsonregion_middle_east.example.jsonregion_southeast_asia.example.jsonscripts/render.pytemplates/briefing.html详细介绍
主题简报 — 专题观察简报生成器
基于公开新闻,为任意主题(地区 / 行业 / 政策议题 / 机构)生成信息简报,并输出一个完整独立的 HTML 文件,可直接粘贴到微信公众号编辑器中。
双语技能。中文版:
SKILL.zh.md。英文版是唯一事实来源;.zh.md是同步翻译 — 始终先编辑英文版,再在同一变更集中同步修改.zh.md,切勿只编辑中文版。
触发语
用户可能会说:
- “做一份 5 月下半月的中东观察”
- “Generate a semiconductor industry briefing for the past month”
- “做一期 AI 立法主题观察,时间是 2026 年 Q2”
- “/topic-brief”
- “用 topic-brief 跑一份 ...”
任何类似“针对 XX 制作简报 / 观察 / 摘要”的描述性请求都应触发此技能。
排除范围
生成任何简报前,先检查主题是否属于拒绝处理的类别。无论如何措辞,以下主题均不在处理范围内:
- 政治议题 — 选举、政党、政治人物立场、政府合法性争论
- 军事议题 — 军事行动、兵力构成、装备数量、冲突详情、国防政策
- 宗教议题 — 教义、教派争端、宗教领袖的声明
- 娱乐圈名人八卦 — 私生活、丑闻、粉丝争端
- 其他本质上具有争议的话题 — 文化战争、身份争端、价值判断争论
如果用户请求的主题属于以上类别,只回复一行并停止:
Out of scope. (超出能力范围)
不要执行搜索,不要起草任何内容,不要协商范围。
回复语言
使用用户请求所用的语言回复。中文提问 → 中文回复;英文提问 → 英文回复;混合输入 → 使用占主导地位的语言。生成的 HTML 本身应使用源材料和 subject_name 所用的语言(中文主题生成中文简报,英文主题生成英文简报)。面向用户的报告字段标签(例如“来源 / Source”)应与简报正文语言一致。
5 步工作流
第 1 步 — 收集参数(一个面向用户的提问提示,4 个问题)
如果用户在触发请求中没有提供全部参数,请通过一个合并提问提示一次性询问所有信息:
| 问题 | 标题 | 选项 |
|---|---|---|
| 主题是什么? | 主题 / Subject | 自由填写(地区 / 行业 / 议题 / 机构名称) |
| 时间范围? | 时间 / Period | “过去两周 / 过去一个月 / 过去一个季度 / 自定义范围”。立即将答案规范化为两个 ISO 日期 [period_start, period_end](YYYY-MM-DD)。例如:如果今天是 2026-05-13,用户说“过去一个月” → period_start=2026-04-13,period_end=2026-05-13 |
| 来源偏好? | 信息源 / Sources | “A 默认权威来源白名单 / B 我自己的白名单 / C 屏蔽特定来源” |
| 作者署名? | 作者 / Author | 提示:“封面左下角的作者位置默认为‘developed by Gen’ — 想显示什么内容?”明确选项:“A 保留默认值 / B 留空”。提问提示内置的 Other 选项允许用户输入自定义署名。 |
-
主题字段在 JSON 中对应
subject_name(例如“中东”“半导体”“AI 立法”) -
作者字段在 JSON 中对应
author,显示于封面左下角。用户的三种选项分别映射为三种 JSON 状态:用户选择 JSON 操作 渲染效果 A 保留默认值 省略 author字段显示“developed by Gen”(架构默认值) B 留空 写入 "author": ""留空 其他自定义内容(例如“张三 · 研究院”) 写入 "author": "张三 · 研究院"显示自定义文本 -
在同一会话中,如果用户已回答作者问题,后续运行时沿用上一次的值(除非用户更改)。
如果触发请求已指定所有参数(“做 5.1–5.12 的中东观察,作者署名‘张三’”),则跳过提问提示,直接继续。
第 2 步——并行搜集资料
每个搜索查询都必须包含时间筛选条件。 对于 Google / Bing:使用 after:YYYY-MM-DD before:YYYY-MM-DD(采用第 1 步中规范化后的 period_start / period_end);对于其他搜索引擎,使用等效语法。没有时间筛选条件时,搜索引擎会按相关性返回结果,SEO 权重高的旧“重大事件”就会被搜出,让简报内容过时。
时间规则:
- 焦点正文可以引用更早的背景信息作对比(例如“去年,X 发布过一份类似报告……”),但必须明确标注时间点(例如“2025 年第 3 季度……”),让读者一眼区分背景信息与期间内的事件
- 4 个子章节中的条目必须严格在时间窗口内(event_date 位于
[period_start, period_end])。时间窗口外的材料要么删除,要么移至焦点正文并标为背景信息
至少进行 4–6 次搜索引擎查询,覆盖以下维度(根据主题类型调整):
| 主题类型 | 建议的搜索维度(4–6 个) |
|---|---|
| 地区 | 央行决策 / 宏观数据(GDP、通胀、贸易)/ 重大政策 / 国际合作 / 突发事件 |
| 行业 | 指标性企业动态 / 监管 / 产能投资 / 上游投入 / 终端市场需求 / 国际竞争 |
| 政策议题 | 立法进展 / 执法案例 / 学术讨论 / 跨境溢出效应 / 公众争议 |
| 机构 | 重要决策 / 高级官员讲话 / 数据发布 / 研究成果 / 立法听证会 |
抓取网页正文 1–2 次,深入阅读焦点报告的原文(提取具体数字、情景和政策影响)。
默认权威来源白名单(除非用户在第 1 步中另有指定):
- 国际机构:IMF、World Bank、OECD、ADB、UNCTAD、IADB、AIIB、IEA、WTO
- 央行:Federal Reserve、ECB、Bundesbank、各国央行
- 政府机构:European Commission、国家统计机构
- 主流财经媒体:Reuters、Bloomberg、FT、Economist、Nikkei Asia、Xinhua、Business Standard
第 3 步——确认方向(必须向用户确认)⚠️
搜集完资料后停止,并在撰写前确认方向:
Report to user:
- Time window: [period_start, period_end]
- Proposed focus report: <title> by <institution>, published <YYYY-MM-DD> (URL: ...)
- Proposed 4 sub-sections with candidate items (each tagged with event date):
A. <section> — 3–5 items:
· [YYYY-MM-DD] <headline> · <source institution>
· [YYYY-MM-DD] <headline> · <source institution>
B. ...
C. ...
D. ...
Ask:
- Confirm the direction?
- Swap the focus?
- Adjust the 4 sub-sections?
- Any candidate items falling outside the window (check the dates)?
每个候选条目都必须标明事件日期——这一步让用户和模型都能抽查时效性,防止过时条目混入最终稿件。
如果用户提出调整,请修改后再次确认。只有用户确认后,才能继续第 4 步。
跳过这一步,可能会在发现焦点方向错误后被迫重写 5,000 个字符。
第 4 步 — 编写 JSON
遵循 prompts/system.md 中的架构和规范:
长度和结构:
- 主体聚焦内容为 1,500–2,500 个字符(3–5 个章节,每节 200–500 个字符)
- 4 个子章节 × 每节 3–4 个条目(标题 ≤30 个字符 + 正文 100–300 个字符)
- 摘要:聚焦简介 150–250 个字符 + 4 个 region_items,每项各用一句话
- 总计:3,000–5,000 个字符
首要规范——不得编造数字 每个具体数字(百分比、金额、日期、数量)都必须能追溯到第 2 步收集的材料。撰写后,重新阅读草稿,并针对每个数字逐一询问“这个数字来自哪里?” 如果无法回答,就进行修正。
时间范围规范:
- 每个子章节的
item都必须包含event_date字段(YYYY-MM-DD;仅知道月份时可使用 YYYY-MM) - 每个
event_date都必须落在[period_start, period_end]范围内 - 主体聚焦内容提及更早的背景时,必须明确标注时间点(“在 2025 Q3……”/“去年……”)
JSON 引号规范:中文行内引号必须使用成对的 " 和 ",不得使用直引号 "(会导致 JSON 解析失败)。
风格参考: reference/ 包含 4 篇历史样例(3 篇区域类 + 1 篇红色品牌机构类)。模仿其措辞、节奏和语气。
保存路径:output/seed/<subject>_<period_end>.json,以便追溯种子数据。
第 5 步 — 渲染并报告
python3 scripts/render.py output/seed/<subject>_<period_end>.json --out output --open
- 自动运行
fix_quotes修复中文引号配对 - 将 HTML 渲染到
output/<period_end>_<title>.html - 在浏览器中打开
报告清单:
- 文件路径
- 字符数/每个子章节的条目数
- 按 4 个子章节分组的来源 URL 列表
- 提醒:发布前必须人工核查每个数字和 URL——AI 输出 ≠ 结论
工具调用映射(跨 LLM 适配)
此技能以通用语义描述工具操作,便于非 Claude 终端将其映射到自身的工具集:
| 通用动词 | 映射到(Claude Code) | 映射到(其他终端) |
|---|---|---|
| 搜索引擎查询 | WebSearch | 终端的网页搜索工具 |
| 获取网页正文 | WebFetch | 终端的 URL 获取工具 |
| 面向用户的问题提示 | AskUserQuestion | 终端的交互式提示工具或纯 stdout 问题 |
| 读取全文 | Read | 终端的文件读取工具 |
| 执行 shell 命令 | Bash | 终端的 shell 执行工具 |
如果运行中的终端缺少某个动词对应的工具(例如没有交互式提示),LLM 应灵活降级处理——例如,将参数问题合并成一条普通消息提问,并等待用户回复。
故障处理
| 现象 | 操作 |
|---|---|
| 搜索某个维度时没有找到相关材料 | 告知用户尝试过哪些查询;询问是否要更改关键词 |
| 某个具体数字无法核实 | 删除该条目或改写为不含数字的表述;不得编造 |
| JSON 解析失败 | 99% 的情况下是中文引号配对错误;render.py 会自动运行 fix_quotes 作为补救;若仍然失败,则手动检查 |
| 主题过窄,无法填满 4 个子章节 | 请用户扩大时间范围或拓宽主题(例如,“国内 EDA 工具”→“半导体”) |
| 没有合适的聚焦报告 | 改用该时期最重要的央行决策/主权评级报告/大型银行研究报告 |
快速命令参考
# Enter the skill directory (path inside the market-research-skills monorepo)
cd /path/to/market-research-skills/skills/topic-brief
# Render (auto-fixes quotes + opens browser)
python3 scripts/render.py reference/region_middle_east.example.json --out output --open
# Quote-fix only
python3 -c "from lib.fix_quotes import fix_file; from pathlib import Path; fix_file(Path('output/seed/xxx.json'))"
# Install dependency (first time)
python3 -m pip install --user jinja2
自检清单(第 4 步后运行)
- issue_title ≤ 24 个字符(包括标点)——标题较长会在封面上换行,请缩短
- 恰好有 4 个小节,每节包含 3–4 个条目
-
summary.items恰好包含 4 个条目,与 4 个小节对应 - 每个数字都能追溯到第 2 步的来源
- 每个
item.source都包含完整 URL - 每个
item.event_date都在[period_start, period_end]范围内 - 如果重点正文提及时间范围之外的背景,必须明确标注时间点(例如:“2025 年第 3 季度……”)
-
item.headline≤ 30 个字符 - 重点部分包含 3–5 个小节;重点正文总计 1,500–2,500 个字符
- 中文引号使用成对的
"", 不使用直引号" - 已填写
subject_name字段 - 已填写
period_start/period_end,并使用 ISO 日期格式
红线
- 不得捏造任何数字、日期或引文。 如果源材料中没有相关内容,请改写并删去数字,或直接删除该条目。
- 不得使用非白名单来源作为重点报告的依据。 大众经济学博客、社交媒体帖子和未注明出处的转述,不能作为重点部分的依据。
- 小节条目必须严格限定在时间范围内。 任何
event_date超出[period_start, period_end]范围的条目,都必须删除,或移至重点正文作为带有明确时间标注的背景内容。 - 每次搜索都必须设置时间筛选。 不使用
after:/before:搜索会让搜索引擎返回经过 SEO 加权的旧内容——这是简报过时的根本原因。 - 不得跳过第 3 步(方向确认)。 朝错误方向撰写 5,000 个字符,会浪费用户的审核额度。
- 不得围绕被拒绝的主题撰写简报(政治/军事/宗教/名人八卦/本质上有争议的主题)。回复
Out of scope. (超出能力范围)并停止。 - 不得用没有实质内容的叙述充字数(“令人震惊”/“标志着”/“势必”)。保持事实准确、信息密集,并以来源为依据。
- 第 5 步不得省略人工审核提醒。 AI 输出是草稿材料,不能作为可发布的结论。