初始化

This commit is contained in:
2026-07-18 16:13:52 +08:00
parent c0070f0a5c
commit fe8b417ab6
75 changed files with 12898 additions and 1 deletions
+477
View File
@@ -0,0 +1,477 @@
# 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