--- title: "从 N 份新闻邮件到 1 份摘要,为 AI 工程师而做" date: "2026-07-29" description: "我做了一条流水线,替我读 AI 新闻。它负责摘要、跨来源去重、扔掉噪音,然后把当天真正重要的二三十条还给我。现在它公开了。" language: zh url: "https://pablooliva.de/the-closing-window/zh/n-newsletters-to-1-digest-built-for-ai-engineers/" markdownUrl: "https://pablooliva.de/the-closing-window/zh/n-newsletters-to-1-digest-built-for-ai-engineers.md" translations: - language: ar url: "https://pablooliva.de/the-closing-window/ar/n-newsletters-to-1-digest-built-for-ai-engineers/" - language: de url: "https://pablooliva.de/the-closing-window/de/n-newsletters-to-1-digest-built-for-ai-engineers/" - language: es url: "https://pablooliva.de/the-closing-window/es/n-newsletters-to-1-digest-built-for-ai-engineers/" - language: en url: "https://pablooliva.de/the-closing-window/n-newsletters-to-1-digest-built-for-ai-engineers/" ---
## TL;DR 我做了一条私有流水线,替我读 AI 新闻。它会读一批筛选过的新闻邮件(newsletter),并把每个链接背后的真实文章抓下来。逐条做摘要。然后判断哪些其实是同一条新闻换了个标题,扔掉营销内容和噪音,把当天真正重要的二三十条交给我。产出现在公开了:**[downstream.news](https://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/](https://downstream.news/sources/),这样你可以自己判断输入,而不必去信任输出。 - **一切都可被机器读取**:RSS、JSON Feed、每份摘要的 Markdown、一份 `llms.txt`,以及一个 [/for-agents/](https://downstream.news/for-agents/) 端点。如果你自己的 agent 想读这份摘要,它不需要去抓取网页。 ## 换作是你,我会想知道的事 corroboration(佐证)计数的含义是"有 N 个来源碰过这个话题",而不是"有 N 个来源发了完全同一条新闻"。我拿 220 对人工标注的样本对语义匹配做了校准,而这两个概念之间的梯度是真的很弱:一对我判定为"绝不能合并"的样本得分 0.796,一对必须合并的样本得分 0.761。这个区间里不存在任何可用的阈值。现在凡是落在灰区的,都会升级交给第二个模型,逐对回答"是不是同一条新闻?"。 任意一天里,大约五分之一的链接抓取会失败,原因是付费墙、机器人拦截,以及只能靠 JavaScript 渲染的页面。这些内容仍然会出现,标记为降级状态,用锚文本作为标题线索。 输入在设计上就是敌对的,因为攻击者控制着流水线所摄入的每一封邮件的全部正文。模型前面有五层 prompt injection 防御,每个模型返回都会做 schema 校验,而一个不符合契约的返回,不会被悄悄揉成符合的样子。 它还能无人值守地发布,这之所以行得通,是因为流水线会给自己的产出打分。每天的产物都带一个健康状态块。站点只在绿色状态下发布,遇到任何更差的状态就暂停,改为显示一条延迟提示。发不出东西,好过发出我自己没法担保的东西。 ## 去看看吧 [downstream.news](https://downstream.news) 每天傍晚 CET 时间 19:15 左右更新。有 [网页存档](https://downstream.news/archive/)、[RSS 订阅](https://downstream.news/rss.xml),如果你想直接收到,也有每日邮件。不用账号,没有付费墙,也没打算做这两样。 如果你现在正在做那套八份新闻邮件的来回折腾,拿它跟你平时的阅读并行试一周,看看它漏掉了什么。