Files

1 line
56 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "ahhhhmen/macro-policy-radar", "files": {"README.md": {"e4accae5560d0541329e83b6a0d4dc4ded6a7fb7": {"t": 1785746611.6052577, "n": 8866, "h": "5121c512c2da3821", "c": "# Macro Policy Radar — 全球关键矿产宏观政策雷达\n\n> **当前版本:v5.5** — 自动寻源系统与政策覆盖修复(泛在域名通配 RSS + 逆向域名回溯闭环自适应寻源)\n\n## 项目概述\n\n全自动化的**全球关键矿产宏观地缘政策情报引擎**。周期性扫描全球官方政策源和 Google News 动态聚合网,抓取原始政策文本,调用 DeepSeek v4-pro 进行智库级结构化研判(**事实 → 基线 → 定向推演**),结果持久化至 Notion 知识库,高冲击力政策通过钉钉推送给决策层。\n\n**核心业务领域**:锂、钴、镍、铜、稀土、石墨等关键矿产的出口禁令、资源民族主义、关税调整、外资股权限制、税收与特许权使用费变动等宏观政策。\n\n**设计哲学**:事实准确是底线,时效性、重要性、相关性都在此之上收敛。**宁可漏推,不可错推。**\n\n**技术栈**:Python 3.10+ / OpenAI SDK (DeepSeek v4-pro) / BeautifulSoup4 + lxml / PyYAML / requests / Notion API + DingTalk Webhook / GitHub Actions(每周研判 + 每季度基线审计)\n\n---\n\n## 核心机制速览\n\n| 机制 | 说明 |\n|------|------|\n| **五道防线** | `is_valid_macro_policy` 杀伤开关 → `noise_patterns` 28 关键词过滤 → `Historical_Noise` 旧规拦截 → 时效性校验(年份预扫 + LLM 自检) → `_sanitize_fabricated_numbers` 数字净化兜底 |\n| **智库分析框架** | `factual_basis`(原文溯源)→ `industry_baseline_recall`(CoT 常识锚)→ `impact_deduction`(🔻上游→🔺中游→🔻下游 节点推演)→ `baseline_shift_detected`(范式转移自检) |\n| **双闸门推送** | 四重 AND(烈度 + 官方源 + 非程序性说明 + 置信度≠Low),通过才推送钉钉 |\n| **自适应寻源 (Layer 4)** | **国别域名通配 RSS 扫描 (Scheme 1)** 自动捕捉新政;**成功政策域名回溯探针 (Scheme 2)** 自动抽取未知官网域名并写入 YAML 候选池 |\n| **基线运维** | `knowledge_baselines.yaml` 7 国解耦基线 + 启动交叉表 + `audit_baselines.py` 季度影子审计 |\n| **分析范式** | 对标 Rhodium / CSIS / 情报界 ICD 203:Fact → Baseline → Directional Impact |\n\n---\n\n## 文件结构\n\n```\nmacro-policy-radar/\n├── main.py # 核心引擎(唯一运行入口)\n├── policy_schema.json # JSON Schema 约束(认知滤网 + 输出规范)\n├── sources.yaml # 四层寻源配置(含通配扫描源)\n├── discovered_sources.yaml # 自动发现的新官方源候选池 (v5.5 新增)\n├── knowledge_baselines.yaml # 7 国产业基线库(解耦代码,独立维护)\n├── audit_baselines.py # 季度影子审计脚本\n├── requirements.txt # Python 依赖\n├── README.md # 本文档\n└── .github/workflows/\n ├── macro_policy_radar.yml # 每周研判调度(周一 09:00 CST)\n └── baseline_auditor.yml # 每季度基线审计调度\n```\n\n共享基础设施(LLM 缓存/重试/抓取/推送等)由 [radar-infra](https://github.com/ahhhhmen/radar-infra) 提供。\n\n---\n\n## 快速开始\n\n### 前置要求\n\n- Python 3.10+\n- [DeepSeek API key](https://platform.deepseek.com/)\n- (可选)[NewsAPI key](https://newsapi.org/) — 不配则走 Google News RSS 回退\n- (可选)Notion 集成 token + 数据库 ID\n\n```bash\n# 1. 克隆项目\ngit clone https://github.com/ahhhhmen/macro-policy-radar.git\ncd macro-policy-radar\n\n# 2. 创建 .env 文件,至少填入 DeepSeek key\ncat > .env << 'EOF'\nDEEPSEEK_API_KEY=sk-your-key-here\n# 可选配置\n# NEWSAPI_KEY=xxx\n# NOTION_TOKEN=secret_xxx\n# NOTION_DATABASE_ID=xxx\n# DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=xxx\n# DINGTALK_SECRET=xxx\nEOF\n\n# 3. 安装依赖(自动拉取 radar-infra)\npip install -r requirements.txt\n\n# 4. 运行\npython main.py\n\n# 仅更新基线时间戳\npython audit_baselines.py --update-timestamp\n```\n\n---\n\n## 架构总览\n\n```\n ┌──────────────────────┐\n │ knowledge_baselines │\n │ .yaml │\n │ (7 国,独立维护) │\n └──────────┬───────────┘\n │ load + inject per country\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 输入层 (四层自适应寻源) │\n│ ├── 第 1 层:静态 HTML 靶向抓取(esdm.go.id 等 20+ 精选源) │\n│ ├── 第 2 层:声明式查询矩阵(10 矿种 × 30 关键词 → NewsAPI + RSS) │\n│ ├── 第 3 层:自适应热点发现(DeepSeek 每周推荐当周查询) │\n│ ├── 第 4 层:自适应自动寻源(域名通配 RSS 泛搜 + 逆向域名回溯探针) │\n│ └── 二级抓取深度补全:RSS headline → fetch_article_full_text → 全文 │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 防线 1: is_valid_macro_policy 杀伤开关 │\n│ 防线 2: noise_patterns 噪音过滤(28 关键词) │\n│ 防线 3: Historical_Noise 旧规拦截(v4.2 新增) │\n│ 防线 4: 时效性校验(年份预扫 + LLM 自检 + 交叉验证) │\n│ 防线 5: 数字净化 _sanitize_fabricated_numbers(v4.0 兜底) │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ DeepSeek v4-pro 智库级分析 (temperature=0.2) │\n│ ├── factual_basis: 原文逐字摘录(事实层) │\n│ ├── industry_baseline_recall: CoT 常识锚(基线层 · v4.1) │\n│ ├── baseline_shift_detected: 范式转移自检(v4.2) │\n│ └── impact_deduction: 节点定向推演 🔻上游→🔺中游→🔻下游(分析层) │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 推送终判 │\n│ ├── 双闸门(四重 AND · v4.0)→ 通过才推送钉钉 │\n│ ├── Notion 入库:properties + children 块级排版 + 📝 待核标签 │\n│ └── 范式转移基线破裂 ⚠️ 特殊渲染(v4.2) │\n└────────────────────────────────────────────────────────────────────┘\n```\n\n---\n\n## 智库级分析框架详解\n\n对标 Rhodium 每行标注 `Source: [primary data], Rhodium Group analysis` 和情报界 \"the source says vs we assess\" 的分层标准:\n\n| 层 | 字段 | 来源 | 约束 |\n|----|------|------|------|\n| 事实层 | `substantive_provisions` + `factual_basis` | 原文逐字摘录 | 禁止增加原文没有的事实、数字 |\n| 基线层 | `industry_baseline_recall` | YAML 注入 + LLM 训练数据 | CoT 先回忆常识再推演 |\n| 分析层 | `impact_deduction` | 事实+基线性推理 | 🔻上游→🔺中游→🔻下游 节点格式,禁止编造百分比 |\n| 自检 | `baseline_shift_detected` | LLM 对比基线 vs 最新情报 | true → 🚨 运维告警 + 推送卡片标红 |\n| 置信度 | `analytic_confidence` | High/Medium/Low 自评 | Low 默认不推送 |\n\n---\n\n## 五道防线\n\n| # | 防线 | 触发条件 | 效果 |\n|---|------|---------|------|\n| 1 | `is_valid_macro_policy` | LLM 判定无关内容(导航/社会新闻/纯内政) | 直接丢弃 |\n| 2 | `noise_patterns` | 标题含 28 个否定关键词 | 过滤 |\n| 3 | `Historical_Noise` | `current_stage == \"Historical_Noise\"` | 丢弃(旧规复述无增量) |\n| 4 | 时效性校验 | 年份预扫 + LLM `is_recent_policy_action` + 交叉验证 | 降级为 `Low_Monitoring` |\n| 5 | `_sanitize_fabricated_numbers` | LLM 输出中的数字未在原文中出现 | 标记 `⚠️(待核)` |\n\n---\n\n## 双闸门推送规则\n\n```python\nPUSH_REQUIRED_SOURCE_TYPES = {\"Official_Gazette\", \"Ministry_Website\", \"Customs_Announcement\"}\nREGULATION_PATTERNS = [\n r\"Permen ESDM\", r\"Keputusan Menteri\", r\"UU\", r\"Peraturan\",\n r\"国务院令\", r\"商务部公告\", r\"发改委令\", r\"海关总署公告\",\n r\"Regulation No\", r\"Decree No\", r\"Executive Order\", r\"Act of \\d{4}\",\n]\n\ndef _should_push(data, fetched_text, source_depth):\n # 闸门 1: 烈度 ∈ {High_Disruption, Moderate_Adjustment}\n # 闸门 2: 官方源 OR 文本含法规编号白名单\n # 闸门 3: 非 Procedural_Statement(程序性说明仅入库)\n # 闸门 4: 置信度 ≠ Low(信息不足时宁可漏推)\n # 闸门 5: 非 Unverified(阶段未核实不推)\n```\n\n---\n\n## 推送卡片格式(v4.3 三层结构)\n\n```\n📌 [ID] 印尼能矿部发布采矿治理程序说明 (镍/铜)\n 🏛️ 颁布机构:ESDM\n 📝 Dari Perizinan hingga RKAB...\n 🌍 🇮🇩 印尼 | 矿种 镍、铜\n ⚖️ 程序性说明 | 生效 未定 | 🟡 中度调整 | 🔴 置信度:低\n\n📜 事实层(原文可核)\n - 原文为岩石类 IUP 申请程序说明...\n 📎 原文依据:Tata Cara Pemberian Izin Usaha Pertambangan Batuan\n\n⚓ 产业基线(行业共识 · CoT 常识锚)\n 印尼自2020年起全面禁止镍原矿出口,RKAB为唯一配额凭证...\n\n🔮 分析层 | 置信度:低\n 🔻 上游采矿端:审批收紧→国内矿权人供给受限...\n 🔺 中游冶炼端:内贸矿溢价上行→独立冶炼厂利润挤压...\n 🔻 下游终端:原文信息不足,待细则发布后评估\n\n🔗 查看原文\n```\n\n范式转移时基线段变为 `⚓ 产业基线 | ⚠️【历史基线已被打破】`。\n\n---\n\n## 基线运维\n\n### 启动交叉表(每次运行)\n\n```\n📚 基线知识库已加载,覆盖 7 个国家,最后更新: 2026-06-22\n⚠️ [基线缺口] 3 国有情报源但无基线: ['AU', 'CD', 'CL']\nℹ️ [待接源] 4 个基线国家暂无情报源: ['AR', 'GH', 'PH', 'ZW']\n```\n\n### 季度影子审计\n\n| 命令 | 作用 |\n|------|------|\n| `python3 audit_baselines.py` | 全量审计:NewsAPI+RSS 采编 → DeepSeek Diff |\n| `python3 audit_baselines.py --country ID` | 单国审计 |\n| `python3 audit_baselines.py --update-timestamp` | 仅更新 `last_updated` |\n\n审计结论:`NO_CHANGE` → 自动更新时间戳 / `CHANGE` → CI 告警 + 打印 Diff 报告。\n\n### 新增/更新基线\n\n编辑 `knowledge_baselines.yaml`,按已有格式增删条目。系统下次运行自动加载,无需改代码。\n\n---\n\n## 环境变量\n\n| 变量名 | 用途 | 必填 |\n|--------|------|------|\n| `OPENAI_API_KEY` | DeepSeek API 密钥(注入 `DEEPSEEK_API_KEY`) | 是 |\n| `OPENAI_BASE_URL` | API 端点(默认 `https://api.deepseek.com`) | 否 |\n| `NEWSAPI_KEY` | NewsAPI 密钥 | 否 |\n| `NOTION_TOKEN` | Notion Integration Token | 否 |\n| `NOTION_DATABASE_ID` | Notion 目标数据库 ID | 否 |\n| `DINGTALK_WEBHOOK` | 钉钉 Webhook URL | 否 |\n| `DINGTALK_SECRET` | 钉钉加签密钥 | 否 |\n| `MAX_AI_CALLS` | 单轮最大 AI 调用数(默认 8,0=不限) | 否 |\n| `MAX_CONSECUTIVE_EMPTY` | 连续空转熔断上限(默认 5) | 否 |\n| `MIN_TEXT_LENGTH` | 文本最短字符数门槛(默认 300) | 否 |\n| `MIN_FULLTEXT_LENGTH` | 二级抓取最小正文长度(默认 300) | 否 |\n| `RSS_MAX_AGE_DAYS` | RSS 文章硬过滤天数(默认 14) | 否 |\n| `NOTION_HAS_AUTHORITY_FIELD` | 启用 Notion 颁布机构列 | 否 |\n\n---\n\n## 扩展指南\n\n### 新增情报源\n\n在 `sources.yaml` 的 `macro_sources` 下新增条目。系统启动时自动检测国家代码,若 `knowledge_baselines.yaml` 中无对应基线,打印 `⚠️ [基线缺口]` 提示。\n\n### 新增/更新国家基线\n\n编辑 `knowledge_baselines.yaml`,按已有格式新增条目即可。\n\n### 手动触发审计\n\n```bash\npython3 audit_baselines.py # 全量审计\npython3 audit_baselines.py --country ID # 单国审计\npython3 audit_baselines.py --update-timestamp # 仅更新时间戳\n```\n\n---\n\n## 设计哲学\n\n1. **管道式无状态架构** — 每次运行独立,适合 Cron 调度\n2. **Schema 驱动** — AI 输出结构由 `policy_schema.json` 统一定义,改 Schema 即改变系统行为\n3. **基线解耦** — 产业常识与代码物理分离,YAML 可独立维护\n4. **事实准确优先** — 五道防线 + CoT 定锚 + 数字净化兜底,宁可漏推不可错推\n5. **人机协同** — LLM 生成分析 → 代码层拦截 + 置信度标注 → 📝 标签引导人工复核\n"}, "902ec607c5ec888f5b13ced8b3a5d1b75b307a25": {"t": 1785766272.465092, "n": 8866, "h": "5121c512c2da3821", "c": "# Macro Policy Radar — 全球关键矿产宏观政策雷达\n\n> **当前版本:v5.5** — 自动寻源系统与政策覆盖修复(泛在域名通配 RSS + 逆向域名回溯闭环自适应寻源)\n\n## 项目概述\n\n全自动化的**全球关键矿产宏观地缘政策情报引擎**。周期性扫描全球官方政策源和 Google News 动态聚合网,抓取原始政策文本,调用 DeepSeek v4-pro 进行智库级结构化研判(**事实 → 基线 → 定向推演**),结果持久化至 Notion 知识库,高冲击力政策通过钉钉推送给决策层。\n\n**核心业务领域**:锂、钴、镍、铜、稀土、石墨等关键矿产的出口禁令、资源民族主义、关税调整、外资股权限制、税收与特许权使用费变动等宏观政策。\n\n**设计哲学**:事实准确是底线,时效性、重要性、相关性都在此之上收敛。**宁可漏推,不可错推。**\n\n**技术栈**:Python 3.10+ / OpenAI SDK (DeepSeek v4-pro) / BeautifulSoup4 + lxml / PyYAML / requests / Notion API + DingTalk Webhook / GitHub Actions(每周研判 + 每季度基线审计)\n\n---\n\n## 核心机制速览\n\n| 机制 | 说明 |\n|------|------|\n| **五道防线** | `is_valid_macro_policy` 杀伤开关 → `noise_patterns` 28 关键词过滤 → `Historical_Noise` 旧规拦截 → 时效性校验(年份预扫 + LLM 自检) → `_sanitize_fabricated_numbers` 数字净化兜底 |\n| **智库分析框架** | `factual_basis`(原文溯源)→ `industry_baseline_recall`(CoT 常识锚)→ `impact_deduction`(🔻上游→🔺中游→🔻下游 节点推演)→ `baseline_shift_detected`(范式转移自检) |\n| **双闸门推送** | 四重 AND(烈度 + 官方源 + 非程序性说明 + 置信度≠Low),通过才推送钉钉 |\n| **自适应寻源 (Layer 4)** | **国别域名通配 RSS 扫描 (Scheme 1)** 自动捕捉新政;**成功政策域名回溯探针 (Scheme 2)** 自动抽取未知官网域名并写入 YAML 候选池 |\n| **基线运维** | `knowledge_baselines.yaml` 7 国解耦基线 + 启动交叉表 + `audit_baselines.py` 季度影子审计 |\n| **分析范式** | 对标 Rhodium / CSIS / 情报界 ICD 203:Fact → Baseline → Directional Impact |\n\n---\n\n## 文件结构\n\n```\nmacro-policy-radar/\n├── main.py # 核心引擎(唯一运行入口)\n├── policy_schema.json # JSON Schema 约束(认知滤网 + 输出规范)\n├── sources.yaml # 四层寻源配置(含通配扫描源)\n├── discovered_sources.yaml # 自动发现的新官方源候选池 (v5.5 新增)\n├── knowledge_baselines.yaml # 7 国产业基线库(解耦代码,独立维护)\n├── audit_baselines.py # 季度影子审计脚本\n├── requirements.txt # Python 依赖\n├── README.md # 本文档\n└── .github/workflows/\n ├── macro_policy_radar.yml # 每周研判调度(周一 09:00 CST)\n └── baseline_auditor.yml # 每季度基线审计调度\n```\n\n共享基础设施(LLM 缓存/重试/抓取/推送等)由 [radar-infra](https://github.com/ahhhhmen/radar-infra) 提供。\n\n---\n\n## 快速开始\n\n### 前置要求\n\n- Python 3.10+\n- [DeepSeek API key](https://platform.deepseek.com/)\n- (可选)[NewsAPI key](https://newsapi.org/) — 不配则走 Google News RSS 回退\n- (可选)Notion 集成 token + 数据库 ID\n\n```bash\n# 1. 克隆项目\ngit clone https://github.com/ahhhhmen/macro-policy-radar.git\ncd macro-policy-radar\n\n# 2. 创建 .env 文件,至少填入 DeepSeek key\ncat > .env << 'EOF'\nDEEPSEEK_API_KEY=sk-your-key-here\n# 可选配置\n# NEWSAPI_KEY=xxx\n# NOTION_TOKEN=secret_xxx\n# NOTION_DATABASE_ID=xxx\n# DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=xxx\n# DINGTALK_SECRET=xxx\nEOF\n\n# 3. 安装依赖(自动拉取 radar-infra)\npip install -r requirements.txt\n\n# 4. 运行\npython main.py\n\n# 仅更新基线时间戳\npython audit_baselines.py --update-timestamp\n```\n\n---\n\n## 架构总览\n\n```\n ┌──────────────────────┐\n │ knowledge_baselines │\n │ .yaml │\n │ (7 国,独立维护) │\n └──────────┬───────────┘\n │ load + inject per country\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 输入层 (四层自适应寻源) │\n│ ├── 第 1 层:静态 HTML 靶向抓取(esdm.go.id 等 20+ 精选源) │\n│ ├── 第 2 层:声明式查询矩阵(10 矿种 × 30 关键词 → NewsAPI + RSS) │\n│ ├── 第 3 层:自适应热点发现(DeepSeek 每周推荐当周查询) │\n│ ├── 第 4 层:自适应自动寻源(域名通配 RSS 泛搜 + 逆向域名回溯探针) │\n│ └── 二级抓取深度补全:RSS headline → fetch_article_full_text → 全文 │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 防线 1: is_valid_macro_policy 杀伤开关 │\n│ 防线 2: noise_patterns 噪音过滤(28 关键词) │\n│ 防线 3: Historical_Noise 旧规拦截(v4.2 新增) │\n│ 防线 4: 时效性校验(年份预扫 + LLM 自检 + 交叉验证) │\n│ 防线 5: 数字净化 _sanitize_fabricated_numbers(v4.0 兜底) │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ DeepSeek v4-pro 智库级分析 (temperature=0.2) │\n│ ├── factual_basis: 原文逐字摘录(事实层) │\n│ ├── industry_baseline_recall: CoT 常识锚(基线层 · v4.1) │\n│ ├── baseline_shift_detected: 范式转移自检(v4.2) │\n│ └── impact_deduction: 节点定向推演 🔻上游→🔺中游→🔻下游(分析层) │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 推送终判 │\n│ ├── 双闸门(四重 AND · v4.0)→ 通过才推送钉钉 │\n│ ├── Notion 入库:properties + children 块级排版 + 📝 待核标签 │\n│ └── 范式转移基线破裂 ⚠️ 特殊渲染(v4.2) │\n└────────────────────────────────────────────────────────────────────┘\n```\n\n---\n\n## 智库级分析框架详解\n\n对标 Rhodium 每行标注 `Source: [primary data], Rhodium Group analysis` 和情报界 \"the source says vs we assess\" 的分层标准:\n\n| 层 | 字段 | 来源 | 约束 |\n|----|------|------|------|\n| 事实层 | `substantive_provisions` + `factual_basis` | 原文逐字摘录 | 禁止增加原文没有的事实、数字 |\n| 基线层 | `industry_baseline_recall` | YAML 注入 + LLM 训练数据 | CoT 先回忆常识再推演 |\n| 分析层 | `impact_deduction` | 事实+基线性推理 | 🔻上游→🔺中游→🔻下游 节点格式,禁止编造百分比 |\n| 自检 | `baseline_shift_detected` | LLM 对比基线 vs 最新情报 | true → 🚨 运维告警 + 推送卡片标红 |\n| 置信度 | `analytic_confidence` | High/Medium/Low 自评 | Low 默认不推送 |\n\n---\n\n## 五道防线\n\n| # | 防线 | 触发条件 | 效果 |\n|---|------|---------|------|\n| 1 | `is_valid_macro_policy` | LLM 判定无关内容(导航/社会新闻/纯内政) | 直接丢弃 |\n| 2 | `noise_patterns` | 标题含 28 个否定关键词 | 过滤 |\n| 3 | `Historical_Noise` | `current_stage == \"Historical_Noise\"` | 丢弃(旧规复述无增量) |\n| 4 | 时效性校验 | 年份预扫 + LLM `is_recent_policy_action` + 交叉验证 | 降级为 `Low_Monitoring` |\n| 5 | `_sanitize_fabricated_numbers` | LLM 输出中的数字未在原文中出现 | 标记 `⚠️(待核)` |\n\n---\n\n## 双闸门推送规则\n\n```python\nPUSH_REQUIRED_SOURCE_TYPES = {\"Official_Gazette\", \"Ministry_Website\", \"Customs_Announcement\"}\nREGULATION_PATTERNS = [\n r\"Permen ESDM\", r\"Keputusan Menteri\", r\"UU\", r\"Peraturan\",\n r\"国务院令\", r\"商务部公告\", r\"发改委令\", r\"海关总署公告\",\n r\"Regulation No\", r\"Decree No\", r\"Executive Order\", r\"Act of \\d{4}\",\n]\n\ndef _should_push(data, fetched_text, source_depth):\n # 闸门 1: 烈度 ∈ {High_Disruption, Moderate_Adjustment}\n # 闸门 2: 官方源 OR 文本含法规编号白名单\n # 闸门 3: 非 Procedural_Statement(程序性说明仅入库)\n # 闸门 4: 置信度 ≠ Low(信息不足时宁可漏推)\n # 闸门 5: 非 Unverified(阶段未核实不推)\n```\n\n---\n\n## 推送卡片格式(v4.3 三层结构)\n\n```\n📌 [ID] 印尼能矿部发布采矿治理程序说明 (镍/铜)\n 🏛️ 颁布机构:ESDM\n 📝 Dari Perizinan hingga RKAB...\n 🌍 🇮🇩 印尼 | 矿种 镍、铜\n ⚖️ 程序性说明 | 生效 未定 | 🟡 中度调整 | 🔴 置信度:低\n\n📜 事实层(原文可核)\n - 原文为岩石类 IUP 申请程序说明...\n 📎 原文依据:Tata Cara Pemberian Izin Usaha Pertambangan Batuan\n\n⚓ 产业基线(行业共识 · CoT 常识锚)\n 印尼自2020年起全面禁止镍原矿出口,RKAB为唯一配额凭证...\n\n🔮 分析层 | 置信度:低\n 🔻 上游采矿端:审批收紧→国内矿权人供给受限...\n 🔺 中游冶炼端:内贸矿溢价上行→独立冶炼厂利润挤压...\n 🔻 下游终端:原文信息不足,待细则发布后评估\n\n🔗 查看原文\n```\n\n范式转移时基线段变为 `⚓ 产业基线 | ⚠️【历史基线已被打破】`。\n\n---\n\n## 基线运维\n\n### 启动交叉表(每次运行)\n\n```\n📚 基线知识库已加载,覆盖 7 个国家,最后更新: 2026-06-22\n⚠️ [基线缺口] 3 国有情报源但无基线: ['AU', 'CD', 'CL']\nℹ️ [待接源] 4 个基线国家暂无情报源: ['AR', 'GH', 'PH', 'ZW']\n```\n\n### 季度影子审计\n\n| 命令 | 作用 |\n|------|------|\n| `python3 audit_baselines.py` | 全量审计:NewsAPI+RSS 采编 → DeepSeek Diff |\n| `python3 audit_baselines.py --country ID` | 单国审计 |\n| `python3 audit_baselines.py --update-timestamp` | 仅更新 `last_updated` |\n\n审计结论:`NO_CHANGE` → 自动更新时间戳 / `CHANGE` → CI 告警 + 打印 Diff 报告。\n\n### 新增/更新基线\n\n编辑 `knowledge_baselines.yaml`,按已有格式增删条目。系统下次运行自动加载,无需改代码。\n\n---\n\n## 环境变量\n\n| 变量名 | 用途 | 必填 |\n|--------|------|------|\n| `OPENAI_API_KEY` | DeepSeek API 密钥(注入 `DEEPSEEK_API_KEY`) | 是 |\n| `OPENAI_BASE_URL` | API 端点(默认 `https://api.deepseek.com`) | 否 |\n| `NEWSAPI_KEY` | NewsAPI 密钥 | 否 |\n| `NOTION_TOKEN` | Notion Integration Token | 否 |\n| `NOTION_DATABASE_ID` | Notion 目标数据库 ID | 否 |\n| `DINGTALK_WEBHOOK` | 钉钉 Webhook URL | 否 |\n| `DINGTALK_SECRET` | 钉钉加签密钥 | 否 |\n| `MAX_AI_CALLS` | 单轮最大 AI 调用数(默认 8,0=不限) | 否 |\n| `MAX_CONSECUTIVE_EMPTY` | 连续空转熔断上限(默认 5) | 否 |\n| `MIN_TEXT_LENGTH` | 文本最短字符数门槛(默认 300) | 否 |\n| `MIN_FULLTEXT_LENGTH` | 二级抓取最小正文长度(默认 300) | 否 |\n| `RSS_MAX_AGE_DAYS` | RSS 文章硬过滤天数(默认 14) | 否 |\n| `NOTION_HAS_AUTHORITY_FIELD` | 启用 Notion 颁布机构列 | 否 |\n\n---\n\n## 扩展指南\n\n### 新增情报源\n\n在 `sources.yaml` 的 `macro_sources` 下新增条目。系统启动时自动检测国家代码,若 `knowledge_baselines.yaml` 中无对应基线,打印 `⚠️ [基线缺口]` 提示。\n\n### 新增/更新国家基线\n\n编辑 `knowledge_baselines.yaml`,按已有格式新增条目即可。\n\n### 手动触发审计\n\n```bash\npython3 audit_baselines.py # 全量审计\npython3 audit_baselines.py --country ID # 单国审计\npython3 audit_baselines.py --update-timestamp # 仅更新时间戳\n```\n\n---\n\n## 设计哲学\n\n1. **管道式无状态架构** — 每次运行独立,适合 Cron 调度\n2. **Schema 驱动** — AI 输出结构由 `policy_schema.json` 统一定义,改 Schema 即改变系统行为\n3. **基线解耦** — 产业常识与代码物理分离,YAML 可独立维护\n4. **事实准确优先** — 五道防线 + CoT 定锚 + 数字净化兜底,宁可漏推不可错推\n5. **人机协同** — LLM 生成分析 → 代码层拦截 + 置信度标注 → 📝 标签引导人工复核\n"}, "86f6640a30b7d9e5c3a2501684f9b7bb1027d52b": {"t": 1785766273.828705, "n": 8634, "h": "a7607b0e5020275c", "c": "# Macro Policy Radar — 全球关键矿产宏观政策雷达\n\n> **当前版本:v4.3** — 事实优先重构(智库级基线定锚 + 五重防线防幻觉)\n\n## 项目概述\n\n全自动化的**全球关键矿产宏观地缘政策情报引擎**。周期性扫描全球官方政策源和 Google News 动态聚合网,抓取原始政策文本,调用 DeepSeek v4-pro 进行智库级结构化研判(**事实 → 基线 → 定向推演**),结果持久化至 Notion 知识库,高冲击力政策通过钉钉推送给决策层。\n\n**核心业务领域**:锂、钴、镍、铜、稀土、石墨等关键矿产的出口禁令、资源民族主义、关税调整、外资股权限制、税收与特许权使用费变动等宏观政策。\n\n**设计哲学**:事实准确是底线,时效性、重要性、相关性都在此之上收敛。**宁可漏推,不可错推。**\n\n**技术栈**:Python 3.10+ / OpenAI SDK (DeepSeek v4-pro) / BeautifulSoup4 + lxml / PyYAML / requests / Notion API + DingTalk Webhook / GitHub Actions(每周研判 + 每季度基线审计)\n\n---\n\n## 核心机制速览\n\n| 机制 | 说明 |\n|------|------|\n| **五道防线** | `is_valid_macro_policy` 杀伤开关 → `noise_patterns` 28 关键词过滤 → `Historical_Noise` 旧规拦截 → 时效性校验(年份预扫 + LLM 自检) → `_sanitize_fabricated_numbers` 数字净化兜底 |\n| **智库分析框架** | `factual_basis`(原文溯源)→ `industry_baseline_recall`(CoT 常识锚)→ `impact_deduction`(🔻上游→🔺中游→🔻下游 节点推演)→ `baseline_shift_detected`(范式转移自检) |\n| **双闸门推送** | 四重 AND(烈度 + 官方源 + 非程序性说明 + 置信度≠Low),通过才推送钉钉 |\n| **基线运维** | `knowledge_baselines.yaml` 7 国解耦基线 + 启动交叉表 + `audit_baselines.py` 季度影子审计 |\n| **分析范式** | 对标 Rhodium / CSIS / 情报界 ICD 203:Fact → Baseline → Directional Impact |\n\n---\n\n## 文件结构\n\n```\nmacro-policy-radar/\n├── main.py # 核心引擎(唯一运行入口)\n├── policy_schema.json # JSON Schema 约束(认知滤网 + 输出规范)\n├── sources.yaml # 三层寻源配置\n├── knowledge_baselines.yaml # 7 国产业基线库(解耦代码,独立维护)\n├── audit_baselines.py # 季度影子审计脚本\n├── requirements.txt # Python 依赖\n├── README.md # 本文档\n└── .github/workflows/\n ├── macro_policy_radar.yml # 每周研判调度(周一 09:00 CST)\n └── baseline_auditor.yml # 每季度基线审计调度\n```\n\n共享基础设施(LLM 缓存/重试/抓取/推送等)由 [radar-infra](https://github.com/ahhhhmen/radar-infra) 提供。\n\n---\n\n## 快速开始\n\n### 前置要求\n\n- Python 3.10+\n- [DeepSeek API key](https://platform.deepseek.com/)\n- (可选)[NewsAPI key](https://newsapi.org/) — 不配则走 Google News RSS 回退\n- (可选)Notion 集成 token + 数据库 ID\n\n```bash\n# 1. 克隆项目\ngit clone https://github.com/ahhhhmen/macro-policy-radar.git\ncd macro-policy-radar\n\n# 2. 创建 .env 文件,至少填入 DeepSeek key\ncat > .env << 'EOF'\nDEEPSEEK_API_KEY=sk-your-key-here\n# 可选配置\n# NEWSAPI_KEY=xxx\n# NOTION_TOKEN=secret_xxx\n# NOTION_DATABASE_ID=xxx\n# DINGTALK_WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token=xxx\n# DINGTALK_SECRET=xxx\nEOF\n\n# 3. 安装依赖(自动拉取 radar-infra)\npip install -r requirements.txt\n\n# 4. 运行\npython main.py\n\n# 仅更新基线时间戳\npython audit_baselines.py --update-timestamp\n```\n\n---\n\n## 架构总览\n\n```\n ┌──────────────────────┐\n │ knowledge_baselines │\n │ .yaml │\n │ (7 国,独立维护) │\n └──────────┬───────────┘\n │ load + inject per country\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 输入层 │\n│ ├── 静态 HTML 靶向抓取(esdm.go.id 等 15 源) │\n│ ├── 声明式查询矩阵(6 矿种 × 25 关键词 → NewsAPI + RSS) │\n│ ├── 自适应热点发现(DeepSeek 推荐当周查询) │\n│ └── v4.0 二级抓取:RSS headline → fetch_article_full_text → 全文 │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 防线 1: is_valid_macro_policy 杀伤开关 │\n│ 防线 2: noise_patterns 噪音过滤(28 关键词) │\n│ 防线 3: Historical_Noise 旧规拦截(v4.2 新增) │\n│ 防线 4: 时效性校验(年份预扫 + LLM 自检 + 交叉验证) │\n│ 防线 5: 数字净化 _sanitize_fabricated_numbers(v4.0 兜底) │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ DeepSeek v4-pro 智库级分析 (temperature=0.2) │\n│ ├── factual_basis: 原文逐字摘录(事实层) │\n│ ├── industry_baseline_recall: CoT 常识锚(基线层 · v4.1) │\n│ ├── baseline_shift_detected: 范式转移自检(v4.2) │\n│ └── impact_deduction: 节点定向推演 🔻上游→🔺中游→🔻下游(分析层) │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 推送终判 │\n│ ├── 双闸门(四重 AND · v4.0)→ 通过才推送钉钉 │\n│ ├── Notion 入库:properties + children 块级排版 + 📝 待核标签 │\n│ └── 范式转移基线破裂 ⚠️ 特殊渲染(v4.2) │\n└────────────────────────────────────────────────────────────────────┘\n```\n\n---\n\n## 智库级分析框架详解\n\n对标 Rhodium 每行标注 `Source: [primary data], Rhodium Group analysis` 和情报界 \"the source says vs we assess\" 的分层标准:\n\n| 层 | 字段 | 来源 | 约束 |\n|----|------|------|------|\n| 事实层 | `substantive_provisions` + `factual_basis` | 原文逐字摘录 | 禁止增加原文没有的事实、数字 |\n| 基线层 | `industry_baseline_recall` | YAML 注入 + LLM 训练数据 | CoT 先回忆常识再推演 |\n| 分析层 | `impact_deduction` | 事实+基线性推理 | 🔻上游→🔺中游→🔻下游 节点格式,禁止编造百分比 |\n| 自检 | `baseline_shift_detected` | LLM 对比基线 vs 最新情报 | true → 🚨 运维告警 + 推送卡片标红 |\n| 置信度 | `analytic_confidence` | High/Medium/Low 自评 | Low 默认不推送 |\n\n---\n\n## 五道防线\n\n| # | 防线 | 触发条件 | 效果 |\n|---|------|---------|------|\n| 1 | `is_valid_macro_policy` | LLM 判定无关内容(导航/社会新闻/纯内政) | 直接丢弃 |\n| 2 | `noise_patterns` | 标题含 28 个否定关键词 | 过滤 |\n| 3 | `Historical_Noise` | `current_stage == \"Historical_Noise\"` | 丢弃(旧规复述无增量) |\n| 4 | 时效性校验 | 年份预扫 + LLM `is_recent_policy_action` + 交叉验证 | 降级为 `Low_Monitoring` |\n| 5 | `_sanitize_fabricated_numbers` | LLM 输出中的数字未在原文中出现 | 标记 `⚠️(待核)` |\n\n---\n\n## 双闸门推送规则\n\n```python\nPUSH_REQUIRED_SOURCE_TYPES = {\"Official_Gazette\", \"Ministry_Website\", \"Customs_Announcement\"}\nREGULATION_PATTERNS = [\n r\"Permen ESDM\", r\"Keputusan Menteri\", r\"UU\", r\"Peraturan\",\n r\"国务院令\", r\"商务部公告\", r\"发改委令\", r\"海关总署公告\",\n r\"Regulation No\", r\"Decree No\", r\"Executive Order\", r\"Act of \\d{4}\",\n]\n\ndef _should_push(data, fetched_text, source_depth):\n # 闸门 1: 烈度 ∈ {High_Disruption, Moderate_Adjustment}\n # 闸门 2: 官方源 OR 文本含法规编号白名单\n # 闸门 3: 非 Procedural_Statement(程序性说明仅入库)\n # 闸门 4: 置信度 ≠ Low(信息不足时宁可漏推)\n # 闸门 5: 非 Unverified(阶段未核实不推)\n```\n\n---\n\n## 推送卡片格式(v4.3 三层结构)\n\n```\n📌 [ID] 印尼能矿部发布采矿治理程序说明 (镍/铜)\n 🏛️ 颁布机构:ESDM\n 📝 Dari Perizinan hingga RKAB...\n 🌍 🇮🇩 印尼 | 矿种 镍、铜\n ⚖️ 程序性说明 | 生效 未定 | 🟡 中度调整 | 🔴 置信度:低\n\n📜 事实层(原文可核)\n - 原文为岩石类 IUP 申请程序说明...\n 📎 原文依据:Tata Cara Pemberian Izin Usaha Pertambangan Batuan\n\n⚓ 产业基线(行业共识 · CoT 常识锚)\n 印尼自2020年起全面禁止镍原矿出口,RKAB为唯一配额凭证...\n\n🔮 分析层 | 置信度:低\n 🔻 上游采矿端:审批收紧→国内矿权人供给受限...\n 🔺 中游冶炼端:内贸矿溢价上行→独立冶炼厂利润挤压...\n 🔻 下游终端:原文信息不足,待细则发布后评估\n\n🔗 查看原文\n```\n\n范式转移时基线段变为 `⚓ 产业基线 | ⚠️【历史基线已被打破】`。\n\n---\n\n## 基线运维\n\n### 启动交叉表(每次运行)\n\n```\n📚 基线知识库已加载,覆盖 7 个国家,最后更新: 2026-06-22\n⚠️ [基线缺口] 3 国有情报源但无基线: ['AU', 'CD', 'CL']\nℹ️ [待接源] 4 个基线国家暂无情报源: ['AR', 'GH', 'PH', 'ZW']\n```\n\n### 季度影子审计\n\n| 命令 | 作用 |\n|------|------|\n| `python3 audit_baselines.py` | 全量审计:NewsAPI+RSS 采编 → DeepSeek Diff |\n| `python3 audit_baselines.py --country ID` | 单国审计 |\n| `python3 audit_baselines.py --update-timestamp` | 仅更新 `last_updated` |\n\n审计结论:`NO_CHANGE` → 自动更新时间戳 / `CHANGE` → CI 告警 + 打印 Diff 报告。\n\n### 新增/更新基线\n\n编辑 `knowledge_baselines.yaml`,按已有格式增删条目。系统下次运行自动加载,无需改代码。\n\n---\n\n## 环境变量\n\n| 变量名 | 用途 | 必填 |\n|--------|------|------|\n| `OPENAI_API_KEY` | DeepSeek API 密钥(注入 `DEEPSEEK_API_KEY`) | 是 |\n| `OPENAI_BASE_URL` | API 端点(默认 `https://api.deepseek.com`) | 否 |\n| `NEWSAPI_KEY` | NewsAPI 密钥 | 否 |\n| `NOTION_TOKEN` | Notion Integration Token | 否 |\n| `NOTION_DATABASE_ID` | Notion 目标数据库 ID | 否 |\n| `DINGTALK_WEBHOOK` | 钉钉 Webhook URL | 否 |\n| `DINGTALK_SECRET` | 钉钉加签密钥 | 否 |\n| `MAX_AI_CALLS` | 单轮最大 AI 调用数(默认 8,0=不限) | 否 |\n| `MAX_CONSECUTIVE_EMPTY` | 连续空转熔断上限(默认 5) | 否 |\n| `MIN_TEXT_LENGTH` | 文本最短字符数门槛(默认 300) | 否 |\n| `MIN_FULLTEXT_LENGTH` | 二级抓取最小正文长度(默认 300) | 否 |\n| `RSS_MAX_AGE_DAYS` | RSS 文章硬过滤天数(默认 14) | 否 |\n| `NOTION_HAS_AUTHORITY_FIELD` | 启用 Notion 颁布机构列 | 否 |\n\n---\n\n## 扩展指南\n\n### 新增情报源\n\n在 `sources.yaml` 的 `macro_sources` 下新增条目。系统启动时自动检测国家代码,若 `knowledge_baselines.yaml` 中无对应基线,打印 `⚠️ [基线缺口]` 提示。\n\n### 新增/更新国家基线\n\n编辑 `knowledge_baselines.yaml`,按已有格式新增条目即可。\n\n### 手动触发审计\n\n```bash\npython3 audit_baselines.py # 全量审计\npython3 audit_baselines.py --country ID # 单国审计\npython3 audit_baselines.py --update-timestamp # 仅更新时间戳\n```\n\n---\n\n## 设计哲学\n\n1. **管道式无状态架构** — 每次运行独立,适合 Cron 调度\n2. **Schema 驱动** — AI 输出结构由 `policy_schema.json` 统一定义,改 Schema 即改变系统行为\n3. **基线解耦** — 产业常识与代码物理分离,YAML 可独立维护\n4. **事实准确优先** — 五道防线 + CoT 定锚 + 数字净化兜底,宁可漏推不可错推\n5. **人机协同** — LLM 生成分析 → 代码层拦截 + 置信度标注 → 📝 标签引导人工复核\n"}, "866288e054bc1b6d80a8b856f9e4c445e315f546": {"t": 1785766275.3016858, "n": 7844, "h": "fafec02127d9e30c", "c": "# Macro Policy Radar — 全球关键矿产宏观政策雷达\n\n> **当前版本:v4.3** — 事实优先重构(智库级基线定锚 + 五重防线防幻觉)\n\n## 项目概述\n\n全自动化的**全球关键矿产宏观地缘政策情报引擎**。周期性扫描全球官方政策源和 Google News 动态聚合网,抓取原始政策文本,调用 DeepSeek v4-pro 进行智库级结构化研判(**事实 → 基线 → 定向推演**),结果持久化至 Notion 知识库,高冲击力政策通过钉钉推送给决策层。\n\n**核心业务领域**:锂、钴、镍、铜、稀土、石墨等关键矿产的出口禁令、资源民族主义、关税调整、外资股权限制、税收与特许权使用费变动等宏观政策。\n\n**设计哲学**:事实准确是底线,时效性、重要性、相关性都在此之上收敛。**宁可漏推,不可错推。**\n\n**技术栈**:Python 3.10+ / OpenAI SDK (DeepSeek v4-pro) / BeautifulSoup4 + lxml / PyYAML / requests / Notion API + DingTalk Webhook / GitHub Actions(每周研判 + 每季度基线审计)\n\n---\n\n## 核心机制速览\n\n| 机制 | 说明 |\n|------|------|\n| **五道防线** | `is_valid_macro_policy` 杀伤开关 → `noise_patterns` 28 关键词过滤 → `Historical_Noise` 旧规拦截 → 时效性校验(年份预扫 + LLM 自检) → `_sanitize_fabricated_numbers` 数字净化兜底 |\n| **智库分析框架** | `factual_basis`(原文溯源)→ `industry_baseline_recall`(CoT 常识锚)→ `impact_deduction`(🔻上游→🔺中游→🔻下游 节点推演)→ `baseline_shift_detected`(范式转移自检) |\n| **双闸门推送** | 四重 AND(烈度 + 官方源 + 非程序性说明 + 置信度≠Low),通过才推送钉钉 |\n| **基线运维** | `knowledge_baselines.yaml` 7 国解耦基线 + 启动交叉表 + `audit_baselines.py` 季度影子审计 |\n| **分析范式** | 对标 Rhodium / CSIS / 情报界 ICD 203:Fact → Baseline → Directional Impact |\n\n---\n\n## 文件结构\n\n```\nmacro-policy-radar/\n├── main.py # 核心引擎(唯一运行入口)\n├── policy_schema.json # JSON Schema 约束(认知滤网 + 输出规范)\n├── sources.yaml # 三层寻源配置\n├── knowledge_baselines.yaml # 7 国产业基线库(解耦代码,独立维护)\n├── audit_baselines.py # 季度影子审计脚本\n├── requirements.txt # Python 依赖\n├── README.md # 本文档\n└── .github/workflows/\n ├── macro_policy_radar.yml # 每周研判调度(周一 09:00 CST)\n └── baseline_auditor.yml # 每季度基线审计调度\n```\n\n---\n\n## 架构总览\n\n```\n ┌──────────────────────┐\n │ knowledge_baselines │\n │ .yaml │\n │ (7 国,独立维护) │\n └──────────┬───────────┘\n │ load + inject per country\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 输入层 │\n│ ├── 静态 HTML 靶向抓取(esdm.go.id 等 15 源) │\n│ ├── 声明式查询矩阵(6 矿种 × 25 关键词 → NewsAPI + RSS) │\n│ ├── 自适应热点发现(DeepSeek 推荐当周查询) │\n│ └── v4.0 二级抓取:RSS headline → fetch_article_full_text → 全文 │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 防线 1: is_valid_macro_policy 杀伤开关 │\n│ 防线 2: noise_patterns 噪音过滤(28 关键词) │\n│ 防线 3: Historical_Noise 旧规拦截(v4.2 新增) │\n│ 防线 4: 时效性校验(年份预扫 + LLM 自检 + 交叉验证) │\n│ 防线 5: 数字净化 _sanitize_fabricated_numbers(v4.0 兜底) │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ DeepSeek v4-pro 智库级分析 (temperature=0.2) │\n│ ├── factual_basis: 原文逐字摘录(事实层) │\n│ ├── industry_baseline_recall: CoT 常识锚(基线层 · v4.1) │\n│ ├── baseline_shift_detected: 范式转移自检(v4.2) │\n│ └── impact_deduction: 节点定向推演 🔻上游→🔺中游→🔻下游(分析层) │\n└──────────────────────────┬─────────────────────────────────────────┘\n ▼\n┌────────────────────────────────────────────────────────────────────┐\n│ 推送终判 │\n│ ├── 双闸门(四重 AND · v4.0)→ 通过才推送钉钉 │\n│ ├── Notion 入库:properties + children 块级排版 + 📝 待核标签 │\n│ └── 范式转移基线破裂 ⚠️ 特殊渲染(v4.2) │\n└────────────────────────────────────────────────────────────────────┘\n```\n\n---\n\n## 智库级分析框架详解\n\n对标 Rhodium 每行标注 `Source: [primary data], Rhodium Group analysis` 和情报界 \"the source says vs we assess\" 的分层标准:\n\n| 层 | 字段 | 来源 | 约束 |\n|----|------|------|------|\n| 事实层 | `substantive_provisions` + `factual_basis` | 原文逐字摘录 | 禁止增加原文没有的事实、数字 |\n| 基线层 | `industry_baseline_recall` | YAML 注入 + LLM 训练数据 | CoT 先回忆常识再推演 |\n| 分析层 | `impact_deduction` | 事实+基线性推理 | 🔻上游→🔺中游→🔻下游 节点格式,禁止编造百分比 |\n| 自检 | `baseline_shift_detected` | LLM 对比基线 vs 最新情报 | true → 🚨 运维告警 + 推送卡片标红 |\n| 置信度 | `analytic_confidence` | High/Medium/Low 自评 | Low 默认不推送 |\n\n---\n\n## 五道防线\n\n| # | 防线 | 触发条件 | 效果 |\n|---|------|---------|------|\n| 1 | `is_valid_macro_policy` | LLM 判定无关内容(导航/社会新闻/纯内政) | 直接丢弃 |\n| 2 | `noise_patterns` | 标题含 28 个否定关键词 | 过滤 |\n| 3 | `Historical_Noise` | `current_stage == \"Historical_Noise\"` | 丢弃(旧规复述无增量) |\n| 4 | 时效性校验 | 年份预扫 + LLM `is_recent_policy_action` + 交叉验证 | 降级为 `Low_Monitoring` |\n| 5 | `_sanitize_fabricated_numbers` | LLM 输出中的数字未在原文中出现 | 标记 `⚠️(待核)` |\n\n---\n\n## 双闸门推送规则\n\n```python\nPUSH_REQUIRED_SOURCE_TYPES = {\"Official_Gazette\", \"Ministry_Website\", \"Customs_Announcement\"}\nREGULATION_PATTERNS = [\n r\"Permen ESDM\", r\"Keputusan Menteri\", r\"UU\", r\"Peraturan\",\n r\"国务院令\", r\"商务部公告\", r\"发改委令\", r\"海关总署公告\",\n r\"Regulation No\", r\"Decree No\", r\"Executive Order\", r\"Act of \\d{4}\",\n]\n\ndef _should_push(data, fetched_text, source_depth):\n # 闸门 1: 烈度 ∈ {High_Disruption, Moderate_Adjustment}\n # 闸门 2: 官方源 OR 文本含法规编号白名单\n # 闸门 3: 非 Procedural_Statement(程序性说明仅入库)\n # 闸门 4: 置信度 ≠ Low(信息不足时宁可漏推)\n # 闸门 5: 非 Unverified(阶段未核实不推)\n```\n\n---\n\n## 推送卡片格式(v4.3 三层结构)\n\n```\n📌 [ID] 印尼能矿部发布采矿治理程序说明 (镍/铜)\n 🏛️ 颁布机构:ESDM\n 📝 Dari Perizinan hingga RKAB...\n 🌍 🇮🇩 印尼 | 矿种 镍、铜\n ⚖️ 程序性说明 | 生效 未定 | 🟡 中度调整 | 🔴 置信度:低\n\n📜 事实层(原文可核)\n - 原文为岩石类 IUP 申请程序说明...\n 📎 原文依据:Tata Cara Pemberian Izin Usaha Pertambangan Batuan\n\n⚓ 产业基线(行业共识 · CoT 常识锚)\n 印尼自2020年起全面禁止镍原矿出口,RKAB为唯一配额凭证...\n\n🔮 分析层 | 置信度:低\n 🔻 上游采矿端:审批收紧→国内矿权人供给受限...\n 🔺 中游冶炼端:内贸矿溢价上行→独立冶炼厂利润挤压...\n 🔻 下游终端:原文信息不足,待细则发布后评估\n\n🔗 查看原文\n```\n\n范式转移时基线段变为 `⚓ 产业基线 | ⚠️【历史基线已被打破】`。\n\n---\n\n## 基线运维\n\n### 启动交叉表(每次运行)\n\n```\n📚 基线知识库已加载,覆盖 7 个国家,最后更新: 2026-06-22\n⚠️ [基线缺口] 3 国有情报源但无基线: ['AU', 'CD', 'CL']\nℹ️ [待接源] 4 个基线国家暂无情报源: ['AR', 'GH', 'PH', 'ZW']\n```\n\n### 季度影子审计\n\n| 命令 | 作用 |\n|------|------|\n| `python3 audit_baselines.py` | 全量审计:NewsAPI+RSS 采编 → DeepSeek Diff |\n| `python3 audit_baselines.py --country ID` | 单国审计 |\n| `python3 audit_baselines.py --update-timestamp` | 仅更新 `last_updated` |\n\n审计结论:`NO_CHANGE` → 自动更新时间戳 / `CHANGE` → CI 告警 + 打印 Diff 报告。\n\n### 新增/更新基线\n\n编辑 `knowledge_baselines.yaml`,按已有格式增删条目。系统下次运行自动加载,无需改代码。\n\n---\n\n## 环境变量\n\n| 变量名 | 用途 | 必填 |\n|--------|------|------|\n| `OPENAI_API_KEY` | DeepSeek API 密钥(注入 `DEEPSEEK_API_KEY`) | 是 |\n| `OPENAI_BASE_URL` | API 端点(默认 `https://api.deepseek.com`) | 否 |\n| `NEWSAPI_KEY` | NewsAPI 密钥 | 否 |\n| `NOTION_TOKEN` | Notion Integration Token | 否 |\n| `NOTION_DATABASE_ID` | Notion 目标数据库 ID | 否 |\n| `DINGTALK_WEBHOOK` | 钉钉 Webhook URL | 否 |\n| `DINGTALK_SECRET` | 钉钉加签密钥 | 否 |\n| `MAX_AI_CALLS` | 单轮最大 AI 调用数(默认 8,0=不限) | 否 |\n| `MAX_CONSECUTIVE_EMPTY` | 连续空转熔断上限(默认 5) | 否 |\n| `MIN_TEXT_LENGTH` | 文本最短字符数门槛(默认 300) | 否 |\n| `MIN_FULLTEXT_LENGTH` | 二级抓取最小正文长度(默认 300) | 否 |\n| `RSS_MAX_AGE_DAYS` | RSS 文章硬过滤天数(默认 14) | 否 |\n| `NOTION_HAS_AUTHORITY_FIELD` | 启用 Notion 颁布机构列 | 否 |\n\n---\n\n## 扩展指南\n\n### 新增情报源\n\n在 `sources.yaml` 的 `macro_sources` 下新增条目。系统启动时自动检测国家代码,若 `knowledge_baselines.yaml` 中无对应基线,打印 `⚠️ [基线缺口]` 提示。\n\n### 新增/更新国家基线\n\n编辑 `knowledge_baselines.yaml`,按已有格式新增条目即可。\n\n### 手动触发审计\n\n```bash\npython3 audit_baselines.py # 全量审计\npython3 audit_baselines.py --country ID # 单国审计\npython3 audit_baselines.py --update-timestamp # 仅更新时间戳\n```\n\n---\n\n## 设计哲学\n\n1. **管道式无状态架构** — 每次运行独立,适合 Cron 调度\n2. **Schema 驱动** — AI 输出结构由 `policy_schema.json` 统一定义,改 Schema 即改变系统行为\n3. **基线解耦** — 产业常识与代码物理分离,YAML 可独立维护\n4. **事实准确优先** — 五道防线 + CoT 定锚 + 数字净化兜底,宁可漏推不可错推\n5. **人机协同** — LLM 生成分析 → 代码层拦截 + 置信度标注 → 📝 标签引导人工复核\n"}}}}