Phase 05 - Lesson 21
Inferencia de Lenguaje Natural — Implicación Textual
"t implica h" significa que un humano que lea t concluiría que h es verdadero. NLI es la tarea de predecir implicación / contradicción / neutralidad. Aburrida en la superficie, pero estructural en producción.
Tipo: Aprender Lenguajes: Python Prerrequisitos: Fase 5 · 05 (Análisis de Sentimiento), Fase 5 · 13 (Respuesta a Preguntas) Tiempo: ~60 minutos
El Problema
Construiste un sumarizador. Produjo un resumen. ¿Cómo sabes que el resumen no contiene una alucinación?
Construiste un chatbot. Respondió "sí." ¿Cómo sabes que la respuesta está respaldada por el pasaje recuperado?
Necesitas clasificar 10.000 artículos de noticias por tema. No tienes etiquetas de entrenamiento. ¿Puedes reutilizar un modelo?
Los tres problemas se reducen a Inferencia de Lenguaje Natural. NLI pregunta: dada una premisa t y una hipótesis h, ¿h es implicada por t, contradicha, o neutral (sin relación)?
- Verificación de alucinación:
t= documento fuente,h= afirmación del resumen. No implicación = alucinación. - QA fundamentado:
t= pasaje recuperado,h= respuesta generada. No implicación = fabricación. - Clasificación zero-shot:
t= documento,h= etiqueta verbalizada ("Esto trata sobre deportes"). Implicación = etiqueta predicha.
Una tarea, tres usos en producción. Por eso todo framework de evaluación de RAG incorpora un modelo de NLI por debajo.
El Concepto
Las tres etiquetas.
- Implicación.
t→h. "El gato está en la alfombra" implica "Hay un gato." - Contradicción.
t→ ¬h. "El gato está en la alfombra" contradice "No hay gato." - Neutralidad. Ninguna inferencia en ninguna dirección. "El gato está en la alfombra" es neutral respecto a "El gato tiene hambre."
No es implicación lógica. NLI es inferencia de lenguaje natural — lo que un lector humano típico inferiría, no lógica estricta. "Juan paseó a su perro" implica "Juan tiene un perro" en NLI, pero la lógica de primer orden estricta solo lo admitiría si axiomatizaras la posesión.
Datasets.
- SNLI (2015). 570 mil pares anotados por humanos, descripciones de imágenes como premisas. Dominio acotado.
- MultiNLI (2017). 433 mil pares en 10 géneros. El corpus de entrenamiento estándar en 2026.
- ANLI (2019). NLI adversarial. Humanos escribieron ejemplos diseñados específicamente para romper modelos existentes. Más difícil.
- DocNLI, ConTRoL (2020–21). Premisas con extensión de documento. Prueban inferencia multi-hop y de largo alcance.
La arquitectura. Un encoder transformer (BERT, RoBERTa, DeBERTa) lee [CLS] premise [SEP] hypothesis [SEP]. La representación del [CLS] alimenta un softmax de 3 vías. Entrena en MNLI, evalúa en benchmarks reservados, obtén 90%+ de precisión en pares dentro de la distribución.
Zero-shot vía NLI. Dado un documento y etiquetas candidatas, convierte cada etiqueta en una hipótesis ("Este texto trata sobre deportes"). Calcula la probabilidad de implicación de cada una. Elige el máximo. Este es el mecanismo detrás del pipeline zero-shot-classification de Hugging Face.
Constrúyelo
Paso 1: ejecuta un modelo de NLI preentrenado
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 en producción, facebook/bart-large-mnli y microsoft/deberta-v3-large-mnli son los predeterminados abiertos. DeBERTa-v3 encabeza los leaderboards.
Paso 2: clasificación 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]}
La plantilla es "This example is about {label}." por defecto. Personalízala con hypothesis_template. No requiere datos de entrenamiento. Sin fine-tuning. Funciona desde el primer momento.
Paso 3: verificación de fidelidad 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 es el núcleo de la fidelidad de RAGAS. Divide la respuesta generada en afirmaciones atómicas. Verifica cada afirmación contra el contexto recuperado. Reporta la fracción que implica.
Paso 4: clasificador de NLI hecho a mano (conceptual)
Ve code/main.py para un juguete solo con la stdlib: premisa e hipótesis se comparan vía solapamiento léxico + detección de negación. No compite con modelos transformer — pero muestra la forma de la tarea: dos textos de entrada, etiqueta de 3 vías de salida, pérdida = entropía cruzada sobre {entail, contradict, neutral}.
Trampas
- Atajos solo por la hipótesis. Los modelos pueden predecir la etiqueta solo a partir de la hipótesis al ~60% en SNLI porque "not", "nobody", "never" se correlacionan con contradicción. Baseline fuerte para detectar fuga de etiqueta.
- Heurística de solapamiento léxico. La heurística de subsecuencia ("toda subsecuencia es implicada") pasa SNLI pero falla en HANS/ANLI. Usa benchmarks adversariales.
- Degradación con extensión de documento. Los modelos de NLI de oración única caen 20+ de F1 en premisas con extensión de documento. Usa modelos entrenados en DocNLI para contexto largo.
- Sensibilidad a la plantilla en zero-shot. "This example is about {label}" vs "{label}" vs "The topic is {label}" puede oscilar la precisión en 10+ puntos. Ajusta la plantilla.
- Desajuste de dominio. MNLI entrena en inglés general. El texto jurídico, médico y científico necesita modelos de NLI específicos de dominio (ej.: SciNLI, MedNLI).
Úsalo
El stack de 2026:
| Caso de uso | Modelo |
|---|---|
| NLI de propósito general | microsoft/deberta-v3-large-mnli |
| Rápido / edge | cross-encoder/nli-deberta-v3-base |
| Clasificación zero-shot (ligero) | facebook/bart-large-mnli |
| NLI a nivel de documento | MoritzLaurer/DeBERTa-v3-large-mnli-fever-anli-ling-wanli |
| Multilingüe | MoritzLaurer/multilingual-MiniLMv2-L6-mnli-xnli |
| Detección de alucinación en RAG | Capa de NLI dentro de RAGAS / DeepEval |
El meta-patrón de 2026: NLI es la cinta adhesiva de la comprensión de texto. Cada vez que necesites "¿A respalda a B?" o "¿A contradice a B?" — recurre a NLI antes de recurrir a otra llamada de LLM.
Entrégalo
Guarda 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.
Ejercicios
- Fácil. Ejecuta
facebook/bart-large-mnlien 20 triplas (premisa, hipótesis, etiqueta) hechas a mano que cubran las tres clases. Mide la precisión. Agrega trampas adversariales de "heurística de subsecuencia" ("I did not eat the cake" vs "I ate the cake") y observa si se rompe. - Medio. Compara la plantilla zero-shot
"This text is about {label}"contra"The topic is {label}"y"{label}"en 100 titulares de AG News. Reporta la oscilación de precisión. - Difícil. Construye un verificador de fidelidad para RAG: descomposición en afirmaciones atómicas + NLI por afirmación. Evalúa en 50 respuestas generadas por RAG con contexto oro. Mide las tasas de falso positivo y falso negativo contra etiquetas hechas a mano.
Términos Clave
| Término | Lo que dice la gente | Lo que realmente significa |
|---|---|---|
| NLI | Inferencia de Lenguaje Natural | Clasificación de 3 vías de la relación premisa-hipótesis. |
| RTE | Reconocimiento de Implicación Textual | Nombre más antiguo para NLI; misma tarea. |
| Implicación | "t implica h" | Un lector típico concluiría que h es verdadero dado t. |
| Contradicción | "t descarta h" | Un lector típico concluiría que h es falso dado t. |
| Neutralidad | "indefinido" | Ninguna inferencia de t a h en ninguna dirección. |
| Clasificación zero-shot | NLI como clasificador | Verbaliza etiquetas como hipótesis, elige el máximo de implicación. |
| Fidelidad | ¿La respuesta está respaldada? | NLI sobre (contexto recuperado, respuesta generada). |
Lecturas Adicionales
- 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 — el benchmark ANLI.
- Yin, Hay, Roth (2019). Benchmarking Zero-shot Text Classification — NLI como clasificador.
- He et al. (2021). DeBERTa: Decoding-enhanced BERT with Disentangled Attention — el caballo de batalla del NLI en 2026.