The Closing Window
从 N 份新闻邮件到 1 份摘要,为 AI 工程师而做 image
Photo by Mike Hindle on Unsplash

从 N 份新闻邮件到 1 份摘要,为 AI 工程师而做

AI Insights

TL;DR

我做了一条私有流水线,替我读 AI 新闻。它会读一批筛选过的新闻邮件(newsletter),并把每个链接背后的真实文章抓下来。逐条做摘要。然后判断哪些其实是同一条新闻换了个标题,扔掉营销内容和噪音,把当天真正重要的二三十条交给我。产出现在公开了:downstream.news。免费,无需账号,提供 RSS、邮件和 JSON。为那些真正用 AI 模型和 agent 做东西的人而做。


我是为自己做的

收件箱里八份新闻邮件,每天晚上翻一遍。那就是我的 N。我在同一条新闻上反复浪费时间,还得从大量低价值内容里硬趟过去。没有什么灵光一闪的时刻,也没有什么有意思的来龙去脉(虽然编辑这篇文章的 AI 一直想把我往那个方向哄)。我有一件重复的阅读杂务,我会写代码,而这件杂务恰好属于语言模型擅长的那类场景——前提是你在它外面搭够脚手架,让输出值得信任。

而需要的脚手架比你想的多得多。我本以为这是件轻松活,结果拖了好几个月……靠,现在想想可能有五个月。其中两个月被我扔掉了,因为我当时太依赖"感觉",堆了一个你能想到的功能全都有的怪物。那些功能大多在最后一步倒下了。之后我只能重来。掉进这个坑里,我挺难为情的。

现在它总算能用、也确实有用了,我想别人大概也在做我以前那套八份新闻邮件的来回折腾,所以就把产出公开了。

它到底做什么

四件它做得好的事。这不是一个 feed 阅读器。

它做摘要

每条新闻都会得到一到两句话的转述,写这段话的模型是真的去读了背后那篇文章的。而不是新闻邮件里对它的那段简介。流水线所分析的内容里,大约 81% 来自链接指向的目标页面,而不是锚文本。新闻邮件只是投递工具;真正被阅读的是它指向的东西。

摘要的作用是让你判断值不值得点进去,而每一条都会链接到原始出处。Downstream 是一个路由器。所有值得读的东西,仍然住在别人的站点上。另外,我也想让更多人知道这些来源;它们很棒,我心存感激。

它跨来源去重

这是最难的部分,难得让我有点不好意思。"同一条新闻出现在五份新闻邮件里"是一个 URL 规范化问题,而它又压在一个去除追踪参数的问题上面,因为每家新闻邮件平台包装外链的方式都不一样。字符串比对在这里毫无用处。HubSpot 甚至不用 HTTP 重定向;它返回一个 JavaScript 页面,把真实 URL 藏在一处变量赋值里,你得从页面正文里把它解析出来。匹配分三层进行:规范化后的精确 URL,然后是标题的模糊匹配,然后是对向量库做 embedding 相似度比对,时间窗口是滚动的七天。

看得见的回报,是每条内容上那个标记——有多少个独立来源碰过这个话题。当你在扫一份列表时,这个数字是实打实的信号。它同时也参与排序:两条得分相同时,被更广泛报道的那条胜出。

还有第二道去重,大多数聚合器都跳过了。过去七天里已经出现过的话题会被压制,这样一条有后劲的新闻不会连着五个晚上出现在你的摘要里。

它扔掉噪音

每条内容都会依据一份明确的配置文件在两个维度上打分:对一线 AI 工程师的重要性,以及紧急度——也就是有没有弃用截止日期,或者有没有一个正对着你的安全问题。评分标准用具体范例做了锚定,说明 8 分长什么样、2 分长什么样,因为一个没有锚点的模型会把所有东西都停在 6.5 分,等于什么都没告诉你。

这份配置文件还带着明确的降权提示。没有产品角度的融资消息会被故意打低分。招聘信息、导航杂项、会议推广,以及新闻邮件夹在正文之间的订阅广告,同样如此。

剩下的就是这一天

来源每天大约产出 250 条候选内容。最后发出去的是二三十条。

7 月 24 日,流水线把 244 条内容变成了一份 30 条的摘要。7 月 23 日只发了七条,因为 23 号是个安静的日子。没有固定配额去把清淡的一天硬撑起来,但对内容多的一天确实有上限,封顶在 30 条。

专门面向 AI 工程师

评分配置文件的名字,字面上就叫 ai-engineering。这不是一个通用科技资讯流外面拧上了一个 AI 板块。

具体表现是这样:

  • 每条内容上的主题标签:Models、Agents、On-device、Coding、Research、Robotics、Policy。
  • 读者层级标签,在你投入之前先告诉你这是哪一类阅读:Internals、Depth、Product、Any。
  • 公开的来源清单,见 /sources/,这样你可以自己判断输入,而不必去信任输出。
  • 一切都可被机器读取:RSS、JSON Feed、每份摘要的 Markdown、一份 llms.txt,以及一个 /for-agents/ 端点。如果你自己的 agent 想读这份摘要,它不需要去抓取网页。

换作是你,我会想知道的事

corroboration(佐证)计数的含义是"有 N 个来源碰过这个话题",而不是"有 N 个来源发了完全同一条新闻"。我拿 220 对人工标注的样本对语义匹配做了校准,而这两个概念之间的梯度是真的很弱:一对我判定为"绝不能合并"的样本得分 0.796,一对必须合并的样本得分 0.761。这个区间里不存在任何可用的阈值。现在凡是落在灰区的,都会升级交给第二个模型,逐对回答"是不是同一条新闻?"。

任意一天里,大约五分之一的链接抓取会失败,原因是付费墙、机器人拦截,以及只能靠 JavaScript 渲染的页面。这些内容仍然会出现,标记为降级状态,用锚文本作为标题线索。

输入在设计上就是敌对的,因为攻击者控制着流水线所摄入的每一封邮件的全部正文。模型前面有五层 prompt injection 防御,每个模型返回都会做 schema 校验,而一个不符合契约的返回,不会被悄悄揉成符合的样子。

它还能无人值守地发布,这之所以行得通,是因为流水线会给自己的产出打分。每天的产物都带一个健康状态块。站点只在绿色状态下发布,遇到任何更差的状态就暂停,改为显示一条延迟提示。发不出东西,好过发出我自己没法担保的东西。

去看看吧

downstream.news 每天傍晚 CET 时间 19:15 左右更新。有 网页存档RSS 订阅,如果你想直接收到,也有每日邮件。不用账号,没有付费墙,也没打算做这两样。

如果你现在正在做那套八份新闻邮件的来回折腾,拿它跟你平时的阅读并行试一周,看看它漏掉了什么。

Powered by Buttondown.