一份报告可以引用正确,结论仍然错误
假设模型回答“这项变化会破坏旧版本兼容”,并引用了一条真实存在的发布标题。引用可以逐字匹配,位置和 hash 也完全正确,但标题本身没有说明旧行为、输入条件或失败范围。这时程序检查通过了,语义推断仍然越过了材料。
研究系统不能只问“有没有引用”。还需要分别检查来源身份、引用完整性、语义关系、行为验证和验收范围。每一层都重要,也都有自己的盲区。
本章用当前实现说明这些层次。目标是学会读一份研究报告的依据,而不是给每项结论贴一个看似精确、却没有定义的信任分数。
四个检查面,各自证明到哪里
下面是互相补充的检查面,不是自动升级的置信分数。
- 01来源身份
这段材料来自哪份快照、哪个版本,何时被保存?
- 02程序约束
引用是否匹配、ID 是否允许、结构与状态是否有效?
- 03语义判断
引用是否真正支持问题中的命题,解释有没有越过材料范围?
- 04独立验证
按独立依据、明确环境和输入,检查一项有限的行为声明。
hash 和引用检查不能代替语义评审;模型解释不能代替实验;固定样本通过也不覆盖任意输入。
| 检查面 | 可以检查的事情 | 仍不能推出 |
|---|---|---|
| 来源身份 | 对应来源、文档版本与保存的快照 | 来源发布者绝不会出错 |
| 程序约束 | quote 能匹配、ID 属于候选、JSON 与状态关系合法 | 引用确实支持问题中的命题 |
| 语义判断 | 解释、支持/反驳与问题的关系 | 行为已经在真实环境独立复现 |
| 独立验证 | 指定版本、输入和环境下的有限声明通过验收 | 任意版本、输入或部署都可靠 |
这些层次不会自动向上晋级。系统保存了某条记录,不会让它自动成为已验证事实;实验通过,也必须说明实验究竟检验了哪项声明。
quote、offset 与 hash 分别在做什么
补充原文解读中,模型返回原文连续片段,不返回自己计算的坐标或引用 hash。代码在绑定的正文中匹配片段,计算 UTF-16 的起止位置,并对引用片段的 UTF-8 字节计算 SHA-256。
下面按 ResearchBriefing.reference 压缩为阅读示意;sha256 是示意帮助函数,省略长度检查、异常处理与实际摘要格式化,不能直接当成生产代码。
int start = body.indexOf(quote);
if (start < 0) throw invalid();
String hash = sha256(quote.getBytes(UTF_8));
return new EvidenceReference(
quote, start, start + quote.length(), hash
);
这里有几个需要精确理解的细节:
- 起止位置属于保存的那份正文,结束位置是右开边界;它不是文件字节偏移,也不是 Token 位置。
- 当前补充解读路径使用
indexOf的首个匹配。相同文字出现多次时,它不证明模型心中想引用的是哪一次;上下文消歧仍可能需要进一步设计。 - 这里计算的是引用片段的 hash,不能直接把它叫成整份来源文档的内容摘要。
- hash 能帮助识别内容变化,不能判断一段话是真是假,也不能判断解释是否合理。
M2 提取路径还有自己关于 quote 与 offset 的校验和唯一匹配纠正规则。不要把某一路径的实现直接套用到所有引用路径;具体检查应按模块与版本核对。
为什么严格 JSON 仍然值得做
结构检查解决不了全部语义问题,但可以拒绝一批明确非法输出。当前补充解读拒绝未知字段、尾随内容、重复 JSON key,以及不合法的 finding 编号;小数和字符串不能偷偷转换为整数。
引用编号是 findings 的 1-based 索引。ANSWERED 必须关联发现,NOT_FOUND 必须没有关联发现,PARTIAL 表示材料只能回答部分问题。代码还能限制字段、数组、响应字节数和 quote 数量。
这些约束让下游不用猜测字段的含义。例如编号 1.9 不应被截成 1,也不能把字符串 "1" 当作模型遵守了整数契约。但即使整数合法、quote 存在,模型依旧可能选择一条语义不相关的引用。
因此正确的设计是:先对可确定的结构与身份失败关闭,再把语义评测作为独立问题处理。不能因为“结构校验不够”就放弃结构校验,也不能因为结构通过就宣布内容可靠。
支持、反驳、未验证与完成,是不同坐标
本项目同时存在证据验证状态、模型评估立场、研究结果状态和子问题覆盖状态。读报告时要先确认自己正在看哪一种。
| 字段或层次 | 典型值 | 该怎样读 |
|---|---|---|
| Claim 的验证状态 | UNVERIFIED 等 |
主张是否拥有对应的验证依据;引用可追溯不自动升级状态 |
| Agent 的语义立场 | SUPPORTED、CONTRADICTED、INCONCLUSIVE |
模型相对用户命题的证据判断 |
| Research Run 的结果 | COMPLETED、INCONCLUSIVE、FAILED、BUDGET_EXHAUSTED |
研究工作流的完成、材料不足或运行停止原因 |
| Briefing 子问题覆盖 | ANSWERED、PARTIAL、NOT_FOUND |
当前保存快照回答这个子问题到什么程度 |
| Briefing 保存状态 | RUNNING、COMPLETED、FAILED、OUTCOME_UNCERTAIN |
补充解读的生成与持久化状态 |
一个已保存的 COMPLETED Briefing 完全可以包含 PARTIAL 子问题。一个模型判断为 SUPPORTED 的回答,也不等于数据库 Claim 从 UNVERIFIED 晋升为独立证实的事实。工作流完成与认识上的确定性不能共用一个“成功”标签。
一个真实失败:把“反对命题”判断成“支持”
早期真实模型固定集曾得到 4/5,其中一个明确反对问题命题的候选被判断为支持。原因涉及模型判断的参照点:它可能在评价“候选主张是否与自己的 quote 一致”,而用户真正问的是“这份材料是否支持我提出的命题”。
后来系统明确了命题相对的支持/反驳规则,并收紧协议与候选范围;固定五类真实模型验收达到 5/5、零虚假完成。这个结果证明修正后的实现通过了这组样本,不是生产准确率。
这个失败适合帮助理解一个边界:引用是真实的、候选文本也有依据,仍然可能回答错用户的问题。 Completion Verifier 可以拒绝未知引用,却不能单凭 ID 判断语义立场是否合理。
相关历史见本站文章《为什么模型把“明确反对”判断成了支持》,可从文章目录查阅。历史文章保留当时快照;本专题使用页首标注的已合并基线解释当前职责。
当前测试与评测分别覆盖什么
下面是应用已有的验收记录,不是本次网站写作重新执行了应用或付费研究。日期和范围是数字的一部分。
| 记录 | 观察结果 | 适用边界 |
|---|---|---|
| 2026-10-14 Java / Node 验收 | 418 个单元测试、246 个集成测试,0 失败/错误;5 个条件跳过;页面 Node 11/11 | 自动化契约与明确用例,不代表全面语义质量 |
| M3 五类真实决策固定集 | 修正后 5/5、零虚假完成 | 小样本、固定条件,不能当作普遍准确率 |
| M5 决策固定集 | 10/10,并有有限对抗探针 | 不代表系统性安全验证 |
| M5 多来源 ResearchRun 基线 | 三个 Release 的冻结节选、五个问题,5/5 预标注结构化结论匹配 | 中文回答仅轻量措辞筛查;Token 完整性 4/5,费用完整性 0/5 |
| 2026-10-14 完整原文复核 | 三项发现、保存与重启读取一致 | 单一真实样本;实际实验运行数为 0 |
这些结果回答不同问题。集成测试可以验证落盘与幂等;语义固定集检查特定输入下的决策;真实模型运行暴露供应商输出形态;内容复核检查解释有没有越界。把所有数量加起来变成一个“质量百分比”没有明确含义。
什么才算独立验证
假如模型提出“某个 guardrail 能阻止指定工具输出进入下一轮上下文”,要验证这项有限声明,首先应固定版本、配置、输入和预期检查点。验收依据应来自明确规范、参考行为或独立检查,不能只让同一个模型同时生成主张、预期和“已通过”的解释。
即使一个受控实验通过,也只覆盖事先约定的条件。另一个模型版本、更长输出、并发运行或异常分支可能需要新任务。因此后续通用实验能力必须同时考虑白名单模板、审批、资源限制和结果解释,不能把执行任意代码当作研究必备捷径。
当前固定 Prompt-strategy A/B 是已经验收的另一项小切片:固定五个 case、两臂十次子运行、确定性指标与逐版本审批。它没有对本次 SDK Release 样本执行行为实验,也不能充当对这个 SDK 兼容性的证明。
沿实现继续核查
| 项目内材料 | 核对重点 |
|---|---|
research/briefing/ResearchBriefing.java |
严格 JSON、子问题状态、引用索引、首匹配位置与 quote hash |
research/application/ResearchReportAssembler.java |
工作流完成条件与引用解析的程序边界 |
agent/loop/CompletionVerifier.java |
已观察引用与支持/反驳的最低结构要求 |
ResearchBriefingValidationTest、ResearchBriefingApiIT |
非法编号、伪 quote、保存与调用次数边界 |
docs/evaluation/M3-REAL-MODEL-DECISION-REPORT.md |
历史立场误判、修正与固定集限制 |
docs/evaluation/M5-RESEARCH-RUN-E2E-BASELINE.md |
冻结材料、预标注结论、中文措辞筛查与用量缺口 |
docs/ACCEPTANCE.md |
按日期核对各项验收,不用旧段落覆盖较新证据 |
读完一份报告后,至少应该能回答:它引用了什么,代码检查了什么,模型判断了什么,实际验证过什么,以及还有什么不知道。下一章把这些问题放回完整原文复核样本。