Capítulo 15 de 22 · intermedio
Contexto largo y preguntas sobre documentos
Qué cubre esta sesión
Hace tres semanas construiste RAG porque un documento era demasiado grande para caber en un prompt. Los context windows modernos cambian esa cuenta. Cuando un modelo acepta cientos de miles de tokens — y algunos aceptan un millón — un montón de documentos simplemente caben, y para esos puedes saltarte el retrieval por completo: sin chunking, sin embeddings, sin vector store, sin el riesgo de que el único párrafo que necesitabas no haya entrado en el top-k. Pegas todo y preguntas.
Esto no es "contexto largo le gana a RAG" — es "sabe qué herramienta pide la situación." El contexto largo es más simple y no puede fallar, pero es más lento y más caro mientras más le metas, y no escala a un corpus que cambia o que empequeñece cualquier ventana. Esta hora trata de la capacidad y, en igual medida, del criterio de cuándo echar mano de ella.
OpenAI
Casi no hay API nueva — el documento entero entra en las instructions y el modelo responde a partir de él. Lo nuevo es la escala de lo que se te permite poner ahí.
# The entire document goes into the prompt as context. No retrieval step — the
# model reads all of it and answers from the relevant part.
def ask(document: str, question: str) -> str:
response = client.responses.create(
model=_MODEL,
instructions=f"Answer the question using this document.\n\n{document}",
input=[{"role": "user", "content": question}],
)
return response.output_text
El demo esconde un dato específico — un código de calibración — en una sección y lo pide. El modelo lo encuentra porque el manual completo está ahí mismo. Ese es el atractivo: con el documento entero en contexto, no hay paso de retrieval que salga mal. El modo de falla no es "faltaba el chunk"; es "la ventana estaba llena," y eso es mucho más fácil de razonar.
Gemini
Mismo enfoque, y los modelos de Gemini son conocidos por ventanas especialmente grandes, lo que los hace un ajuste natural para trabajo de documento completo.
def ask(document: str, question: str) -> str:
response = client.models.generate_content(
model=_MODEL,
contents=[types.Content(role="user", parts=[types.Part(text=question)])],
config=types.GenerateContentConfig(
system_instruction=f"Answer the question using this document.\n\n{document}",
),
)
return response.text or ""
Dos realidades que hay que tener presentes. Primera, "cabe en la ventana" no es lo mismo que "gratis" — pagas por cada token del prompt en cada llamada, así que reenviar un documento de 100k tokens por cada una de veinte preguntas cuesta veinte veces lo que costaría recuperar los 2k relevantes. (El prompt caching de la próxima semana suaviza exactamente esto.) Segunda, los modelos todavía pueden perder cosas en la mitad de un contexto muy largo; son más fuertes al principio y al final, así que pon la pregunta y el material más importante donde vayan a ser vistos.
Ponlo a trabajar
Tres apps de docker-compose bajo code/showcase/<slug>/. Misma rutina: bash bootstrap-secrets.sh, docker compose up --build, http://localhost:3000.
Showcase 1 — Q&A de documento completo
Pega un documento, pon tu pregunta en una línea Q: y recibe una respuesta a
partir del texto completo — RAG sin el retrieval. Úsalo lado a lado con el
doc-qa de la semana 9 y siente el tradeoff: este no puede perder un chunk, pero
relee todo cada vez.
Showcase 2 — Resumen largo
Pega un artículo o una transcripción, recibe un TL;DR y los puntos clave. Resumir es la victoria más fácil del contexto largo — la tarea genuinamente necesita ver todo, y ahora puede, sin la gimnasia de map-reduce que resumir solía requerir.
Showcase 3 — Buscador de aguja
Un muro de notas de release y de ops ya está en el prompt; pide un detalle enterrado y míralo regresar exacto. Esta es la prueba de "aguja en un pajar" con la que los labs miden los modelos de contexto largo. Prueba varios — el nombre de guardia, el rate limit, el flag de telemetría — y nota que no importa en qué parte del documento viva la respuesta.
Los tres ponen un documento completo en contexto y le hacen un tipo distinto de pregunta. Sin embeddings, sin store — solo un prompt grande y buenas instructions.
Córrelo
El README de esta carpeta tiene la versión de Python, la línea de instalación,
las dos variables de entorno y los comandos exactos. Las keys vienen del .env
sin trackear en la raíz del curso.
Lo que te llevas
El contexto largo es el anti-RAG: cuando un documento cabe en la ventana, mete todo y sáltate el retrieval por completo — sin chunking, sin embeddings, nada que perder. Échale mano cuando la fuente es un solo documento que cabe y no cambia seguido; échale mano a RAG cuando el corpus es grande, dinámico, o mucho más grande que cualquier ventana. Y respeta los dos costos que el contexto largo esconde: pagas por cada token en cada llamada (el caching ayuda, la próxima semana), y los modelos atienden mejor al principio y al final de un prompt enorme, así que coloca ahí la pregunta y el material crucial. La próxima semana volvemos explícitos el dinero y la velocidad de todo esto — prompt caching, costo y latencia.