一个人、一个 Cloudflare Worker、一个 D1 数据库,加上豆包大模型,把 14 个信息源熬成了一块「AI 智能工作台」。
一、为什么要做这个东西
作为一个同时写 AI 科技自媒体和开发者技术内容的人,我每天早上的状态基本是:Hacker News 刷一遍、Reddit 的 r/MachineLearning 和 r/LocalLLaMA 刷一遍、GitHub Trending 看一眼、arXiv 扫一眼,再加上新智元、量子位、36 氪 AI、AI Base 这些中文源——一个小时就没了,而且越刷越焦虑,生怕漏掉什么。
问题不是信息太少,而是信息太多但没有被加工。我需要的不是另一个 RSS 阅读器,而是一个能替我读、替我筛、替我总结、甚至替我想选题的「智能工作台」。
于是有了 AI Radar Intelligence OS:每小时自动抓取 → AI 富集摘要 → 跨源去重合并 → 生成选题,前端做成了一个参考 Apple / Linear / Perplexity / Vercel / Raycast 风格的仪表盘。它不是新闻网站,是一块 AI 从业者每天早上打开的智能工作台。
技术栈很轻:Cloudflare Workers + Hono + D1(SQLite)做后端,React 18 + Vite + Tailwind 做前端,模型调用走火山方舟(Volcengine Ark)的 Anthropic Messages 兼容协议。整个项目没有服务器,全在边缘跑。
二、老规矩:先和Doubao-Seed-Evolving 把需求聊清楚
动机想清楚之后,接下来才是我的固定习惯——老规矩,先和 Doubao-seed-evolving 模型沟通需求,让它把要做的东西列出来,再动手写代码。
我把脑子里模糊的想法丢给它:「我想做一个 AI 从业者每天早上打开的情报首页,不是新闻列表,是一个智能工作台,参考 Apple、Linear、Perplexity、Vercel、Raycast 的质感,要快、要智能、要可信」。它没有急着写代码,而是先反问、再拆解,最后给出一份结构化的需求清单:
- 首页要承载哪些版块:Hero 关键指标、AI 每日简报、Live 滚动情报条、精选情报、GitHub 趋势、arXiv 论文、势力榜、AI 工具、RZ动态,共九个;
- 哪些数据有真实来源、哪些没有:模型榜、AI 工具、后端没有专门表,它主动提出「用真实数据推导,不伪造跑分、金额、封面」——这正好是我最在意的信任底线;
- 全站风格统一:不只改首页,资讯、选题、主题、趋势、详情页全部套用同一套 OS 视觉语言;
- 动效与技术选型:引入 framer-motion 做弹簧/交错/页面过渡,lucide-react 线性图标替换 emoji,暗色/亮色自适应、aurora 背景、玻璃拟态;
- 性能要求:路由级 code-splitting、vendor 分包、聚合接口、DB 索引、缓存策略;
- 不能动的部分:数据采集、AI 富集、选题生成的 pipeline 和分类体系保持不变。
更关键的是,它在列需求的阶段就把「信任」这条主线拎了出来:所有数字、摘要、趋势都必须来自真实数据,推导逻辑要在 UI 上标明口径(比如「近 7 天动量」),没有金额就不显示金额。这一句后来成了整个产品的红线。
需求清单对齐之后,我才让它进入实现阶段。事实证明,这一步省了大量返工——与其边写边改,不如先让模型当一次产品经理,把「要做什么、不做什么、底线在哪」聊透。而豆包 Seed-Evolving 在这个「需求梳理 → 方案拆解 → 风险预判」环节表现出来的工程理解力,也是我愿意把 AFP 额度一路烧到上限的原因。
三、这个网站到底能干什么
1. 一张屏看完整个 AI 世界(总览 Dashboard)
首页是一个 bento 风格的仪表盘,九个版块全部基于真实数据,没有一个数字是编的:
- Hero 区:情报总数、今日新增、监控来源数、当前最热主题,数字滚动入场,配 aurora 渐变背景和跟随鼠标的聚光灯。
- AI 每日简报:把当天生成的选题卡的 hook、差异化角度、可引用事实抽成一段「3 分钟读完」的导语。
- Live Intelligence Ticker:Bloomberg 终端风格的自动滚动情报条,hover 暂停,点击直达原文。
- 精选情报卡:AI 摘要 + 「为什么重要」+ 热度条 + 阅读时长 + 收藏/分享。
- GitHub 趋势 / arXiv 论文 / AI 工具 / 初创:四个垂直版块。
- 势力榜:按真实主题提及量和 7 天动量排名,配 14 天迷你走势线——这是给「今天谁在霸榜」一个量化答案。
其中版块(势力榜、AI 工具)后端没有专门的数据表,我坚持用真实数据推导,而不是伪造:势力榜来自主题提及时间序列,AI 工具来自 Product Hunt / AI Base 和带「AI 编程 / Agent」标签的 GitHub 项目,因为「信任」是这个产品的底线。
2. 跨源去重 + 热度加权
同一条新闻,新智元、量子位、Hacker News 可能都报。AI 富集阶段会为每个事件生成一个英文 eventKey(比如 Doubao-Seed-Evolving),后端据此把多个来源合并到同一条情报下,热度按来源权重累加。你看到的是「一件事」,而不是「五条重复的标题」。
3. AI 每日选题(核心杀手锏)
每天早上 08:30(北京时间),系统自动取过去 24 小时热度最高的 20 条情报,让Doubao-Seed-Evolving生成恰好 6 张选题卡。每张卡包含:
- 工作标题 + 一句话卖点(hook)
- 五个平台各自的切入角度:公众号走深度分析、知乎走问答干货、小红书走实用情绪、短视频走 3 秒钩子、技术博客走原理实践——不是一句话换皮
- 差异化角度:「别人会怎么写,你怎么写得不一样」
- 可引用事实点,每条必须带输入里给过的真实 URL,不许编造
- 工作量评估(low/medium/high)
- 关联的原始热点
这对内容创作者来说,等于每天有一个不吃早饭的资深编辑把选题会开完了。
4. 主题与趋势
14 个主题(大模型、Agent、AI 编程、开源、OpenAI、Anthropic、Google、字节/豆包、阿里/通义、DeepSeek、多模态、AI 硬件、自动驾驶、安全与监管)支持点进去看该主题下的资讯和近 30 天走势。趋势页是手绘的 SVG 多折线图,支持 1×/2×/3× 缩放、悬停十字线、末端标签防重叠、图例点击隐藏。
5. 刚刚做完的「智能工作台级」重构
这一轮我把整个前端从一个窄栏新闻列表重做成了 Intelligence OS:
- 浮动玻璃态导航胶囊,
layoutId做 tab 切换的弹簧动画 - framer-motion 驱动的卡片浮起、交错入场、数字 count-up、页面过渡
- lucide-react 线性图标替换了全部 emoji
- 全站暗色/亮色自适应,aurora 背景 + 浮动粒子 + 鼠标聚光灯
- 路由级 code-splitting + vendor 分包,首屏 JS 从单包 365KB 降到 react/motion/icons/app 四个可长期缓存的 chunk
- 长列表用
content-visibility:auto跳过屏外布局,/api/overview加了stale-while-revalidate,DB 补了复合索引
6. 实测数据快照
上线跑了一段时间后,我截了一张当时的真实数据(GET /api/overview 原始返回,非演示数据):
| 指标 | 数值 |
|---|---|
| 已富集情报总数 | 139 条 |
| 过去 24 小时新增 | 71 条 |
| 监控信息源 | 14 个(中英文混合) |
| 当前最热主题 | 大模型(今日 43 条提及) |
| 当日 AI 选题卡 | 6 张,全部由 doubao-seed-evolving 生成 |
| 首页各版块 | Ticker 14 · 精选 8 · GitHub 6 · 论文 5 · 工具 8 · RZ 6 |
势力榜(按近 14 天主题提及量,括号内为近 7 天动量):大模型 96(+86)、开源 37(+33)、Agent 35(+35)、多模态 18(+14)、Anthropic 16(+12)、安全与监管 14(+12)、OpenAI 11(+11)、阿里/通义 5(+5)。能清楚看到当天的三条主线:大模型底层迭代、开源项目爆发、Agent 与安全攻防。
版块当天命中 6 条真实行业动态——Anthropic 100 亿算力协议、AIROBO 数亿元首轮RZ、恺望数据逾亿元战略RZ、前海母基金数亿元押注 Om AI 联汇、美图 1 亿元 AI 影像挑战赛、智象未来三个月RZ超 21 亿跻身独角兽。金额全部来自新闻标题原文,系统只做关键词匹配,不解析、不换算、更不杜撰,没有金额的条目就只显示标题和摘要。
当天热度最高的三条精选情报是:逆向渗透 AI 技能路由包 reverse-skill(热度 73428)、腾讯云开源 Agent 团队级记忆中心 TencentDB-Agent-Memory(32748)、airllm 单 4GB 显存推理 70B 大模型(32598)。豆包据此生成的第一张选题卡是 reverse-skill——它准确抓住了「24k Star、兼容 Claude Code/Cursor、AI 编程下沉到安全攻防一线」这个核心,并为公众号、知乎、小红书、短视频、技术博客分别写了完全不同的切入角度,连「仅限授权测试」的合规边界都主动加上了。
四、为什么是Doubao-Seed-Evolving
整个智能工作台用了两个豆包模型分工:
| 任务 | 模型 | 原因 |
|---|---|---|
| 每小时资讯富集(摘要/分类/主题/去重键) | doubao-seed-2-0-lite | 批量、高频、要快、要便宜 |
| 每日选题生成 | doubao-seed-evolving | 需要更强的推理、创意和长上下文综合 |
这个组合让我能把「体力活」交给 lite,把「脑力活」交给 Seed-Evolving。下面重点说说 Seed-Evolving 在这个项目里体现出的几个关键优点。
1. 1M 上下文:一天的热点可以一次性喂进去
选题生成不是逐条处理,而是把当天 Top 20 情报(标题、AI 摘要、为什么重要、分类、主题、热度、来源链接)一次性塞进一个 prompt,要求模型在全局视野下挑选 6 个最值得做的选题、合并同一事件、为五个平台分别写不同角度。
这就是 1M 上下文的价值:我不需要做分片、摘要再摘要、map-reduce 那套容易丢信息的拼装。一天的全部热点放进一个上下文窗口,模型能看到「整个信息版图」再做判断,选题之间不会重复,平台角度之间能形成互补。
在富集阶段,每批 6 条、每条摘要截断到 400 字,是我主动做的成本控制;但当我需要「全局综合」时,1M 的余量意味着我敢把整天的数据一次喂进去,而不用在工程上拆得七零八落。
2. 「永远更新的模型卡片」:代码不用改,模型自己进化
火山方舟上 doubao-seed-evolving 这个模型卡片是滚动更新的——别名永远指向最新的 Evolving 版本。这意味着我的 wrangler.jsonc 里只要写 MODEL_IDEAS="doubao-seed-evolving",后端不需要发版、不需要改 endpoint,模型升级后选题质量会自动跟着变好。
对一个个人项目来说,这一点特别重要:我不用维护模型版本矩阵,也不用纠结「要不要升级到新版本」。我的选题系统永远跑在豆包最新的能力上。
3. Coding 工程能力:这次重构它就是我的结对程序员
这次 OS 级重构,Seed-Evolving 深度参与了编码:
- 前端从单包拆成 React.lazy 路由分包 + Vite manualChunks(react/motion/icons 独立缓存)
- 新增
/api/overview聚合接口,用一条IN查询批量补来源,替掉了原来每条 item 单独查来源的 N+1 - D1 复合索引设计、HTTP
stale-while-revalidate缓存策略 - 一堆 TypeScript 类型收敛和防御性归一化
它在工程上下文里的表现是:能读懂既有代码的风格和约束,给出的改动是「融入式」而不是「另起炉灶式」。比如我要求它复用现有的
idea-shape.ts 归一化器、保持 Array.isArray 防御、沿用中文注释密度,它都能照着做。这种「在别人的代码库里优雅地动刀」的能力,比从零写一段 demo 难得多。
4. Agent 检索与指令遵循能力:富集本身就是一个结构化 Agent
富集任务本质上是一个小型 Agent:读入来自 14 个不同来源、格式各异的原始条目(HN 的 JSON、Reddit 的 API、GitHub Trending 的 HTML、arXiv 的 Atom、各家 RSS),输出严格结构化的 JSON,还要做跨源事件合并。
我在 system prompt 里下了十条「严格规则(违反视为失败)」,包括:
- 只有真正属于 AI 领域才 relevant,纯前端框架、普通 App、招聘一律 false
relevance必须是 0–1 的数字,不能写「高/中/低」- summary 必须是 2–4 句中文,不许加「近日」「据悉」这类废话
- 公司归属必须准确,严禁张冠李戴:Qwen/通义绝不能打成「字节/豆包」,豆包绝不能打成「阿里/通义」,并给了每家公司的关键词白名单
eventKey同一事件所有来源必须完全一致- 只输出 JSON,不要 markdown 代码块
Seed-Evolving 和 seed-2-0-lite 在这种长指令 + 强约束 + 多类别分类任务上的遵循度相当稳,批量 6 条一次返回的 JSON 结构几乎不跑偏。我仍然在后端加了 sanitize() 做二次校验(relevance 数字兜底、category/topic 越界纠正、公司主题关键词复核),但这是「安全网」而不是「擦屁股」——防线的主力仍然是模型本身的指令遵循能力。
5. 幻觉控制:可引用事实必须带真实 URL
选题生成里有一条铁律:facts 里的每条 URL 必须是输入中给过的真实链接,不要编造。这直接关系到内容创作者会不会引用一个不存在的来源。
实际表现是:模型基本不会凭空捏造 URL 或事实。我在前端又加了一层 idea-shape.ts 的容错归一化(把偶尔被序列化成字符串/对象的字段收敛回正确形状),双层防护下,之前那种「点选题卡白屏」的问题已经彻底消失。
幻觉不是零,但它已经从「需要人盯着改」降到了「程序化兜底就能兜住」的水平——这是一个工程上可用的临界点。
6. 最出彩的地方:每日选题生成器
如果只能挑一个地方证明 Seed-Evolving 在这个项目里的价值,那就是每天早上 08:30 自动跑的「选题生成器」。它把我前面说的所有优点——长上下文、指令遵循、Agent 式的关联检索、幻觉控制——浓缩在一次模型调用里。
代码短到可以整篇贴出来。这是 worker/src/ai/ideas.ts 的核心:
const SYSTEM = `你是一位资深 AI 领域内容策划,服务对象是一位同时做"AI 科技自媒体"和"开发者技术内容"的创作者。
他的发布平台包括:微信公众号、知乎、小红书、短视频(抖音/视频号)、技术博客。
根据我给你的今日热点条目,挑选出恰好 6 个最值得做的选题,为每个选题输出一张选题卡。必须正好 6 张,不多不少;如果热点不够,就从相对没那么热但仍有价值的条目中补足。
选题原则:
1. 优先选有传播力、有信息差、有观点空间、能体现开发者视角的事件。
2. 不要每条新闻都做,纯RZ、纯人事、纯监管公告除非影响很大否则跳过。
3. 同一事件只出一张卡,把多个来源的事实合并。
4. platforms 为每个平台给一句不同的切入角度(不是同一句话换皮):
- 公众号:深度分析/观点视角
- 知乎:问答体/干货拆解视角
- 小红书:实用/情绪/清单视角
- 短视频:3秒钩子+冲突点
- 技术博客:技术原理/上手实践视角
5. angle 是差异化角度:说明"别人会怎么写,你怎么写出不一样的"。
6. facts 是可引用的事实点,每条带 url(必须是输入里给过的真实链接,不要编造)。
7. effort 取 low/medium/high。`;
export async function generateIdeas(env: Env, items: TopItem[], date: string) {
const userPrompt = `日期:${date}
今日热点条目(已按热度排序):
${JSON.stringify(items, null, 2)}
请输出 {"ideas": [数组]},每个选题字段:
title(工作标题), hook(一句话卖点), platforms(对象数组,每项 {platform, angle}),
facts(事实点数组,每项 {text, url}), angle(差异化角度),
effort(low/medium/high), item_ids(关联的条目id数组,数字)`;
const resp = await chatJson(env, env.MODEL_IDEAS, [
{ role: "system", content: SYSTEM },
{ role: "user", content: userPrompt },
], { temperature: 0.4, maxTokens: 6000, timeoutMs: 120000 });
return (resp.ideas || []).map((r) => ({
idea_date: date,
title: asString(r.title, "(无标题)"),
hook: asString(r.hook),
platforms: normalizePlatforms(r.platforms),
facts: normalizeFacts(r.facts),
angle: asString(r.angle),
effort: normalizeEffort(r.effort),
item_ids: normalizeItemIds(r.item_ids),
model: env.MODEL_IDEAS,
}));
}
调用方传入的 items 是当天热度最高的 20 条情报,每条都带着完整的 title / summary / why / category / topics / score / sources[{url,name}],被 JSON.stringify 整体塞进一个 prompt。注意这里几个设计细节正好对应模型的几项能力:
- 「恰好 6 张,不多不少」+ 热点不够就补足 —— 这是对指令遵循的硬约束,模型要在「宁缺毋滥」和「必须交满 6 张」之间自己做权衡;
- 「同一事件只出一张卡,把多个来源的事实合并」 —— 这需要模型在 20 条长上下文里识别哪些是同一事件,跨条目做 Agent 式的关联与合并,而不是逐条复述;
- 五个平台各给一句不同切入角度,「不是同一句话换皮」 —— 这要求模型真的理解五种内容形态的差异,而不是套模板;
facts必须带输入里给过的真实 URL —— 这是反幻觉的硬约束,模型被禁止凭空造链接;item_ids是关联的条目 id 数组 —— 模型要回头从输入里挑出它引用了哪几条,相当于一次「可溯源的检索」,让每张选题卡都能点回原始热点。
更妙的是最后那一段 .map():模型输出我并不直接信任,而是过 asString / normalizePlatforms / normalizeFacts / normalizeEffort / normalizeItemIds 五个归一化器,把偶尔被序列化成字符串、缺字段、枚举越界的脏数据收敛回正确形状。这是我和 Seed-Evolving 磨合出来的协作方式——模型负责聪明,代码负责兜底。
为什么说这是它「最出彩」的地方?因为富集任务是「读一条、吐一条」的体力活,换成小模型也能干;而选题生成是在一整个上下文窗口里做全局判断、跨源合并、多视角创作、还要自报来源的综合活。它生成的不是摘要,是判断——哪些值得写、怎么写得不一样。这正是 1M 上下文 + 强指令遵循 + 反幻觉三者同时在线时,大模型才能交付的东西。也是我愿意把这个最关键的日常任务,单独留给 doubao-seed-evolving 而不是 lite 的原因。
五、深度测评的代价:AFP 用量被我打到上限
说实话,这一轮重构和调优我对 Seed-Evolving 做了非常重度的测评:反复迭代选题 prompt(从「写 6 个选题」到精确到五个平台各自的人设和句式)、测试不同 temperature、对比 lite 和 Evolving 在富集质量上的差异、压测长上下文下的 JSON 稳定性、用它重构前后端代码……
结果就是:AFP 用量直接打到了上限。
这算是个幸福的烦恼——它说明这个模型在真实工程场景里是「用得起来、而且越用越想用」的,而不是调两下就丢到一边的玩具。配额触顶反而成了我对它能力最直接的一次背书:如果不是真的好用,谁会把额度烧到上限呢。
(小提示:批量富集这类高频任务我已经切给 doubao-seed-2-0-lite,只让 Seed-Evolving 做每日选题这种高价值综合任务,把好钢用在刀刃上。)
六、一些工程上的小心思
- 两模型分工:lite 跑量,Evolving 跑质,成本和质量平衡。
- 显式关闭 thinking:火山方舟的豆包默认开 extended thinking,批量结构化任务会白烧 token,我在 API 层显式
thinking: { type: "disabled" }。 - 容错 JSON:模型偶尔给 JSON 套
```jsonfence,代码里统一剥掉再 parse。 - 错误边界:React ErrorBoundary 包住每张卡,单条坏数据不会拖垮整页。
- 主题公司归属二次校验:后端用关键词表复核 AI 的公司打标,标题权威优先,防止摘要里的幻觉把别家公司带进来。
- 已读/收藏 localStorage:阅读状态跨组件同步,轻量不依赖后端。
- 尊重
prefers-reduced-motion:动画在无障碍设置下降级为即时显示。
七、接下来想做什么
- 给势力榜接入真实的模型跑分/评测数据,而不只是提及量
- 把选题卡的五个平台角度做成「一键复制成稿框架」
- 加一个「情报回顾」周报,让 Seed-Evolving 每周做一次趋势综述
- 等 D1 数据再厚一点,用 1M 上下文做「月度 AI 产业复盘」
八、写在最后
这个项目让我重新确认了一件事:大模型真正的杠杆,不是替你写一段话,而是替你走完一整条信息流水线——从抓取、筛选、摘要、去重、分类、打标,到选题策划,全在边缘自动跑。我每天早上打开它,看到的不是一堆链接,而是已经被加工好的「认知」。
Doubao-Seed-Evolving 在其中扮演的是那个「主编 + 资深工程师」的角色:长上下文 hold 得住全局、模型卡片自动进化、写代码能融入既有工程、指令遵循稳、幻觉可控。它不是完美的,但它已经过了「能在生产里扛事」那条线。
我把 AFP 打到上限,就是最好的证明。
如果你也想自己跑一个,或者看看这套工作流具体怎么实现的,代码和在线站点都放在这里,欢迎 Star、提 Issue、照着改:
整个项目前后端加起来没多少代码,Cloudflare Workers + D1 + 豆包的组合部署成本几乎为零,照着 README 填个 ARK Key 就能拥有自己的 AI 情报工作台。
AI Radar Intelligence OS x 豆包/火山方舟 · 数据每小时自动更新,选题每天 08:30 自动生成。
