- domestic_crawl_8g.sh: Xvfb 启动脱离管道 fd(</dev/null + 重定向日志 + disown)。 修复 2026-09-06 事故:Xvfb 常驻进程继承 'bash crawl | tee' 管道写端, tee 永远收不到 EOF → domestic_full.sh 卡死 M1 → 日报永不生成 - scheduler/reporter.py: _load_events_window 对 'publish_time 过期' 的文件 增加 mtime 兜底(本次窗口内新翻译的事件不被低质量 publish_time 误伤)。 修复空日报:date-only/美式日期错位的 publish_time 使窗口 articles=0 - configs/system.yaml: M4 翻译 provider 切换 deepseek → dashscope(qwen3.7-flash), 降低翻译成本(输出单价约降 ~9 倍);daily_report 保持 deepseek 不变
134 lines
6.8 KiB
YAML
134 lines
6.8 KiB
YAML
# ════════════════════════════════════════════════════
|
||
# 系统功能配置(非敏感)
|
||
# 密钥、API 地址 请在 .env 中配置
|
||
# ════════════════════════════════════════════════════
|
||
|
||
# ── 部署拓扑 ────────────────────────────────────────
|
||
# 海外服务器已弃用(M1-M6 全链路在 domestic 执行)
|
||
servers:
|
||
overseas_host: "ecs-user@8.217.19.253"
|
||
overseas_path: "/opt/intlgrab"
|
||
domestic_host: "pi@192.168.1.160"
|
||
domestic_path: "/home/pi/intlnews"
|
||
|
||
# ── HTTP 代理(Privoxy → ss-local → Shadowsocks 海外访问)──
|
||
proxy:
|
||
enabled: false # 通过 Profile 8g_headful 启用
|
||
url: "http://127.0.0.1:3128" # HTTP 代理地址
|
||
bypass_domains: [] # 不走代理的域名(如国内 CDN)
|
||
|
||
# ── 抓取 ────────────────────────────────────────────
|
||
crawler:
|
||
max_memory_mb: 1800 # 内存上限 MB(超限触发 GC)
|
||
source_timeout_sec: 7200 # 单源超时秒数(2h)
|
||
article_delay_sec: 3.0 # 文章间冷却间隔
|
||
page_timeout_sec: 45 # 单页加载超时
|
||
http_timeout_sec: 30 # 轻量 HTTP 抓全文单页超时(秒)
|
||
http_min_html_len: 2000 # 判定 HTTP 拿到正文的最小 HTML 长度
|
||
viewport_width: 1024
|
||
viewport_height: 768
|
||
user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
|
||
headful: false # true=有头浏览器(需 X Server 或 xvfb),false=headless
|
||
xvfb_display: ":99" # headful 模式下的虚拟显示器(xvfb-run 自动设置)
|
||
|
||
# ── 正文提取 ──────────────────────────────────────────
|
||
extractor:
|
||
min_content_words: 50
|
||
trafilatura_fallback: true
|
||
|
||
# ── 去重 ────────────────────────────────────────────
|
||
dedup:
|
||
hamming_distance_threshold: 3
|
||
simhash_window_days: 30
|
||
min_content_length: 100
|
||
|
||
# ── LLM 默认配置(所有 LLM 场景的兜底)────────────────
|
||
# 按场景独立配置见下方 llm_scenes 段;场景未声明的字段回退到本段。
|
||
llm:
|
||
provider: "deepseek"
|
||
deepseek_model: "deepseek-v4-flash"
|
||
qwen_model: "qwen3.7-flash"
|
||
timeout_sec: 60
|
||
max_attempts: 3 # 单篇总尝试次数(含首次),失败后指数退避重试
|
||
max_tokens: 8192
|
||
temperature: 0.1
|
||
concurrency: 3
|
||
|
||
# ── LLM 场景配置(按场景独立指定大模型类型与参数)──────
|
||
# 每个场景可覆盖 provider / model / temperature / max_tokens / max_attempts / timeout_sec;
|
||
# 场景内统一用 "model" 键指定模型(优先于 llm 段的 deepseek_model / qwen_model)。
|
||
llm_scenes:
|
||
translation:
|
||
# M4:全文英译中 + 投资事件抽取(单次 LLM 调用合并输出)
|
||
#provider: "deepseek"
|
||
provider: "dashscope"
|
||
model: "qwen3.7-flash"
|
||
temperature: 0.1
|
||
max_tokens: 8192
|
||
description: |
|
||
用途: M4 对去重后的英文正文做全文英译中,并抽取投资事件
|
||
(事件类型/美股代码/情绪/重要度/摘要,单次调用合并输出)
|
||
使用方法: llm/pipeline.py 调用 load_llm_config(scene="translation"),
|
||
配合 concurrency=3 逐篇并发;单篇失败重试 max_attempts 次后跳过,
|
||
未翻译篇由增量机制下次补齐
|
||
模型要求: 中英财经翻译准确、术语一致;严格按 Prompt 输出 JSON 结构;
|
||
单篇平均 ≤3 秒;max_tokens 需容纳长文(建议 ≥8192)
|
||
daily_report:
|
||
# M7:每日 AI 摘要日报(五段式,高重要度事件分批生成)
|
||
provider: "deepseek"
|
||
model: "deepseek-v4-flash"
|
||
temperature: 0.3
|
||
max_tokens: 1500
|
||
description: |
|
||
用途: M7 日报 AI 摘要(五段式),高重要度事件分批(≤10 条/批)生成
|
||
各批摘要后合并为完整日报摘要
|
||
使用方法: scheduler/reporter.py::_call_llm_simple 使用
|
||
load_llm_config(scene="daily_report");分批/合并失败均有回退,
|
||
全部失败走规则兜底(直接列 Top 事件),日报仍正常入库
|
||
模型要求: 中文财经总结能力强;单批 600-1500 字摘要质量稳定;
|
||
支持高频短调用(crontab 07/12/18 每天 3 次 × 每份 3 批)
|
||
|
||
# ── Embedding 向量化(单一场景,不按场景拆分)─────────
|
||
# 说明: Qdrant collection en_finance_news 的入库向量与检索查询向量必须由
|
||
# 同一模型生成(跨模型向量无法比较),因此 embedding 不支持按场景独立配置。
|
||
# 调用点: embedding/pipeline.py(入库)、vectorstore/pipeline.py(检索)、
|
||
# mcp_server/server.py(MCP 搜索查询向量化)——三处共用本配置。
|
||
embedding:
|
||
provider: "dashscope"
|
||
dashscope_model: "text-embedding-v3"
|
||
dimension: 1024
|
||
batch_size: 10
|
||
max_attempts: 3 # 单批总尝试次数(含首次),失败后指数退避重试
|
||
timeout_sec: 30
|
||
|
||
# ── Qdrant ──────────────────────────────────────────
|
||
qdrant:
|
||
collection: "en_finance_news"
|
||
|
||
# ── 日报 ────────────────────────────────────────────
|
||
report:
|
||
max_events: 20
|
||
summary_max_chars: 500
|
||
importance_threshold: 4
|
||
upload_host: "simon@doorcome.cn"
|
||
upload_path: "/var/www/html/echart/research"
|
||
|
||
# ── 同步 (rsync) ─────────────────────────────────────
|
||
# 海外服务器已弃用,以下保留作为参考
|
||
sync:
|
||
port: 22
|
||
sentinel: "/tmp/en_news_sync_done"
|
||
pack_dir: "/tmp"
|
||
|
||
# ── 定时调度 ────────────────────────────────────────
|
||
# 全流程:M1 抓取 → M2→M6 管道 → 日报
|
||
# 每天 06:00 / 12:00 / 18:00 / 22:00 各执行一次
|
||
schedule:
|
||
day_cutoff_hour: 6
|
||
times: ["06:00", "12:00", "18:00", "22:00"]
|
||
|
||
# ── 日志 ────────────────────────────────────────────
|
||
logging:
|
||
level: "INFO"
|
||
dir: "logs"
|