Files
daily-robots/docs/superpowers/specs/2026-07-29-ai-news-research-quality-design.md

142 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Design: Research 模式 AI 时讯质量(去重 · 国内配额 · 可信源)
Generated: 2026-07-29
Repo: daily-robots
Status: APPROVED
Related: `skills/daily-ai-news-research/SKILL.md`, `daily/news/research.py`, `docs/superpowers/specs/2026-07-14-wecom-diversity-dedup-design.md`
## Problem Statement
当前 `DAILY_AI_NEWS_MODE=research` 下:
1. **内容重复高**:同事件多源报道并列入榜(如 OpenAI 联名 / Altman 减速 / HF 入侵同簇Kimi K3 开源与多条适配);`items``tech_items` 只按 link 去重skill 还允许主题重叠。
2. **几乎无国内资讯**prompt 写「不区分国内国外合并精选」模型偏国际源research 分支关闭国内 RSS企微也不再出国内独立区块。
3. **可信度不稳**:低质搬运 / 营销号可进榜(如证券之星类),与「以官方/权威为准」不符。
样例:`output/2026-07-29.ai-news-research.json`
## Decisions已确认
| 决策点 | 选择 |
|--------|------|
| 国内资讯路径 | **A继续 research 合并展示**;不恢复国内独立区块;不引入 RSS 回填 |
| 国内配额 | 主列表至少约 30%10 条 → **≥3 条国内**`tech_items` **不强制**国内 |
| 去重范围 | **C**:同事件多源只留 1 条 + `tech_items` 相对 `items` 主题不得复述 |
| 可信度 | 国内/国际均以 **官方 + 权威媒体** 为准;不可信则不写,宁缺毋滥 |
| 实现路径 | **Prompt/skill 约束 + `research.py` 解析后硬校验**(推荐方案 2 |
| 条数不足 | **少返回**;禁止为凑满 limit / 国内配额灌低质或同事件条目 |
## Explicit Non-Goals
| 项 | 状态 |
|----|------|
| 恢复「国内 AI 时讯」独立企微区块 | ❌ 本期不做 |
| research 不足时用国内 RSS 补齐 | ❌ 本期不做(偏离路径 A |
| 切回纯 RSS | ❌ 本期不做 |
| LLM 语义嵌入聚类 | ❌ 本期不做(规则 + 实体/关键词即可) |
| 改 `generate.py` research/rss 分支结构 | ❌ 不动 |
## Architecture
```
Cursor Agent (WebSearch)
skills/daily-ai-news-research/SKILL.md + research prompt
│ JSON: items / tech_items
parse_research_response (link 去重)
post_process_research_items
1. trusted-source filter
2. same-event dedupe (items)
3. tech vs items topic filter
4. CN quota packing (min_cn)
_apply_pushed_dedup → generate / wecom
```
仍走现有 `fetch_ai_news_research``generate.py` research 分支;企微保持一块合并时讯。
## Components
### 1. Skill / prompt`skills/daily-ai-news-research/SKILL.md` + `fetch_ai_news_research` 文案)
更新要点:
- 中英文检索都要做;主列表国内 ≥ `min_cn`(默认 30%),但**只收可信国内源**。
- 删除「主题可重叠」「必须恰好 N 条硬凑」;改为「不足少返回」。
- 同事件只保留一条最权威源;`tech_items` 不得复述 `items` 已覆盖的事件/产品发布。
- 来源优先级:官方 blog/changelog/新闻稿、政府/监管原文、一线权威媒体、学术官方;禁止二手搬运、标题党、不明自媒体、证券营销号(无权威交叉验证则不写)。
- 用户 prompt 从「不区分国内国外,合并精选」改为「合并展示,国内配额硬性,可信度优先」。
### 2. 后处理(`daily/news/research.py`
#### 2.1 国内判定(任一即国内)
1. 可选字段 `region: "cn"|"intl"`(有则优先)。
2. `source_name` / host 命中国内白名单量子位、36氪、雷锋网、IT之家、财新、机器之心、钛媒体、虎嗅等
3. 常见中文域(`.cn` 及已知国内 host
#### 2.2 可信源过滤
- 维护 `TRUSTED_HOSTS` / `TRUSTED_SOURCE_NAMES`(国际 + 国内权威;含官方域如 `openai.com``anthropic.com``blog.google` 等)。
- 不在白名单 → **剔除**(保守:宁可短列表)。
- 官方域优先于二手报道;同事件去重时官方源胜出。
#### 2.3 同事件去重items
- 在 link 去重之后。
- 归一化 title+desc抽取主实体公司/产品)+ 事件动词簇(开源、入侵、联名、适配…)。
- 高置信重叠 → 只留排序更靠前且更可信的一条;保守策略避免误杀明显不同事件。
#### 2.4 tech vs items
- tech 与任一 item 同事件,或同主实体且同属「发布/适配/SDK」簇 → 丢弃 tech。
-items 已有 Kimi K3 开源 → tech 中 HF / 昇腾 / 摩尔线程适配全部剔除。
#### 2.5 国内配额
- `min_cn = env DAILY_WECOM_AI_NEWS_CN_MIN`;若未设或 ≤0`max(1, lim * 3 // 10)`10 → 3
- 去重后尽量保证最终 `items` 中国内 ≥ `min_cn`:国内可信条优先占位,再用国际可信条补满。
- 可信国内不足 → 短列表 + 日志 `news_cn_short:N`**不用低质源灌满**。
### 3. 配置
| 变量 | 默认 | 含义 |
|------|------|------|
| `DAILY_WECOM_AI_NEWS_CN_MIN` | `0`= 按 30% 推算) | 主列表国内最少条数;正整数覆盖 |
`.env.example` 注明;`.env` 可不改(沿用推算)。
### 4. 测试(`tests/test_ai_news_research.py`
- 国内判定(白名单 / `.cn` / `region`)。
- 可信过滤:证券之星类 host 剔除;官方/权威保留。
- 同事件Altman 减速与员工联名若同属「减速/治理请愿」簇 → 只留 1 条;与 HF 入侵若实体+事件动词不同则可分簇保留(保守,避免误杀)。
- techitems 已有 Kimi K3 → 多条 Kimi 适配 tech 全剔除。
- 配额:混合列表打包后国内 ≥ `min_cn`(在可信国内足够时)。
验收可对 `2026-07-29.ai-news-research.json` 跑后处理做人工对照。
## Failure Behavior
| 情况 | 行为 |
|------|------|
| 无 `CURSOR_API_KEY` / Agent 失败 | 与现网一致:`enabled: False` |
| 去重/可信过滤后变短 | 接受短列表;日志 `news_dedup_drop` / `news_cn_short` |
| 可信国内为 0 | 不编造、不 RSS 回填;国际可信条照常(若有) |
## Files Touched
- `skills/daily-ai-news-research/SKILL.md`
- `daily/news/research.py`
- `tests/test_ai_news_research.py`
- `.env.example`(可选配置说明)
## Out of Scope Reminder
不改 RSS 抓取路径;不改 research/rss 模式切换结构;不恢复国内独立企微区块。