3.8 KiB
3.8 KiB
引文三角核验协议 (language 无关)
论文最致命的失分是编造引文(hallucinated citation)与引而不实(cite 的文献不支撑该论断)。
本协议把每条引文从"看起来对"逼到"经得起查"。移植自 ARS 的 triangulation + claim-faithfulness 思路,
后端换成 zcbot 自己的 documents / research 库(它们本就带 DOI + md_content,做 anchor 比对反而更顺)。
这是协议不是脚本 —— 你(模型)拿 host-side tool 逐条执行。quality_check.py 只做机械的 orphan/uncited/编号核对,真伪与支撑度靠本协议。
何时跑
- 阶段四逐章起草后、阶段六渲染前,对所有引文跑一遍
- 用户自带的引文清单也要跑(用户也可能记错卷期/页码)
三层核验(逐条引文执行)
第 1 层 — 存在性 (exists)
每条引文先确认"这篇文献真实存在":
documents库语义检索(材料类优先,中英 query 都行)/research库search()/get_paper(doi)- 命中 → 记下真实 DOI / 作者 / 年份 / 期刊 / 卷期页;以库里返回为准,不沿用记忆里的字段
- 两个库都查不到 → 标
[未核实],不得编造条目;告诉用户"这条找不到来源,请提供 PDF/DOI 或删去该论断"
第 2 层 — 三角印证 (triangulate)
关键论断(创新点对比、机理依据、定量结论)的支撑引文,至少两个独立信息源一致才算稳:
- documents 命中 + research/DOI 一致 → 通过
- 仅单一来源 → 标"单源,谨慎",提示用户复核
- 不同来源字段冲突(年份/卷期不一致)→ 以可验证的 DOI 元数据为准,修正条目
第 3 层 — 支撑度 (claim-faithfulness)
最容易翻车的一层:文献存在,但并不支撑你写的那句话。逐条做:
- 抓回该文献的
md_content(documents 直接给整篇 Markdown)/fetch_xml/fetch_pdf(research) - 在原文里定位与论断相关的锚点证据:一句 ≤25 词的原文引语 + 出现的段落/小节位置
- 判定支撑度三档:
- support:原文明确支撑该论断 → 通过
- partial / 需限定:原文只支撑部分,或有前提条件 → 改写论断使之与证据相符(别让引文背锅)
- not-support / 反向:原文不支撑甚至相反 → 删除该引用或换文献;绝不硬挂
- 抓不到全文(无 PDF/XML)→ 至少用 abstract 做弱核验,标"仅摘要核验",提示用户终审时复查
产出:核验台账 CITATIONS.md
在 <task_dir>/CITATIONS.md 记一份可复盘的台账(append,一条引文一行):
# 引文核验台账
> 每条引文的存在性/三角/支撑度核验结果。渲染前所有条目应为 verified 或经用户确认。
- [1] Provis & Bernal 2014, Annu. Rev. Mater. Res. 44:299 | exists:✓(documents+DOI) | triangulate:✓ | claim:support "geopolymers form via dissolution-polymerisation"(§2.1) | status: verified
- [2] <author> <year> ... | exists:✓ | claim:partial → 已把"显著提高"改为"在 28d 提高约 12%" | status: verified-revised
- [3] <author> ... | exists:✗ 两库未命中 | status: 待用户提供来源
与编号流程的衔接
- 起草时占位
[CITE-<keyword>](见 cite_*.md) - 本协议逐条把占位映射到已核验的真实文献
- 仅 status=verified / verified-revised / 用户确认 的才进入编号
- 按文中首次出现顺序编
[1][2]...,写06_references.md - quality_check.py 兜底查 orphan/uncited/编号连续
铁律
- ❌ 任何 status 非 verified 的引文不得带进最终稿(要么核实、要么删论断、要么用户拍板)
- ❌ 不得为凑引文数编造"看起来合理"的文献
- ✅ 支撑度不足时改论断迁就证据,不是改证据迁就论断
- ✅ 两库都查不到时如实告诉用户,给出"提供来源 / 删除论断"两个选项