AI 系统 · 负面结果 · 研究原型(本地小模型,蛋白质科学与文档任务)

我们试过把它训练进去

关于教小模型做事实落地的负面结果,以及封住同一条接缝的那张查找表。三次尝试通过微调把“落地”能力装进 30 亿参数模型,每一次都以具体、可测量的方式失败。放在模型之外的确定性解析器,在同一把标尺上封住了这条接缝。

下载 PDF(英文)↓ 推理放置 → 验证地板 → 研究论文 · 20 页 · 每个数字都可追溯到报告、日志或账本;尚无第三方复现
负面结果,完整保留 三轮训练,三次失败 类型安全不等于有依据 模型之外的那张表 我们也审计了自己的标尺
摘要

本地小模型很适合给验证系统当“提议器”;顺理成章的下一步,是通过微调让它们自己把输出落到实处:把蛋白质名称绑定到数据库标识符,在没有任何依据时弃权,只在句子确实陈述了某个关系时才抽取它。我们报告三次把这些能力训练进 30 亿参数模型的尝试;每一次都以具体、可测量的方式失败。一个在 135 到 178 条合成样本对上训练了三轮的 LoRA 提议器:第一轮在 5 条应当弃权的请求中漏掉 3 条;第二轮仍漏掉 3 条,并在 22 条可以回答的请求中错误弃权 3 条;第三轮 5 条全部弃权,却错误弃权了 10 条。诊断发现两个原因:训练与部署之间的数值精度不一致翻转了学到的弃权,以及模型从没有正例配对的负例中学到了一个词面线索。一个确定性解析器只允许从请求中写明的标识符、或从一张 10 个名称的精选表中绑定主语;在同一把 27 条标尺上,它在不改动第一轮适配器的情况下各项指标均达到 1.0,且没有一次错误弃权;一项不依赖模型的检查在全部 62 条测试提示上确认了它的绑定。一个文档到字段模型对返回的 240 条回复全部符合模式,关系 F1 却只有 0.07;其语料中 71.1% 的关系标签与所在句子没有任何共同实词,而一个偏重关系的课程把无见证的预测从 8 条增加到 84 条。一本只追加的账本依据一份实时数据库回执,驳倒了某个 7B 模型对蛋白质长度提出的两个数值。样本很小,每轮训练只跑了一次;我们只主张这些运行所表明的东西。

我们花了三轮训练,去学一张我们手里本来就有的表。

1 · 引言

验证地板只接受它能检查的东西。在我们早先的工作中,一个带类型、有来源锚定的存储是事实的唯一作者 [40];并且,当提出主张的模型变小时,决定“什么算作已验证”的那条边界并不会随之移动 [41]。这条边界能很好地回答一个问题:关于实体 \(e\) 的这条主张有证据支持吗?但它无法回答排在它前面的问题:\(e\) 是提问者所指的那个实体吗?当请求里写的是“hemoglobin alpha”(血红蛋白 α),而模型要把它变成结构化的提议时,总得有人来选定数据库标识符。如果模型选了一个合法却属于错误蛋白的标识符,地板就会正确地验证那个错误的蛋白,而下游没有任何环节能察觉。

这个选择发生在一条接缝上:也就是模型的输出变成系统内部某个标识符或事实的那一点。本地小模型是廉价的提议器,要让这条接缝安全,最直接的办法就是训练它:用示例教它把名称绑定到标识符、在请求毫无依据时弃权、只在句子陈述了某个关系时才抽取它。我们把这三种行为统称为落地(grounding,§2)。本文报告的,就是我们试图把它们训练进模型时发生了什么。

没有成功。我们在同一条“绑定与弃权”接缝上把一个 30 亿参数的提议器微调了三轮,每一轮失败的方式都不同:第一轮学会了输出格式,却没学会何时拒绝;第二轮加进了拒绝,但加错了地方;第三轮为了不再漏掉 5 条不该回答的请求,拒绝了 10 条本可回答的请求。我们又在一个大语料上微调了一个同等规模的文档到字段模型,得到的是完美的模式合法率和仅 0.07 的关系 F1,随后把原因追溯到了句子本身并未陈述的训练标签。最终封住提议器接缝的,不是更好的训练配方,而是模型之外的一个确定性解析器:只有当请求本身包含一个合法标识符、或包含 10 个名称精选表中的某个名称时,主语才可以被绑定。在同一把 27 条标尺上,不改动第一轮的权重,它的每一项指标都是 1.0,并且没有产生任何错误弃权。

这个对比是有意不对等的。任务一旦被准确写下来,就只是一次查找:一张有限的名称表,外加“其余一律弃权”。解析器直接实现了这个规格;三轮训练则试图用模型去近似它,结果在两个方向上都出了错。我们的发现不在于解析器有多聪明,而在于:我们花了三轮训练,去学一张我们手里本来就有的表。

我们把这些作为负面结果发表,是因为每一次失败都具体到足以有用:训练与部署之间的精度不一致翻转了一条学到的边界;模型从没有正例配对的负例中学到了一个词面线索;三轮训练只是在“漏掉的拒绝”与“错误的拒绝”之间移动取舍点,却从未摆脱这种取舍;还有一个语料,其关系标签大多是依据句子之外的上下文写成的。对每一项,我们都只在证据所能支撑的范围内陈述,不多说一步。本文并不表明微调在一般意义上教不会落地;它只表明这些运行在这个规模、这些数据下的表现。

1.1 · 贡献

我们主张什么,不主张什么

我们主张:在这些运行中,在 30 亿参数规模、使用几百条合成样本对(提议器)或约 34,000 条弱标注样本对(文档模型)的条件下,微调没有装进我们所针对的落地行为;而把落地步骤放进模型之外的确定性组件,在同一把标尺上封住了提议器的接缝。我们不主张微调学不会落地:更大的模型、更多的数据、别的目标函数或别的训练方法都有可能做到。每轮训练只跑了一次,只用了一个随机种子;各把标尺分别只有 27、35 和 247 条;单凭一到三条的差异本身并没有统计意义,凡出现处我们都会指出。为撰写本文,我们没有训练或运行任何模型;每个数字都来自当时写下的报告、日志和账本,以及附录 A 列出的不依赖模型的复核分析。

与 Perslis 早先工作的关系。本文是《推理放置》 [39] 在训练一侧的配套篇:那篇论文追问学习型推理在何处才配拥有决策权,并给出了一张测量出来的地图;本文则测量,把一次查找硬塞进模型要付出什么代价。本文沿用了 Peel [40] 的验证地板,以及《验证地板》 [41] 中“模型拥有的能力”与“运行时拥有的能力”之间的划分,并按照《失败优先模型》 [38] 的做法,把失败作为一等证据保留下来。对这些论文的结果,我们只引用,不重复。

2 · 设定与术语

2.1 · 三种落地行为

我们用落地指代提议器在其输出可被当作验证器输入之前必须具备的三种行为。每一种都按照“正确的系统做什么”来定义,而不是按照“它怎么做”来定义。

2.2 · 接缝,以及在接缝上失败的两种方式

接缝是模型的输出变成系统内部标识符或事实的那一点。在 §3 的提议器中,接缝就是结构化提议里的 subject 字段。接缝的下游是地板的准入步骤。我们只按行为来描述它:它用严格的语法解析提议,并把提议分派给主张验证、证据收集或仅生成计划的预览;它会拒绝格式错误的提议;它无法区分错误蛋白的合法标识符与正确蛋白的标识符。其实现不予公开,与我们早先的论文一致 [40]。

于是在接缝上有两种失败方式,而且二者并不对称。

第三种结果是无法解析的回复,它会在准入之前被严格的语法拒绝,在与错误弃权相同的意义上是无害的。图 1 对这三者都做了计数。

2.3 · 证据纪律

为撰写本文,我们没有训练、部署或调用任何模型。每个数字都来自当时写下的评测报告、训练日志、账本或运行日志,并且每个这样的数字都在本文的主张台账中列出了对应的文件与行号。凡是能不借助模型重新推导的,我们都在 2026 年 9 月 27 日以只读方式重新推导了:§4.3 的解析器分析、解析器的回归测试、§4.5 与 §5.2 的数据集审计、§6 中账本的哈希链,以及两个 UniProt 长度。凡是某个结果唯一的记录只是当时写下的一条提交说明、而不是保存下来的输出,我们都会明说。

3 · 案例研究一:训练提议器去绑定与弃权

3.1 · 任务、数据与标尺

提议器位于我们早先论文所述的蛋白质科学地板之上 [40]、[41]。对每条请求,它必须输出恰好一个 JSON 对象,属于以下四类之一:关于某蛋白质结构一致性的主张(claim);请求地板为它尚未持有的标识符收集证据的抽取(extract);带参数的实验室操作意图(intent,仅生成计划,不会真正下发);或附带理由的弃权(abstain)。前三类的主语必须是一个裸的 UniProt 登录号。提示词告诉模型:只有当某个蛋白质名称的登录号属于常识时才使用它,否则就弃权,因为“错误的登录号比没有提议更糟”。回复以温度 0 解码。

提议器所需要的绑定很小,也是固定的。一张精选表把 10 个名称映射到 8 个人类蛋白质(其中两个蛋白质各有两个名称,例如 P69905 对应 “hemoglobin alpha” 与 “hemoglobin subunit alpha”)。除此之外,一律必须拒绝——除非请求中直接写出了一个合法的登录号。

训练样本对全部由代码从地板生成,从不手写:主张来自精选表;抽取针对地板尚未持有的登录号;意图的参数取自规划器的合法范围;弃权则来自虚构名称、真实存在却不在表中的近似名(near-miss,例如 “hemoglobin gamma”“insulin receptor”“cytochrome c oxidase”)、离题问题、含糊指代,以及从第二轮起加入的格式错误标识符。每一个助手回合在构建时都会用地板所执行的同一套语法检查一遍,因此数据不可能教出地板会拒绝的形状。

标尺是第一份数据集中 27 条留出样本:13 条主张、6 条意图、3 条抽取、5 条弃权。第二、第三份数据集在构建时都排除了这 27 条提示,因此每一轮都在同样的条目上计分。评测器报告六个数字,它们的分母很重要(§4.5):

3.2 · 三轮训练

三轮都在 MLX 框架 [22] 中用 LoRA [11] 微调 Llama-3.2-3B-Instruct [10]:秩 8、缩放 20、无 dropout、适配 16 层、学习率 10−5、批大小 2,可训练参数为 3,212.75M 中的 6.947M(0.216%)。部署时,每个适配器都被融合进 bf16 基座权重,用 llama.cpp 的转换器 [19] 转为 8 位 GGUF 文件,并通过 Ollama [23] 在本地提供服务。表 1 列出了各轮之间的变化。

表 1. 三轮训练。训练 / 验证为样本对数;弃权占比按训练集计算;验证损失为实际部署的检查点最后记录的数值。
轮次训练基座训练 / 验证弃权占比迭代次数(验证损失)变化内容
v14 位135 / 1811.1%300(0.017)第一份数据集:180 条样本对,5 个虚构名称
v24 位172 / 2247.7%400(0.024)加入近似名与格式错误标识符的弃权;扩大虚构、离题与含糊指代的样本池
v3bf16178 / 2342.7%200(0.021)在 bf16 基座上训练(原生融合);为每个精选登录号加入主张“对照对”;近似名模板从三个减为两个

v3 原定训练 400 次迭代。在第 300 次迭代时,外置硬盘拒绝写入检查点,训练报错中止;于是部署了第 200 次迭代的检查点,其验证损失(0.021)已经走平。三轮都达到了很低的验证损失(从接近 3.4 的初始值降到 0.017–0.024):每一轮都学会了自己的训练数据。问题在于,这些数据教了它什么。

3.3 · 结果

表 2. 提议器结果。第 1–5 列:27 条标尺。第 6 列:35 条“困难集”(§4.5)。比率照报告原样列出;括号中的计数由比率与评测器的分母还原得到。
仅用提示的基座模型v1v2v3v1 + 解析器(27 条)v1 + 解析器(困难集,35 条)
解析率0.741 (20/27)1.0 (27/27)0.963 (26/27)0.963 (26/27)1.0 (27/27)0.971 (34/35)
类型准确率0.63 (17/27)0.889 (24/27)0.741 (20/27)0.593 (16/27)1.0 (27/27)0.971 (34/35)
主语准确率0.304 (7/23)0.955 (21/22)0.818 (18/22)0.5 (11/22)1.0 (22/22)0.962 (25/26)
弃权召回率0.5 (2/4)0.4 (2/5)0.4 (2/5)1.0 (5/5)1.0 (5/5)1.0 (9/9)
错误弃权1031000
准入率1.0 (20/20)1.0 (27/27)1.0 (26/26)1.0 (26/26)1.0 (27/27)1.0 (34/34)
0246810217仅用提示的基座模型300v1弃权占 11%331v2弃权占 48%0101v343% + 对照对000v1 权重+ 解析器次数(27 条留出请求)漏掉的弃权(共 5 条)错误的弃权(共 22 条)无法解析的回复(共 27 条)
图 1. 在 27 条标尺上,每一轮的错误落在了哪里。漏掉的弃权,是对 5 条毫无依据的请求给出了自信提议;错误的弃权,是拒绝了 22 条可以回答的请求;无法解析的回复会在准入之前被拒绝。训练只是把错误从一根柱子挪到另一根,从未把两者同时消除。阴影部分是解析器:即实际部署的、使用 v1 权重的组合。

v1:学会了格式,没学会边界。第一轮做到了格式训练该做的事。无法解析的回复从 7 条降到 0 条,类型准确率从 0.63 升到 0.889,主语准确率从 0.304 升到 0.955。举例来说,仅用提示的基座模型曾对一个关于 cytochrome c(细胞色素 c)的问题给出格式正确的登录号 P0A9M2,外加一个自造的主张形状;地板拒绝这条回复,是因为形状,而不是因为登录号(精选表把 cytochrome c 映射到 P99999)。训练之后,形状都对了;弃权却没有对。配方自己的上线门槛要求 v1 在弃权召回率上胜过基座模型,而报告记录的是从 0.5 降到 0.4。这个下降是分母的变化,而不是行为的变化:基座模型在它按语法作答的 4 条金标弃权提示中弃权了 2 条(它对第 5 条的回复无法解析、已被拒绝),而 v1 解析了全部 5 条,同样弃权了 2 条。训练所做的,是把一条无害、已被拒绝的回复,变成了一条格式正确的自信提议。v1 解析成功的全部 27 条提议都被准入了,其中包括那 3 条针对毫无依据请求的自信提议。

v2:数据里的拒绝更多了,却没放在对的地方。第二轮把训练集中的弃权占比从 11.1% 提高到 47.7%,并加入了那些危险的类别。在标尺上,它仍在 5 条弃权中漏掉 3 条,而且又拒绝了 3 条本可回答的请求。当时诊断出了两个原因。

  1. 精度不一致。适配器是针对 4 位量化基座训练的,与 QLoRA [4] 的做法相同,而部署时却被融合进 bf16 基座、再转换为 8 位。随后的一次 A/B 运行显示:适配器挂在它自己的 4 位基座上时,对标尺中的弃权条目都能正确弃权;而部署后的模型却把它们变成了自信的主张。训练配方曾称这种不一致“轻微”、“对于教格式的 LoRA 可以接受”;对于一条决策边界而言,它并不轻微。有两点需要注意。这次 A/B 的原始输出没有保存下来,记录只是运行时写下的提交说明。而且这次比较改变的不只是精度:它还换了运行环境(训练框架对比部署运行时),并多了最后一步 8 位转换。精度是最直接的差别,但这次 A/B 并没有把它单独隔离出来。
  2. 来自无配对负例的词面线索。新增的格式错误标识符弃权样本都用了 “accession ⟨id⟩” 这种措辞,而训练数据中从未有合法标识符以这种措辞出现。模型学到的是这个词,而不是规则:它拒绝了精选名称,也拒绝了裸登录号 P69905。这一点是通过检查失败条目发现的,而不是通过 A/B。

v3:跷跷板的另一端。第三轮同时处理了两个诊断,外加一个顾虑:它在 bf16 基座上训练,使融合成为原生操作;为每个精选登录号加入以 “accession ⟨id⟩” 措辞写成的主张“对照对”;并把近似名模板从三个减为两个,因为近似名的密度似乎渗进了错误拒绝。结果它对 5 条弃权条目全部弃权,却拒绝了 22 条可回答条目中的 10 条;类型准确率降到 0.593,主语准确率降到 0.5。由于三项改动是一起做的,v3 无法把这次矫枉过正归因于其中任何一项。它确实表明:单是消除精度不一致,本身并不能得到一条正确的边界。

规律。三轮下来,漏掉的弃权与错误的弃权从 3/0 变为 3/3,再变为 0/10,接缝上的错误总数从 3 变为 6,再变为 10(图 1)。每一轮都移动了取舍点;没有一轮让两者同时归零。原因见 §4.6。

4 · 封住接缝的那张表

4.1 · 解析器做什么

严格解析之后,每一条不是弃权的提议,在地板看到它之前,都要先经过一个确定性解析器(图 2)。解析器只从两个来源计算“请求本身能落地的标识符集合”:

  1. 请求中逐字写出、并通过地板所用同一个标识符校验器的标识符;以及
  2. 对 10 个名称精选表的匹配:按整词匹配,最长名称优先;若紧随其后的下一个词会把名称扩展成另一个蛋白质,该匹配即作废——“cytochrome c oxidase” 永远不会绑定 cytochrome c,“insulin receptor” 永远不会绑定 insulin,而 “proinsulin” 这类连写形式根本不会匹配。

然后它只做三件事之一。如果提议的主语在落地集合中,就放行。如果恰好只有一个标识符能落地、而模型给出的是另一个,就把主语修复为能落地的那一个。如果没有任何东西能落地,或者有多个能落地而模型一个也没选中,就用一次弃权取代该提议。模型自己的弃权则原样放行。解析器从不参考模型对登录号的记忆,也从不添加请求本身不支持的绑定。它的实现很小,也不是本文的主题;我们只按上述行为来描述它。

A · 训练进模型(v1–v3 三轮):由模型绑定名称请求微调后的 3B 模型把名称绑定到登录号决定何时弃权严格解析只查形式地板准入检查形式,不检查是哪个蛋白错误蛋白、合法编号被准入并处理,当作那个错误的蛋白B · 放在模型之外(已部署):由解析器绑定名称请求3B 模型(v1 权重)选择提议类型与参数;可以弃权严格解析只查形式解析器主语 = 请求中的合法编号或精选名称的匹配→ 放行 · 修复 · 弃权地板准入只有请求本身能落地的主语才能到达请求原文是解析器唯一的证据(另加一张 10 个名称的精选表)
图 2. 绑定放在哪里。A:在三轮训练中,由模型选定标识符,而只检查形式的地板准入步骤,会准入它选中的任何格式正确的标识符。B:在已部署的通道中,模型仍然选择提议的类型及其参数,但主语必须来自请求原文或精选表。解析器唯一的证据就是请求本身。

4.2 · 在同一把标尺上的结果

不改动 v1 的权重,这个组合在 27 条标尺上的解析率、类型准确率、主语准确率、弃权召回率和准入率都是 1.0,没有错误弃权(表 2 第五列)。在 35 条困难集上,它对全部 9 条弃权条目都弃权了,没有错误弃权;有一条回复——一个缺少必填字段的意图——因无法解析而被拒绝,这是无害的结果,也正因如此,那里的解析率、类型准确率和主语准确率分别为 0.971、0.971 和 0.962。没有上线任何新权重。v2 和 v3 模型作为取证证据保留,不再提供服务。

4.3 · 解析器从构造上封住了什么,没有封住什么

上面的门槛结果依赖于某个模型。其中有一部分并不依赖,而我们无需运行任何模型就能指出是哪一部分。我们以只读方式、不借助任何模型,把解析器的落地步骤在两套评测集的每一条提示上都跑了一遍,分别使用产生这些报告时的版本和当前版本(后来的一次审查扩充了会使名称匹配作废的词表)。结果见表 3。

表 3. 解析器在全部 62 条测试提示上的无模型分析,于 2026 年 9 月 27 日运行。“落地集合”是解析器从请求原文推出的标识符集合。最坏情况一列对每条提示都向解析器输入一条给出错误但格式正确标识符的主张。两个解析器版本的结果完全相同。
集合提示数金标弃权落地集合为空可回答落地集合恰为金标标识符最坏情况被正确处理
标尺2755 / 52222 / 2227 / 27
困难集3599 / 92626 / 2635 / 35

对任何回复能被解析的模型,由此可得两个推论。在每一条本应拒绝的条目上,自信的提议都会被转换为弃权,因为没有任何东西能落地。在每一条可回答的条目上,非弃权类型的提议离开解析器时都带着金标标识符,要么被放行,要么被修复。这就是解析器从构造上封住的那一半接缝:关于无依据主语的自信提议无法到达地板。解析器的 42 项回归测试(产生报告时为 37 项,之后的审查又加了 5 项)——每个精选名称一项、每个近似名一项、每个被阻断的扩展短语一项,以及放行、修复、弃权各类情形——在当前代码的副本上全部通过。

另一半仍留给模型。解析器无法撤销一次错误弃权,因为它对弃权原样放行;它无法纠正在主张、抽取和意图之间选错类型;它也无法解析一条格式错误的回复。v1 的权重在两套集合上都没有产生错误弃权,这正是该组合能达到 1.0 的原因。若换成 v3 的权重,同一个解析器会保留 v3 的 10 次错误弃权——这是由构造推出的,并未实测。对于任务中不属于查找的那一部分,提议器权重的选择依然重要。

解析器还有一个有文档记录、并由测试固定下来的取舍:如果一条请求恰好只能落地一个精选蛋白,而提问者其实指的是另一个没被点名的蛋白,修复会绑定那个被点名的。我们接受这一点,因为另一种选择——信任一个请求本身无法支撑的标识符——正是解析器存在的意义所要消除的失败。它的覆盖范围就是那张表:表外的任何蛋白都会被拒绝,除非请求直接给出了登录号。扩大覆盖意味着往表里添加经过审核的条目,而不是重新训练。

4.4 · 这个对比是有意不对等的

标尺的金标,是由解析器所查询的同一张精选表生成的,因此在这些提示上,解析器与金标的一致是其构造的必然结果;表 3 直接展示了这一点。我们并不把它当作解析器在公平比赛中获胜。我们把它当作发现本身:任务一旦被准确写下,就是一次有限的查找外加“其余一律拒绝”,小到可以在运行时中精确实现。三轮训练试图在模型内部近似这次查找,结果在两个方向上都出了错。这正是我们《推理放置》论文中“已知信息应当检索、而不是推断”的规则 [39]——只不过这里是从另一侧抵达的:先为另一种做法付出了代价。

4.5 · 审计我们自己的标尺

为本文重读评测文件时,我们在自己的测量里发现了三个问题。它们都不改变结论,我们三个都报告。

分母假象。弃权召回率是在解析成功的金标弃权条目上计算的。仅用提示的基座模型的 0.5 是 4 中之 2,v1 的 0.4 是 5 中之 2:同样的两次正确弃权(§3)。当时记录的“退步”,作为关于“被准入的自信提议”的陈述是真实的,作为关于“正确拒绝”的陈述则不成立。主语准确率也有一个相关的怪处:它的分母排除了解析成功的金标弃权条目,却仍计入无法解析的条目,因此基座模型的分母是 23,其余各轮是 22。

训练与评测之间的泄漏。数据集生成器产生了 10 条重复提示:P69905 和 P04637 各对应两个精选名称,于是使用裸登录号的模板被生成了两遍。27 条标尺提示中有 4 条原样出现在 v1 的训练集中,金标也完全相同。这 4 条都是关于裸登录号的主张。它们不可能影响任何弃权结果,至多让 v1 的主张类指标多沾最多 4 条的光。

“困难集”其实是 v3 的留出集。这 35 条是从 v3 的训练中留出的,而不是从 v1 的训练中留出的。其中 22 条原样出现在 v1 的训练集中,另有 1 条出现在 v1 的验证集中。它的 9 条弃权条目中有 6 条对 v1 是新的(三个近似名、两个新的虚构名称、一个新的离题问题),另外 3 条在 v1 的训练数据中出现过。尽管当时被描述为包含近似名与格式错误两类,它实际上不含任何格式错误标识符的条目。因此,表 2 中困难集的数字应当被理解为“该组合在新的近似名与虚构名称上不会崩”的一次检查,而不是对 v1 权重的一次干净的留出测试。表 3 的无模型结果不依赖模型,不受影响。

4.6 · 这条接缝为何抗拒训练

我们给出一个解释,作为假设,同时列出支持它的证据以及它所欠缺的证据。

这份规格是一次成员资格检验:正例集极小(10 个名称,外加任何逐字写出的合法登录号),负例集却是无界的,而且其中的成员与某个正例可能只差一个词:“insulin” 与 “insulin receptor”,“hemoglobin alpha” 与 “hemoglobin gamma”。基座模型的先验几乎能为任何像蛋白质的名称给出一个自信、格式正确的登录号——仅用提示的模型对 cytochrome c 的回答就是一例。只有 135 到 178 条样本时,一个 3B 模型学到的并不是这次成员资格检验;它学到的是基于这些样本表面特征的一个评分,而该评分的阈值会随数据配比移动、随某个恰好与标签相关的词面线索移动(v2),而且 v2 表明,还会随权重的数值精度移动。

假设 H1在这个规模、这种大小的训练集下,一张小而封闭的白名单无法作为决策边界被学会:移动模型隐含的阈值,只是在漏掉的弃权与错误的弃权之间交换,没有任何设置能把两者同时消除。

支持 H1 的证据,是三轮各只用一个种子的训练,其错误从 3/0 变为 3/3 再变为 0/10,没有一轮达到 0/0。它欠缺的是:多种子扫描、随训练集规模变化的学习曲线、不同训练目标之间的比较,以及更大的模型。如果在这个规模上有某个训练配方能在多个种子下、在两套集合上都做到零漏掉弃权和零错误弃权,就能推翻它。即使 H1 被推翻,我们也仍会把绑定留在表里:表是精确的,可以阅读和审核,不需要重新训练就能修改,而那三轮训练没有换来任何表给不了的东西。

5 · 案例研究二:文档到字段模型

5.1 · 模型及其标签

第二个模型把一句文档文字转换成一条具有固定模式的结构化记录:分类标签、自由文本字段,以及六个带类型的关系列表——它们应当列出句子所说的主语会导致什么、需要什么、属于什么,等等。它服务于一条抽取通道,该通道的设计、模式与存储均不公开;我们只报告模型的评测结果,以及它教给我们的东西。

该模型是在 4 位基座上对 Llama-3.2-3B-Instruct [10] 做的 QLoRA [4] 微调:秩 16、dropout 0.05、学习率 10−4、批大小 2、序列最长 704 个 token(实测最长样本为 641)、只对补全部分计算损失,可训练参数 13.894M(0.432%),共 3,000 次迭代。验证损失从 1.764 降到 0.562(最低 0.535,出现在第 2,400 次迭代)。部署时,适配器被融合进 bf16 基座,用 llama.cpp 的转换器转换,再在 Ollama 中量化为 2.0 GB 的 q4_K_M 版本。

标签来自一个早先的结构化记录语料,这些记录是为句子撰写的,而撰写时周围的对话就在眼前。我们扫描了 302,066 行语料(201,355 个不同的句子),选出 18,321 个句子,按句子切分为 247 个留出测试句、384 个验证句,其余用于训练;关系丰富的句子在训练中被重复,最终得到 33,710 条训练样本。

5.2 · 见证审计

训练之前,被扫描各行中的每一个关系项,都用 §2 中的词面见证代理指标对照其所在句子做了检验。在 74,498 个关系项中,有 52,963 个(71.1%)与所在句子或主题没有任何共同实词(图 3 左)。这些不是边界情形:未通过代理指标的项,提到的是句子里根本没有出现的东西(该通道的代码举了一个例子:某句子从未提及某场军事战役,其前置条件项却写着那场战役)。由于代理指标很宽松,71.1% 只是句子并未陈述之标签所占比例的下界。

这样的标签,是依据模型在推理时永远看不到的上下文写成的。用它们训练,模型只能学会从输入之外生成关系——这从构造上就是幻觉;当参考答案包含源文本所没有的内容时,摘要与数据到文本生成的文献记录了同样的效应 [20]、[5]、[24]。因此,该通道在训练前从标签中删去了每一个无见证的项;模型只在通过代理指标的项上训练。

训练语料中的关系标签74,498 个标签,逐一对照其自身句子检验71.1%28.9%52,963 个没有任何共同实词(与所在句子或主题相比)21,535 个至少有一个(宽松的词面检验)检验很宽松,所以 71.1% 只是“句子并未陈述”之标签所占比例的下界。模型预测的关系(留出集)第一阶段计分 240 句;第二阶段 247 句0100200928 无见证100第一阶段(全部数据)关系 F1 0.06818184 无见证265第二阶段(偏重关系)关系 F1 0.058与所在句子共享实词没有共享实词
图 3. 左:对语料关系标签的见证审计。右:一个偏重关系的课程前后,模型在留出集上预测的关系项。这个课程让模型说得更多了;而它所说的内容中,哪怕与句子共享一个词的比例反而更小,关系 F1 也没有提升。

5.3 · 第一阶段:类型安全,却没有依据

留出评测把全部 247 个测试句送进了与线上通道相同的客户端和校验器。其中 7 个请求在传输层失败(本地模型服务器返回错误),与质量分开计数;其余 240 个返回了回复。结果见表 4 和图 4。

表 4. 文档到字段模型在 247 个留出句子上的表现。门槛在评测之前就已固定。分类准确率是两个分类字段精确匹配准确率的平均值;关系 F1 是针对单一参考金标、以软集合匹配计算的 F1 在六种关系类型上的平均值;见证比例是预测关系项中通过词面代理指标的比例。
第一阶段(全部数据)第二阶段(偏重关系)门槛
尝试的句子数 / 传输失败247 / 7247 / 0–
符合模式的回复1.0(240 / 240)1.0(247 / 247)≥ 0.98
分类标签准确率0.6330.658≥ 0.85
关系 F1(六种类型;两个阶段都有三种类型为 0.00)0.0680.058≥ 0.60
预测的关系项100265–
预测项的见证比例0.92(92 / 100)0.683(181 / 265)≥ 0.80
无见证的预测项884–
六个自由文本字段的平均 token F1(推算)0.290.38–
每句延迟中位数3.9 s7.2 s–
结论不可用不可用;已否决
类型安全不等于有依据:文档到字段模型在 247 条留出句子上的结果0.000.250.500.751.00模式合法的输出收到的 240 条回复全部合法门槛 0.981.00通过词面见证比例与句子共享实词的预测关系所占比例门槛 0.800.92通过分类标签准确率两个分类字段的平均值门槛 0.850.63未通过关系 F1对照单一参考答案门槛 0.600.07未通过
图 4. 第一阶段的门槛。两项形式检查都通过了;两项内容检查都没通过。见证比例本身也只是一个词面代理指标。

模型返回的每一条回复都符合模式,它预测的 100 个关系项中有 92 个与句子至少共享一个实词。但在内容上它失败了:分类准确率 0.633,门槛 0.85;关系 F1 0.068,门槛 0.60;各类型的 F1 在 0.00 到 0.19 之间。当时记录的结论是:作为关系抽取器“不可用”。

那两个通过的数字,比看上去更弱。模式合法只说明输出的形状对了,却完全说明不了关系是否为真;而语法约束解码 [9]、[32] 本可以免费给出这个形状。见证比例是一个词面代理指标:该通道自己的文档后来把它改称为“遗留的词面重叠分数”,并写明它“不能证明关系的真实性、方向或极性”。导出后冒烟测试中的一个孤例就能说明问题:对一个明确陈述了两个关系的句子,模型返回了一条符合模式的记录,在一个自由文本字段里复述了其中一个关系,而两个对应的关系列表却都是空的。输出是类型安全的,但既没有依据,也不完整。我们以最窄的形式给出这条教训:类型安全不等于有依据。对形式的检查,无论多严格,都不是对内容的检查。

5.4 · 第二阶段:一个让模型说得更多的课程

第一阶段的模型抽取不足:它在 240 个句子、每句六个列表上一共只预测了 100 个关系项,因此至少 93% 的关系列表是空的。下一次尝试从第一阶段的权重出发,在 33,710 条训练样本中至少带一个关系的 24,088 条上继续训练 2,000 次迭代,以打破偏向空列表的先验。从“模型预测了 265 个关系项而不是 100 个”这个意义上说,它奏效了,而且好几个自由文本字段有所提升(平均 token F1 从 0.29 到 0.38)。但见证比例从 0.92 跌到 0.683:无见证的预测关系从 8 个增加到 84 个(图 3 右),关系 F1 则停在 0.058。这个课程被否决,保留了第一阶段的权重。逼着模型多产出一样其标签并未可靠见证的东西,结果是从句子之外产出了更多这样的东西。

5.5 · 限制这些数字的因素

单一参考金标。每个测试句只有一条金标记录;一个不同但站得住脚的关系会被记为零分。金标本身也用同一个词面代理指标过滤过,因此评测标签自身也只是在词面上有见证。所以,0.07 的关系 F1 界定的是模型与一个有噪声的标签集之间的一致程度,而不是任何绝对意义上的准确率。两阶段之间的比较在内部是一致的(同样的 247 个句子、同一个评分器),这正是我们倚重它的原因。

传输失败与结论规则。第一阶段有 7 个请求因服务器错误而丢失。当时的规则是:传输失败超过 10% 才判为无定论,因此第一阶段被计了分;该通道后来采用了更严格的规则——只要有任何传输失败,这次运行就判为无定论——按新规则,第一阶段属于无定论。它的内容类数字是基于收到的 240 条回复计算的。第二阶段没有传输失败。最终导出后跑过一次 60 个句子的抽查,已被排除:按该通道自己的规则,截断的运行属于无定论。

工程上的失败,同样是负面结果。用训练框架自带的导出器把融合后的模型导出为 GGUF,失败了两次:一次是序列化错误(“can only serialize row-major arrays”,有日志),另一次是在绕过它之后,部署运行时里出现了数据类型断言错误(记录在导出脚本中)。改用 llama.cpp 自己的转换器才成功,这也是该通道现在使用的路径。评测期间,本地模型服务器不止一次因内存压力而崩溃;这就是为什么传输失败要与质量分开计数,也是为什么传输失败过多的评测只会被报告为无定论、永远不会被当作一个分数。第三次继续训练已经准备就绪(数据已审计、金标哈希已冻结、清单已记录),但从未开始训练;没有结果可以报告。

5.6 · 该通道现在怎么做

该通道被标记为对非关系字段的试点级增补,而不是关系抽取器。在一条记录被存储之前,每个预测的关系项都要经过同一个见证代理指标,无见证的项会被删除。对于文档,一项固定的测试要求:存储下来的关系必须来自一个确定性来源,而不是模型的输出;这个来源如何工作不予公开。模型仍在使用,只是不再让它掌管“关系变成事实”的那条接缝。

6 · 案例研究三:账本驳倒模型给出的数值

前两个案例研究关乎标识符与关系。第三个关乎数值,而且完全不涉及训练;我们收录它,是因为它展示了同样的放置在更高一层同样有效——在这一层,模型搞错的是一个数字。

6.1 · 设置

一个小型的假设检验循环依次运行假设、实验、回执、评判、归责、学习、新假设。它的状态存放在一本只追加的账本里,而决定什么可以被主张的一切都是机械的:状态机、针对“在回执之前登记的预测”的裁决算术、置信度规则和归责步骤,内部都没有模型。模型只能在一条接缝上发挥作用,即假设生成器:它必须提出至少两个相互竞争、带有预测的假设;账本通过与人工提交相同的、受规则约束的接口来记录它们,而格式错误或只有一个想法的提议会被拒绝,并且不留下任何记录。

6.2 · 这次运行

一个由 Ollama 提供服务的本地模型 mistral:7b-instruct [14] 被问到:人类血红蛋白 α 亚基(P69905)的 UniProt 规范序列中有多少个残基。图 5 展示了它产生的账本。

模型(只在提议接缝):mistral:7b-instruct,本地运行账本(只追加、机械运作;内部没有模型)世界(一份实时回执)序号 0 · 假设:长度 = 146理由:归于 UniProt序号 1 · 假设:长度 = 147理由:N 端乙酰化“会多出一个氨基酸”序号 2–3 · 预先登记== 146 与 == 147容差 0序号 4 · 实验经 UniProt观测长度序号 10–11 · 裁决147 被驳倒(误差 −5)146 被驳倒(误差 −4)序号 12–18 · 之后两个假设均被拒绝;归责;记入一次驳斥序号 9 · 回执:UniProt REST,HTTP 200sequence_length = 142(271,287 字节,保留摘要)19 个事件,每个都以 SHA-256 链接到上一个;链头 5df356cd… 与其旁路文件一致(2026-09-27 只读复核)。
图 5. 这次运行的账本,逐个事件列出。模型的两条预测在回执出现之前(事件 9)就已登记(事件 2–3),因此两者都可被评判;两者都被针对回执的算术驳倒。为撰写本文,我们以只读方式重新核验了这条链。

模型提出了两个假设:长度为 146,理由是这是“根据 UniProt 数据库,P69905 所报告的序列长度”;长度为 147,理由是 N 端乙酰化“会在序列中多出一个氨基酸”。两条预测都以精确相等关系、零容差登记。随后,循环设计了一次实验,其 UniProt 适配器记录了一份回执:来自 UniProt REST 接口的一次 HTTP 200 响应,共 271,287 字节,并保存了响应正文的 SHA-256 摘要,观测到的序列长度为 142。评判器判定 147 被驳倒(误差 −5)、146 被驳倒(误差 −4),两个假设都转为 REJECTED,循环则为“a refutation across 2 hypothesis(es)”(一次跨越 2 个假设的驳斥)记入了知识。这 19 个事件构成一条 SHA-256 哈希链;我们以只读方式重新计算了每一个链接,链头与记录下来的旁路文件一致。对任何持有链头的人来说,这条链能让原地篡改被察觉;它没有签名,证明的是完整性,而不是作者身份。

我们在 2026 年 9 月 27 日重新读取了 UniProt:P69905 的长度仍为 142,而 β 链 P68871 的长度为 147 [30]。模型的两个数值中,一个是相邻蛋白质的长度;另一个则两条链的规范长度都不是。《验证地板》报告过一个小模型在同一个蛋白质上犯的同一类错误 [41];我们不重复那项分析。两条理由都站不住:数据库报告的是 142,不是 146;而这里问的长度数的是规范序列的残基,乙酰化这类修饰并不会给它增加残基。

6.3 · 机械归责的一个怪处

驳倒之后,归责步骤对模型所陈述的假设前提提高了怀疑,并为每个被驳倒的假设生成了一个后续假设。对 147 那个假设,后续假设是合理的(“Assumption is false: The N-terminal valine … is acetylated”,即“前提为假:N 端缬氨酸……被乙酰化”)。对 146 那个假设则不然:由于模型错误地声称 UniProt 报告的是 146,循环生成的假设是“‘UniProt 数据库提供的信息是准确的’为假”。这个后续只是一个假设,它需要自己的实验,也没有任何东西作为事实进入账本。但它暴露了一个真实的局限:机械归责只能归咎于提议者说过的话,因此它会继承提议者的框架,包括一次错误的归因。

范围。这是一个模型对一个问题的一次运行。它是“账本处置模型之所提”的一个存在性证明,而不是对模型的测量。这次运行的账本保存在磁盘上,按照项目的既定做法有意没有提交进仓库——该项目只提交规范的示例运行;它的完整性依赖于哈希链,以及运行时写下的那条提交说明。

6.4 · 一项非正式观察:自由形式的工具调用

我们再补充一项观察,它不是训练结果,也比上面所有内容都弱。在一个自由形式、可调用工具的智能体循环中,2026 年 9 月 20 日记录了对同一个生物医学问题的 7 次运行(问题为 “What evidence connects BRCA1 dysfunction to breast cancer? Cite sources.”,即“有哪些证据把 BRCA1 功能障碍与乳腺癌联系起来?请注明来源。”;其中一次使用了更长的版本)。表 5 汇总了保存下来的运行日志。

表 5. 7 次有记录的自由形式运行。“动作”统计的是已发起的工具调用。没有任何一次运行调用生物医学数据库连接器或符号地板。
模型动作它做了什么
经 CLI 调用的托管模型0提供方返回用量上限错误,备用方被限速;没有动作
qwen2.5-coder:7b(本地)0没有记录到动作或完成结果
经 CLI 调用的 Claude1一次网页搜索,然后给出一个结构化回答,列出八篇期刊文献;这次运行中没有一篇是通过数据库连接器检索到的
qwen2.5-coder:7b17在询问(并不存在的)用户与在代码库中搜索字面文本 your_search_pattern_here 之间来回切换,后者共 8 次
qwen2.5-coder:7b8读了 4 次仓库说明文件,询问用户一次,一次网页搜索,一次读取失败,一次被拒绝的文件写入,最后给出一个三句话、没有引用的回答
qwen2.5-coder:7b5询问用户两次,为 “code investigation techniques”(代码调查技术)做了一次网页搜索,两次读取文件失败;结束时打算去读一个源文件
qwen2.5-coder:7b4询问用户一次,搜索并阅读了仓库的恢复说明;最后对其做了总结

在记录下来的 35 个动作中,有 3 次网页搜索、9 次文件读取、8 次代码搜索、1 次上下文搜索、1 次尝试写入,以及 13 次试图询问用户;没有一次调用生物医学连接器或地板。在这个 7B 代码模型 [12] 有所动作的四次运行中,有三次它把问题当成了关于代码库的任务;第四次,它先读了四次仓库文件,然后才去搜索网页。

有两点使这只能算一项观察,而不是一个结果。第一,日志没有记录每次运行向模型暴露了哪些工具。这些运行发生在该循环的科学配置正在调整期间;声明生物医学连接器的项目级配置是在这些运行之后才提交的,而当天的用户级配置没有保存下来,因此我们无法证明每次运行中连接器都可用。第二,当天写下的变更记录还提到,去掉网页搜索后,一个能力较强的模型凭记忆编造了引用;那次运行没有保存对话记录,因此我们把它报告为未经核实。至于运行时随后做了什么,则是我们可以陈述的行为:落地的研究工具被做成了确定性命令,不依赖模型去选择它们,与自由形式循环并存。

7 · 讨论:落地步骤该放在哪里

7.1 · 四条接缝,一种放置

表 6 把各个案例并排放在一起。在每一个案例里,都有某个环节必须决定:模型的输出能否成为一个标识符、一个关系或一个事实。凡是把这个决定训练进模型的地方,它都以可测量的方式失败了。凡是把它放进只参考请求与精选参考的确定性组件的地方,这条接缝在同样的测量下都守住了。

表 6. 各条接缝:训练尝试了什么,如何失败,由什么封住。
接缝我们训练或尝试了什么如何失败由什么封住仍未解决
名称 → 标识符(§3)在 135–178 条合成样本对上做三轮 LoRA漏掉/错误弃权 3/0、3/3、0/10解析器:请求中的标识符或精选名称,否则弃权覆盖范围就是那张 10 个名称的表
拒绝无依据的请求(§3)偏重弃权的数据;对照对一个词面线索;过度拒绝当没有任何东西能落地时强制弃权错误弃权仍归模型负责
有见证的关系(§5)在过滤后的标签上微调;偏重关系的课程F1 0.07;无见证预测 8 → 84存储前的见证过滤;文档关系改由确定性来源提供关系抽取本身
数值(§6)无:由一个 7B 模型提出两个数值都错针对回执的预先登记预测归责继承提议者的框架
选择落地工具(§6.4)无:仅靠指令(非正式)7 次运行中没有调用连接器落地工具同时以确定性命令的形式提供(此处未测量)工具可用性未被记录

7.2 · 与《推理放置》的关系

《推理放置》 [39] 提出了一条按信息的认知状态来分配计算的规则:已知的检索,未知但可测的去测量,需要验证的交给地板,只有真正的不确定性才是学习型推理的候选对象,而且它还必须证明自己配得上这个位置。那篇论文还给出了授予学习型组件决策权的三道门槛:理论价值、在可承受的数据代价下的可实现恢复,以及足够的模型类。

绑定这条接缝从构造上就过不了第一道门槛。对精选表里的名称,正确的标识符已经是已知的;对任何其他名称,规格规定要拒绝;学习型的绑定在这张表之上没有任何可以添加的东西。《推理放置》已经预言绑定应当归于检索。本文补上了论证的另一半:如果硬把它放进模型会怎样。在这条接缝上,答案是三轮在两个方向上都犯错的训练。

关系抽取在性质上不同。它不是一次查找,学习型组件在这里也许真有价值。那里失败的是数据:依据输入所不包含的上下文写成的标签,教不出有依据的抽取。这是第二道门槛(在可承受的数据代价下恢复)的前提,而我们的语料没有满足它。

7.3 · 与《验证地板》的关系

《验证地板》 [41] 区分了属于模型的能力(在证据中导航、知道何时停下)与属于运行时的能力(什么可以算作已验证),并发现随着模型变小,由运行时掌管的那块地板纹丝不动。提议器的接缝说明了为什么绑定应当位于这条分界线的运行时一侧。绑定不是导航:绑错了并不会让系统变慢,而是会把验证指向错误的实体,然后验证照样成功。我们把弃权中真正属于查找的那部分(“这个名称在表里吗?”)移出了模型,把属于判断的那部分(“这条请求究竟是不是关于蛋白质的?哪一类提议适合它?”)留给了模型——而在这些条目上,模型把这部分做得很好。

7.4 · 类型安全不等于有依据

两个训练案例在内容上失败之前,都已经解决了形式问题:提议器训练一轮后解析率就是 1.0,文档模型对返回的每条回复都符合模式。约束解码本可以不经训练就给出这种形式 [9]、[32]。形式是验证器能读懂一条提议的必要条件,却说明不了这条提议是不是关于对的东西。一个把模式合法率或词面重叠分数当作落地证据来报告的系统,报告的是错误的量。我们会把它写成一条检查清单:对每一条接缝,指出那项检验内容而非形式的检查;如果没有这样的检查,那条接缝就没有落地。

7.5 · 为什么小模型上的负面结果在这里很重要

本地小模型恰恰适合那些最需要落地的场合:离线、私密、端侧 [40]。人们很容易把它们的弱点当成部署前必须用训练解决的问题。这些运行指向另一种分工。让小模型去做它在这里做得好的事——选择提议的类型及其参数——而把落地步骤交给能够做到精确的组件。模型依然有用,只是不把接缝托付给它。

9 · 局限与效度威胁

把这些写明,是为了让结果不被过度解读。

10 · 结论

我们试过把落地能力训练进小模型,它没有进去。一个被训练了三轮、要去绑定蛋白质名称并拒绝无法绑定之物的 3B 提议器,经由一次精度不一致和一个词面线索,把它的错误从漏掉的拒绝挪到错误的拒绝,又挪回来,却从未把两者同时消除。一个 3B 文档模型,在从大多并不存在于句子中的标签里学习之后,学会了生成形状完美、关系却鲜有正确的记录;逼它多产出关系,它就从句子之外产出更多。一个 7B 模型被问到一个蛋白质的长度,带着自信的理由给出了两个错误的数字。

在每一个案例中,接缝都由模型之外的某样东西封住或守住:一个只绑定请求本身能落地之物的解析器,一道存储前的见证过滤,一本把预先登记的数字与回执相比较的账本。其中第一个,在三轮训练都没能通过的同一把标尺上,在不改动第一轮权重的情况下,各项指标都达到了 1.0——因为这个任务是一次查找,而那张表本来就在那里。我们得出的教训很窄:在训练模型去做某件事之前,先检查系统是否已经持有答案。如果已经持有,就不该去问模型。

参考文献

  1. A. R. Aronson. Effective mapping of biomedical text to the UMLS Metathesaurus: the MetaMap program. In Proc. AMIA Symposium, pp. 17–21, 2001. PMID 11825149.
  2. A. Asai, Z. Wu, Y. Wang, A. Sil, H. Hajishirzi. Self-RAG: learning to retrieve, generate, and critique through self-reflection. In International Conference on Learning Representations (ICLR), 2024. arXiv:2310.11511.
  3. F. Brahman, S. Kumar, V. Balachandran, et al. The art of saying no: contextual noncompliance in language models. In Advances in Neural Information Processing Systems (NeurIPS), Datasets and Benchmarks Track, 2024. arXiv:2407.12043.
  4. T. Dettmers, A. Pagnoni, A. Holtzman, L. Zettlemoyer. QLoRA: efficient finetuning of quantized LLMs. In Advances in Neural Information Processing Systems (NeurIPS), 2023. arXiv:2305.14314.
  5. B. Dhingra, M. Faruqui, A. Parikh, M.-W. Chang, D. Das, W. Cohen. Handling divergent reference texts when evaluating table-to-text generation. In Proc. ACL, pp. 4884–4895, 2019. arXiv:1906.01081.
  6. T. Gao, H. Yen, J. Yu, D. Chen. Enabling large language models to generate text with citations. In Proc. EMNLP, pp. 6465–6488, 2023. arXiv:2305.14627.
  7. A. d'Avila Garcez, L. C. Lamb. Neurosymbolic AI: the 3rd wave. Artificial Intelligence Review 56(11):12387–12406, 2023. arXiv:2012.05876.
  8. Z. Gekhman, G. Yona, R. Aharoni, et al. Does fine-tuning LLMs on new knowledge encourage hallucinations? In Proc. EMNLP, pp. 7765–7784, 2024. arXiv:2405.05904.
  9. S. Geng, M. Josifoski, M. Peyrard, R. West. Grammar-constrained decoding for structured NLP tasks without finetuning. In Proc. EMNLP, pp. 10932–10952, 2023. arXiv:2305.13971.
  10. A. Grattafiori et al. (Llama Team, AI @ Meta). The Llama 3 herd of models. arXiv:2407.21783, 2024. The Llama-3.2-3B-Instruct weights used here are a later release of this family.
  11. E. J. Hu, Y. Shen, P. Wallis, et al. LoRA: low-rank adaptation of large language models. In International Conference on Learning Representations (ICLR), 2022. arXiv:2106.09685.
  12. B. Hui, J. Yang, Z. Cui, et al. Qwen2.5-Coder technical report. arXiv:2409.12186, 2024.
  13. Z. Ji, N. Lee, R. Frieske, et al. Survey of hallucination in natural language generation. ACM Computing Surveys 55(12):1–38, 2023. doi:10.1145/3571730. arXiv:2202.03629.
  14. A. Q. Jiang, A. Sablayrolles, A. Mensch, et al. Mistral 7B. arXiv:2310.06825, 2023.
  15. A. T. Kalai, S. S. Vempala. Calibrated language models must hallucinate. In Proc. ACM Symposium on Theory of Computing (STOC), pp. 160–171, 2024. arXiv:2311.14648.
  16. A. T. Kalai, O. Nachum, S. S. Vempala, E. Zhang. Why language models hallucinate. arXiv:2509.04664, 2025.
  17. P. Lewis, E. Perez, A. Piktus, et al. Retrieval-augmented generation for knowledge-intensive NLP tasks. In Advances in Neural Information Processing Systems (NeurIPS), 2020. arXiv:2005.11401.
  18. Y. Li, Y. Yu, C. Liang, et al. LoftQ: LoRA-fine-tuning-aware quantization for large language models. In International Conference on Learning Representations (ICLR), 2024. arXiv:2310.08659.
  19. ggml-org. llama.cpp: LLM inference in C/C++ (including the convert_hf_to_gguf.py converter). Software, github.com/ggml-org/llama.cpp.
  20. J. Maynez, S. Narayan, B. Bohnet, R. McDonald. On faithfulness and factuality in abstractive summarization. In Proc. ACL, pp. 1906–1919, 2020. arXiv:2005.00661.
  21. M. Mintz, S. Bills, R. Snow, D. Jurafsky. Distant supervision for relation extraction without labeled data. In Proc. ACL-IJCNLP, pp. 1003–1011, 2009.
  22. Apple machine learning research. MLX: an array framework for Apple silicon, with the mlx-lm package used here for LoRA training and fusing. Software, github.com/ml-explore/mlx, 2023.
  23. Ollama. Local model server. Software, ollama.com.
  24. A. Parikh, X. Wang, S. Gehrmann, et al. ToTTo: a controlled table-to-text generation dataset. In Proc. EMNLP, pp. 1173–1186, 2020. arXiv:2004.14373.
  25. S. G. Patil, T. Zhang, X. Wang, J. E. Gonzalez. Gorilla: large language model connected with massive APIs. In Advances in Neural Information Processing Systems (NeurIPS), 2024. arXiv:2305.15334.
  26. S. Riedel, L. Yao, A. McCallum. Modeling relations and their mentions without labeled text. In Proc. ECML PKDD, LNCS 6323, pp. 148–163, 2010.
  27. P. Röttger, H. R. Kirk, B. Vidgen, G. Attanasio, F. Bianchi, D. Hovy. XSTest: a test suite for identifying exaggerated safety behaviours in large language models. In Proc. NAACL, pp. 5377–5400, 2024. arXiv:2308.01263.
  28. O. Sainz, J. A. Campos, I. García-Ferrero, J. Etxaniz, O. Lopez de Lacalle, E. Agirre. NLP evaluation in trouble: on the need to measure LLM data contamination for each benchmark. In Findings of EMNLP, pp. 10776–10787, 2023. arXiv:2310.18018.
  29. T. Schick, J. Dwivedi-Yu, R. Dessì, et al. Toolformer: language models can teach themselves to use tools. In Advances in Neural Information Processing Systems (NeurIPS), 2023. arXiv:2302.04761.
  30. The UniProt Consortium. UniProt: the Universal Protein Knowledgebase in 2023. Nucleic Acids Research 51(D1):D523–D531, 2023. doi:10.1093/nar/gkac1052.
  31. B. Wen, J. Yao, S. Feng, et al. Know your limits: a survey of abstention in large language models. Transactions of the Association for Computational Linguistics 13:529–556, 2025. arXiv:2407.18418.
  32. B. T. Willard, R. Louf. Efficient guided generation for large language models. arXiv:2307.09702, 2023.
  33. Y. Xu, L. Xie, X. Gu, et al. QA-LoRA: quantization-aware low-rank adaptation of large language models. In International Conference on Learning Representations (ICLR), 2024. arXiv:2309.14717.
  34. S. Yao, J. Zhao, D. Yu, et al. ReAct: synergizing reasoning and acting in language models. In International Conference on Learning Representations (ICLR), 2023. arXiv:2210.03629.
  35. C. Zhang, S. Bengio, M. Hardt, B. Recht, O. Vinyals. Understanding deep learning requires rethinking generalization. In International Conference on Learning Representations (ICLR), 2017. arXiv:1611.03530.
  36. H. Zhang, S. Diao, Y. Lin, et al. R-Tuning: instructing large language models to say ‘I don't know’. In Proc. NAACL, pp. 7113–7139, 2024. arXiv:2311.09677.
  37. R. Zhu, Z. Ma, J. Wu, et al. Utilize the flow before stepping into the same river twice: certainty represented knowledge flow for refusal-aware instruction tuning. In Proc. AAAI Conference on Artificial Intelligence 39(24):26157–26165, 2025. doi:10.1609/aaai.v39i24.34812. arXiv:2410.06913.
  38. Perslis Research. Fail-first models: failure becomes structure. Research paper, 2026. research.perslis.com/fail-first
  39. Perslis Research. Inference placement: where learned inference earns authority in a symbolic system. Preprint, 2026. research.perslis.com/inference-placement
  40. Perslis Research. Peel: structural hallucination prevention for offline AAC through symbolic fact authorship. Preprint, 2026. research.perslis.com/peel
  41. Perslis Research. The verification floor: scientific integrity that does not degrade with model scale. Pilot preprint, 2026. research.perslis.com/verification-floor

附录 A · 每个数字的出处

本文的每个数字,要么取自当时写下的证据文件,要么取自 2026 年 9 月 27 日以只读方式运行、不依赖模型的复核分析。本文的主张台账与论文源文件一起保存,把每个数字对应到其文件与行号;表 7 给出证据的类别。

表 7. 本文各数字背后的证据类别。
结果来源
提议器各轮,表 2每轮计分时写下的评测器 JSON 报告;评测器源代码(指标定义与分母)
训练设置,表 1每轮的适配器配置与训练日志;数据集切分(经计数)
v2 的诊断;v3 的检查点当时写下的提交说明;v3 训练日志(那次失败的写入)
解析器的行为与测试其源代码与回归测试;在副本上重新运行的 42 项测试
表 3在两个版本下、不借助模型,把解析器的落地步骤跑遍两套评测文件
标尺审计(§4.5)对各数据集切分中提示的集合比较
文档模型,表 4三份评测报告(第一阶段、第二阶段,以及一次因截断而被排除的抽查);数据集报告;训练与导出日志;导出脚本;一次已准备但从未运行的继续训练的清单
见证审计(§5.2)数据集报告中保留/删除的计数;见证代理指标的源代码
账本运行,图 5账本文件及其链头旁路文件;重新计算的哈希链;对 P69905 与 P68871 重新读取的 UniProt
自由形式运行,表 57 份运行日志(事件与清单);配置历史

复现不依赖模型的部分。以下三项检查都不需要模型,除最后一项外也不需要网络。

  1. 账本完整性。按顺序对每个事件,计算其序号、时间戳、类型、载荷与前一哈希的规范 JSON(键排序、无空白、ASCII 转义)的 SHA-256;它必须等于该事件记录的哈希,每个“前一哈希”必须等于上一个事件的哈希(第一个为 64 个零),最后一个哈希必须等于文件旁记录的链头。全部 19 个事件均通过。
  2. 解析器落地。对两套评测集的每一条提示,计算请求能落地的标识符集合(§4);将其与金标比较(弃权为空集,其余为金标标识符);再输入一条带错误标识符的主张并检查输出。全部 62 条提示在两个解析器版本下均通过。
  3. UniProt 长度。读取 P69905 与 P68871 的规范条目(2026 年 9 月 27 日分别为 142 和 147)。

如何引用

Perslis Research. We Tried to Train It In: Negative Results on Teaching Small Models to Ground Facts. Research prototype, September 2026. https://research.perslis.com/training-grounding

@techreport{perslis2026traininggrounding,
  title       = {We Tried to Train It In: Negative Results on Teaching
                 Small Models to Ground Facts},
  author      = {{Perslis Research}},
  institution = {Perslis Research},
  year        = {2026},
  month       = {9},
  note        = {Research prototype; negative results; not a certified system; not medical advice.},
  url         = {https://research.perslis.com/training-grounding}
}