热点雷达:为什么我们不再需要编辑
25K GitHub 星标的秘密:让数百万人的点击、点赞和真金白银替你筛选信息
Google 搜索的是编辑,不是人
想象你在准备明天的一场重要会议。你 Google 了对方的名字,得到了一篇 2023 年的 LinkedIn 档案。但这个人在 Reddit 上有 569 条讨论,在 X 上发了 40 条推文,在 YouTube 上做了 3 场深度访谈。这些才是真实的声音 - 但 Google 完全看不到。
每个平台都是一座围墙花园:Google 不碰 Reddit 评论,ChatGPT 搜不到 X 推文,Gemini 看不到 TikTok。没有任何一个 AI 能同时访问所有这些数据。但你可以带上自己的密钥和浏览器会话,让一个AI Agent一次性搜索所有平台。
/last30days 的信息源全景
它搜索的不是网页,而是真正有"人味"的数据源。
社交讨论(人们在说什么)
视频内容(人们在说什么 + 怎么说)
真金白银的信号
代码里长什么样?
这是 pipeline.py 中定义搜索深度的关键代码。三种模式控制"搜多深"。
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 赞"比"某博客推荐"更有说服力?
智能管道:搜索引擎如何"理解"你的主题
不是搜关键词,而是先搞清楚你是谁、你在哪活跃、人们怎么讨论你
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 中,每种搜索意图对应不同的数据源优先级。
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 排在第一位。为什么?因为它代表真金白银的押注,比任何专家的个人预测都更可信。这是"群众的智慧"最极致的体现。
匹配意图与数据源
将每种搜索意图拖放到它最应该优先使用的数据源上。
"我想学怎么做 XX" - 教程类查询,需要视频演示
"XX 会发生吗?" - 预测类查询,需要真金白银信号
"XX 技术的真实情况是什么?" - 事实查询,需要技术人辩论
检测你的理解
输入"/last30days Peter Steinberger"后,v3 做了什么 v2 不会做的事?
如果你搜索"如何使用 Claude Code 写测试",系统会把哪个数据源排在第一位?
证据融合:从噪音中提取信号
加权倒数排名融合、跨源集群合并、作者封顶 - 把一万条结果变成五条真知灼见
一万条结果,哪些是真的?
并行搜索 14 个数据源,每个源返回 12-20 条结果。如果同一条新闻在 Reddit、X 和 YouTube 上同时出现,你不需要看三遍。问题是:怎么合并?怎么排序?怎么防止一个人的声音盖过所有人?
每个数据源有自己的排名。RRF 把所有排名加权合并成一个最终得分。基于 Cormack 等人 2009 年的经典算法。
同一个故事在 Reddit 讨论、X 发推、YouTube 评测?合并为一个主题集群,而不是三条独立结果。基于实体重叠检测。
防止任何单一声音主导你的简报。一个 prolific 发帖人的 20 条推文,最多只有 3 条出现在最终结果中。
一条结果如何被评分
三个评委给同一条结果打分,RRF 综合它们的意见。跟着数据包旅行。
RRF 算法的核心公式
来自 fusion.py,Cormack 等人 2009 年的经典平滑常数。
# 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 系数来检测主题重叠。
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 中的每作者上限机制,确保信息多样性。
# 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 的那一行。
场景:用户反馈搜索结果总是按标题排序,而不是按相关性排序
def _candidate_sort_key(c):
return (-c.rrf_score,
-c.local_relevance,
c.freshness,
c.title)
检测你的理解
为什么用重叠系数而不是 Jaccard 系数来检测主题重叠?
如果一个意见领袖在 X 上发了 20 条关于同一话题的推文,系统会怎么处理?
输出契约:AI 如何"不搞砸"你的简报
八条铁律防止 AI 模型"自由发挥",加上可分享的 HTML 简报系统
AI 模型最大的敌人是它自己
这个项目的核心挑战不是技术 - 而是防止 AI 模型"自作聪明"。2026 年 4 月 18 日的一次公开测试中,同一个模型连续 8 次违反输出规范:自创标题、添加章节标头、泄漏原始数据。它不是不懂规则,而是文件太长,它没读到规则就输出了。
模型 Opus 4.7 在 8 次连续运行中,每次都违反 LAW 2(自创标题如"标题"、"为什么他本月无处不在")或 LAW 4(使用 ## 章节标头)。根本原因:规则写在文件第 1094 行,模型只读了前 1000 行就开始生成输出。解决方案:把规则移到文件最前面。
八条铁律(LAW)
每条 LAW 背后都是一次真实的生产事故。
输出末尾不能有 Sources:/References:/进一步阅读: 等引用列表。引用以行内链接形式嵌入正文。因为模型会把通用 WebSearch 的"必须添加来源"提示和技能特定规则搞混。
第一行必须是徽章,第二行空行,第三行"What I learned:"。不是"关于 XX 的研究",不是"XX:人们怎么说"。徽章就是标题。
用连字符 + 空格(" - ")代替 em-dash 或 en-dash。为什么?破折号是最容易暴露"这是 AI 写的"特征。
正文不能使用 ## 或 ### 标记。叙述结构只有:粗体引导段落 + "研究关键模式"标签 + 编号列表。没有博客式的子标题。
引擎输出的"所有代理已报告"表情树页脚必须原样包含在最终输出中。不能重算统计、不能改格式、不能跳过。
引擎内部的"排名证据集群"是给 AI 看的素材,不是给用户看的结果。必须把数据转化为叙述文字,不能直接复制粘贴。
AI 模型自己生成 JSON 查询计划,不需要外部 API 密钥。引擎 stderr 中看到"没有 LLM 供应商"不是说你不能做规划 - 你自己就是供应商。
每个 @handle、r/subreddit、出版物都必须以 Markdown 链接形式嵌入。不是裸 URL,不是无链接的纯文本名。[名字](URL) 是唯一正确格式。
铁律是怎么被违反的?又是怎么被修复的?
以下对话基于 2026-04-18 的真实事故复盘。
强制首行徽章:格式锚点
这是 SKILL.md 中最关键的输出格式定义。徽章是防止 AI "自由发挥"的结构锚。
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 前会先做几个关键的正则清理。
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 不搞砸最终结果。它的真正力量在于:没有任何单一平台能提供这样的跨源视角。