Phase 05 - Lesson 21
Inferência de Linguagem Natural — Implicação Textual
"t implica h" significa que um humano lendo t concluiria que h é verdadeiro. NLI é a tarefa de prever implicação / contradição / neutralidade. Aparentemente entediante, mas estrutural em produção.
Tipo: Aprender Linguagens: Python Pré-requisitos: Fase 5 · 05 (Análise de Sentimento), Fase 5 · 13 (Resposta a Perguntas) Tempo: ~60 minutos
O Problema
Você construiu um sumarizador. Ele produziu um resumo. Como saber se o resumo não contém uma alucinação?
Você construiu um chatbot. Ele respondeu "sim." Como saber se a resposta é sustentada pelo trecho recuperado?
Você precisa classificar 10.000 artigos de notícias por tópico. Não tem rótulos de treinamento. Dá para reaproveitar um modelo?
Os três problemas se reduzem a Inferência de Linguagem Natural. NLI pergunta: dada uma premissa t e uma hipótese h, h é implicada por t, contradita, ou neutra (sem relação)?
- Checagem de alucinação:
t= documento fonte,h= afirmação do resumo. Não implicação = alucinação. - QA fundamentado:
t= trecho recuperado,h= resposta gerada. Não implicação = fabricação. - Classificação zero-shot:
t= documento,h= rótulo verbalizado ("Isto é sobre esportes"). Implicação = rótulo previsto.
Uma tarefa, três usos em produção. É por isso que todo framework de avaliação de RAG embarca um modelo de NLI por baixo dos panos.
O Conceito
Os três rótulos.
- Implicação.
t→h. "O gato está no tapete" implica "Existe um gato." - Contradição.
t→ ¬h. "O gato está no tapete" contradiz "Não existe gato." - Neutralidade. Nenhuma inferência em qualquer direção. "O gato está no tapete" é neutro em relação a "O gato está com fome."
Não é implicação lógica. NLI é inferência de linguagem natural — o que um leitor humano típico inferiria, não lógica estrita. "João passeou com o cachorro dele" implica "João tem um cachorro" em NLI, mas a lógica de primeira ordem estrita só admitiria isso se você axiomatizasse a posse.
Datasets.
- SNLI (2015). 570 mil pares anotados por humanos, legendas de imagens como premissas. Domínio restrito.
- MultiNLI (2017). 433 mil pares em 10 gêneros. O corpus de treinamento padrão em 2026.
- ANLI (2019). NLI adversarial. Humanos escreveram exemplos projetados especificamente para quebrar modelos existentes. Mais difícil.
- DocNLI, ConTRoL (2020–21). Premissas com extensão de documento. Testam inferência multi-hop e de longo alcance.
A arquitetura. Um encoder transformer (BERT, RoBERTa, DeBERTa) lê [CLS] premise [SEP] hypothesis [SEP]. A representação do [CLS] alimenta um softmax de 3 vias. Treine em MNLI, avalie em benchmarks reservados, obtenha 90%+ de acurácia em pares dentro da distribuição.
Zero-shot via NLI. Dado um documento e rótulos candidatos, transforme cada rótulo em uma hipótese ("Este texto é sobre esportes"). Calcule a probabilidade de implicação de cada um. Escolha o máximo. Esse é o mecanismo por trás do pipeline zero-shot-classification da Hugging Face.
Construa
Passo 1: rode um modelo de NLI pré-treinado
from transformers import pipeline
nli = pipeline("text-classification",
model="facebook/bart-large-mnli",
top_k=None) # return all labels; replaces deprecated return_all_scores=True
premise = "The cat is sleeping on the couch."
hypothesis = "There is a cat in the room."
result = nli({"text": premise, "text_pair": hypothesis})[0]
print(result)
# [{'label': 'entailment', 'score': 0.97},
# {'label': 'neutral', 'score': 0.02},
# {'label': 'contradiction', 'score': 0.01}]
Para NLI em produção, facebook/bart-large-mnli e microsoft/deberta-v3-large-mnli são os padrões abertos. O DeBERTa-v3 lidera os leaderboards.
Passo 2: classificação zero-shot
zs = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")
text = "The stock market rallied after the central bank cut interest rates."
labels = ["finance", "sports", "politics", "technology"]
result = zs(text, candidate_labels=labels)
print(result)
# {'labels': ['finance', 'politics', 'technology', 'sports'],
# 'scores': [0.92, 0.05, 0.02, 0.01]}
O template é "This example is about {label}." por padrão. Personalize com hypothesis_template. Não requer dados de treinamento. Sem fine-tuning. Funciona direto da caixa.
Passo 3: checagem de fidelidade para RAG
def is_faithful(answer, context, threshold=0.5):
result = nli({"text": context, "text_pair": answer})[0]
entail = next(s for s in result if s["label"] == "entailment")
return entail["score"] > threshold
Este é o cerne da fidelidade do RAGAS. Divida a resposta gerada em afirmações atômicas. Verifique cada afirmação contra o contexto recuperado. Reporte a fração que é implicada.
Passo 4: classificador de NLI feito à mão (conceitual)
Veja code/main.py para um brinquedo só com a stdlib: premissa e hipótese são comparadas via sobreposição lexical + detecção de negação. Não compete com modelos transformer — mas mostra o formato da tarefa: dois textos na entrada, rótulo de 3 vias na saída, perda = entropia cruzada sobre {entail, contradict, neutral}.
Armadilhas
- Atalhos só pela hipótese. Modelos conseguem prever o rótulo apenas pela hipótese a ~60% no SNLI porque "not", "nobody", "never" se correlacionam com contradição. Baseline forte para detectar vazamento de rótulo.
- Heurística de sobreposição lexical. A heurística de subsequência ("toda subsequência é implicada") passa no SNLI mas falha no HANS/ANLI. Use benchmarks adversariais.
- Degradação com extensão de documento. Modelos de NLI de sentença única caem 20+ de F1 em premissas com extensão de documento. Use modelos treinados em DocNLI para contexto longo.
- Sensibilidade ao template no zero-shot. "This example is about {label}" vs "{label}" vs "The topic is {label}" pode oscilar a acurácia em 10+ pontos. Ajuste o template.
- Incompatibilidade de domínio. O MNLI treina em inglês geral. Texto jurídico, médico e científico precisam de modelos de NLI específicos de domínio (ex.: SciNLI, MedNLI).
Use
A stack de 2026:
| Caso de uso | Modelo |
|---|---|
| NLI de propósito geral | microsoft/deberta-v3-large-mnli |
| Rápido / edge | cross-encoder/nli-deberta-v3-base |
| Classificação zero-shot (leve) | facebook/bart-large-mnli |
| NLI em nível de documento | MoritzLaurer/DeBERTa-v3-large-mnli-fever-anli-ling-wanli |
| Multilíngue | MoritzLaurer/multilingual-MiniLMv2-L6-mnli-xnli |
| Detecção de alucinação em RAG | Camada de NLI dentro do RAGAS / DeepEval |
O meta-padrão de 2026: NLI é a fita adesiva da compreensão de texto. Sempre que você precisar de "A sustenta B?" ou "A contradiz B?" — recorra a NLI antes de recorrer a outra chamada de LLM.
Entregue
Salve como outputs/skill-nli-picker.md:
---
name: nli-picker
description: Pick an NLI model, label template, and evaluation setup for a classification / faithfulness / zero-shot task.
version: 1.0.0
phase: 5
lesson: 21
tags: [nlp, nli, zero-shot]
---
Given a use case (faithfulness check, zero-shot classification, document-level inference), output:
1. Model. Named NLI checkpoint. Reason tied to domain, length, language.
2. Template (if zero-shot). Verbalization pattern. Example.
3. Threshold. Entailment cutoff for the decision rule. Reason based on calibration.
4. Evaluation. Accuracy on held-out labeled set, hypothesis-only baseline, adversarial subset.
Refuse to ship zero-shot classification without a 100-example labeled sanity check. Refuse to use a sentence-level NLI model on document-length premises. Flag any claim that NLI solves hallucination — it reduces it; it does not eliminate it.
Exercícios
- Fácil. Rode
facebook/bart-large-mnliem 20 triplas (premissa, hipótese, rótulo) feitas à mão cobrindo todas as três classes. Meça a acurácia. Adicione armadilhas adversariais de "heurística de subsequência" ("I did not eat the cake" vs "I ate the cake") e veja se ele quebra. - Médio. Compare o template zero-shot
"This text is about {label}"contra"The topic is {label}"e"{label}"em 100 manchetes do AG News. Reporte a oscilação de acurácia. - Difícil. Construa um verificador de fidelidade para RAG: decomposição em afirmações atômicas + NLI por afirmação. Avalie em 50 respostas geradas por RAG com contexto ouro. Meça as taxas de falso positivo e falso negativo contra rótulos feitos à mão.
Termos-Chave
| Termo | O que as pessoas dizem | O que realmente significa |
|---|---|---|
| NLI | Inferência de Linguagem Natural | Classificação de 3 vias da relação premissa-hipótese. |
| RTE | Reconhecimento de Implicação Textual | Nome mais antigo para NLI; mesma tarefa. |
| Implicação | "t implica h" | Um leitor típico concluiria que h é verdadeiro dado t. |
| Contradição | "t descarta h" | Um leitor típico concluiria que h é falso dado t. |
| Neutralidade | "indefinido" | Nenhuma inferência de t para h em qualquer direção. |
| Classificação zero-shot | NLI como classificador | Verbalize rótulos como hipóteses, escolha o máximo de implicação. |
| Fidelidade | A resposta é sustentada? | NLI sobre (contexto recuperado, resposta gerada). |
Leitura Complementar
- Bowman et al. (2015). A large annotated corpus for learning natural language inference — SNLI.
- Williams, Nangia, Bowman (2017). A Broad-Coverage Challenge Corpus for Sentence Understanding through Inference — MultiNLI.
- Nie et al. (2019). Adversarial NLI — o benchmark ANLI.
- Yin, Hay, Roth (2019). Benchmarking Zero-shot Text Classification — NLI como classificador.
- He et al. (2021). DeBERTa: Decoding-enhanced BERT with Disentangled Attention — o cavalo de batalha do NLI em 2026.