初始化
This commit is contained in:
@@ -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. 内容 Hash(SHA256 前 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 Provider:DashScope `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
|
||||
Reference in New Issue
Block a user