Phase 05 - Lesson 13
Sistemas de Preguntas y Respuestas
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
Tres sistemas dieron forma al QA moderno. El extractivo encontraba fragmentos. El aumentado por recuperacion los anclaba en documentos. El generativo producia respuestas. Todo asistente de IA moderno es una mezcla de los tres.
Tipo: Build Lenguajes: Python Prerrequisitos: Fase 5 · 11 (Traduccion Automatica), Fase 5 · 10 (Mecanismo de Atencion) Tiempo: ~75 minutos
El Problema
Un usuario escribe "Cuando se lanzo el primer iPhone?" y espera "29 de junio de 2007." No "La historia de Apple es larga y variada." No "2007" aislado, sin oracion alguna. Una respuesta directa, anclada y correcta.
Tres arquitecturas dominaron el QA en la ultima decada.
- QA extractivo. Dada una pregunta y un pasaje que se sabe contiene la respuesta, encuentra los indices de inicio y fin del fragmento de la respuesta en el pasaje. SQuAD es el benchmark canonico.
- QA de dominio abierto. El pasaje no se proporciona. Recupera primero el pasaje relevante, luego extrae o genera una respuesta. Este es el cimiento de todo pipeline RAG actual.
- QA generativo / de libro cerrado. Un gran modelo de lenguaje responde desde su memoria parametrica. Sin recuperacion. El mas rapido en inferencia, el menos confiable en hechos.
La tendencia en 2026 es hibrida: recupera los mejores pocos pasajes, luego instruye a un modelo generativo a responder anclado en esos pasajes. Eso es RAG, y la leccion 14 cubre la mitad de recuperacion en profundidad. Esta leccion construye la mitad de QA.
El Concepto
Extractivo. Codifica pregunta y pasaje juntos con un transformer (familia BERT). Entrena dos cabezas que predicen los indices de los tokens de inicio y fin de la respuesta. La perdida es entropia cruzada sobre posiciones validas. La salida es un fragmento del pasaje. Nunca alucina (por construccion), nunca maneja preguntas que el pasaje no puede responder (por construccion).
Aumentado por recuperacion (RAG). Dos etapas. Primero, un recuperador encuentra los k mejores pasajes de un corpus. Segundo, un lector (extractivo o generativo) produce la respuesta usando esos pasajes. La separacion recuperador-lector permite entrenar y evaluar cada uno de forma independiente. El RAG moderno suele agregar un reordenador entre ambos.
Generativo. Un LLM solo-decodificador (GPT, Claude, Llama) responde desde los pesos aprendidos. Sin paso de recuperacion. Excelente en conocimiento comun, catastrofico en hechos raros o recientes. La tasa de alucinacion esta inversamente correlacionada con la frecuencia del hecho en los datos de preentrenamiento.
Construyelo
Paso 1: QA extractivo con un modelo preentrenado
from transformers import pipeline
qa = pipeline("question-answering", model="deepset/roberta-base-squad2")
passage = (
"Apple Inc. released the first iPhone on June 29, 2007. "
"The device was announced by Steve Jobs at Macworld in January 2007."
)
question = "When was the first iPhone released?"
answer = qa(question=question, context=passage)
print(answer)
{'score': 0.98, 'start': 57, 'end': 70, 'answer': 'June 29, 2007'}
deepset/roberta-base-squad2 esta entrenado en SQuAD 2.0, que incluye preguntas sin respuesta. Por defecto, el pipeline question-answering devuelve el fragmento con mayor puntuacion incluso cuando gana la puntuacion nula del modelo — no devuelve automaticamente una respuesta vacia. Para obtener el comportamiento explicito de "sin respuesta", pasa handle_impossible_answer=True en la llamada al pipeline: el pipeline entonces devuelve una respuesta vacia solo cuando la puntuacion nula supera la de todo fragmento. Verifica siempre el campo score de cualquier manera.
Paso 2: un pipeline aumentado por recuperacion (boceto)
from sentence_transformers import SentenceTransformer
import numpy as np
encoder = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
corpus = [
"Apple Inc. released the first iPhone on June 29, 2007.",
"Macworld 2007 featured the iPhone announcement by Steve Jobs.",
"Android launched in 2008 as Google's mobile operating system.",
"The first iPod was released in 2001.",
]
corpus_embeddings = encoder.encode(corpus, normalize_embeddings=True)
def retrieve(question, top_k=2):
q_emb = encoder.encode([question], normalize_embeddings=True)
sims = (corpus_embeddings @ q_emb.T).squeeze()
order = np.argsort(-sims)[:top_k]
return [corpus[i] for i in order]
def answer(question):
passages = retrieve(question, top_k=2)
combined = " ".join(passages)
return qa(question=question, context=combined)
print(answer("When was the first iPhone released?"))
Pipeline de dos etapas. El recuperador denso (Sentence-BERT) encuentra pasajes relevantes por similitud semantica. El lector extractivo (RoBERTa-SQuAD) extrae el fragmento de la respuesta de los mejores pasajes combinados. Funciona en corpus pequenos. Para un corpus de un millon de documentos, usa FAISS o una base de datos vectorial.
Paso 3: generativo con RAG
def rag_generate(question, llm):
passages = retrieve(question, top_k=3)
prompt = f"""Context:
{chr(10).join('- ' + p for p in passages)}
Question: {question}
Answer using only the context above. If the context does not contain the answer, say "I don't know."
"""
return llm(prompt)
El patron del prompt importa. Instruir explicitamente al modelo a anclarse en el contexto y devolver "I don't know" cuando el contexto es insuficiente reduce las tasas de alucinacion en un 40-60% comparado con un prompt ingenuo. Patrones mas elaborados agregan citas, puntuaciones de confianza y extraccion estructurada.
Paso 4: evaluacion que refleja el mundo real
SQuAD usa Exact Match (EM) y F1 a nivel de token. EM es una coincidencia estricta tras la normalizacion (minusculas, eliminar puntuacion, quitar articulos) — o la prediccion coincide exactamente o puntua 0. El F1 se calcula sobre el solapamiento de tokens entre prediccion y referencia y otorga credito parcial. Ambos sub-acreditan las parafrasis: "June 29, 2007" vs "June 29th, 2007" tipicamente obtiene 0 de EM (el ordinal rompe la normalizacion) pero aun gana un F1 sustancial por el solapamiento de tokens.
Para QA en produccion:
- Exactitud de la respuesta (juzgada por LLM o por humano, ya que las metricas no capturan la equivalencia semantica).
- Exactitud de la cita. El pasaje citado realmente respalda la respuesta? Trivial de verificar automaticamente con coincidencia de cadenas entre las citas generadas y los pasajes recuperados.
- Calibracion del rechazo. Cuando la respuesta no esta en los pasajes recuperados, el sistema dice correctamente "I don't know"? Mide la tasa de confianza falsa.
- Recall de recuperacion. Antes de evaluar al lector, mide si el recuperador coloca el pasaje correcto entre los
kmejores. Un lector no puede arreglar un pasaje ausente.
RAGAS: el framework de evaluacion de produccion de 2026
RAGAS esta hecho a medida para sistemas RAG y es el estandar de uso en 2026. Puntua cuatro dimensiones sin requerir referencias de oro:
- Fidelidad. Cada afirmacion en la respuesta proviene del contexto recuperado? Medida por entailment basado en NLI. Tu metrica principal de alucinacion.
- Relevancia de la respuesta. La respuesta aborda la pregunta? Medida generando preguntas hipoteticas a partir de la respuesta y comparandolas con la pregunta real.
- Precision del contexto. De los fragmentos recuperados, que fraccion era realmente relevante? Baja precision = ruido en el prompt.
- Recall del contexto. El conjunto recuperado contenia toda la informacion necesaria? Bajo recall = el lector no puede tener exito.
La puntuacion sin referencia permite evaluar sobre trafico de produccion en vivo sin respuestas de oro curadas. Agrega el LLM-como-juez encima para preguntas abiertas donde las metricas de coincidencia exacta son inutiles.
pip install ragas. Conecta tu recuperador + lector. Obtiene cuatro escalares por consulta. Alerta ante regresiones.
Usalo
El stack de 2026.
| Caso de uso | Recomendado |
|---|---|
| Dado un pasaje, encontrar el fragmento de la respuesta | deepset/roberta-base-squad2 |
| Sobre un corpus fijo, libro cerrado inaceptable | RAG: recuperador denso + lector LLM |
| En tiempo real sobre un almacen de documentos | RAG con recuperador hibrido (BM25 + denso) + reordenador (leccion 14) |
| QA conversacional (preguntas de seguimiento) | LLM con historial de conversacion + RAG en cada turno |
| Dominios altamente factuales y regulados | Extractivo sobre un corpus autoritativo; nunca generativo solo |
El QA extractivo esta pasado de moda en 2026 porque el RAG con LLMs maneja mas casos. Aun se usa en contextos donde se requiere cita literal: investigacion legal, cumplimiento regulatorio, herramientas de auditoria.
Entregalo
Guarda como outputs/skill-qa-architect.md:
---
name: qa-architect
description: Choose QA architecture, retrieval strategy, and evaluation plan.
version: 1.0.0
phase: 5
lesson: 13
tags: [nlp, qa, rag]
---
Given requirements (corpus size, question type, factuality constraint, latency budget), output:
1. Architecture. Extractive, RAG with extractive reader, RAG with generative reader, or closed-book LLM. One-sentence reason.
2. Retriever. None, BM25, dense (name the encoder), or hybrid.
3. Reader. SQuAD-tuned model, LLM by name, or "domain-fine-tuned DistilBERT."
4. Evaluation. EM + F1 for extractive benchmarks; answer accuracy + citation accuracy + refusal calibration for production. Name what you are measuring and how you are measuring it.
Refuse closed-book LLM answers for regulatory or compliance-sensitive questions. Refuse any QA system without a retrieval-recall baseline (you cannot evaluate the reader without knowing the retriever surfaced the right passage). Flag questions that require multi-hop reasoning as needing specialized multi-hop retrievers like HotpotQA-trained systems.
Ejercicios
- Facil. Configura el pipeline extractivo SQuAD anterior sobre 10 pasajes de Wikipedia. Elabora 10 preguntas a mano. Mide con que frecuencia la respuesta es correcta. Deberias ver 7-9 correctas si los pasajes y las preguntas estan limpios.
- Medio. Agrega un clasificador de rechazo. Cuando la puntuacion de la mejor recuperacion este por debajo de un umbral (digamos 0,3 de coseno), devuelve "I don't know" en lugar de llamar al lector. Ajusta el umbral en un conjunto reservado.
- Dificil. Construye un pipeline RAG sobre un corpus de 10.000 documentos de tu eleccion. Implementa recuperacion hibrida (BM25 + densa) con fusion RRF (ver leccion 14). Mide la exactitud de la respuesta con y sin el paso hibrido. Documenta que tipos de pregunta se benefician mas.
Terminos Clave
| Termino | Lo que la gente dice | Lo que realmente significa |
|---|---|---|
| QA extractivo | Encontrar el fragmento de la respuesta | Predecir los indices de inicio y fin de la respuesta dentro de un pasaje dado. |
| QA de dominio abierto | QA sobre un corpus | Sin pasaje dado; debe recuperar y luego responder. |
| RAG | Recuperar y luego generar | Generacion aumentada por recuperacion. Pipeline recuperador + lector. |
| SQuAD | Benchmark canonico | Stanford Question Answering Dataset. Metricas EM + F1. |
| Alucinacion | Respuesta inventada | Salida del lector no respaldada por el contexto recuperado. |
| Calibracion del rechazo | Saber cuando callar | El sistema dice correctamente "I don't know" cuando es incapaz de responder. |
Lectura Adicional
- Rajpurkar et al. (2016). SQuAD: 100,000+ Questions for Machine Comprehension of Text — el articulo del benchmark.
- Karpukhin et al. (2020). Dense Passage Retrieval for Open-Domain QA — DPR, el recuperador denso canonico para QA.
- Lewis et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks — el articulo que nombro al RAG.
- Gao et al. (2023). Retrieval-Augmented Generation for Large Language Models: A Survey — estudio exhaustivo sobre RAG.