## 真实数据回归基线

> 状态:2026-06-02 完成。**25 条真实公开新闻 / 公告 / 政策**, 标注集见 [`samples/labeled_real.jsonl`](../samples/labeled_real.jsonl), 每条带 `source_url` 可追溯。
>
> 本文档回答 [`roadmap.md` §5](./roadmap.md#5-当前优先级建议) 的第 1 候选——「真实数据盲测,决定要不要立刻加 LLM」。

---

## 1. 一句话结论

| 阶段 | 三项全过 | thesis 准确率 | macro F1 | 运营支撑 F1 |
|---|---:|---:|---:|---:|
| 词典扩展前(rules v0) | **40.0%** | 64.0% | 0.822 | 0.59 |
| 词典扩展后(rules v1) | **64.0%** | **92.0%** | **0.875** | **0.80** |
| 增量 | **+24 pp** | +28 pp | +0.053 | +0.21 |

合成集 30 条在 v1 下仍保持 **100% / 1.000**, 没有退化。

下一步明确分两步:

1. ~~**先扩词典**~~ ✅ **已完成**(rules v1) —— 真实集三项全过拉到 **64%**, thesis 准确率拉到 92%
2. **再加 LLM 兜底**(置信度 < 0.5 触发) —— 剩余 9 个失败 case 中, 5 条是 thread "over-fire"(关键词漂移)、2 条是对冲句、2 条是 thread 召回边界 case, 都需要语义理解才能修

**不需要**重写分类器、不需要引入语义检索 / embedding。

## 2. 数据集组成

| 维度 | 分布 |
|---|---|
| 总条数 | **25** |
| 时间窗 | 2024-12 ~ 2026-04(以 2025-Q3 至 2026-Q2 为主) |
| 主线覆盖 | 核心网 7 · 终端 12 · 芯片 2 · 运营支撑 9 (含多主线) |
| Thesis 分布 | 增强 17 · 削弱 5 · 中性 2 · 主线零命中 2 (含一条澄清公告) |
| 边角 case | 公司澄清公告 (n025) · 整星制造无主线 (n018) · 监管警示 (n019) · 对冲句 (n017) · 公司反哺过度耦合测试 (n024) |
| 数据源 | 工信部公告 · 上交所通报 · 公司公告(震有科技 / 海格 / 复旦微电 / 中国卫星 / 北方导航 / 思瑞浦) · 财经媒体(新浪 / 证券时报 / 21 经济网 / 通信世界 / C114 / 国际电子商情)· 行业研报 |

每条样本字段:`title` / `content` / `occurred_at` / `source` / `source_url` / `expected.threads` / `expected.thesis_impact` / `expected.min_confidence` (+ `max_confidence`)。

## 3. 基线指标

### 3.1 整体(两轮对比)

| 指标 | 真实集 v0(扩词典前) | 真实集 v1(扩词典后) | 合成集 v1 |
|---|---:|---:|---:|
| **三项全过通过率** | 40.0% | **64.0%** | 100.0% |
| thread 集合精确匹配率 | 56.0% | **64.0%** | 100.0% |
| thesis 影响准确率 | 64.0% | **92.0%** | 100.0% |
| confidence 在期望区间率 | 84.0% | **100.0%** | 100.0% |
| **per-thread macro F1** | 0.822 | **0.875** | 1.000 |
| 平均置信度 | 0.618 | 0.721 | 0.760 |

### 3.2 per-thread P / R / F1(v1,词典扩展后)

| thread | TP | FP | FN | P | R | F1 | vs v0 |
|---|---:|---:|---:|---:|---:|---:|---|
| 核心网 | 7 | 4 | 0 | 0.64 | 1.00 | **0.78** | 持平 |
| 终端 | 12 | 2 | 0 | 0.86 | 1.00 | **0.92** | 持平 |
| 芯片 | 2 | 0 | 0 | 1.00 | 1.00 | **1.00** | 持平 |
| 运营支撑 | 8 | 3 | 1 | 0.73 | 0.89 | **0.80** | +0.21 |

观察:

- **核心网 over-precision** 没有改善(FP=4): "信关站"/"5G NTN"/"星座" 在政策、终端订单类新闻里高频出现 → 误挂。这是关键词漂移问题,词典加减无法解决,要 LLM 才能识别语境
- **终端 F1 0.92**:文本里"终端" 这个词命中率高,且公司反哺(华力创通 / 海格)拉得稳
- **芯片只有 2 条**:样本量太小,F1=1 仅做参考
- **运营支撑 recall 0.56 → 0.89**:补"卫星通信服务"/"经营许可"/"业务许可"/"卫星物联网业务"后, 政策与牌照类新闻直接拉回

### 3.3 公司反哺开关对比(v0 基线时)

| 模式 | 三项全过 | thread exact-match | macro F1 |
|---|---:|---:|---:|
| 启用 `enrich_with_company_threads`(默认) | 40.0% | 56.0% | 0.822 |
| 关闭 enrich(`--no-company-enrich`) | 40.0% | **60.0%** | 0.818 |

**反直觉发现**:关闭公司反哺反而把 thread exact-match 从 56% 拉到 60%。原因:种子公司列表里"中国卫通"是 OPERATIONS,导致 n001 / n024 等"中国卫通"出现的新闻被强行挂"运营支撑"。本身没问题(中国卫通确实是 OPERATIONS 公司),但当 expected.threads 只标"核心网+终端"时(因为事件本质是技术突破/终端发布而非公司业务定位)反而被扣 exact-match 分。

→ 公司反哺应**改为弱信号**:只在 thread 列表为空时补充,或者补充的同时降一档置信度,而不是无条件追加。

⚠️ **本轮未改动公司反哺逻辑**, 因为 `test_enrich.py::test_company_thread_backfill` 与 fallback 模式语义直接冲突, 且 v0 关闭 enrich 时 F1 只升 0.5 pp, ROI 偏低。推迟到与 LLM 兜底同一轮统一改造,届时把"反哺加成 → confidence 降一档"作为弱信号信号一起接入。

## 4. 失败 case 根因拆解(v0 15 条 → v1 9 条)

按"修复成本/可行性"分组。**带 ✅ 是 v1 词典扩展已修复**。

### 4.1 一类:词典扩展即可解决(v0 占失败 60%,9 / 15 → v1 实测修复 6 条)

#### POS_KEYWORDS 缺漏 — 政策类正面动词
| ID | 缺漏词 | v1 状态 |
|---|---|---|
| n004 | `上线`,`正式` | ✅ 修复 |
| n005 | `颁发`,`获许可`,`经营许可`,`配齐` | ✅ 修复 |
| n007 | `印发`,`促进`,`鼓励`,`推动`,`出台` | ✅ impact 修复(threads 仍 over-fire) |
| n012 | `拳头产品`,`广泛应用`,`积极推进` | ❌ 未补这一类(风险大,可能误命中描述性段落) |
| n020 | `批复`,`试点经营` | ✅ impact 修复(threads 仍多挂核心网) |

#### NEG_KEYWORDS 缺漏 — 财报类负面词
| ID | 缺漏词 | v1 状态 |
|---|---|---|
| n017 | `下滑`,`承压` | ✅ 修复 |
| n018 | `亏损放大`(复合词) + 整星制造无主线 | ❌ "增长 + 亏损" 对冲句, 需 LLM |
| n019 | `警示`,`信息披露不准确`,`风险提示不充分` | ✅ impact 修复(threads 仍漏运营支撑) |

#### 运营支撑词典缺漏 — 政策 / 牌照域
| ID | 缺漏词 | v1 状态 |
|---|---|---|
| n020 | `卫星物联网业务`,`经营许可`,`业务许可` | ⚠️ 运营支撑命中, 但仍多挂核心网("星座" 命中) |
| n021 | `卫星通信服务`,`卫星导航服务`,`电信运营` | ✅ 修复 |
| n022 | `出海`,`卫星业务落地`,`手机直连卫星业务` | ✅ 修复 |

**关键修法落到 v1:**
- `POSITIVE_KEYWORDS` 增 14 个: 上线/全国上线/颁发/获许可/经营许可/业务许可/配齐/印发/出台/鼓励/推动/促进/批复/出海/签署/授权
- `NEGATIVE_KEYWORDS` 增 14 个: 下滑/承压/业绩下滑/利润下滑/营收下滑/亏损放大/毛利率下降/扣非亏损/警示/监管警示/信息披露不准确/风险提示不充分/披露不及时/招标失败
- `THREAD_KEYWORDS[OPERATIONS]` 增 9 个: 卫星通信服务/卫星导航服务/卫星遥感/经营许可/业务许可/卫星物联网业务/卫星移动通信业务/试点经营/卫星网络运营
- `DIMENSION_KEYWORDS[RISK]` 增 6 个: 警示/监管警示/信息披露不准确/下滑/承压/招标失败
- `_NEGATION_PAIRS` 增 4 对: (未发布,发布)/(未取得,获得)/(未签订,签订)/(招标失败,中标) — 主修澄清公告类否定语境

### 4.2 二类:必须 LLM 兜底(v1 残留 9 条失败的主体)

#### 关键词漂移导致 thread over-fire(5 条)

| ID | over-fire 主线 | 漂移触发词 | 标注本意 |
|---|---|---|---|
| n001 | 多挂运营支撑 | "中国卫通" 公司反哺无条件追加 | 试验事件本质是核心网 + 终端 |
| n002 | 多挂终端 | "手机直连卫星" 作为应用场景出现 | 项目本质是核心网模拟系统 |
| n006 | 多挂终端 | "手机直连卫星" 在政策列表中提及 | 牌照颁发本质是运营支撑 |
| n007 | 多挂核心网 | "核心网" 在政策长文里被列举 | 政策利好终端 + 运营支撑 |
| n010 | 多挂核心网 + 运营支撑 | "三大运营商" "低轨星座地面网络" | 终端公司订单事件 |

修法:rules 不可解。LLM 在低置信度时介入,识别"主线 vs 应用场景"。

#### 对冲句无主从识别(2 条)

| ID | 句式 | 为什么 rules 修不动 |
|---|---|---|
| n012 | "FPGA 是公司拳头产品, 广泛应用于卫星通信领域" | 无明确动作词, POS=0 但 thread 命中 → 中性。加"拳头产品"等描述词风险大 |
| n018 | "营收同比增长37.89%, 净利润亏损放大" + 整星制造无主线 | 增长 + 亏损同时命中, POS/NEG 平局 → 中性误判。且 4 主线本就没有"整星制造", 公司反哺把"运营支撑"硬加上 |

#### Thread 召回边界(2 条)

| ID | 现象 | 为什么 rules 修不动 |
|---|---|---|
| n019 | thresh 漏 "运营支撑"(impact 已修) | 文本无明确 OPERATIONS 关键词("商业航天"是泛词不入词典), 但人类判定监管警示属运营/合规 |
| n020 | 多挂核心网("天启星座" 触发) | 上下文是"卫星物联网试点经营", "星座" 在这里是公司名一部分 |

→ **LLM 兜底触发阈值建议 `confidence < 0.55`**: v1 残留 9 条对应 confidence 区间, 阈值 0.55 能覆盖 n012(0.55) / n018 / n019, 阈值 0.5 cover 80%。over-fire 类(n001/n002/n006/n007/n010)confidence 通常 ≥ 0.6 不会触发——这是已知 limitation, 需要在阈值之外加"thread 命中 > 2 时强制 LLM 复核"作为补充触发条件。

### 4.3 三类:标注 / 设计争议(v0 占失败 13%,v1 已全部修复)

| ID | 争议 | v1 状态 |
|---|---|---|
| n007 | `工信部指导意见` 是否应该归"核心网"主线 | impact 修复, threads 仍 over-fire(归入 4.2 第一类) |
| n024 | `中国卫通推出消费级终端` 公司反哺挂运营支撑 | ✅ exact-match 通过 |
| n025 | 北方导航澄清"未发布、无业务" | ✅ 修复(`_NEGATION_PAIRS` 加 `未发布→发布`) |

## 5. 与合成集对比的关键 takeaway

| 维度 | 合成集 100% 是因为 | 真实集掉下来是因为 |
|---|---|---|
| 词典覆盖 | 样本里出现的词典里都有 | 真实新闻措辞远比合成丰富 |
| 极性词 | 合成时刻意放了正反 keyword | 真实新闻"对冲句"普遍, "上线/颁发"等不在词典 |
| Thread 集合 | 合成只挂明确主线 | 真实政策文 / 公司公告往往跨多主线,exact-match 太严苛 |
| 标注 | 合成是 round-trip(规则与样本一起调) | 真实标注是人工先判,classifier 后跑,标注偏差 + 边角案例多 |

**核心教训**:**100% 合成集分数不代表上线表现**——这条早在 `regression.md §6` 已经写明,真实数据把这句话坐实了。

## 6. 对 Phase 2 路线图的具体修订

参考 [`roadmap.md` §2](./roadmap.md#2-phase-2--tracking-agent-todo),原计划是 P0 "接 RSS / 公司公告抓取" + "复用 ingest pipeline"。真实数据回归之后的修订:

| 原 Story | 优先级 | 修订建议 |
|---|---|---|
| 真实新闻 20-50 条盲测 | P0 | ✅ 完成 25 条 |
| 词典扩展(原 limitations §6 罗列的) | 隐含 | ✅ rules v1 实测把三项全过从 40% 拉到 64% |
| LLM 兜底分类 | P2(置信度低时介入) | **升级 P1**, 触发阈值 `confidence < 0.55` + thread 命中 ≥ 3 时强制复核 |
| 接 RSS / 公司公告抓取 | P0 | 不变, 但需要在 ingest 时同时写"低置信待审 flag", 让 LLM 兜底有入口 |
| Thesis impact 实时评分 | P1 | 不变 |

**Phase 2.0 · 词典扩展**(✅ 已完成 2026-06-02)

实施改动汇总见 §4.1 末尾的 "关键修法落到 v1"。实测:

- 真实集三项全过 **40% → 64%** (+24 pp)
- thesis 准确率 **64% → 92%** (+28 pp)
- 运营支撑 F1 **0.59 → 0.80** (+0.21)
- 合成集 30 条 **100% / 1.000 不退化** ✓
- pytest 18 / 18 全过 ✓

**Phase 2.1 · LLM 兜底 + 公司反哺弱信号化**(优先级 P1,3-5 天)

- LLM 触发条件:`classify(...).confidence < 0.55` **或** `len(threads) >= 3`(后者捕获 thread over-fire)
- 输入:原文 + rules 预测结果(作为弱监督)+ 命中的关键词 evidence
- 输出:`threads` + `thesis_impact` + 一句话解释
- 模型选型:DeepSeek-V3 / Qwen2.5-32B 廉价档即可,无需 Opus
- 公司反哺顺带改造:被反哺挂上的 thread 单独标记到 `evidence.company_threads`(已实现)+ 整体 confidence 乘 0.85 折扣(待加)。同步把 `test_enrich.py::test_company_thread_backfill` 的语义改成"反哺标弱信号"
- 评估:真实集再跑一次,目标三项全过 ≥ 85%, thread exact-match ≥ 80%

## 7. 复现命令

```bash
cd agent
.venv/bin/python -m satellite_agent.cli regress samples/labeled_real.jsonl --format md
.venv/bin/python -m satellite_agent.cli regress samples/labeled_real.jsonl --format md --no-company-enrich
.venv/bin/python -m satellite_agent.cli regress samples/labeled_real.jsonl --format json > /tmp/baseline.json
```

## 8. 后续

- [x] 词典扩展 PR(Phase 2.0)— ✅ 2026-06-02 完成。三项全过 40% → 64%,合成集不退化
- [ ] LLM 兜底原型(Phase 2.1) — 选 1 个廉价模型, 单跑 5 条对冲句样本(n012 / n018 / n019)看效果再决定全量
- [ ] 公司反哺改弱信号(Phase 2.1 同批) — `confidence *= 0.85` 折扣,同步更新 `test_enrich.py`
- [ ] 真实集扩容到 50 条(Phase 2 抓取上线后, 用真实抓取数据扩样)
- [ ] 标注复审:n007 / n024 的争议项二次确认, 是否调整 expected

---

> **免责声明** — 本回归集所引用的真实新闻 / 公告 / 政策文件均来自公开渠道, `source_url` 可追溯。文本经过简化以适配 classifier 输入,事实与时间点保留原貌。回归结果仅用于评估 MVP 分类器, 不构成对相关公司或证券的任何投资判断。
