吃瓜追踪器(gossip-tracker)
把一个热点事件拆成时间线 + 人物关系 + 阵营 + 一句结论的轻量级研究工具。所有信息必须来自实时搜索,不能凭记忆编。
这个 skill 干什么
用户扔过来一个事件名(e.g. "那个谁谁谁的瓜"),这个 skill 会:
- 搜证 — 多源、跨平台搜索事件的最新进展和关键节点
- 梳理 — 整理成时间线、人物图谱、各方表态
- 判断 — 给一个事实层面的总结("现在局面是 X,争议在 Y"),不替用户站队
- 产出 — 控制台里给一份能直接读的摘要 + 一份可分享的 HTML 报告
适用场景:
- 突发新闻:某公司/某人物刚出事,第一时间想知道来龙去脉
- 持续追踪:某个事件过了几天,进展到哪了
- 行业八卦:XX 行业最近有什么大事
- 跨语种:能搜中文/英文/小语种,跨地域
核心铁律
绝对不能凭训练数据编故事。 吃瓜的核心是"真",编出来的瓜毫无价值还可能害人。每一条事实都必须挂信源,每一条时间线节点都必须能搜到。
具体来说:
- ❌ "我印象中 X 是 Y" → 不行,必须搜
- ❌ "据说 Z 公司做了..." → 不行,要给具体信源
- ✅ "据 [微博/小红书/财新/Reuters 2026-06-24],X 是 Y" → 这才是合格输出
- 搜不到 → 老实说搜不到,不要硬编
不要硬凑无关人物/关联。 吃瓜报告只写直接相关的人物和事件。如果某个人物/事件和核心争议没有直接关系,就不写。不要为了让报告"更丰富"而把不相关的人拉进来。
搜索工具选择(AI 自己挑)
让 AI 根据事件性质和实际可用的工具自己选择。但要真的搜——这是底线。
最少搜几次:3 轮起步。
- 第 1 轮:事件名+时间 → 找全貌
- 第 2 轮:具体人物/公司名 → 找细节
- 第 3 轮:最新进展+各方表态 → 找分歧
- 第 4 轮(可选):网友/粉丝/路人的具体观点和评论 → 找吃瓜群众视角
搜不到怎么办:换关键词、换平台、换语种,不要编。真搜不到时在报告里明写"截至搜索时点未发现 X 信源"。
工作流
四个阶段,全跑完:
阶段 1:搜索建档
目标:搜出 5-15 条可引用的事实点。
操作:
- 收到事件名后,先脑内拆出 3-5 个搜索角度:
- 事件本身("X 发生了什么")
- 关键人物("X 的 CEO 怎么说")
- 时间锚点("X 2026 年 6 月最新")
- 反对方/不同观点("X 争议"、"X 质疑")
- 行业/板块影响("X 行业 受影响")
- 网友/粉丝/路人视角("X 网友 评论"、"X 粉丝 反应")
- 跑 3-5 次搜索(不同关键词、不同工具),记录每条事实点:
- 时间戳(最好精确到日)
- 信源(哪个平台/媒体/账号)
- 事实陈述(中立,不加工)
- 搜完做一次事实去重:同一件事多个信源说 → 选最权威的那个作为主信源,其他标"另据 X 也报道"
产出:docs/吃瓜_YYYY-MM-DD_<event>/raw_search.md
格式:
## 搜索 1:<query>
工具:mmx-search
时间:2026-06-24 15:30
### 找到的事实
- [2026-06-22] 某公司在港交所发布公告,称... (来源: 财新)
- [2026-06-23] 创始人发内部信,提到... (来源: 36 氪)
- [2026-06-24] 业内人士透露,... (来源: 微博 @某某)
### 没搜到
- 没有找到 X 公司的官方回应
阶段 2:结构化梳理
把 raw_search.md 里的事实点按维度重新组织:
必有的维度:
- 时间线(最重要)— 按时间正序排列所有事实点,精确到日,每个节点挂信源
- 人物/实体— 谁在局里,各自什么角色
- 阵营/表态— 支持的、反对的、观望的
- 争议焦点— 分歧在哪,谁和谁吵
- 当前状态— 截止搜索时,事情进展到什么程度
- 待观察— 接下来可能怎么发展(标"未验证")
- 吃瓜群众 & 粉丝视角(新增)— 从搜索结果中提炼网友/粉丝/路人的具体观点和评论
写时间线时的时间精度:
- 精确到日:"2026-06-22"
- 精确到月:"2026 年 6 月"
- 模糊:"近期"、"最近" → 一定要在报告里标"具体时间未公开"
- 交叉验证:同一件事多个信源报道 → 列出主信源 + 其他信源作为佐证
"吃瓜群众 & 粉丝视角"怎么写:
- 从搜索结果中提炼网友/粉丝/路人的具体观点和具体评论
- 分三类:吃瓜群众/反对派、粉丝/支持派、中间派/理性派
- 每个观点挂信源(来源:微博/今日头条/腾讯新闻)
- 引用具体评论时保持原话,不要改写
产出:docs/吃瓜_YYYY-MM-DD_<event>/briefing.md
阶段 3:生成 HTML 报告
写一份带时间线样式、人物卡片的 HTML 报告。不强制——用户没要时跳过。
风格:
- 配色:用户没指定主色 → 用骚气橙红(#FF6B35)作为主色,配深灰底
- 暗色主题(吃瓜都在手机上看)
- 时间线竖排,左边是日期/时间,右边是事件卡片
- 人物关系用简单的标签云
模板(写到 templates/report.html,吃瓜时复制后填充):
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{{event_name}} · 吃瓜报告</title>
<style>
body { font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
background: #1a1a1a; color: #e8e8e8; max-width: 720px; margin: 0 auto;
padding: 24px; line-height: 1.6; }
h1 { color: #FF6B35; border-bottom: 2px solid #FF6B35; padding-bottom: 8px; }
h2 { color: #FFB088; margin-top: 32px; }
.meta { color: #888; font-size: 13px; }
.timeline { position: relative; padding-left: 24px; border-left: 2px solid #444; }
.event { background: #2a2a2a; border-radius: 8px; padding: 12px 16px; margin: 12px 0;
border-left: 3px solid #FF6B35; }
.event .time { color: #FF6B35; font-size: 13px; font-weight: bold; }
.event .source { color: #888; font-size: 12px; margin-top: 4px; }
.quote { background: #2a2a2a; border-left: 3px solid #FFD700; padding: 8px 12px;
margin: 8px 0; font-style: italic; color: #ccc; }
.tag { display: inline-block; background: #FF6B35; color: #1a1a1a; padding: 2px 8px;
border-radius: 4px; font-size: 12px; margin: 2px; }
.warn { color: #FFA500; font-size: 12px; }
.footer { color: #666; font-size: 12px; margin-top: 32px; padding-top: 16px; border-top: 1px solid #333; }
</style>
</head>
<body>
<h1>🍉 {{event_name}}</h1>
<p class="meta">吃瓜时间 · {{current_time}} · AI 整理,仅供参考</p>
<h2>📌 一句话总结</h2>
<p>{{one_line_summary}}</p>
<h2>⏱️ 时间线</h2>
<div class="timeline">
{{timeline_events}}
</div>
<h2>👥 关键人物/实体</h2>
{{people_cards}}
<h2>⚔️ 各方表态</h2>
{{stances}}
<h2>❓ 争议焦点</h2>
{{controversies}}
<h2>🔮 待观察</h2>
{{to_watch}}
<div class="footer">
<p>⚠️ 本报告由 AI 基于公开信源整理,所有事实点均挂信源,仅供参考。</p>
<p>信源覆盖:{{source_list}}</p>
</div>
</body>
</html>
占位符替换:
def fill_html_template(template_path, event_data, output_path):
"""event_data 是 dict,键名对应模板占位符"""
html = Path(template_path).read_text(encoding="utf-8")
# 时间线条目
timeline_html = "\n".join(
f'<div class="event">'
f'<div class="time">{e["time"]}</div>'
f'<div>{e["content"]}</div>'
f'<div class="source">来源: {e["source"]}</div>'
f'</div>'
for e in event_data["timeline"]
)
# 人物卡
people_html = " ".join(
f'<span class="tag">{p["name"]} · {p["role"]}</span>'
for p in event_data["people"]
)
# ... 其他占位符类似
html = html.replace("{{event_name}}", event_data["name"])
html = html.replace("{{current_time}}", event_data["time"])
html = html.replace("{{one_line_summary}}", event_data["summary"])
html = html.replace("{{timeline_events}}", timeline_html)
html = html.replace("{{people_cards}}", people_html)
html = html.replace("{{stances}}", event_data["stances"])
html = html.replace("{{controversies}}", event_data["controversies"])
html = html.replace("{{to_watch}}", event_data["to_watch"])
html = html.replace("{{source_list}}", event_data["sources"])
Path(output_path).write_text(html, encoding="utf-8")
产出:docs/吃瓜_YYYY-MM-DD_<event>/report.html
阶段 4:控制台摘要
这是必有的输出,HTML 是可选的。控制台摘要的结构:
🍉 吃瓜时间 · 2026-06-24 15:30
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 一句话总结
[2-3 句话说清楚这瓜是什么、走到哪了、关键在啥]
⏱️ 时间线
• 2026-06-20 [来源] 事件起源...
• 2026-06-22 [来源] 关键转折...
• 2026-06-24 [来源] 最新进展...
👥 谁在局里
• [人物A] — [角色] — [目前态度]
• [人物B] — [角色] — [目前态度]
⚔️ 核心争议
[一句话讲清谁和谁吵、吵什么]
👥 吃瓜群众 & 粉丝视角
吃瓜群众(路人/反对派)
• 核心观点1:...(来源:...)
• 核心观点2:...(来源:...)
• 具体评论:"..."(来源:...)
粉丝(支持派)
• 核心观点1:...(来源:...)
• 核心观点2:...(来源:...)
• 具体评论:"..."(来源:...)
中间派/理性派
• 核心观点1:...(来源:...)
• 具体评论:"..."(来源:...)
❓ 待观察
[接下来可能怎么发展、关注什么]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ 信息均来自公开搜索,仅供参考
📄 完整报告: docs/吃瓜_XXX/report.html
信源规范
吃瓜对信源的要求比研究更严,因为八卦容易被造谣。
信源等级:
- A 级(可单引):新华社、人民日报、央视、财新、Reuters、AP、Bloomberg、公司官方公告、监管机构公告
- B 级(需交叉验证):36 氪、虎嗅、华尔街见闻、FT、NYT、WSJ、第一财经
- C 级(线索源):微博热搜、知乎热榜、小红书、Twitter/X trending、Reddit
- D 级(不单引):未署名自媒体、营销号、来源不明的截图
引用规则:
- 关键事实(A 级事件)→ 必须有至少 1 个 A 级信源
- 争议性陈述 → 必须有 2 个独立信源
- C 级信源 → 在报告里明写"据微博/小红书用户",不要当主信源
- 找不到信源 → 明写"暂无公开报道",不要脑补
特别注意:
- 截图、聊天记录、单方面陈述 → 必须标"未经当事方证实"
- 涉及个人隐私、名誉的 → 不传播未经证实的具体细节
- 涉及上市公司的 → 优先用交易所/公司公告,不用社交媒体爆料
不中断原则
跟 research 报告一样,别中途停下来问。用户给你一个事件,搜 → 整理 → 输出一气呵成。
| 场景 | 怎么继续 | |------|---------| | 搜不到某个事实 | 写"暂无公开信源",继续往下 | | 多个信源说法不一 | 列出来,让用户自己判断 | | 事件还在发展中 | 标"截至搜索时点 YYYY-MM-DD HH:MM" | | 用户没说要 HTML | 默认只输出控制台摘要 + briefing.md | | 事件涉及敏感内容 | 转述事实不下判断;具体人名隐去或用"相关人士" | | 完全没有信源 | 老实说"搜不到",绝不用训练数据填 |
不做的事
- ❌ 编造任何时间、人物、引语
- ❌ 把传闻当事实
- ❌ 替事件主角做道德判断
- ❌ 输出一个"看起来很专业但内容是空的"报告
- ❌ 跳过搜索直接出报告(这是底线)
- ❌ 用"据说"、"听说"、"有人爆料"等模糊措辞作为主信源(这些只能作为线索)
- ❌ 硬凑无关人物/关联(和核心争议没有直接关系的人/事就不写)
工作目录结构
docs/
吃瓜_YYYY-MM-DD_<event_slug>/
raw_search.md # 阶段 1:原始搜索记录
briefing.md # 阶段 2:结构化梳理
report.html # 阶段 3:HTML 报告(可选)
sources.md # 信源清单
event_slug 用事件名拼音或简短英文,例如 腾讯_混元大模型_发布会、Kimi_融资、OpenAI_董事会。
失败模式与恢复
| 现象 | 原因 | 处理 | |------|------|------| | 搜不到任何东西 | 事件太新/太小众,搜索引擎还没收录 | 换关键词、换语种、查官方账号 | | 搜出来的全是英文 | 事件海外为主 | 接受英文结果,中文翻译后给用户 | | 时间线对不上 | 不同信源时间戳不一致 | 列出来让用户判断,或用"约 6 月 22 日" | | 涉及多个事件混在一起 | 关键词歧义 | 主动问用户一次"你说的 X 是 A 还是 B",问完继续 | | 工具超时 | 临时网络问题 | 重试一次;连续失败就在报告里说"信源 X 暂时不可达" | | AI 想凭印象写 | 训练数据诱惑 | 强制再搜一次;搜不到就明说 | | 硬凑无关人物/关联 | 想让报告"更丰富",把不直接相关的人/事拉进来 | 删掉。吃瓜报告只写直接相关的人物和事件,不要硬凑关联。如果某个人物/事件和核心争议没有直接关系,就不写。 |
质量自检
出报告前必须过一遍:
def self_check(briefing_md, raw_search_md):
"""出报告前的自检"""
checks = []
# 1. 每条事实是否都挂信源
facts = extract_facts(briefing_md) # 简单正则提"日期+内容"
no_source = [f for f in facts if not has_source(f)]
checks.append(("每条事实挂信源", len(no_source) == 0,
f"{len(no_source)} 条无信源"))
# 2. raw_search 至少 3 轮
rounds = count_search_rounds(raw_search_md)
checks.append(("搜索至少 3 轮", rounds >= 3, f"实际 {rounds} 轮"))
# 3. 至少 1 个 A 级或 2 个 B 级信源
tier_a = count_sources_by_tier(raw_search_md, "A")
tier_b = count_sources_by_tier(raw_search_md, "B")
checks.append(("A/B 级信源充足",
tier_a >= 1 or tier_b >= 2,
f"A={tier_a}, B={tier_b}"))
# 4. 时间线节点不少于 3 个
timeline_events = count_timeline_events(briefing_md)
checks.append(("时间线 ≥ 3 节点", timeline_events >= 3,
f"实际 {timeline_events}"))
# 5. 没有凭印象写的内容(用关键词嗅探)
suspicious = ["我记得", "印象中", "应该", "好像", "听说", "据说", "据传"]
no_proof = search_suspicious_phrases(briefing_md, suspicious)
checks.append(("无凭印象/模糊措辞", len(no_proof) == 0,
f"{len(no_proof)} 处"))
for name, ok, detail in checks:
mark = "✓" if ok else "✗"
print(f"{mark} {name}: {detail}")
return all(ok for _, ok, _ in checks)
自检不通过 → 回去补搜索或删掉对应内容。
额外检查:
- ✅ 时间线是否精确到日?
- ✅ 每个时间线节点是否挂了信源?
- ✅ 是否有"吃瓜群众 & 粉丝视角"部分?
- ✅ 是否硬凑了无关人物/关联?(如果有,删掉)
微信扫一扫