做 AI 相关工作的人,大概都有过这种体验:每天早上先刷一遍 X,再看几个大厂博客,然后去 Hacker News 和 Reddit 翻翻评论区,晚上再补几期 YouTube 访谈。
一圈下来一两个小时没了,真正有用的信息可能就那么几条。
问题不在信息少,而在于信息太散、太杂、太重复。这篇文章从这个需求出发,拆一拆一个能自动跑起来的 AI 资讯平台该怎么设计,最后手把手部署一套。
1、先把需求说清楚:四个要解决的问题
把“每天刷资讯”这件事拆开看,其实是四个具体的问题。
第一,源太多、格式不一。 官方博客有 RSS,Hacker News 有评论区,Reddit 按子版块组织,X 是一条条帖子,YouTube 是视频。想统一收进来,每类源都得有自己的采集方式。
第二,噪声太多。 科技媒体的 RSS 里一半不是 AI 内容,社媒上大量帖子没人互动。需要有人帮你先筛一遍。
第三,重复太多。 一个模型发布,官方博客发一遍,TechCrunch 报道一遍,X 上几十个人转发评论。你不想看同一件事十遍。
第四,读原文太费时间。 一篇长博客、一期两小时的播客,你需要的往往只是几百字的要点,最好中英文都有。
这四个问题,正好对应一条流水线的四个环节:采集、过滤、去重、摘要。
2、技术方案:一条流水线,四个环节
采集层按源的类型分开处理。RSS/Atom 最简单,解析 feed 就行。Hacker News 除了帖子本身,还要把评论区一起抓下来,因为很多有价值的观点在评论里。YouTube 视频取字幕文本,把“看视频”变成“读文字”。GitHub Trending 取仓库的 README 和元数据。
讨论类内容还要设一道互动门槛:点赞和评论数不够的帖子先不处理,记下来过段时间再复查。刚发出来的帖子互动少,直接判死刑容易漏掉后来火起来的。
过滤和摘要层交给大模型。每篇文章送进去,一次调用拿回四样东西:相关性判断、中英双语摘要、标签、重要性评分。这里有个简单但好用的约定:==和 AI 无关的内容直接打 0 分,0 分不入库==,过滤和打分合成一步。
不同类型的内容,摘要口径也不一样。新闻要讲清事实和影响,讨论帖要提炼各方观点,开源项目要说明它解决什么问题。所以提示词按类别分开写,每类一套。
去重层是整条流水线里最值得说的部分,分两级:
- 第一级是 SimHash。对全文算一个指纹,两个指纹的汉明距离不超过 3 就算重复。它便宜,而且放在调用大模型之前,转载、镜像这类几乎一字不差的内容,在这一步就被拦掉,省下的是真金白银的 token。
- 第二级是语义去重。不同媒体报道同一件事,措辞完全不同,SimHash 认不出来。这时把摘要和标签用本地的 all-MiniLM-L6-v2 模型转成向量,在数据库里用 pgvector 查余弦相似度,超过 0.85 就算重复。24 小时内的新文章阈值放宽到 0.80,因为同一个热点集中爆发时,重复报道最多。
存储层用带 pgvector 扩展的 PostgreSQL。文章、源列表、向量都在一个库里,语义去重直接用一条 SQL 查询完成,不用另外维护一个向量数据库。
最后用一个调度器把这些串起来,定时跑一轮。

这套方案我们自己已经跑了一段时间,代码整理成了开源项目 ai-news-brief(MIT 协议)。下面就用它从零部署一套,数据库用 Supabase 的免费项目。
3、准备工作
你需要三样东西:
- Python 3.10 以上。
- 一个大模型 API key。任何 OpenAI 兼容的接口都行,项目默认用 DeepSeek,换别家只要改接口地址和 key。
- 一个 Supabase 免费项目。它自带 PostgreSQL,pgvector 开个开关就能用,省去自己装数据库的麻烦。
另外可选一个 GitHub Token。不填也能抓 GitHub Trending,填了以后 GitHub API 的限额从每小时 60 次提到 5000 次。
4、配置 Supabase:开扩展、拿连接串
在 Supabase 新建项目。建项目时要设一个数据库密码,记下来,后面要用。
然后启用 pgvector,两种方式任选一种。
一种是点界面:进 Dashboard 的 Database 页面,左侧栏点 Extensions,搜 vector,打开开关。
另一种是在 SQL Editor 里执行:
CREATE EXTENSION IF NOT EXISTS vector;
表不用手动建,程序第一次运行时会自动创建。
接下来拿连接串。点 Dashboard 顶部的 Connect 按钮,这里要看你的网络环境。
网络支持 IPv6 的话,选 Direct connection:
postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres
网络只有 IPv4 的话(国内家庭宽带和公司网络大多是这样),直连会失败,要选 Session pooler:
postgresql://postgres.[PROJECT-REF]:[YOUR-PASSWORD]@[POOLER-HOST]:5432/postgres
注意两点。
一是主机名和用户名直接从 Connect 弹窗里复制,别自己拼。pooler 的主机名带一个集群编号,没法从地区推出来;pooler 连接的用户名也和直连不一样,是 postgres.项目ID 的形式。
二是把 [YOUR-PASSWORD] 换成你的密码时,如果密码里有 &、#、? 或空格,要做百分号编码,否则连不上。
5、拉代码、填配置
git clone https://github.com/frankzch/ai-news-brief.git
cd ai-news-brief
pip install -r requirements.txt
playwright install chromium
最后一行装的是 Chromium 内核,有些网页的正文要靠浏览器渲染后才能取到。
复制一份环境变量模板:
cp .env.example .env
.env 里必填两项:
DEEPSEEK_API_KEY:大模型 key。用别家就改填INBRIEF_LLM_API_KEY和INBRIEF_LLM_BASE_URL。INBRIEF_SUPABASE_DB_URL:刚才复制的连接串。
GITHUB_TOKEN 选填。
其余参数都在 config.yaml 里,常改的有这几个:
| 配置项 | 默认值 | 作用 |
|---|---|---|
llm.model_name |
deepseek-v4-flash | 摘要用的模型 |
schedule.interval_hours |
2 | 调度模式下每几小时跑一轮 |
fetching.max_entries |
50 | 单轮最多处理多少篇 |
fetching.concurrency |
5 | 并发处理数 |
fetching.article_max_age_days |
1 | 超过几天的旧文章跳过 |
fetching.discussion.min_likes / min_replies |
100 / 50 | 讨论帖的互动门槛 |
fetching.github_trending.max_repos |
25 | GitHub Trending 取前多少个 |
cleanup.article_retention_days |
7 | 文章保留几天后自动清理 |
6、加信息源,跑起来
源列表存在数据库的 rss_sources 表里,用自带的 admin_rss.py 管理:
# 添加
python admin_rss.py add https://openai.com/news/rss.xml "OpenAI Blog" --category news
# 查看
python admin_rss.py list
# 删除(会先要求确认)
python admin_rss.py delete <id>
GitHub Trending 不用加源,在 config.yaml 里默认开着。
第一次跑建议只加几个官方博客这类普通 RSS 源,先把整条链路走通:
python main.py --now
--now 表示立即跑一轮。看日志能看到每篇文章的去向:被 SimHash 拦掉、被判定与 AI 无关、被语义去重,还是成功入库。
没问题以后去掉参数,进入调度模式长期运行:
python main.py
结果存在 articles 表里,在 Supabase 的 Table Editor 里能直接看,每条都有中英文标题、短摘要、长摘要、标签和重要性分数。
7、扩展:从 94 个源的目录开始,加你自己的源
程序本身不预置任何源,加什么全由你决定。项目 README 里附了一份我们在用的源目录,一共 94 个,可以直接照着挑:
| 类别 | 数量 | 内容 |
|---|---|---|
| 新闻与博客 | 16 个 RSS | OpenAI、Google DeepMind、Google Research、Apple ML、Microsoft AI、Nvidia、Hugging Face 等官方博客与 HF Daily Papers,加上 TechCrunch、The Verge、MIT 科技评论、VentureBeat 等媒体 |
| 讨论 | HN + 16 个 Reddit + 47 个 X | HN 首页含评论区;Reddit 11 个子版块加 5 个关键词;X 35 位 AI 从业者(Karpathy、Simon Willison 等)加 12 个关键词 |
| 视频 | 13 个 YouTube 频道 | Lex Fridman、Dwarkesh Patel、Latent Space、Two Minute Papers 等,按字幕生成摘要 |
| 开源 | GitHub Trending | 每周热门仓库 |
要加目录之外的源,只需要知道每类源的写法。程序按 URL 自动识别类型:

- 普通 RSS / Atom:直接填 feed 地址。大部分博客、媒体都有。
- YouTube 频道:填频道 feed,
https://www.youtube.com/feeds/videos.xml?channel_id=UC...。 - Reddit 子版块:
https://www.reddit.com/r/<子版块名>/,抓热帖。 - Reddit 关键词:URL 填 reddit.com,描述写
keyword <关键词>。 - X:URL 填 x.com,描述写
keyword <关键词>按关键词搜,写kol <账号名>跟踪某个人。
社媒类的源在运行前还有一些额外设置,项目 README 里有说明。
加源时还有两个参数值得用好。
--category 决定这个源的文章用哪套提示词。src/prompts/ 下有 news、discussion、kol、opensource 四个 txt 文件,类别名就对应文件名。觉得摘要风格不合口味,直接改这几个文本文件,不用碰代码。
--importance-score 是源的基础分,默认 0。一篇文章的最终分数,是大模型打的分和这个源分取平均,讨论类再加上互动热度分一起平均。所以源分留 0 会把平均分拉低一半。你最信任的源,比如各家官方博客,给个高分,它们的文章自然排在前面。
8、嫌部署麻烦?装一个 skill 就行
如果你只是想每天看看 AI 圈发生了什么,不想自己维护数据库和定时任务,我们还做了另一个开源项目 ai-news-skill。
它是一个 Agent Skill,背后接的就是用上面这套流水线跑出来的数据。支持 Claude Code、Codex、OpenClaw 和 Antigravity,一条命令装好:
# Claude Code
git clone https://github.com/frankzch/ai-news-skill.git ~/.claude/skills/ai-news-skill
其他 agent 换一下目录:Codex 是 ~/.codex/skills/,OpenClaw 是 ~/skills/,Antigravity 是 ~/.agents/skills/。
装好以后直接用自然语言问:
- “过去 5 天头部 KOL 发布的 AI 视频,排除 Fireship。”
- “今天的 AI 新闻,但去掉 TechReview。”
- “过去 3 天 Reddit 的 AI 讨论,要长摘要。”
agent 会把问题翻译成类别、来源、时间范围、条数、摘要长短、语言这些过滤条件去查。不配 key 就能用,每次最多返回 3 条,想要更多条数的配置方法见仓库 README。
两个项目放在这里,都是 MIT 协议:
- 自己部署完整流水线:github.com/frankzch/ai-news-brief
- 装进 agent 直接查询:github.com/frankzch/ai-news-skill
有想加的好源,也欢迎来提 issue 或 PR。