🌍 国际财经 Deep Research 平台

使用手册 v1.0 · 2026-06-21 · 私有化部署

📑 目录
  1. 项目概述
  2. 部署拓扑
  3. 环境配置
  4. CLI 命令参考
  5. M1 — 新闻抓取
  6. M2 — 正文提取
  7. M3 — 三层去重
  8. M4 — 翻译 + 事件抽取
  9. M5 — 向量生成
  10. M6 — Qdrant 入库与检索
  11. M7 — 全链路管道 + 日报
  12. M8 — MCP 服务
  13. 数据目录结构
  14. 定时任务
  15. 常见问题

1. 项目概述

本项目构建面向国际英文财经新闻的私有化 Deep Research 平台。

✅ 核心能力
  • 英文财经新闻抓取(Crawl4AI,12 源)
  • 正文提取(trafilatura)
  • 全文英译中(DeepSeek LLM)
  • 投资事件抽取 + 美股代码识别
  • 双语向量知识库(Qdrant 1024维)
  • 中文语义检索
  • MCP 服务(Agent 深度研究)
  • 每日 AI 摘要日报(HTML)
❌ 本项目不是
  • 自动交易系统
  • 股票预测系统
  • 投资顾问系统
💡 对标项目:A 股 Deep Research(news/),架构模式可复用。

2. 部署拓扑

┌──────────────────────────────────────────────────┐
│           Overseas Server (海外)                   │
│  M1 Crawl4AI 抓取 → data/raw/                     │
│  每天 4 次打包 → rsync 推送                        │
│  SSH: <海外服务器>                               │
│  路径: /opt/intlgrab                               │
└────────────────────┬─────────────────────────────┘
                     │ rsync
                     ▼
┌──────────────────────────────────────────────────┐
│           Domestic Server (国内)                   │
│  M2 正文提取 → M3 去重 → M4 翻译+事件              │
│  → M5 向量生成 → M6 Qdrant 入库                    │
│  → M7 调度 + 日报 → M8 MCP 服务                    │
│  SSH: <国内服务器>                                │
│  路径: /home/pi/intlnews                           │
└──────────────────────────────────────────────────┘

3. 环境配置

3.1 依赖安装

cd /home/pi/intlnews
uv sync

3.2 配置文件

文件用途注意
.envAPI Key / URL不入 Git,从 .env.example 复制
configs/system.yaml功能参数模型名、阈值、超时、调度
configs/sources.yaml新闻源定义12 个英文财经源

3.3 必需环境变量

# DeepSeek(M4 翻译+事件抽取)
DEEPSEEK_API_KEY=sk-your-key
DEEPSEEK_BASE_URL=https://api.deepseek.com

# Qwen(备选 LLM)
QWEN_API_KEY=sk-your-key
QWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1

# DashScope(M5 向量生成)
DASHSCOPE_API_KEY=sk-your-key

# Qdrant(留空使用本地文件模式)
QDRANT_URL=http://localhost:6333
QDRANT_API_KEY=

3.4 关键配置项

# configs/system.yaml(关键项)
crawler.max_memory_mb: 1800       # 内存上限
dedup.hamming_distance_threshold: 3
dedup.simhash_window_days: 30
llm.provider: "deepseek"
llm.deepseek_model: "deepseek-v4-flash"
llm.concurrency: 3
embedding.dashscope_model: "text-embedding-v3"
embedding.dimension: 1024
qdrant.collection: "en_finance_news"
schedule.day_cutoff_hour: 6       # 新闻日切分点

4. CLI 命令参考

所有命令通过 uv run en-news 执行:

命令Milestone功能
crawlM1抓取英文财经新闻
extractM2正文提取
dedupM3三层去重
translateM4翻译 + 事件抽取
embedM5向量生成
indexM6Qdrant 入库
search <query>M6语义检索
pipelineM7一键全链路 M2→M6
reportM7日报生成
mcp-serverM8启动 MCP 服务
# 常用选项
uv run en-news crawl --source forexlive          # 指定源
uv run en-news search "美联储" --top-k 5          # 指定返回数
uv run en-news index --recreate                   # 重建 Qdrant
uv run en-news pipeline --skip-report             # 跳过日报

5. M1 — 新闻抓取

5.1 手动抓取

uv run en-news crawl               # 全部源
uv run en-news crawl -s forexlive  # 指定源

5.2 12 个英文财经源

源 ID名称类型
reutersReuters综合财经
cnbcCNBC市场新闻
marketwatchMarketWatch市场数据
ftFinancial Times财经深度
yahoo_financeYahoo Finance综合
investingInvesting.com全球市场
seekingalphaSeeking Alpha投资分析
barronsBarrons市场评论
wsjWSJ综合财经
economistThe Economist经济分析
forexliveForexLive外汇新闻
zerohedgeZeroHedge另类财经

5.3 增量抓取机制

抓取采用两层增量确保不重复下载和存储:

层级位置机制
抓取层_extract_article_urls读取当日 index.jsonl 中已抓取的 url_hash,跳过已存在的 URL,不重复下载
存储层write_index_jsonl追加写入前再次检查 url_hash,已存在则跳过

同一天内多次执行 crawl,只有新文章才会被下载和存储。

5.4 产物

data/raw/{source_id}/{YYYYMMDD}/
├── {url_hash}.html     # 原始 HTML
├── {url_hash}.md       # Crawl4AI Markdown
└── index.jsonl         # 文章索引

5.5 反爬策略

部分新闻源有反爬保护(如 DataDome)。系统支持三种策略,按优先级自动选择:

优先级策略配置说明
1RSS 抓取rss_url通过 Feed 获取文章,完全绕过反爬 ✅ MarketWatch
2Stealthanti_bot_mode: "stealth"隐藏 webdriver 特征
3Headfulanti_bot_mode: "headful"非 headless 浏览器,最像真人

已验证:MarketWatch RSS 10/10 ✅ · WSJ RSS 20/20 ✅ · ForexLive 17/17 ✅ · ZeroHedge 15/15 ✅ · Barron's RSS 10/10 ✅ · Reuters ⚠️ · SeekingAlpha ⚠️

6. M2 — 正文提取

uv run en-news extract              # 全部源
uv run en-news extract -s forexlive # 指定源

技术方案:优先 Crawl4AI Markdown → 回退 trafilatura(英文优化)。最小正文 50 词。

data/processed/{source_id}/{YYYYMMDD}/
└── {url_hash}.json     # ProcessedArticle

7. M3 — 三层去重

uv run en-news dedup
层级方法说明
L1URL Hash完全相同 URL
L2内容 HashSHA1[:16] 去标点空白后匹配
L3SimHash字符 3-gram,汉明距离 ≤ 3,30 天窗口
data/dedup/fingerprints.sqlite3   # SQLite 指纹库
data/deduped/{YYYYMMDD}/uniques/  # 唯一文章

8. M4 — 翻译 + 事件抽取

uv run en-news translate
⚙️ 技术规格

14 种事件类型

财报披露 并购收购 产品发布 监管政策 宏观经济 央行决议 行业动态 技术突破 高管变动 诉讼法律 市场异动 地缘政治 大宗商品 外汇波动

情绪标签

🟢 positive 利好 ⚪ neutral 中性 🔴 negative 利空

9. M5 — 向量生成

uv run en-news embed

技术方案:DashScope text-embedding-v3,1024 维。嵌入文本 = 中文标题 + 事件标签 + 中文正文(4000 字符截断)。

data/embeddings/{YYYYMMDD}/
└── {url_hash}.json     # EmbeddingResult (1024 floats)

10. M6 — Qdrant 入库与检索

入库

uv run en-news index              # 增量入库
uv run en-news index --recreate   # 重建 collection

语义搜索

uv run en-news search "美联储利率决议"
uv run en-news search "伊朗霍尔木兹海峡" --top-k 5
📦 Qdrant 规格

11. M7 — 全链路管道 + 日报

手动全链路运行(完整流程)

当需要手工执行完整的数据处理流程时,按顺序执行:

# 步骤 1(海外): 抓取英文财经新闻
ssh <海外服务器> "cd /opt/intlgrab && uv run en-news crawl"

# 步骤 2(海外): 打包 raw 数据
ssh <海外服务器> "cd /opt/intlgrab && bash scripts/overseas_pack.sh"

# 步骤 3(国内): 拉取海外数据
cd /home/pi/intlnews && bash scripts/domestic_sync.sh

# 步骤 4: 一键全链路 M2→M6 + 日报
cd /home/pi/intlnews && uv run en-news pipeline

也可以分步执行(适合调试):

uv run en-news extract              # M2: 正文提取
uv run en-news dedup                # M3: 三层去重
uv run en-news translate            # M4: 翻译 + 事件抽取
uv run en-news embed                # M5: 向量生成
uv run en-news index                # M6: Qdrant 入库
uv run en-news report               # 日报生成

一键管道(自动)

uv run en-news pipeline               # 全链路 M2→M6 + 日报
uv run en-news pipeline --skip-report  # 跳过日报
uv run en-news report                  # 仅日报

管道流程

M2 extract M3 dedup M4 translate M5 embed M6 index 📰 日报
⚠️ 降级策略:每步失败记录日志但不阻断后续步骤。

HTML 日报五板块

  1. 🤖 AI 摘要 — LLM 根据 important≥4 事件生成要点总结
  2. 🔥 重要事件 — 事件表格(情绪/重要度/摘要/链接)
  3. 📊 数据总览 — M1→M6 管道统计数字
  4. 📈 情绪分布 — 利好/利空/中性比例条
  5. 📋 事件类型 TOP 10

本地: data/reports/intl_news_daily_{YYYYMMDD}.html

线上: 自动上传到 https://echart.doorcome.cn/research/{YYYYMMDD}/

上传配置在 configs/system.yamlreport.upload_host / report.upload_path

12. M8 — MCP 服务

启动

uv run en-news mcp-server

5 个 MCP Tool

Tool功能示例调用
search_news语义检索新闻search_news("美联储利率决议")
search_by_stock美股代码检索search_by_stock("AAPL")
search_by_sentiment情绪过滤检索search_by_sentiment("加息", sentiment="negative")
get_today_events当日重要事件get_today_events(importance_min=4)
get_stats系统统计get_stats()

Claude Code MCP 配置

{
  "mcpServers": {
    "intl-news": {
      "command": "uv",
      "args": ["run", "en-news", "mcp-server"],
      "cwd": "/home/pi/intlnews"
    }
  }
}

13. 数据目录结构

data/
├── raw/                         # M1: 原始抓取
│   └── {source_id}/{YYYYMMDD}/
├── processed/                   # M2: 正文提取
│   └── {source_id}/{YYYYMMDD}/
├── dedup/                       # M3: 指纹库 + 去重结果
│   ├── fingerprints.sqlite3
│   └── {YYYYMMDD}/uniques/
├── events/                      # M4: 翻译+事件
│   └── {YYYYMMDD}/
├── embeddings/                  # M5: 向量
│   └── {YYYYMMDD}/
├── qdrant_storage/              # M6: Qdrant 本地存储
└── reports/                     # M7: 日报
    └── intl_news_daily_{YYYYMMDD}.html

14. 定时任务

时间线

时间服务器动作
05:55海外打包 data/raw/
06:30国内拉取 → M2→M6 管道 → 📰 日报
11:55海外打包
12:00国内拉取 → 管道
17:55海外打包
18:00国内拉取 → 管道
21:55海外打包
22:00国内拉取 → 管道 → 📰 日报

新闻日定义

切分点 day_cutoff_hour: 6。当天 06:00 至次日 05:59 属于同一个新闻日。

15. 常见问题

Q: 如何新增新闻源?

编辑 configs/sources.yaml

- id: "new_source"
  name: "New Source Name"
  enabled: true
  homepage: "https://example.com/finance/"
  article_url_pattern: "/news/[^/]+/"
  js_render: false
  max_articles_per_run: 30

Q: 翻译质量不好怎么办?

  1. 调整 configs/system.yamlllm.temperature(降低更保守)
  2. 编辑 prompts/translation_and_extraction.md 优化 Prompt
  3. 切换 Provider:llm.provider: "qwen"

Q: Qdrant 检索太慢?

本地文件模式 17 条 < 0.01s,足够快。数据量 > 10 万条时切换到 Docker 模式。

Q: 如何查看日志?

tail -f logs/sync.log
tail -f logs/crawler.log   # 海外

Q: 数据如何备份?

tar czf intlnews_backup_$(date +%Y%m%d).tar.gz data/

附录:技术栈

组件技术
语言Python 3.11
包管理uv + pyproject.toml
抓取Crawl4AI + Playwright
正文提取trafilatura
去重SimHash + SQLite
LLMDeepSeek v4-flash(OpenAI SDK)
EmbeddingDashScope text-embedding-v3
向量库Qdrant(本地文件模式)
MCPFastMCP
CLITyper
配置YAML + .env
数据模型Pydantic v2