文章

NLI自然语言推断模型简介

判断两句话是蕴含、矛盾还是中立,也可把标签写成假设句做零样本文本分类。说明编码器、分数校准和与自训分类器的分工,基准准确率不能直接当业务指标。

NLI自然语言推断模型简介

NLI自然语言推断模型简介

NLI(Natural Language Inference,自然语言推断) 是成对文本的三分类:判断两句话之间是蕴含、矛盾还是中立,也常称为 RTE(Recognizing Textual Entailment)。2019 年后,同一套三分类被改写成 零样本文本分类:原文当前提,每个标签写成一句假设,用蕴含概率给类打分。本文说明任务定义、常见数据与编码器、零样本管道,以及和托管决策 API、自训分类器的分工。基准集准确率不能直接当作业务意图识别指标。

参考与延伸阅读:


目录


1. 任务定义

NLI 不问「这句话单独是什么意思」,而问两句话之间的逻辑关系。给定:

  • premise(前提):已经给出的陈述
  • hypothesis(假设):待判断的另一句

模型在三个标签中选择一个:

英文含义例子
entailment假设能从前提推出前提:他在巴黎。假设:他在法国。
contradiction两句冲突前提:他在巴黎。假设:他在东京。
neutral推不出,也不矛盾前提:他在巴黎。假设:他在开会。

RTE 是同一问题的较早名称,评测常把蕴含与非蕴含做成二分类;当代编码器多采用上述三分类。成对句子经过共享或交叉编码器,得到三类 logit,再 softmax。

NLI 本身不是聊天生成:输出是离散关系标签(及概率),没有自由文本。把它接到业务上时,价值在于 标签可以写成自然语言假设,而不必预先冻进分类头。


2. 数据与编码器体量

大规模训练数据中最常被引用的是 SNLI(Stanford Natural Language Inference)和 MNLI(Multi-Genre Natural Language Inference)。二者提供人工标注的前提—假设对及三分类标签,覆盖多体裁后更利于跨域迁移。后续还有 ANLI、XNLI 等困难集与跨语言扩展。

cross-encoder/nli-roberta-base 一类检查点,是在此类数据上将 RoBERTa-base 训成三分类器:标签 0 矛盾、1 蕴含、2 中立。结构量级约为隐藏层 768、12 层、12 个注意力头、词表约 50265,属于小参数编码器,不是生成式大模型。

公开介绍中常见「AllNLI-dev 约 88%~89.5%,概括为 87% 以上」。那是 成对句子 NLI 三分类 的成绩。换成任意业务标签的零样本分类,数字会下降,必须用自己的验证集评估。标准英文 BPE 词表对中文并不友好;中文意图更常见的是中文 NLI 数据或中文编码器(如在中文蕴含语料上微调的 BERT / RoBERTa)。

Cross-encoder 将前提与假设拼接后一次前向,交互充分、延迟随标签数线性增长。Bi-encoder 分别编码再算相似度,吞吐更高,蕴含语义通常弱于交叉编码。零样本分类管道默认走交叉编码 NLI。


3. 零样本分类的构造

Yin、Hay、Roth(EMNLP 2019)将文本分类改写为 NLI:原文作为前提,每个候选标签写成一句假设(例如 This text is about {label}.),比较蕴含概率。Hugging Face 的 zero-shot-classification 管道即此方法。标签不必事先训进分类头,推理时现写即可。

新闻分类示例(管道层;检查点以实际加载为准):

1
2
3
4
5
6
7
8
9
from transformers import pipeline

classifier = pipeline(
    "zero-shot-classification",
    model="cross-encoder/nli-roberta-base",
)
sent = "Apple just announced the newest iPhone X"
candidate_labels = ["technology", "sports", "politics"]
print(classifier(sent, candidate_labels))

内部会对每个标签构造一对 (premise, hypothesis),各跑一次前向。每一对先得到矛盾 / 中立 / 蕴含的 logit,再丢弃中立,对「矛盾 vs 蕴含」做 softmax,得到「该标签是否成立」的分数;多个标签再归一化,形成互斥分类。

输出形态类似:

1
2
3
4
5
{
  "sequence": "Apple just announced the newest iPhone X",
  "labels": ["technology", "sports", "politics"],
  "scores": [0.91, 0.06, 0.03]
}

没有现成的 choice 字段,调用方自行取 argmax。这些 scores 是相对蕴含分,不是校准过的频率:0.91 不等于「91% 把握」。若要「超过 0.9 才自动处理」,必须在自己的验证集上标定阈值。

同一能力覆盖内容审核与分类、客服意图识别、判断两段论述是否蕴含或矛盾。意图识别将用户话语当前提,将「这是退款意图」「这是查询物流」写成假设。

成对打分也可以不走 pipeline,直接对已构造的前提—假设列表做 predict,便于批量吞吐。

假设句质量决定上限。过于抽象的标签(「其他」「综合」)蕴含分不稳定;带领域词的短句通常优于单词标签。多标签非互斥场景应关闭互斥归一化,分别设阈值。


4. 管道实现与分数含义

零样本分类将 (K) 个标签变成 (K) 次 NLI 前向(可批处理)。复杂度约为单次三分类的 (K) 倍,标签从 5 个增到 50 个时延迟近似线性上升。高频服务应限制候选集,或先用句向量粗召回再 NLI 精排。

中立类别在管道中常被丢掉,只比较蕴含与矛盾。业务上「信息不足」有时对应中立:若需要「暂不判断」,应保留三分类输出,而不是强制归一化到互斥标签。

相对 softmax 会让所有标签分数之和为 1,即使原文与任何类都不像。低最高分应视为拒绝识别,而不是勉强取 argmax。校准(温度缩放、Platt 缩放、可靠性图)需要带标签的验证集;默认 NLI 分数不宜直接当作置信度写入风控阈值。


5. 与托管决策 API 的对应关系

以一句中文客服留言、三选一 billing / bug / other 为例:

我被扣了两次钱,非常生气。

NLI 实际输入是三对句子:

前向premisehypothesis(示意)
1我被扣了两次钱,非常生气。This text is about a billing or refund issue.
2同一句This text is about a product bug.
3同一句This text is about something else.

管道层只提交 sequence 与 candidate_labels。输出是 labels 与 scores。

托管决策模型(如 TypeSafe Jev)不再使用 premise / hypothesis 这两个词,改为 state 加 criteria:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "model": "jev-latest",
  "state": "我被扣了两次钱,非常生气。",
  "questions": {
    "topic": {
      "type": "choice",
      "instructions": "这单主要是什么问题?",
      "criteria": {
        "billing": "扣款、退款、账单",
        "bug": "产品坏了、功能不可用",
        "other": "都不属于"
      }
    }
  }
}

对应关系:

  • state = premise
  • 每条 criteria = 一条 hypothesis
  • instructions = 总任务说明(NLI 管道里常常写死在模板中)

输出已带好 choice,并附 probabilities 与 confidence。是 / 否对应只跑一对 NLI;有序打分对应把各档写成多条假设再加权,NLI 也能做,加权需自行实现。

维度NLI(如 nli-roberta-base)托管决策 API(如 Jev)
原文premise / sequencestate
类candidate_labels 或假设句criteria
模型输入每条标签一对句子产品层为一份 state 加一组问题(张量形状未公开)
调用方拿到的scores,自行取最大choice 已取好
多问几个问题再构造更多对同一 state 下并列 questions
能否本地运行可以,权重在模型仓库目前主要为托管 API
概率含义相对 softmax,多半未校准宣称校准;外部仍须自测

NLI 是「一句话对一条假设,打蕴含」;托管决策 API 是「一句话对一组当场声明的选项,直接给出选择」。标签都在推理时才告知模型。后者把取 argmax、多问打包以及宣称的校准收进 API,并没有改写分类问题本身。


6. 量规与嵌套类别

若将「完备程度」打成 0 / 1 / 2,NLI 可写成三条 hypothesis,再计算:

1
score ≈ 0·p0 + 1·p1 + 2·p2

形式上与有序打分类同构。真正不稳定的是:这三档往往不是互斥类,而是包含关系。写得很完整的文本也「有流程」;空泛长文的 Level 0 假设分也可能偏高。NLI 对每条假设独立打分,不建模序关系,灰区会在阈值附近跳动。

模型判断的是「像不像某类说明」,不是「事实能否核对」。一段写得很像完整方案的编造,蕴含分可以同样高。高责任场景应把 NLI 当作初筛,而不是唯一门禁。


7. 与自训分类器的选型

意图识别常见三路,NLI 只是其中一路。

  1. 标签长期固定,能标数百条:微调小分类头(BERT / 中文 RoBERTa,或特征加逻辑回归)。准确、可本地;更换意图需要重训。
  2. 标签经常改、没有标注:零样本 NLI、句向量路由(Semantic Router)、SetFit 少样本。领域数据上仍可继续微调 NLI 头。
  3. 不维护本地模型、接受出网 API:托管决策模型或大模型 JSON mode。换取的是少运维,以及厂商宣称的校准与时延;代价是绑定与数据出境。

从零训练浅层分类器只在特征很固定、样本极少时仍有意义。标签本身含糊的任务(例如「写得全不全」这种序数量规),三种路径都不宜当作硬门禁。规则能拦的空字段、字数下限,应优先用规则。


8. 工程注意

  • 假设模板:中英文模板不可混用词表不匹配的检查点;应在验证集上比较几种措辞。
  • 候选数量:控制 (K);过大时用检索或规则先缩小集合。
  • 拒绝识别:设置最高分下限与「其他」类,避免低分 argmax。
  • 多标签:互斥归一化会扭曲同时成立的标签,应分标签阈值。
  • 中文:优先中文蕴含语料上的编码器;英文 NLI 零样本到中文会损失明显。
  • 延迟与成本:本地编码器可离线批处理;托管 API 适合高 QPS 短文本,须评估出境与保留策略。
  • 评测:同时报告准确率、宏平均 F1、校准误差(ECE)和人工抽检,不要只引用 SNLI / MNLI 数字。

9. 小结

要点结论
任务判断前提与假设为蕴含、矛盾或中立;RTE 为同一问题的较早名称
零样本原文当前提,标签写成假设句,用蕴含分做分类
分数多为相对 softmax,默认未校准,阈值须在业务验证集上标定
与决策 API任务同构;托管接口打包了取最大、多问并行和宣称的校准
选型标签稳定则微调分类器;标签常变则 NLI 或句向量;高责任场景不作唯一门禁
本文由作者按照 CC BY 4.0 进行授权