1 line
56 KiB
JSON
1 line
56 KiB
JSON
{"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"}}}} |