# ════════════════════════════════════════════════════ # 系统功能配置(非敏感) # 密钥、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"