Files
intl_news/english-news-plan.md
T
2026-07-18 16:13:52 +08:00

478 lines
16 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.
# English Financial News — 项目开发计划
> 国际财经新闻抓取与深度研究平台
>
> 对标 `news/` (A 股 Deep Research),复用其架构模式,聚焦英文财经源。
---
## 一、项目定位
构建面向国际财经新闻的私有化 Deep Research 平台。
核心能力:
- 英文财经新闻抓取(Crawl4AI)
- 新闻联播数据接入(api.doorcome.cn
- 全文英译中(LLM
- 投资事件抽取(LLM
- 双语向量知识库(Qdrant
- MCP 服务 + Cherry Studio / Claude Code Agent 深度研究
- 每日 AI 摘要日报(含新闻联播投资相关解读)
本项目不是:
- 交易系统
- 预测系统
- 投资顾问
---
## 二、部署拓扑
```
┌──────────────────────────────────────────────────────────────┐
│ Overseas Server (国外) │
│ M1 Crawl4AI 抓取 → data/raw/{source}/{YYYYMMDD}/ │
│ ↓ │
│ rsync 增量推送 (定时) │
└──────────────────────────┬───────────────────────────────────┘
│ SSH / rsync
┌──────────────────────────────────────────────────────────────┐
│ Domestic Server (国内) │
│ M2 正文提取 → M3 去重 → M4 翻译+事件抽取(LLM) │
│ → M5 向量生成 → M6 Qdrant 入库 │
│ → M7 定时调度 → M8 MCP 服务 │
│ → 日报生成 (AI 摘要 + 重要事件 + 新闻联播投资解读) │
│ │
│ ┌── 新闻联播数据源 (独立 API) ──┐ │
│ │ GET api.doorcome.cn/api/xwlbFine/ │
│ │ → LLM 筛选投资相关 → 重要性评分 → AI 解读 │
│ └──────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
```
同步机制:
- 海外服务器每天定时 `rsync -avz` 推送 `data/raw/` 到国内
- 国内定时任务先拉取同步,再执行 M2→M8 管道
- rsync 天然增量(只传新文件),带宽高效
---
## 三、Milestone 分解
### M0 — 项目骨架
- `pyproject.toml`Python 3.11 + uv
- `.env.example`
- `configs/sources.yaml`(英文财经源配置)
- `CLAUDE.md`
- 目录结构初始化
- CLI 入口:`en-news`
### M1 — 新闻抓取(海外服务器)
**技术选型**Crawl4AI(异步 + Playwright JS 渲染),与 A 股项目一致。
**英文财经源**(初始 12 个):
| 源 ID | 名称 | 类型 |
|-------|------|------|
| reuters | Reuters | 综合财经 |
| cnbc | CNBC | 市场新闻 |
| marketwatch | MarketWatch | 市场数据 |
| ft | Financial Times | 财经深度 |
| yahoo_finance | Yahoo Finance | 综合 |
| investing | Investing.com | 全球市场 |
| seekingalpha | Seeking Alpha | 投资分析 |
| barrons | Barrons | 市场评论 |
| wsj | WSJ | 综合财经 |
| economist | The Economist | 经济分析 |
| forexlive | ForexLive | 外汇新闻 |
| zerohedge | ZeroHedge | 另类财经 |
每个源配置字段:
```yaml
- id: "reuters"
name: "Reuters"
enabled: true
homepage: "https://www.reuters.com/business/"
article_url_pattern: "/[^/]+/[^/]+/"
js_render: true
max_articles_per_run: 30
```
**产物**`data/raw/{source_id}/{YYYYMMDD}/{url_hash}.html` + `index.jsonl`
**同步守护进程**
```bash
# 海外 crontab:每天 05:00 UTC 推送
0 5 * * * rsync -avz --ignore-existing /app/data/raw/ user@domestic:/app/data/raw/
```
### M2 — 正文提取(国内服务器)
**输入**`data/raw/{source_id}/{date}/`rsync 同步后)
**提取方案**
- 优先使用 Crawl4AI 输出的 Markdown`{url_hash}.md`
- 对未生成 Markdown 的源,用 `trafilatura`(英文正文提取,类 GNE 但针对英文优化)
- 输出标准化 `Article` 模型(`title` / `content` / `publish_time` / `author` / `source_id`
**产物**`data/processed/{source_id}/{YYYYMMDD}/{url_hash}.json`
### M3 — 去重
与 A 股项目相同的三层去重:
1. URL Hash(精确)
2. 内容 HashSHA256 前 64 字符)
3. SimHash 模糊(汉明距离 ≤ 3,30 天窗口)
**产物**`data/deduped/{YYYYMMDD}/uniques/{url_hash}.json`
### M4 — 翻译 + 投资事件抽取(LLM)
**单次 LLM 调用完成两件事**(节省 token):
Prompt 设计:
```
输入:英文财经新闻全文
输出 JSON
{
"translation_zh": "中文全文翻译",
"events": [
{
"event_type": "并购/财报/政策/行业/...",
"stock_codes": ["AAPL", "TSLA"],
"sentiment": "positive/negative/neutral",
"importance": 1-5,
"summary_zh": "事件中文摘要"
}
]
}
```
**LLM Provider**DeepSeek(默认)/ Qwen 备选
**产物**`data/events/{YYYYMMDD}/{url_hash}.json`
```json
{
"title": "Apple Reports Record Q2 Earnings",
"title_zh": "苹果公布创纪录第二季度财报",
"content_en": "...",
"content_zh": "...",
"events": [...]
}
```
### M5 — 向量生成
- Embedding ProviderDashScope `text-embedding-v3`1024 维)
- 对中文翻译内容向量化(`content_zh` + `title_zh` + 事件摘要拼接)
- 也可选择英文原文向量化,支持双语检索
**产物**`data/embeddings/{YYYYMMDD}/{url_hash}.json`
### M6 — Qdrant 入库与检索
与 A 股项目相同:
- 本地文件模式(默认)或 Docker Server 模式
- Collection`en_finance_news`
- Payload`source_id` / `title` / `title_zh` / `url` / `publish_time` / `events` / `sentiment` / `importance`
- Vector:从 M5 产物加载
```python
uv run en-news search "Fed interest rate decision"
```
### M7 — 新闻联播数据源(独立模块)
**数据获取**
```
GET https://api.doorcome.cn/api/xwlbFine/?start_date=YYYY-MM-DD&end_date=YYYY-MM-DD
```
**响应结构**
```json
{
"status": "success",
"data": {
"news": [
{
"news_days": "2026-06-20",
"daily_sub_id": 1,
"news_title": "牢记总书记嘱托 各地在文脉赓序中推动城市高质量发展",
"news_improve": "历史文化是城市的灵魂...(全文约3000字)"
}
]
}
}
```
每天约 12-15 条新闻,每条含完整文字稿。
**处理流程**
1. **获取** — 日报生成前拉取昨日新闻联播数据。例如 6/21 早上执行日报 → 拉取 6/20 的新闻联播(前一日 19:00 播出,次日凌晨 API 已就绪)
2. **投资相关性筛选(LLM** — 用 DeepSeek 逐条判断是否与投资相关
- 经济数据、产业政策、贸易谈判 → **高相关**importance 4-5
- 科技创新、区域发展、基建项目 → **中相关**importance 2-3
- 文化、民生、体育、天气 → **非相关**(跳过)
3. **AI 解读** — 对投资相关条目生成 2-3 句投资视角解读:
- 对哪些行业/板块有影响
- 政策信号含义
- 市场可能的反应
4. **纳入日报** — 单独一节展示,区别于英文财经新闻
**产物**`data/xwlb/{YYYYMMDD}/index.jsonl`
```json
{
"news_days": "2026-06-20",
"daily_sub_id": 5,
"news_title": "中欧班列统一品牌十周年",
"is_investment_related": true,
"importance": 4,
"category": "贸易/物流",
"ai_interpretation": "中欧班列十年数据将直接反映一带一路贸易活跃度,利好物流、港口、跨境贸易板块..."
}
```
### M8 — 定时调度
- 国内 crontab 或 APScheduler 守护进程
- 日期规则:T 日早上生成的日报覆盖 T-1 日数据(新闻 + 新闻联播)
- 流程:
```
06:00 等待海外 rsync 完成(检查哨兵文件)
06:30 M2→M3→M4→M5→M6 全链路(处理 T-1 日英文新闻)
07:00 拉取 T-1 日新闻联播 → LLM 筛选解读 → 日报生成
12:00 增量(只处理当日新增)
18:00 增量
22:00 增量 + 日报
```
### M9 — MCP 服务
暴露 5 个 MCP 工具给 Cherry Studio / Claude Code
| 工具 | 功能 |
|------|------|
| `search_en_news` | 通用语义检索(中文查询 → 中文翻译向量匹配) |
| `search_by_company` | 按公司名/股票代码检索 |
| `search_by_sentiment` | 按情绪检索+统计 |
| `search_by_event_type` | 按事件类型检索 |
| `get_daily_report` | 获取最新日报 |
---
## 四、数据模型
```python
class EnArticle(BaseModel):
source_id: str
url: str
url_hash: str
title: str # 英文原标题
title_zh: str # 中文翻译标题
content_en: str # 英文原文
content_zh: str # 中文全文翻译
author: str
publish_time: datetime
source_name: str
word_count: int
word_count_zh: int
class EnExtractedEvent(BaseModel):
article_url_hash: str
event_type: str # 并购/财报/政策/行业/市场/...
stock_codes: list[str] # 涉及美股代码
sentiment: str # positive/negative/neutral
importance: int # 1-5
summary_zh: str # 中文摘要
summary_en: str # 英文摘要
class XwlbItem(BaseModel):
"""新闻联播条目(经 LLM 筛选和解读)。"""
news_days: str # 播出日期 "2026-06-20"
daily_sub_id: int # 当日序号 (1-15)
news_title: str # 标题
news_improve: str # 完整文字稿
is_investment_related: bool # 是否投资相关
importance: int # 投资重要性 1-5 (非投资为 0)
category: str # 投资类别 (贸易/产业政策/科技/基建/金融/...)
ai_interpretation: str # AI 投资解读 2-3 句
```
---
## 五、日报设计
命令:`uv run en-news pipeline --once --report`
执行顺序:新闻联播拉取 → LLM 筛选解读 → 日报 HTML 生成
六段式结构:
1. **AI 摘要**(24h 国际财经 + 昨日新闻联播投资相关,≤500 字,最后一条不截断)
2. **重要事件:国际新闻**24h 英文源,importance ≥ 4 逐级回退,最多 20 篇)
3. **📺 新闻联播投资解读**(昨日播出,投资相关条目 + AI 解读)
- 展示格式:标题 | 投资相关性类别 | 重要度 | AI 解读(2-3 句)
- 非投资相关条目不显示
- 示例:
```
📺 中欧班列统一品牌十周年 [贸易/物流] ⭐⭐⭐⭐
AI解读: 中欧班列十年数据将直接反映一带一路贸易活跃度。
关注物流、港口、跨境贸易板块。政策利好中国外运、中远海控等。
```
4. **市场情绪分布**(利好/利空/中性,24h 国际新闻 + 新闻联播合并统计)
5. **数据总览**(M1→M6 管道统计 + 各源抓取量 6 列网格 + 重要度分布 + 事件类型分布 + 新闻联播条目数)
6. **完整新闻联播条目列表**(当天的全部条目,标题+简要,含非投资类,供快速浏览)
---
## 六、配置规范
### configs/sources.yaml
```yaml
settings:
concurrency: 5
user_agent: "Mozilla/5.0 ..."
output_root: "data/raw"
sources:
- id: "reuters"
name: "Reuters"
enabled: true
homepage: "https://www.reuters.com/business/"
article_url_pattern: "/[^/]+/[^/]+/"
js_render: false
max_articles_per_run: 30
```
### .env 关键配置
```bash
# LLM
LLM_PROVIDER=deepseek
LLM_MODEL=deepseek-v4-flash
DEEPSEEK_API_KEY=sk-xxx
# Embedding
EMBEDDING_PROVIDER=dashscope
DASHSCOPE_API_KEY=sk-xxx
# 新闻联播
XWLB_API_BASE=https://api.doorcome.cn
# Schedule
SCHEDULE_TIMES=06:30,12:00,18:00,22:00
SYNC_WAIT_SEC=300
# Qdrant
QDRANT_COLLECTION=en_finance_news
# Overseas → Domestic
SYNC_HOST=user@domestic-server
SYNC_PORT=22
SYNC_SENTINEL=/tmp/en_news_sync_done
```
---
## 七、目录结构
```
english-news/
├── crawler/ # M1 新闻抓取(Crawl4AI, 部署海外)
├── extractor/ # M2 英文正文提取(trafilatura)
├── dedup/ # M3 三层去重
├── translator/ # M4a 全文翻译(LLM)
├── llm/ # M4b 投资事件抽取
├── embedding/ # M5 向量生成
├── vectorstore/ # M6 Qdrant 客户端
├── xwlb/ # M7 新闻联播数据源
├── scheduler/ # M8 定时任务
├── mcp_server/ # M9 MCP 服务
├── app/ # CLI 入口(en-news)
├── configs/ # sources.yaml / system config
├── prompts/ # LLM Prompt 模板
├── scripts/ # 部署 & 运维脚本
│ ├── sync_daemon.sh # 海外 rsync 推送脚本
│ └── wait_for_sync.py # 国内等待同步完成
├── tests/ # pytest
├── docs/ # 设计文档
├── data/ # 数据目录(git ignored)
│ ├── raw/ # M1 产物(海外与国内共享)
│ ├── processed/ # M2 产物
│ ├── deduped/ # M3 产物
│ ├── events/ # M4 产物
│ ├── embeddings/ # M5 产物
│ ├── xwlb/ # 新闻联播数据(经 LLM 筛选与解读)
│ ├── qdrant_storage/ # M6 Qdrant 本地存储
│ └── reports/ # 日报 HTML
├── logs/ # 运行日志
├── pyproject.toml
├── CLAUDE.md
└── README.md
```
---
## 八、技术选型对比
| 模块 | A 股项目 | 英文财经项目 | 差异 |
|------|---------|-------------|------|
| 抓取 | Crawl4AI | Crawl4AI | 一致 |
| 正文提取 | GNE | trafilatura | 英文优化 |
| 翻译 | — | LLM (DeepSeek) | **新增** |
| 去重 | 三层 | 三层 | 一致 |
| LLM 事件 | DeepSeek/Qwen | DeepSeek/Qwen | 一致 |
| Embedding | DashScope | DashScope | 一致 |
| 向量库 | Qdrant | Qdrant | 一致 |
| 新闻联播 | — | api.doorcome.cn + LLM 筛选 | **新增** |
| 调度 | APScheduler | APScheduler | 一致 |
| MCP | FastMCP | FastMCP | 一致 |
| CLI | a-share | en-news | 命名区分 |
---
## 九、开发优先级(建议顺序)
| 序号 | Milestone | 预估工期 | 依赖 |
|------|-----------|---------|------|
| 1 | M0 项目骨架 | 0.5 天 | — |
| 2 | M1 抓取(海外) | 2 天 | M0 |
| 3 | rsync 同步机制 | 0.5 天 | M1 |
| 4 | M2 正文提取 | 1 天 | 同步就绪 |
| 5 | M3 去重 | 1 天 | M2 |
| 6 | M4 翻译+事件抽取 | 1.5 天 | M3 |
| 7 | M5 向量 + M6 Qdrant | 1 天 | M4 |
| 8 | M7 新闻联播数据源 | 1 天 | — (独立模块) |
| 9 | M8 调度 + 日报 | 1.5 天 | M6, M7 |
| 10 | M9 MCP 服务 | 1 天 | M6 |
| **总计** | | **~11 天** | |
---
## 十、关键风险
| 风险 | 缓解措施 |
|------|---------|
| 英文源 JS 渲染复杂 | Crawl4AI 已有 Playwright 支持,优先使用轻量级源 |
| LLM 翻译质量不稳定 | System prompt 约束翻译风格,保留原文备查 |
| rsync 网络不稳定 | 添加重试机制 + 哨兵文件完整性检查 |
| 海外 IP 被封 | 轮换 User-Agent,控制请求频率(≥ 2s/req |
| DeepSeek API 限流 | 并发控制 + Qwen 备选 provider |
---
> 本计划文件:`~/Downloads/cc-projects/english-news-plan.md`
>
> 最后更新:2026-06-20