fix: bug
This commit is contained in:
@@ -14,16 +14,17 @@
|
||||
|
||||
**数据偏老原因**:未传 `timespan` 和 `sort=datedesc`,API 返回 3 个月内“最相关”文章,不保证最新。
|
||||
|
||||
### 2. RSS 新闻 (situation_update) — 主事件脉络来源
|
||||
### 2. RSS 新闻 → 看板实时数据(主输出)+ 事件脉络
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| 源 | 多国主流媒体:美(Reuters/NYT)、英(BBC)、法(France 24)、俄(TASS/RT)、中(Xinhua/CGTN)、伊(Press TV)、卡塔尔(Al Jazeera) |
|
||||
| **主输出** | **看板实时数据**:战损(combat_losses)、据点状态(key_location)、冲突事件(gdelt_events)、统计(conflict_stats)等,供前端战损/基地/地图等面板展示。 |
|
||||
| 辅助输出 | 事件脉络(situation_update):时间线摘要,非主展示目标。 |
|
||||
| 源 | 多国主流媒体:美/英/法/俄/中/伊/卡塔尔等(见 `config.RSS_FEEDS`) |
|
||||
| 过滤 | 标题/摘要需含 `KEYWORDS` 之一(iran、usa、strike、military 等) |
|
||||
| 更新 | 爬虫 45 秒拉一次(`RSS_INTERVAL_SEC`),优先保证事件脉络 |
|
||||
| 优先级 | 启动时先拉 RSS,再拉 GDELT |
|
||||
| 更新 | 爬虫按 `RSS_INTERVAL_SEC` 拉取;每 `BACKFILL_CYCLES` 轮会从近期事件回填一次战损/据点,保证面板数据与最新内容一致。 |
|
||||
|
||||
**GDELT 无法访问时**:设置 `GDELT_DISABLED=1`,仅用 RSS 新闻即可维持事件脉络。部分境外源可能受网络限制。
|
||||
**GDELT 无法访问时**:设置 `GDELT_DISABLED=1`,仅用 RSS;部分境外源可能需代理。
|
||||
|
||||
### 3. AI 新闻清洗与分类(可选)
|
||||
|
||||
@@ -34,7 +35,7 @@
|
||||
|
||||
---
|
||||
|
||||
**事件脉络可实时更新**:爬虫抓取后 → 写入 SQLite → 调用 Node 通知 → WebSocket 广播 → 前端自动刷新。
|
||||
**看板实时数据更新**:爬虫抓取 → 提取战损/据点等 → 写入 combat_losses、key_location 等 → 调用 Node 通知 → WebSocket 广播 → 前端战损/基地/地图等面板刷新。事件脉络(时间线)为同一流水线的辅助输出。
|
||||
|
||||
## 依赖
|
||||
|
||||
@@ -141,6 +142,7 @@ npm run crawler:test:extraction # 规则/db_merge 测试
|
||||
| **地图冲突点** (conflictEvents) | gdelt_events 或 RSS→gdelt 回填 | ✅ 是 | GDELT 或 GDELT 禁用时由 situation_update 同步到 gdelt_events |
|
||||
| **战损/装备毁伤** (combatLosses) | combat_losses | ⚠️ 有条件 | 仅当 AI/规则从新闻中提取到数字(如「2 名美军死亡」)时,merge 才写入增量 |
|
||||
| **基地/地点状态** (keyLocations) | key_location | ⚠️ 有条件 | 仅当提取到 key_location_updates(如某基地遭袭)时更新 |
|
||||
| **地图打击/攻击动画** (mapData.strikeSources, strikeLines) | map_strike_source, map_strike_line | ⚠️ 有条件 | 仅当提取到 map_strike_sources / map_strike_lines 时写入;格式见下「地图打击数据」 |
|
||||
| **力量摘要/指数/资产** (summary, powerIndex, assets) | force_summary, power_index, force_asset | ❌ 否 | 仅 seed 初始化,爬虫不写 |
|
||||
| **华尔街/报复情绪** (wallStreet, retaliation) | wall_street_trend, retaliation_* | ⚠️ 有条件 | 仅当提取器输出对应字段时更新 |
|
||||
|
||||
@@ -255,6 +257,32 @@ npm run crawler:test
|
||||
|
||||
---
|
||||
|
||||
## 数据流与 AI 自检
|
||||
|
||||
**完整链路**:RSS 抓取 → 关键词过滤 → 翻译/清洗 → 去重(news_content)→ 写 situation_update → 正文抓取(可选)→ **AI 提取**(战损/基地等)→ db_merge 写 combat_losses/key_location 等 → POST /api/crawler/notify → Node 重载并广播。
|
||||
|
||||
| 环节 | 说明 | 自检 |
|
||||
|------|------|------|
|
||||
| 抓取 | `scrapers/rss_scraper.fetch_all()`,按 KEYWORDS 过滤 | `npm run crawler:test` 看条数 |
|
||||
| 去重 | `news_storage.save_and_dedup()`,content_hash 落库 news_content | 查 `news_content` 表条数 |
|
||||
| 事件脉络 | `db_writer.write_updates()` 写 situation_update(与 pipeline 使用同一 db_path) | 查 `situation_update` 表 |
|
||||
| AI 提取 | 战损/基地等:**有 DASHSCOPE_API_KEY 用通义**,**否则 CLEANER_AI_DISABLED=1 用规则**,否则用 **Ollama**(extractor_ai) | 见下 |
|
||||
| 分类/严重度 | 每条 RSS 的 category/severity:**PARSER_AI_DISABLED=1 用规则**,否则 DashScope 或 Ollama | 无 AI 时设 `PARSER_AI_DISABLED=1` 可正常跑 |
|
||||
|
||||
**如何保证「面板实时数据」有更新**(战损、据点等):
|
||||
|
||||
- **推荐**:设 `CLEANER_AI_DISABLED=1` → 使用 `extractor_rules`(纯规则),无需 Ollama/通义,即可从新闻中提取战损/基地并写入 combat_losses、key_location。
|
||||
- 或设 `DASHSCOPE_API_KEY` → 用通义做更细的提取。
|
||||
- 否则用 `extractor_ai`(需本机 `ollama run llama3.1`),未起则提取静默失败、面板数字不更新。
|
||||
- 服务会每 `BACKFILL_CYCLES` 轮(默认 2 轮)从近期事件再跑一次提取并合并,保证战损/据点与最新内容一致。
|
||||
|
||||
**常见 bug 与修复**:
|
||||
|
||||
- **事件脉络有、战损/基地不更新**:多为 AI 未跑通(Ollama 未起且未设 DashScope、未设 CLEANER_AI_DISABLED)。可设 `CLEANER_AI_DISABLED=1` 用规则提取,或起 Ollama / 配置 DashScope。
|
||||
- **多 DB 路径不一致**:pipeline 已统一 `db_path`,`write_updates`、`save_and_dedup`、`merge` 均使用同一 path(或 `config.DB_PATH`)。
|
||||
|
||||
---
|
||||
|
||||
## 优化后验证效果示例
|
||||
|
||||
以下为「正文抓取 + AI 精确提取 + 增量与地点更新」优化后,单条新闻从输入到前端展示的完整示例,便于对照验证。
|
||||
@@ -321,6 +349,15 @@ print('key_location_updates:', out.get('key_location_updates'))
|
||||
|
||||
期望:`combat_losses_delta.us` 含 personnel_killed=2、personnel_wounded=14、aircraft=1 等增量;`key_location_updates` 含阿萨德 side=us 等条目。
|
||||
|
||||
### 地图打击数据(与前端攻击动画统一格式)
|
||||
|
||||
爬虫/AI 若输出以下字段,`db_merge` 会写入 `map_strike_source`、`map_strike_line`,`GET /api/situation` 的 `mapData.strikeSources` / `mapData.strikeLines` 会更新,前端可直接追加打击线与飞行动画。
|
||||
|
||||
- **map_strike_sources**(可选):`[{ "id": "israel"|"lincoln"|"ford", "name": "显示名", "lng": 经度, "lat": 纬度 }]`,与 seed 中打击源 id 一致时可覆盖位置。
|
||||
- **map_strike_lines**(可选):`[{ "source_id": "israel"|"lincoln"|"ford", "target_lng", "target_lat", "target_name": "目标名", "struck_at": "ISO 时间" }]`,每条追加一条打击线(不删已有),便于按时间回放。
|
||||
|
||||
示例:`{ "map_strike_lines": [{ "source_id": "israel", "target_lng": 51.916, "target_lat": 33.666, "target_name": "纳坦兹", "struck_at": "2026-03-01T02:04:00.000Z" }] }`
|
||||
|
||||
---
|
||||
|
||||
## 冲突强度 (impact_score)
|
||||
|
||||
Reference in New Issue
Block a user