数据铁律 v2.3.0 — 上下文约束型分析防造假框架
> 核心逻辑:上下文就是你的全部世界。上下文里没有的数值,你不能写。
这不是传统工具
data-iron-law 是分布式约束层,不是单次执行的应用。它在多 Agent 管线中以 Prompt 注入形式嵌入每个节点——采集、分析、辩论、裁决——每一轮输出携带哈希链锚定,形成不可篡改的溯源链路:
采集 → [七律] → 分析 → [七律] → 辩论 → [链验证] → 裁决 → [终局]
不要把它理解为"装一个应用然后调用"——把它理解为"在每个 Agent 的 system prompt 里植入一段约束代码"。verifier.py 是提供给你的诊断工具,不是 data-iron-law 的本体。
30 秒上手
方式一:Prompt 注入(最简)
把下面这段话追加到你的 Agent system prompt 中:
🔴 数据铁律(违反即判负):
1. 你只能引用下方【数据区块】中明确出现的指标名和数值
2. 禁止编造、推测、或从外部知识引入任何数值
3. 禁止数值单位换算——数据用USD/lb就不能写美元/吨
4. 如果数据中某指标标记ok=False/不可靠,引用时必须注明
5. 对于数据中完全没有的信息,只能做定性论述,不给具体数值
6. 每个数值必须标注来源——[来源: 数据区块]、[来源: 推理]等
7. 输出前自检:你写的每个数字是否在数据区块中出现过?
方式二:程序化验证
# 1. 准备数据快照 JSON(含 value/unit/ok 字段)
# 2. 运行 LLM 分析,保存输出到 analysis.txt
# 3. 运行验证器
python verifier.py --data snapshot.json --output analysis.txt
输出示例:
结果: ⚠️ 发现 2 条可疑引用
合规引用(白名单匹配):
- 512340 [来源: indicators.comex_gold_oi=512340] — COMEX持仓512340手
- 289.3 [来源: indicators.cb_gold_purchases=289.3] — 央行购金289.3吨
可疑引用:
- 4600 — 预计金价将涨至4600美元 → 白名单未匹配(编造预测值)
- 2300 — 减少2300手 → 白名单未匹配(快照值为-2300,方向不一致)
> 设计说明:verifier 有意跳过 <10 的数字和 <10% 的百分比。1-10 在自然语言中高频出现("三大论据""第二点"),扫描它们会产生大量噪声。若需验证小数字/低百分比,修改 verifier.py 中 NUMERIC_PATTERNS 的正则阈值即可。
场景决策表
| 你的场景 | 用哪种模式 | 操作 | 预期效果 |
|---|---|---|---|
| 单次分析报告,基于一份快照 | Prompt 注入 | 复制七律到 system prompt,附数据快照 | LLM 输出不带编造数字,末尾有自检声明 |
| 多次分析需复查数值 | Prompt 注入 + verifier.py | 注入七律 + 每次跑 verifier.py 扫一遍 |
每轮输出有合规报告,可疑值标红 |
| 多 Agent 辩论/评分 | 完整辩论流程(见深度参考) | 每 Agent 注入七律 + Hash chain + 裁判 Verifier | 辩论中谁编造数据立即暴露,链上可追溯 |
| 数据管道/自动化采集 | verifier.py 集成 | 采集→LLM 分析→verifier.py 自动扫描→P0≥2 告警 | 管道数据质量自动监控 |
| 合规审查、法律分析 | Prompt 注入(严格模式) | 加"禁止外部信源引用"额外约束 | 只引法规原文,外部解释显式标注 |
七律速查
| # | 律 | 核心规则 | 违规示例 |
|---|---|---|---|
| 1 | 唯一数据源 | 上下文是你唯一的合法数据来源 | 快照没有白银价格,却写"白银$32.50" |
| 2 | 原始单位不变 | 禁止换算后呈现 | 6.29 USD/lb→写8200美元/吨 |
| 3 | 可靠性标注 | ok=False 必须注明 | PMI 50.1 未标注"数值存疑" |
| 4 | 无数据则定性 | 缺失数据只能定性描述 | "需求增长约10%+"←10%是编造 |
| 5 | 溯源声明 | 每个数值标注来源 | 无来源标记→[!unsourced] |
| 6 | 矛盾保留 | 多源矛盾不强制统一 | 两个源价格差5%,不能选一个当作"对的" |
| 7 | 输出前自检 | 逐条验证每个数值 | 跳过自检→输出被拒绝 |
违规分级与硬止损
| 级别 | 违规行为 | 单次处理 |
|---|---|---|
| P0 | 编造数值、外部信源引用 | 论点推翻,信用降级 |
| P1 | 单位换算呈现 | 要求修正,扣信用分 |
| P2 | 遗漏 ok=False 标注 | 补充标注,轻微扣分 |
| P3 | 定性越界(嵌入不确定数字) | 修正为纯定性 |
硬止损:P0 ≥ 2 条 或 P0+P1 ≥ 3 条 → 整份输出标记 [!REJECTED],不进下游。
常见问题
Q: verifier.py 把合规值标为可疑了?
检查数值方向/符号。-2300 和 2300 是不同的值。白名单近似匹配只做整数部分对比,负数不会匹配正数。另外,小数字(1-10)噪声高,verifier 默认跳过,如需验证小数字请调整 NUMERIC_PATTERNS 或手动检查。
Q: 百分比被误判怎么办?
百分比只扫描 ≥10% 的数字(r'(\d{2,3})\.?\d*%')。如果你需要验证 <10% 的百分比(如"3.2%"),修改 verifier.py 中 NUMERIC_PATTERNS 的正则。权重分配("金70%/铜30%")不是数据引用,不会被扫描。
Q: P1 违规(单位换算)被 verifier 发现了,怎么修?
回到原始单位重新写。如快照是 6.44 USD/lb,你的文本是 约8200美元/吨→改为 6.44 USD/lb。verifier 的可疑清单会标出具体数值和上下文。
Q: P2 违规(遗漏 ok=False)怎么补?
在引用该数值时加注"可靠性存疑"或"ok=False"。verifier 的 whitelist 中 ok=False 的值会标注 [!ok=False] 标签。
Q: 我想在国内数据源上用,需要改什么?
修改 verifier.py 的 NUMERIC_PATTERNS,把单位列表从 美元/吨、美元/磅、USD/oz... 替换为 人民币/吨、元/克、元/股...。Prompt 模板中的示例也可以替换为国内场景。核心七律不变,不需要改。
Q: 链式安全层是什么?什么时候该用?
多 Agent 辩论或多轮分析时,每轮输出携带哈希链(prev_hash → hash),确保没人能在辩论中途篡改历史论述。详见下方深度参考。
深度参考
证据质量评分
每个数值引用评估来源可信度(0-10):
| 质量分 | 来源类型 | 示例 |
|---|---|---|
| 9-10 | API 结构化返回 | yfinance 直接返回值、Wind API |
| 7-8 | 编译知识库/多源验证 | wiki 页面、三源交叉验证通过 |
| 5-6 | 单次搜索/采集 | web_search、web_fetch |
| 3-4 | 语义返回/非结构化源 | 语义搜索、NLP 提取 |
| 1-2 | 推理/估算 | 显式标注 [来源: 推理] |
| 0 | 无来源 | 直接标记编造 |
最终报告全局质量分 = 所有引用数值的质量分均值。<4 分标注 [!low-quality]。
自一致性交叉验证
同一份数据快照跑两次独立分析,比较两轮数值偏差:
| 偏差率 | 标记 | 处理 |
|---|---|---|
| 0% | [!match] |
精确一致 |
| ≤5% | [!drift] |
可接受漂移 |
| 5-15% | [!inconsistent] |
取偏差更小那轮为基准 |
| >15% | [!fabrication-risk] |
至少一轮存在编造 → P0 |
链式安全层(多 Agent 场景)
哈希链锚定
每轮输出携带密码学锚定:
chain: {seq: 3, agent_id: "bull_researcher", prev_hash: "a1b2c3d4e5f6a7b8", hash: "f9e8d7c6b5a43210"}
hash= SHA-256({prev_hash}|{agent_id}|{seq}|{output_content}) 前 16 位 hex- 任何历史输出被修改→后续所有 hash 断裂→可检测篡改
身份签名
每个 Agent 输出携带身份锚定:
agent: {role: "bull_researcher", fingerprint: "d4e5f6a7"}
fingerprint= SHA-256(agent system prompt) 前 8 位 hex- 同一 prompt 版本始终产生相同指纹→可追溯"这句话是谁写的"
轻量共识验证器
替代昂贵的多 Judge 共识(3-9× 成本),使用单次轻量验证:
Agent A/B 辩论 → Judge 裁决
→ verifier.py 扫描 Judge 输出
→ Verifier 比对 Judge 输出 vs 合规清单
→ PASS / FAIL + 回溯修正
- Prompt 极短(<200 tokens),可在主模型上内联执行
- 单次调用成本 ≈ 正常推理的 10-20%
- 不做论证质量判断,只做数据引用合规性检查
模式 B:白名单验证流程
1. 构建上下文数据 → verifier.py 自动提取白名单
2. LLM 输出 → verify_citations() 扫描
3. suspects 非空 → 标记可疑引用
4. 验证报告 + LLM 输出 → 提交审查 Agent
5. 按违规分级判定后果
模式 C:多 Agent 完整辩论流程
1. 各 Agent 按七律输出(携带 chain + agent 字段)
2. verifier.py 扫描每轮输出
3. 验证报告 + 论述 → 裁判 Agent 判罚
4. 对 Judge 输出独立扫描 → 提交 Verifier
5. Verifier PASS → [!verified]; FAIL → 回溯修正或拒绝
更多实施细节见 references/ 目录。
> v2.3.0 (2026-07-04): 新增 verifier.py 独立验证器(零依赖,命令行直接运行);SKILL.md 重构为 Quick Start 优先结构;新增场景决策表与 FAQ;正则改为 $ 金额优先匹配。
> v2.2.1 (2026-06-07): Verifier 全量清单、链验证集成、重试降级。
> v2.2: 链式安全层——哈希链锚定 + 身份签名 + 轻量共识验证器。
> v2.1: 证据质量评分 + 自一致性交叉验证 + 硬止损机制。
> v2.0: 五律→七律;禁止清单;违规分级 P0-P3。