热搜雷达:把 AI 判定的 token 成本压到接近零

AI 速览

还没总结过 —— 过一会儿再看。

热点雷达(hotspot)#

微博实时热搜 + 用户关注词过滤(DeepSeek 判定)的极简网站:登录后写下你想关注的内容(如 ai、新能源车),页面只留相关热搜,也能一键看完整榜单。 域名 hot.hsfp.cn(预览 hot_dev.hsfp.cn);代码 /root/pi-cwd-20260820/hotspot,容器 hotspot(:4440),2026-09-22 建。 关联:提示词、Authentik接入指南、nginx-proxy-manager使用手册、我的服务

关键实现#

  • 数据源:https://weibo.com/ajax/statuses/hot_band(带 category 分类,最全),失败回退 /ajax/side/hotSearch。必须带浏览器 UA + Referer,否则微博返回 {"error":"Forbidden"}(服务器是境外 IP,无 Referer 直接 403;实测这两个 ajax 接口带 Referer 可用,不用走代理)。

  • 登录:auth.hsfp.cn(Authentik)OIDC 授权码,应用 hotspot(provider pk 37),redirect URI 两条(hot / hot_dev)。无状态 HMAC session cookie,签名密钥 HOTSPOT_SESSION_SECRET(缺失回退 client_secret,30 天有效期)。参考实现见 Authentik接入指南 与 autodev/lib/auth.ts。

  • 标签 + 判定三层复用(2026-09-22 重构,核心省 token 机制):

    1. 热搜快照全站共享 TTL 5 分钟(只留最近 20 份);

    2. 条目标签 ItemLabel(全局):键 = 标题归一化哈希(去 #/空白/标点后小写),同一个标题只让 AI 打一次 1–3 个中文通用标签(数码/手机、车企/新能源车、娱乐圈/歌手…),以后同标题直接读标签;

    3. 用户级逐关键词判定 UserItemDecision:唯一键 (userId, titleHash, keyword),判过就不再问 AI(60 天过期,另有「重新判定」按钮清空);

    4. 标签亲和 TagAffinity(用户级):AI 认定「关注词↔标签」关系后,以后带该标签的新条目直接本地命中。 判定顺序:缓存 → 标题/标签字面双向包含(标签命中)→ 标签亲和(标签复用)→ 最后才呼叫 AI(AI 新判,一次调用覆盖本轮所有未决对)。页面每条标出判定来源角标。

  • 实测收益(53 条榜单 / 2 个关注词 / deepseek-flash):首次全量 33s(102 对);同条件再请求 39ms、0 次 AI;榜单换新后只判新标题(新增 1 条 → 1 对新判,7.8s);新标题带已知标签时 0 次 AI 直接命中。

  • 一个真 bug(已修):同一条目里若某关注词已被标签命中、其余关键词未决,旧实现会把整行所有关键词都再送 AI —— 既白烧 token,又把 rule 结论覆盖成 llm。修法是本轮已定的对记进 handled 集合,AI 回填时跳过;llmPairs 统计也只算真正未决的对(原先按「未决条目数 × 全部关键词数」高估)。

  • 降级:抓取失败 → 回退最近快照并标 stale(页面提示数据滞后);判定失败/未配 key → 字面包含匹配,且降级结果不写缓存,下次请求自动重试。

  • 前端:Next.js 16 App Router + Semi Design + 自写 CSS 变量(亮/暗色切换)、5 分钟自动刷新、只看关注开关。移动端响应式。

踩坑#

  • DeepSeek 是推理模型:max_tokens 给小会把正文截空(finish_reason=length,content 为空字符串)——lib/judge.ts 设 8000 才稳。这条与 2026-09-19 记录的 new-api 思考吃满 max_tokens 是同一类问题。

  • docker build 里 apt-get install openssl 极慢/失败:node:slim 默认 deb.debian.org,本机实测 9 MB 索引拉 12 分钟,还会因半截索引报 Unable to locate package openssl。必须先 sed -i 's#deb.debian.org#mirrors.aliyun.com#g' /etc/apt/sources.list.d/debian.sources(builder 和 runner 两个 stage 都要)。直接用本机已有的 node:24-slim,node:20-slim 本地没有、要拉。

  • 反代下推断站点 origin 要用 x-forwarded-proto + host,不能用 req.url(host 会被改写,导致 redirect_uri 对不上)。

  • docker compose up -d --build 会随机失败:加速站 docker.1panel.live 对 HEAD /v2/library/node:24-slim 回 403,BuildKit 解析不到基础镜像元数据(同样的构建几分钟前还是好的,属镜像站抖动)。本机已有该镜像,用 docker build --pull=false -t hotspot:latest . + docker compose up -d --no-build 绕开。

数据模型(prisma/schema.prisma,SQLite)#

User(主键=Authentik sub,不建密码表)/ WatchPref(关注词 JSON,最多 20 个)/ HotSnapshot(榜单快照)/ ItemLabel(全局条目标签,键 titleHash)/ UserItemDecision(用户级判定缓存,键 userId+titleHash+keyword)/ TagAffinity(用户级关键词↔标签亲和)。旧的 MatchResult 表已删。

<!-- project: path:/root/pi-cwd-20260820/hotspot -->

上线验收(2026-09-22)#

  • https://hot.hsfp.cn / https://hot_dev.hsfp.cn 均 200,走 *.hsfp.cn 通配证书(NPM host id 176/177,http2_support: true 避免 421);容器 hotspot 跑在 172.17.0.1:4440,rootfs 检查 20 项(正常)。

  • 线上端到端实测(真 Cookie 访问 /api/hot):关注词 ["ai", <泛娱乐圈词>] → 50 条榜命中 10 条,全是该类人物相关,零误报;["数码"] 命中 3 条 vivo 相关;榜单里确实没有 AI 条目时 ai 正确命中 0 条。前端 10 条渲染、关键词标签与理由、暗色切换(theme-mode=dark,bg #16181d)均已验证;测试用户已从库里清掉。

  • v2(标签/判定复用)线上验收:真实用户 happen 已用 auth.hsfp.cn 登录成功(SSO 链路真机验证通过)并设了关注词 ai;线上首次判定 26.5s(99 对,其中 6 条新打标签、其余 44 条标签复用),同条件再请求 180ms、0 次 AI;页面每条显示标签 chip + 判定来源角标(AI 新判/标签命中/标签复用/历史判定),统计行显示「本次无需 AI 判定(全部复用既有标签/判定) · 复用 100 对 · 已打标签条目 50/50」。

  • 清理提醒:直接改 SQLite(不经 Prisma)删 User 不会触发级联,会留下孤立的 UserItemDecision/TagAffinity/WatchPref 行,删测试用户时要手动按 userId 清。

讨论 0

还没有人说话。

    登录登录后可以参与讨论