AIHOT 开源:把整套「AI 热点站」流水线交到你手上,提示词和门槛全部公开

一个每天自己找热点、自己写日报的网站框架,会是什么样子?AIHOT 给出了一个相当完整的答案:它把「采集 — 预筛 — 评分 — 写作 — 聚簇 — 成刊」这一整条流水线全部开源出来,包括每一个提示词的原文和每一道入选门槛。项目在 2026 年 9 月 28 日建仓,两天内就冲到 3100 多颗星,还带一个能直接访问的线上站作对照。

作者「数字生命卡兹克」在 README 里写得很直白:这半年很多做法律、HR、金融、贵金属的朋友问他,能不能也给他们的行业做一个热点站。他做不了——因为他不了解那些行业,不知道哪些信源有用,也不知道什么样的消息才叫热点。于是干脆把整套框架开源出来,让懂行业的人自己动手。这也是项目名的由来:把站名里的 AI 换掉,它就是你的行业热点站。

仓库地址在这里:https://github.com/KKKKhazix/AIHOT,线上演示站在 https://aihot.news。

三个进程,职责分得很干净

技术栈是 Node.js 24 + TypeScript + React Router(服务端渲染)+ Fastify + PostgreSQL + pg-boss + Tailwind CSS,全部用 Docker Compose 编排。整个系统拆成三个进程:

  • api(apps/api/):Fastify 服务,扛下站内接口、公开 API、RSS、MCP、后台接口、图片代理和分享图生成。
  • worker(apps/worker/):基于 pg-boss 的任务队列与定时任务,负责抓信源、调模型、归组、算热度、出日报、发告警和清理。
  • web(apps/web/):React Router 服务端渲染的网页,只通过 HTTP 读 api,从不直接碰数据库。

业务代码集中在 packages/backend/,前后端共用的类型和常量在 packages/contracts/,而所有跟行业相关的东西——站名文案、分类标签、主题、示范信源、提示词、门槛、品牌——全部收在 industry/ 这一个文件夹里。这个边界划得相当克制:换行业基本不用动代码。

一条资料怎么变成一条精选

这是整个项目最有意思的部分。一条资料进入系统后,要依次经过这些关口:

    收进来:同一网址、同一内容只保留一份;只有标题或订阅摘要的,先抓原文页面再判断。 预筛:判断「这是不是本行业的事」。宽进,只拦明显无关的内容,被拦下的不会出现在任何公开页面。 评分:用同一份评分标准独立打两次分(0–100)。两次之和 ≥ 2 × 门槛才入选,页面上显示的是两次的平均分。 写标题摘要:入选的、以及差一点入选的,按内容理解提示词写中文标题、答案先行的摘要、推荐理由和标签;其余的走更便宜的简短摘要,进「全部动态」。 结构化:分类、标签、主体公司、事实(谁、做了什么、对什么),和评分同时进行,主题页和事件归组都靠它。 归组:不同来源报道的同一件事归成一个事件,事件页有综述,热门按事件排。入选资料要等归组完成(最多 3 分钟)才出现,避免同一件事先冒出好几条。 成刊:每天 08:00 出日报,每周一出周报,每月 1 日出月报,按分类分节并带上导语。

其中「独立打两次分」的设计值得一提。同一份提示词、同一篇资料,让模型跑两遍,取平均——这能在不引入第二个模型的前提下,把单次波动压下去一点。门槛也不是一刀切,而是按信源分级区分:

export const SELECTION = {
  thresholds: { T1: 60, T1_5: 65, T2: 76 },
  understandFloor: 50,
} as const;

T1 是官方一手信源(官网、官方博客、机构),T1_5 是官方账号和准官方创作者,T2 是媒体与个人。官方原文门槛只要 60 分,而媒体和个人要 76 分——同样一件事,官方发布的原文更值得先看到。这组数字是 AIHOT 在 AI 领域长期在用的,作者说它「偏严:宁可少选几条,也不让噪声进精选」。

聚簇与热度:一件事只出现一次

同一件事,官网发一篇、媒体转十篇、社交平台上再吵一天——读者其实只需要看到一次。AIHOT 把这些报道聚成一个事件,分三步:

    找候选:用标题和摘要的向量,在最近两周里找出可能是同一件事的报道,再加上同一链接、同一条推文的回复和引用。 判关系:让模型判断到底是同一件事、后续进展,还是两件事;拿不准的先合并,再换一家模型确认一遍。人工改过的归属永远不会被覆盖。 算热度:48 小时内,每个独立来源只算一次,24 小时减半;重复抓取不会多算,一家媒体发十篇也只算一次。

这套规则的结果是:排在前面的,是真正有很多人在说的事,而不是转发最多的那一家。热点榜还会跟 6 小时前的快照对比,涨得快的标上升箭头,新出现的标一个「新」字。

信源是这套系统的入口

AIHOT 支持六种信源类型,基本覆盖了内容分发的所有主要形态:

信源类型说明
RSS最常见的订阅源,直接解析
网页列表没有 RSS 的站点,抓列表页
JSON 接口直接对接后端 API
X 账号追踪特定账号的推文,讨论也算进热度
微信公众号中文语境里绕不开的一环
外部推送你自己的脚本把内容推进来

信源还要分「级」:T1 官方一手、T1_5 官方账号、T2 媒体与个人,另外还有一个 EXCLUDE_MP 级——它不参与精选评分,只进「全部动态」。抓取频率也不是固定的,系统会根据每个源的产出情况自动调整:活跃的源 15 分钟看一次,不活跃的自动拉长间隔。

校准:先改标准,再动门槛

换了行业、改了评分标准,怎么知道模型选得准不准?项目给了一套完整的评测流程。你先从自己的信源里挑 100–200 条资料,一条一条标「该选 / 不该选」,存成 .data/gold.jsonl,然后跑:

node --env-file=.env scripts/eval-selection.ts \
  --gold .data/gold.jsonl --split development --label "第一版评分标准"

它会输出准确率、查准率、查全率,还会把门槛从 40 到 90 每隔 2 分跑一遍,告诉你不同门槛各会得到什么结果,判错的条目连同模型给的理由一起写进后台的 SelectBench 面板。

作者给的建议很实在:该选没选上,多半是评分标准里没说清它为什么重要,就把这类价值写进「必须正常评价」的部分并给出例子;不该选却选上了,多半是噪声没压住,就写进「必须压住」的部分;只有整体偏松偏紧、且判错的条目分数都贴着门槛时,才去调门槛。「先改标准,再动门槛:门槛只能整体移动,解决不了哪一类判错了。」

评测还刻意区分开发集和留出集:调提示词时只看开发集,最后再用留出集检查一遍,免得把提示词调成「只会做这几道题」。另外,同样的输入和提示词重跑不会重复调用模型——因为每个付费请求都有一张回执,改过的部分才会产生新调用。

几个工程上很克制的设计

    一个公开读取层:网页、RSS、API、MCP、站点地图、分享图读的都是 packages/backend/src/publication/,所以各个出口看到的内容天然一致。新增出口也从这里读。 页面不调模型:读者打开页面只读数据库里已有的结果,模型只在 worker 的任务里调用。这是响应速度的底气——线上实测页面中位数 10 毫秒,95% 在 50 毫秒内。 花钱的请求有回执:每个付费请求(模型、X、公众号、Jina)先记一张回执,拿到结果先存再用。进程重启、任务重试时复用已经付过钱的结果,不重复花钱。 预算熔断:每个付费服务有每分钟、每小时、每天的上限,超了就暂停,在后台「设置 → 预算」里配。 旧文不刷屏:发现时已发布超过 48 小时的资料、新信源的存量、回灌的推送,按原文时间归档,不进「今天」、不推送。 来源可追溯:每条精选都链接原文,站内是否显示全文由信源的配置决定,默认只显示摘要。

它给你留了哪些出口

除了给人看的网页,这套框架还准备了相当完整的机器接口:

出口内容
/ /all /hot /topics精选、全部动态、热门事件、主题页
/daily /weekly /monthly日报、周报、月报
/feed.xml 等四个RSS:精选、全部、全文、日报
/api/v1/公开 API,文档在 /openapi-v1.json
/api/mcpMCP 服务,工具名前缀可配(默认 myhot_)
/llms.txt给大模型看的站点说明
/admin后台:信源管理、内容诊断、精选评测、模型切换

「同一份内容,既给人看,也给 Agent 用」——在 2026 年,这个设计思路越来越像标配,但真正把 MCP、llms.txt、公开 API 和 RSS 一起做齐的站点框架并不多。

十分钟把它跑起来

需要 Docker,和一个 OpenAI 兼容的模型 API Key(DeepSeek、千问、智谱都可以):

git clone https://github.com/KKKKhazix/AIHOT.git myhot
cd myhot
node scripts/init-env.ts --llm-key <你的模型 API Key>
docker compose up -d --build

打开 http://localhost:3000 就能看到站点了,后台在 /admin,管理员密码在 .env 的 ADMIN_PASSWORD 里。一两分钟后开始有内容,第一次导入的资料大约半小时处理完。仓库里自带 18 个公开的海外 AI 资讯源作示范——注意,真正的信源名单和运营数据并不在仓库里,要换成你自己行业的。

改成你的行业,交给 Agent 就行

最省事的办法:把仓库丢给你的编码 Agent(Claude Code、Codex 都行),然后说:

请读 AGENTS.md 和 docs/customize.md,把这个站改成「法律」行业的热点站。我关心的是……(你想盯哪些信源,你觉得什么消息重要、什么不重要,越具体越好)。

要改的东西几乎都在 industry/ 里,代码基本不用动:site.ts 管站名和文案,taxonomy.ts 和 topics.json 管分类标签主题,sources.json 管首次启动时导入的信源,prompts/ 放你的行业 KnowHow,selection.ts 管入选门槛,features.ts 是模型榜和 Codex 重置监控的开关。

作者特别提醒:最值得花时间的是评分标准和门槛,而不是界面。这也是把「行业 KnowHow」真正沉淀下来的地方——它不在代码里,而在你怎么定义「什么值得看」。

一点观察

AIHOT 有意思的地方,在于它把「内容运营的判断力」当成了可配置、可评测、可迭代的一等公民。提示词有版本(版本号就是内容的哈希)、判断有门槛、门槛能校准、校准有样本集和评测脚本——这套工程化的做法,通常在推荐系统或者搜索团队里才见得到,而现在它被装进了一个开源的热点站框架。

作者自己也说得很清楚:他不是专业开发者,是设计师出身,半年前还看不太懂代码,这套代码是他和 AI 一起重写的,「一定还有写得不好的地方」。这反而让整个项目更有参考价值——它展示的是一个普通人在 AI 辅助下,能做出什么样完整度的东西。MIT 许可,代码可以随便用,只要求你不要用 AIHOT 的名字和 Logo。

如果你一直想给自己所在的行业做个信息聚合站,又卡在「不知道从哪下手」,这个仓库大概是目前最接近「照着抄就行」的一份参考。https://github.com/KKKKhazix/AIHOT

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享