NLI自然语言推断模型简介
判断两句话是蕴含、矛盾还是中立,也可把标签写成假设句做零样本文本分类。说明编码器、分数校准和与自训分类器的分工,基准准确率不能直接当业务指标。
NLI自然语言推断模型简介
NLI(Natural Language Inference,自然语言推断) 是成对文本的三分类:判断两句话之间是蕴含、矛盾还是中立,也常称为 RTE(Recognizing Textual Entailment)。2019 年后,同一套三分类被改写成 零样本文本分类:原文当前提,每个标签写成一句假设,用蕴含概率给类打分。本文说明任务定义、常见数据与编码器、零样本管道,以及和托管决策 API、自训分类器的分工。基准集准确率不能直接当作业务意图识别指标。
参考与延伸阅读:
- Bowman 等,SNLI:https://arxiv.org/abs/1508.05326
- Williams 等,MNLI:https://arxiv.org/abs/1704.05426
- Yin, Hay, Roth,零样本文本分类与蕴含方法(EMNLP 2019):https://aclanthology.org/D19-1404/
- Hugging Face Zero-Shot Classification:https://huggingface.co/tasks/zero-shot-classification
- Hugging Face
cross-encoder/nli-roberta-base:https://huggingface.co/cross-encoder/nli-roberta-base - TypeSafe Jev 发布说明(托管决策 API 对照):https://typesafe.ai/blog/introducing-system-one-models-and-jev
目录
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 实际输入是三对句子:
| 前向 | premise | hypothesis(示意) |
|---|---|---|
| 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 / sequence | state |
| 类 | 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 只是其中一路。
- 标签长期固定,能标数百条:微调小分类头(BERT / 中文 RoBERTa,或特征加逻辑回归)。准确、可本地;更换意图需要重训。
- 标签经常改、没有标注:零样本 NLI、句向量路由(Semantic Router)、SetFit 少样本。领域数据上仍可继续微调 NLI 头。
- 不维护本地模型、接受出网 API:托管决策模型或大模型 JSON mode。换取的是少运维,以及厂商宣称的校准与时延;代价是绑定与数据出境。
从零训练浅层分类器只在特征很固定、样本极少时仍有意义。标签本身含糊的任务(例如「写得全不全」这种序数量规),三种路径都不宜当作硬门禁。规则能拦的空字段、字数下限,应优先用规则。
8. 工程注意
- 假设模板:中英文模板不可混用词表不匹配的检查点;应在验证集上比较几种措辞。
- 候选数量:控制 (K);过大时用检索或规则先缩小集合。
- 拒绝识别:设置最高分下限与「其他」类,避免低分 argmax。
- 多标签:互斥归一化会扭曲同时成立的标签,应分标签阈值。
- 中文:优先中文蕴含语料上的编码器;英文 NLI 零样本到中文会损失明显。
- 延迟与成本:本地编码器可离线批处理;托管 API 适合高 QPS 短文本,须评估出境与保留策略。
- 评测:同时报告准确率、宏平均 F1、校准误差(ECE)和人工抽检,不要只引用 SNLI / MNLI 数字。
9. 小结
| 要点 | 结论 |
|---|---|
| 任务 | 判断前提与假设为蕴含、矛盾或中立;RTE 为同一问题的较早名称 |
| 零样本 | 原文当前提,标签写成假设句,用蕴含分做分类 |
| 分数 | 多为相对 softmax,默认未校准,阈值须在业务验证集上标定 |
| 与决策 API | 任务同构;托管接口打包了取最大、多问并行和宣称的校准 |
| 选型 | 标签稳定则微调分类器;标签常变则 NLI 或句向量;高责任场景不作唯一门禁 |
