01

热点雷达:为什么我们不再需要编辑

25K GitHub 星标的秘密:让数百万人的点击、点赞和真金白银替你筛选信息

Google 搜索的是编辑,不是人

想象你在准备明天的一场重要会议。你 Google 了对方的名字,得到了一篇 2023 年的 LinkedIn 档案。但这个人在 Reddit 上有 569 条讨论,在 X 上发了 40 条推文,在 YouTube 上做了 3 场深度访谈。这些才是真实的声音 - 但 Google 完全看不到。

💡
核心洞察

每个平台都是一座围墙花园:Google 不碰 Reddit 评论,ChatGPT 搜不到 X 推文,Gemini 看不到 TikTok。没有任何一个 AI 能同时访问所有这些数据。但你可以带上自己的密钥和浏览器会话,让一个AI Agent一次性搜索所有平台。

/last30days 的信息源全景

它搜索的不是网页,而是真正有"人味"的数据源。

社交讨论(人们在说什么)

💬
Reddit
🐦
X / Twitter
🔶
Hacker News
🦋
Bluesky

视频内容(人们在说什么 + 怎么说)

🎬
YouTube
🎵
TikTok

真金白银的信号

📊
Polymarket
🐙
GitHub
点击任何组件,了解它提供什么数据

代码里长什么样?

这是 pipeline.py 中定义搜索深度的关键代码。三种模式控制"搜多深"。

CODE
DEPTH_SETTINGS = {
    "quick": {
        "per_stream_limit": 6,
        "pool_limit": 15,
        "rerank_limit": 12,
    },
    "default": {
        "per_stream_limit": 12,
        "pool_limit": 40,
        "rerank_limit": 40,
    },
    "deep": {
        "per_stream_limit": 20,
        "pool_limit": 60,
        "rerank_limit": 60,
    },
}
中文翻译

定义三种搜索深度配置字典:

"快速"模式:每个数据源最多取 6 条...

总结果池上限 15 条...

重排序后保留 12 条。

"默认"模式:每源 12 条,总量 40,重排 40。

"深度"模式:每源 20 条,总量 60,重排 60。

就像调节搜索引擎的"音量旋钮" - 快速模式只听最重要的声音,深度模式尽可能多听。

ℹ️
好的代码自己会说话

注意代码中"per_stream_limit"、"pool_limit"、"rerank_limit"三个参数的递进关系:先从每个源头捞一批,再汇总成一个池子,最后重新排序取最优。这就是"先广后精"的信息检索哲学。

如果各平台能对话...

想象 Reddit、X、YouTube、Polymarket 坐在同一个聊天室里讨论同一个话题。

检测你的理解

你正在研究"AI 编程工具哪个好",以下哪种方式最能反映真实用户意见?

为什么说"Reddit 帖子有 1500 赞"比"某博客推荐"更有说服力?

02

智能管道:搜索引擎如何"理解"你的主题

不是搜关键词,而是先搞清楚你是谁、你在哪活跃、人们怎么讨论你

v2 搜的是词,v3 搜的是人

想象你要了解一个人。老办法是在搜索引擎里输入他的名字。新办法是先搞清楚他在哪些社区活跃、有哪些社交账号、他的公司在 GitHub 上有什么项目 - 然后再去这些地方精确搜索。

🔍

预研究大脑

v3 新增的 Python 预研究模块,在搜索开始前自动解析主题关联的 X 账号、GitHub 仓库、Reddit 子版块、YouTube 频道、TikTok 标签。

🧠

意图分类器

自动判断你的查询意图:事实查询、产品比较、观点、教程、突发新闻、预测市场?每种意图优先搜索不同的数据源。

🔗

双向解析

人指向公司,产品指向创始人,名字指向 GitHub 个人主页。输入"Paperclip"能解析出 @dotta。输入"Dave Morin"能找到 @davemorin 加上关联播客。

并行扇出

所有数据源同时搜索,不需要排队等待。"CLI vs MCP" 对比从 v2 的 12+ 分钟降到 v3 的 3 分钟。

一次搜索的完整旅程

从你输入话题到最终输出简报,数据经过了六个步骤。点击"下一步"跟随数据旅行。

👤
用户
🔍
预研究
🧠
查询计划
并行搜索
📊
评分排序
📝
综合简报
点击"下一步"开始数据旅行

意图分类器:系统怎么"知道"你要什么?

planner.py 中,每种搜索意图对应不同的数据源优先级。

CODE
SOURCE_PRIORITY = {
    "factual": ["hackernews", "reddit", "x", "youtube"],
    "product": ["youtube", "reddit", "x", "tiktok"],
    "opinion": ["reddit", "x", "youtube", "hackernews"],
    "how_to": ["youtube", "reddit", "x", "hackernews"],
    "comparison": ["reddit", "x", "hackernews", "youtube"],
    "prediction": ["polymarket", "x", "hackernews"],
}
中文翻译

定义每种搜索意图对应的数据源优先级:

事实查询:先查 Hacker News(技术权威),再查 Reddit(社区讨论)...

产品查询:先查 YouTube(评测视频),再查 Reddit(用户反馈),最后看 TikTok(创作者口碑)...

观点类:Reddit(真实讨论)排在第一...

教程类:YouTube 排第一,因为视频教学最直观...

比较类:Reddit 和 X 的讨论最有参考价值...

预测类:Polymarket(真金白银的预测)排第一。

⚠️
注意"预测"类型的特殊优先级

当系统判断你在做预测时,Polymarket 排在第一位。为什么?因为它代表真金白银的押注,比任何专家的个人预测都更可信。这是"群众的智慧"最极致的体现。

匹配意图与数据源

将每种搜索意图拖放到它最应该优先使用的数据源上。

YouTube
Polymarket
Hacker News

"我想学怎么做 XX" - 教程类查询,需要视频演示

拖到这里

"XX 会发生吗?" - 预测类查询,需要真金白银信号

拖到这里

"XX 技术的真实情况是什么?" - 事实查询,需要技术人辩论

拖到这里

检测你的理解

输入"/last30days Peter Steinberger"后,v3 做了什么 v2 不会做的事?

如果你搜索"如何使用 Claude Code 写测试",系统会把哪个数据源排在第一位?

03

证据融合:从噪音中提取信号

加权倒数排名融合、跨源集群合并、作者封顶 - 把一万条结果变成五条真知灼见

一万条结果,哪些是真的?

并行搜索 14 个数据源,每个源返回 12-20 条结果。如果同一条新闻在 Reddit、X 和 YouTube 上同时出现,你不需要看三遍。问题是:怎么合并?怎么排序?怎么防止一个人的声音盖过所有人?

🔀
加权倒数排名融合(RRF

每个数据源有自己的排名。RRF 把所有排名加权合并成一个最终得分。基于 Cormack 等人 2009 年的经典算法。

🧩
跨源集群合并

同一个故事在 Reddit 讨论、X 发推、YouTube 评测?合并为一个主题集群,而不是三条独立结果。基于实体重叠检测。

✂️
每作者上限 3 条

防止任何单一声音主导你的简报。一个 prolific 发帖人的 20 条推文,最多只有 3 条出现在最终结果中。

一条结果如何被评分

三个评委给同一条结果打分,RRF 综合它们的意见。跟着数据包旅行。

R
Reddit 评委
X
X 评委
Y
YouTube 评委
M
合并器
F
最终排序
点击"下一步"跟随评分过程

RRF 算法的核心公式

来自 fusion.py,Cormack 等人 2009 年的经典平滑常数。

CODE
# Standard RRF smoothing constant (Cormack et al. 2009)
RRF_K = 60

def _candidate_sort_key(c):
    return (
        -c.rrf_score,
        -c.local_relevance,
        -c.freshness,
        c.title,
    )
中文翻译

RRF 的平滑常数 K=60(学术论文推荐的值)。K 越大,排名靠前的结果优势越小。

定义排序键的空行。

定义如何对候选结果排序:

首先按 RRF 综合得分降序(负号=降序)...

得分相同时,按局部相关性降序...

还相同?按时效性降序(越新越好)...

都相同?按标题字母序兜底。

怎么知道两篇文章在讲同一件事?

cluster.py 使用重叠系数而非Jaccard 系数来检测主题重叠。

CODE
def _entity_overlap(entities_a, entities_b):
    """Jaccard-style overlap on extracted entities."""
    if not entities_a or not entities_b:
        return 0.0
    intersection = entities_a & entities_b
    smaller = min(len(entities_a), len(entities_b))
    return len(intersection) / smaller
中文翻译

定义实体重叠度计算函数:

如果任一集合为空,重叠度为 0。

计算两个实体集合的交集(共同出现的词)。

取两个集合中较小的那个的大小。

重叠度 = 交集大小 / 较小集合大小。这比 Jaccard 更公平:一条 10 个词的推文和一篇 100 个词的帖子,只要有 8 个相同的关键词,重叠度就是 80%。

一个人的声音不应盖过所有人

fusion.py 中的每作者上限机制,确保信息多样性。

CODE
# Per-author cap: no single author/handle
# should dominate the pool.
_MAX_ITEMS_PER_AUTHOR = 3

def _extract_author(candidate):
    """Return a normalized author key."""
    for item in candidate.source_items:
        if item.author:
            return item.author.strip().lower()
    return None
中文翻译

每个作者最多保留 3 条结果,防止单一声音垄断。

空行分隔。

从候选结果中提取标准化作者名:

遍历候选结果的所有来源条目...

找到第一个有作者名的条目,返回小写标准化后的名字。

没有作者信息则返回 None。

找出这个 Bug

下面这段代码有一个严重的排序问题。点击你认为有 Bug 的那一行。

场景:用户反馈搜索结果总是按标题排序,而不是按相关性排序

1 def _candidate_sort_key(c):
2 return (-c.rrf_score,
3 -c.local_relevance,
4 c.freshness,
5 c.title)

检测你的理解

为什么用重叠系数而不是 Jaccard 系数来检测主题重叠?

如果一个意见领袖在 X 上发了 20 条关于同一话题的推文,系统会怎么处理?

04

输出契约:AI 如何"不搞砸"你的简报

八条铁律防止 AI 模型"自由发挥",加上可分享的 HTML 简报系统

AI 模型最大的敌人是它自己

这个项目的核心挑战不是技术 - 而是防止 AI 模型"自作聪明"。2026 年 4 月 18 日的一次公开测试中,同一个模型连续 8 次违反输出规范:自创标题、添加章节标头、泄漏原始数据。它不是不懂规则,而是文件太长,它没读到规则就输出了。

⚠️
真实事故记录

模型 Opus 4.7 在 8 次连续运行中,每次都违反 LAW 2(自创标题如"标题"、"为什么他本月无处不在")或 LAW 4(使用 ## 章节标头)。根本原因:规则写在文件第 1094 行,模型只读了前 1000 行就开始生成输出。解决方案:把规则移到文件最前面。

八条铁律(LAW

每条 LAW 背后都是一次真实的生产事故。

1
LAW 1 - 禁止"来源"清单

输出末尾不能有 Sources:/References:/进一步阅读: 等引用列表。引用以行内链接形式嵌入正文。因为模型会把通用 WebSearch 的"必须添加来源"提示和技能特定规则搞混。

2
LAW 2 - 禁止自创标题

第一行必须是徽章,第二行空行,第三行"What I learned:"。不是"关于 XX 的研究",不是"XX:人们怎么说"。徽章就是标题。

3
LAW 3 - 禁止破折号

用连字符 + 空格(" - ")代替 em-dash 或 en-dash。为什么?破折号是最容易暴露"这是 AI 写的"特征。

4
LAW 4 - 禁止章节标头

正文不能使用 ## 或 ### 标记。叙述结构只有:粗体引导段落 + "研究关键模式"标签 + 编号列表。没有博客式的子标题。

5
LAW 5 - 必须包含引擎页脚

引擎输出的"所有代理已报告"表情树页脚必须原样包含在最终输出中。不能重算统计、不能改格式、不能跳过。

6
LAW 6 - 禁止泄漏原始数据

引擎内部的"排名证据集群"是给 AI 看的素材,不是给用户看的结果。必须把数据转化为叙述文字,不能直接复制粘贴。

7
LAW 7 - 你就是规划器

AI 模型自己生成 JSON 查询计划,不需要外部 API 密钥。引擎 stderr 中看到"没有 LLM 供应商"不是说你不能做规划 - 你自己就是供应商。

8
LAW 8 - 引用必须是行内链接

每个 @handle、r/subreddit、出版物都必须以 Markdown 链接形式嵌入。不是裸 URL,不是无链接的纯文本名。[名字](URL) 是唯一正确格式。

铁律是怎么被违反的?又是怎么被修复的?

以下对话基于 2026-04-18 的真实事故复盘。

强制首行徽章:格式锚点

这是 SKILL.md 中最关键的输出格式定义。徽章是防止 AI "自由发挥"的结构锚。

CODE (SKILL.md)
BADGE (MANDATORY, FIRST LINE OF OUTPUT):
The Python engine now emits the badge
as the first line of its --emit=compact stdout.

Your correct behavior is to PASS THROUGH
the script output verbatim.

Badge format:
last30days v{VERSION} - synced {YYYY-MM-DD}

No other text on this line.
One blank line after, then synthesis begins.
中文翻译

徽章(强制,输出的第一行):

Python 引擎现在会自动把徽章作为 --emit=compact 输出的第一行。

空行分隔。

你的正确行为是把脚本输出原样传递。

空行分隔。

徽章格式:last30days v{版本号} - 同步 {日期}

空行分隔。

这一行不能有其他文字。

空一行后,综合分析开始。

💡
核心洞察

这不仅仅是格式要求。首行徽章是一个"结构锚点" - 它的存在本身就告诉 AI 模型"输出形状已经确定了,你不要自创格式"。没有这个锚点,模型就会回到自己训练数据中常见的博客格式。这不是提示工程的问题,而是大模型行为学的问题。

可分享的 HTML 简报

v3 新增的功能:研究结果可以导出为自包含的 HTML 文件,拖进 Slack、邮件或 Notion 即可分享。

--emit=html 将研究结果渲染为深色主题、打印友好的 HTML 文件
内联 CSS 所有样式写在文件内部,不依赖外部资源,离线也能正常显示
系统字体兜底 优先加载 Inter 和 JetBrains Mono,如果不可用自动降级到系统字体
无 JavaScript 纯 HTML+CSS,不包含任何脚本,安全可靠
LAST30DAYS_MEMORY_DIR 简报保存目录,默认 ~/Documents/Last30Days/

HTML 渲染器怎么处理 Markdown?

html_render.py 在把 Markdown 转为 HTML 前会先做几个关键的正则清理。

CODE
PROSE_LABELS = [
    ("What I learned:", "What I learned"),
    ("KEY PATTERNS from the research:",
     "Key patterns from the research"),
]

EVIDENCE_BLOCK_PATTERN = re.compile(
    r"<!-- EVIDENCE FOR SYNTHESIS.*?-->"
    r"(.*?)<!-- END EVIDENCE -->",
    re.DOTALL
)
中文翻译

定义散文标签的映射表:

"我学到了什么"对应 HTML 中的标签名"我学到的内容"。

"研究关键模式"对应标签名"研究中的关键模式"。

空行分隔。

定义正则表达式来匹配"仅供综合使用"的证据块:

匹配开始标记"证据仅供综合使用"...

到结束标记"证据结束"之间的所有内容。

re.DOTALL 让 . 也匹配换行符。

防止 AI "跑偏"的三重锚点策略

锚点 1:强制首行徽章

🌐
强制徽章

锚点 2:固定引擎路径

📌
固定路径

锚点 3:显式警告

🚫
显式警告
点击任何锚点,了解它为什么有效

检测你的理解

为什么同一个 AI 模型(Opus 4.7)在 2026-04-18 连续 8 次违反规则,修复后又 10/10 通过?

LAW 1(禁止来源清单)违反了四次,每次原因不同。以下哪个是第四层防线?

你运行 /last30days 时看到 stderr 输出"No LLM provider configured"(未配置 LLM 供应商),你应该怎么做?

课程总结

📡

模块 1:热点雷达

14 个数据源,从 Reddit 到 Polymarket。搜索的不是网页,而是真人参与行为。社交相关性取代 SEO 相关性。

🧠

模块 2:智能管道

预研究大脑解析主题,意图分类器决定搜索策略,并行扇出同时查所有数据源。3 分钟完成 v2 需要 12 分钟的工作。

🔬

模块 3:证据融合

RRF 算法合并多源排名,重叠系数检测跨源主题重复,每作者上限 3 条保证信息多样性。

📜

模块 4:输出契约

八条铁律防止 AI 自由发挥。三重锚点策略(强制徽章 + 固定路径 + 显式警告)确保格式一致性。

ℹ️
课程核心思想

/last30days 不是一个搜索引擎。它是一个信息合成引擎 - 搜索真人参与行为,用数学算法融合排序,通过严格的输出契约确保 AI 不搞砸最终结果。它的真正力量在于:没有任何单一平台能提供这样的跨源视角。