Cada respuesta fallida de RAG que depuré en producción tuvo la misma causa raíz: el retriever nunca vio la respuesta. La cláusula de excepción estaba en el documento, el modelo de embeddings funcionaba, el LLM era capaz — pero el chunk con la frase clave se había cortado justo en el peor borde, así que su vector no matcheó con nada.
En este deep-dive te muestro cómo cortar documentos para que la recuperación deje de fallar: chunking fijo vs recursivo vs semántico vs tardío, qué tamaño de chunk y overlap respaldan los benchmarks 2026, y un tutorial Python que podés correr sobre tu propio corpus esta tarde.
1. El Problema: Buenos Documentos, Chunks Rotos
El chunking decide la calidad de recuperación antes de que tu modelo de embeddings vea el texto. Si un chunk mezcla dos temas, su vector cae a mitad de camino y no matchea bien ninguna query. Si contiene “el límite” sin antecedente, el embedder no puede desambiguar cuál límite. Y si una tabla se corta entre filas, los fragmentos son inútiles al generar. La guía de Weaviate de septiembre 2025 lo cuantifica: hasta 9% de brecha en recall entre el mejor y el peor chunking sobre el mismo corpus con el mismo retriever.
El Error Más Común
Optimizar el modelo de embeddings antes de arreglar los chunks. Los equipos cambian embedders, agregan rerankers y agrandan el LLM dejando el chunking en el default de la librería — y se preguntan por qué la recuperación sigue mediocre. El estudio peer-reviewed de Vectara en NAACL 2025 advierte en la otra dirección: sobre documentos realistas, el chunking fijo superó consistentemente al semántico, así que “más inteligente suena mejor” tampoco es estrategia. Medí sobre tu corpus y después decidí.
Esta guía te da un camino defendible: empezá con splits recursivos de 512 tokens, ajustá el tamaño a tu tipo de query, y pasá a chunking semántico, tardío o contextual solo cuando tus propias métricas justifiquen el costo extra. Cada número abajo viene de un benchmark publicado en Fuentes — tratá los números de vendors como direccionales y tus propios scores RAGAS como desempate.
2. Conceptos Mínimos: Seis Estrategias en Cinco Minutos
En 2026 realmente hay solo seis jugadas, y cada una ataca una falla distinta: coherencia (un tema por chunk), autocontención (sin referencias colgadas) y granularidad de recall (lo bastante chico para que la respuesta domine el vector del chunk). Este es el menú completo antes de medir nada.
Tamaño Fijo
256–512 tokens · El más rápido
Corta cada N caracteres sin mirar el contenido. Cero overhead y tamaños predecibles, pero parte oraciones y tablas por la mitad. Solo para prototipar — nunca el default de producción.
Recursivo
Default de LangChain · 256–1024 tokens
Prueba separadores en orden — párrafos, líneas, oraciones, palabras — antes del corte duro. La mayoría de cortes caen en bordes naturales. El default más seguro: el recursivo de 512 tokens ganó un benchmark de siete estrategias en febrero 2026.
Semántico
Bordes por embeddings · Tamaño variable
Corta donde cae la similitud de embeddings entre oraciones. Mejor recall en la eval de Chroma (91.9%) pero peor accuracy end-to-end que el recursivo en el test de FloTorch (54% vs 69%) — los fragmentos chicos recuperan bien y responden mal. Unas 14× más lento de indexar según Chonkie.
Late Chunking
Jina AI, 2024 · Todo el doc primero
Embebe el documento entero con un modelo de contexto largo y después promedia vectores de tokens en vectores de chunks — cada chunk hereda contexto gratis. Arregla el dolor de correferencia de “el límite”. Requiere un modelo que exponga vectores de tokens (jina-embeddings-v3, nomic-embed-text, BGE-M3).
Contextual Retrieval
Anthropic, sep 2024 · Preámbulo de 50–100 tokens
Un LLM escribe un contexto corto que ubica cada chunk en su documento, antepuesto antes de embeber y de BM25. Redujo fallos top-20 un 35% solo, 49% con BM25 contextual, 67% con reranking (5.7% → 1.9%) en las evals de Anthropic.
Padre–Hijo
Chico-a-grande · 256 / 1024 tokens
Busca sobre chunks hijos chicos para precisión y entrega el chunk padre al LLM para contexto. El equipo que reemplazó Graph RAG lento en producción usó padres de 1024 con hijos de 256 y subió F1 factual de 0.61 a 0.84 en contratos legales.
Mi Default Recomendado
RecursiveCharacterTextSplitter en 512 tokens con 50–100 de overlap, contados con un tokenizer real. Es la configuración que sigue ganando benchmarks generales, cuesta 1× al indexar y lleva tres líneas de código. Todo lo de abajo trata de saber exactamente cuándo abandonarla.
3. Tamaño de Chunk y Overlap: Lo Que Dicen los Números
El tamaño de chunk es el hiperparámetro de mayor leverage del pipeline — la investigación de NVIDIA encontró que errarle por un bracket degrada la precisión de contexto 15–30%. El overlap, en cambio, perdió su estatus de “siempre agregalo”: un análisis sistemático de enero 2026 no encontró beneficio medible en recuperación dispersa, solo mayor costo de indexado. Tratá ambos como ajustables con los rangos de abajo.
📏 Tamaño de Chunk por Tipo de Query
256–512 tokens
QA factual — la respuesta es una frase en la fuente. Los chunks chicos concentran la respuesta en el vector. Bracket del benchmark de NVIDIA.
512–1.024 tokens
Queries analíticas y multi-hop — el LLM necesita el contexto alrededor para razonar. Bracket del benchmark de NVIDIA.
200–400 tokens
QA sobre docs técnicas — el punto dulce para text-embedding-3-large y Cohere embed-english-v3.0 en benchmarks de vendors.
800–1.200 tokens
Resúmenes y razonamiento comparativo — las ventanas grandes ganan porque la respuesta necesita el pasaje que la rodea.
50–200 tokens
Búsqueda de código — cortá en bordes de función o clase, nunca por conteo de tokens, con el path del archivo antepuesto para desambiguar.
Sin chunking
Docs cortos autocontenidos (FAQs, descripciones de producto) — los tests 2026 de Firecrawl muestran que chunkear acá daña. Un doc, un chunk.
🔗 Reglas de Overlap
10–20% por default
50–100 tokens sobre un chunk de 512. Recupera respuestas a caballo de un borde sin inundar el índice de casi-duplicados.
25% si el recall flojea
128 tokens sobre un chunk de 512 según la guía de Microsoft Azure. Subí el overlap solo después de medir un problema de bordes.
0% con cortes semánticos
Cuando los cortes ya caen sobre cambios de tema, el overlap no agrega recall medible. Cero es un valor válido y más barato.
📚 De Dónde Salen Estos Números
Weaviate, sep 2025
9% de brecha en recall mejor vs peor
Anthropic, sep 2024
Cortes de fallos 35% / 49% / 67%
Benchmark NVIDIA
Brackets de tamaño por tipo de query
Estudio LlamaIndex
1024 tokens cerca del pico de faithfulness
Benches Chonkie
Semántico ~14× más lento de indexar
arXiv, ene 2026
Overlap sin beneficio para SPLADE
Tip: Contá Tokens, No Caracteres
Pasá un tokenizer real como length_function en vez de len — los conteos de caracteres y tokens divergen fuerte en código, URLs y texto no-ASCII. Con cl100k_base de tiktoken tu presupuesto de 512 tokens significa lo mismo para el splitter y para el modelo de embeddings.
4. Tutorial: De Docs Crudos a Chunks Medidos
Hasta acá la teoría. El flujo de abajo corre sobre tu corpus en una tarde: armá un golden set de 50 preguntas desde logs reales, barré tamaños recursivos, compará contra semántico y quedate con el que gane en tus métricas — no en el chart de un vendor. Si usás LlamaIndex en vez de LangChain, el punto de entrada equivalente es SentenceSplitter desde llama_index.core.node_parser con los mismos argumentos chunk_size y chunk_overlap.
🛠️ Los Cinco Pasos
Paso 1 — Golden set
Juntá 50 preguntas representativas con spans de respuesta conocidos (offsets de caracteres en el doc fuente). Guardá spans, no índices de chunk — los índices cambian cuando re-chunkeás.
Paso 2 — Barrido recursivo
Corré 256, 512 y 1024 tokens con 10–20% de overlap con el harness del bloque 1. Rankeá por recall@10 y tasa de fallos top-20.
Paso 3 — Desafiante semántico
Corré el bloque 2 sobre el mismo golden set. Mirá el tamaño promedio de chunk — si los fragmentos promedian menos de ~100 tokens, esperá la paradoja FloTorch: gran recall, respuestas débiles.
Paso 4 — Ruteá por tipo
Markdown por splitting de headers primero, código por splitting por lenguaje, tablas por filas, prosa por el ganador de los pasos 2–3.
Paso 5 — Congelá y monitoreá
Congelá al ganador, cableá recall@k en CI y re-corré el barrido cuando cambie la mezcla del corpus. El chunking deriva en silencio cuando cambian los documentos.
📊 Qué Medir
recall@k + tasa de fallos
Trackeá recall@10 y 1-menos-recall@20. Reportá recall@1 y recall@10 — recall@10 esconde misses catastróficos en top-1.
Accuracy end-to-end
Un chunk que recupera bien pero responde mal sigue siendo un mal chunk. Puntuá respuestas finales, no solo recuperación.
Stats de forma
Cantidad de chunks, tamaño promedio/mín/máx. Los fragmentos diminutos y los mega-chunks son las dos firmas de una config rota.
Costo y latencia
Costo de indexado por millón de chunks y latencia p95 por query. Lo semántico cuesta 2–5× al ingerir; el reranking cuesta latencia por query.
Código 1 — Barrido recursivo de tamaños (LangChain)
from langchain_text_splitters import RecursiveCharacterTextSplitter
with open("docs/manual.txt", encoding="utf-8") as f:
text = f.read()
for chunk_size, chunk_overlap in [(256, 25), (512, 50), (1024, 100)]:
splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap,
length_function=len,
)
chunks = splitter.split_text(text)
sizes = [len(c.split()) for c in chunks]
avg = sum(sizes) / len(sizes)
print(f"{chunk_size}/{chunk_overlap} -> {len(chunks)} chunks, avg {avg:.0f} words")Código 2 — Desafiante semántico (langchain-text-splitters)
from langchain_text_splitters import SemanticChunker # core desde PR #35668; la ruta langchain_experimental es legacy
from langchain_openai.embeddings import OpenAIEmbeddings
splitter = SemanticChunker(
OpenAIEmbeddings(model="text-embedding-3-small"),
breakpoint_threshold_type="percentile",
breakpoint_threshold_amount=95,
)
docs = splitter.create_documents([text])
print(f"Semantic chunking produced {len(docs)} chunks")
for i, doc in enumerate(docs[:3]):
print(f"--- chunk {i} ({len(doc.page_content)} chars) ---")5. Contextual Retrieval y Late Chunking en la Práctica
Cuando el barrido se estanca, estas dos técnicas atacan los fallos restantes desde lados opuestos. Contextual retrieval fuerza la autocontención con un preámbulo LLM de 50–100 tokens por chunk; late chunking obtiene contexto intra-documento gratis embebiendo todo el documento antes de agrupar en chunks. Combinan bien — primero late-chunk, después anteponé contexto — y ninguna agrega latencia por query porque todo el trabajo ocurre al ingerir.
Preámbulo contextual
Una llamada LLM por chunk sobre el documento completo cacheado. El contexto de 50–100 tokens viaja delante del texto intacto del chunk como superficie extra de recuperación. Solo esto cortó los fallos top-20 de Anthropic un 35%.
BM25 contextual
Corré BM25 sobre el mismo texto contextualizado, no sobre los chunks crudos — ese solo detalle mueve la ablación de 35% a 49%. Lo denso captura significado, lo léxico captura códigos de error e identificadores.
Rerank top-150 a 20
Un cross-encoder re-puntúa candidatos fusionados por query. Esto es lo que lleva el stack a la reducción total de 67% — al precio de latencia por query, así que presupuestala explícito.
Late chunking
Embebé una vez con jina-embeddings-v3 (o nomic-embed-text, BGE-M3) y después promediá vectores de tokens en vectores de chunks. La API de OpenAI no expone vectores de tokens, así que este camino está cerrado si estás atado a ella.
Prompt caching
Cacheá el documento una vez y reutilizalo para cada llamada de contexto — cerca de $1 por millón de chunks con un modelo clase Haiku. Sin caching la misma ingesta cuesta 10–30× más.
Código 3 — La misma idea en LlamaIndex
from llama_index.core import Document
from llama_index.core.node_parser import SentenceSplitter
splitter = SentenceSplitter(chunk_size=512, chunk_overlap=50)
nodes = splitter.get_nodes_from_documents([Document(text=text)])
chunks = [n.text for n in nodes]
print(f"SentenceSplitter produced {len(chunks)} chunks")Código 4 — Patrón de preámbulo contextual (receta Anthropic)
CONTEXT_PROMPT = (
"<document>{doc}</document>
"
"Here is the chunk to situate within the whole document.
"
"<chunk>{chunk}</chunk>
"
"Reply with a 50-100 token context for this chunk."
)
# Prepend before BOTH embedding and BM25 indexing
contextualized = context + "
" + chunk6. Camino de Decisión: Qué Estrategia para Tus Docs
No hay un ganador universal — la victoria recursiva de FloTorch, la corona de recall semántico de Chroma y el triunfo de page-level de NVIDIA salieron de distintos corpus. Recorré el camino de abajo en orden y frená en el primer paso cuya evidencia matchee tus documentos.
☀️ Empezá Acá (Una Tarde)
- 1. Splitting recursivo en 512 tokens con 10–20% de overlap, contado por tokens. Esta es la configuración detrás del récord de 69% accuracy end-to-end sobre papers académicos.
- 2. Puntuala sobre 50 queries doradas de tus propios logs antes de tocar nada más.
- 3. Si dominan los docs cortos, testeá también sin chunking — una FAQ, un chunk.
📅 Ramificá por Tipo de Documento
- PDFs paginados: Probá chunking por página — ganó los benchmarks 2024 de NVIDIA sobre documentos financieros.
- Markdown / HTML: Cortá por headers primero y recursivo dentro de cada sección. Los headings ya codifican estructura temática mejor de lo que los embeddings pueden inferir.
- Código + tablas: Splitting por lenguaje en bordes de función, por filas para tablas. Nunca dejes que una ventana fija parta una función o una fila al medio.
📆 Graduá Solo con Evidencia
- Semántico: Cuando la prosa narrativa derrota al recursivo y los fragmentos se mantienen sobre ~200 tokens. Presupuestá 2–5× de costo de ingesta.
- Late chunking: Cuando las cross-referencias densas (“el límite”, “esa política”) derrotan todo lo demás y los docs entran en la ventana del embedder.
- Contextual + rerank: Cuando los chunks son pobres en contexto solos — contratos, manuales, reportes densos — y la escalera 35 → 49 → 67% reproduce en tus evals.
7. Errores Comunes Que Matan la Recuperación
En cada post-mortem de benchmarks 2026 que leí, los mismos cinco fallos aparecían una y otra vez. Todos son baratos de evitar una vez que los viste nombrados — y caros de depurar como “los embeddings deben estar mal”.
✅ Hacé
- • Evaluá cambios de chunking con recall@k más accuracy end-to-end de respuestas
- • Guardá spans dorados como offsets de caracteres, no índices de chunk
- • Ajustá el tamaño al tipo de query: chico para hechos, grande para análisis
- • Re-corré el barrido cuando cambie la mezcla del corpus — el chunking deriva
- • Aplicá BM25 y reranking sobre texto contextualizado, no chunks crudos
- • Tratá el acantilado de contexto de ~2.500 tokens como techo por chunk
❌ No Hagas
- • Defaultear a chunking semántico porque suena más sofisticado
- • Asumir que el overlap siempre ayuda — testeá overlap cero en cortes semánticos
- • Re-chunkear en query time — chunkeá una vez al ingerir
- • Esperar que los scores MTEB de embeddings predigan tu dominio
- • Shippear chunking por página en docs sin estructura real de páginas
- • Leer los números headline de vendors como promesas para tu corpus
Regla de oro
Cortá deliberadamente, medí sin piedad. El chunking es la palanca más barata de RAG y la más ignorada — un swing de 9% en recall te cuesta nada más que una tarde de barridos, mientras un modelo más grande te factura para siempre.
Conclusión
La evidencia 2026 apunta en una dirección: empezá con splits recursivos de 512 tokens contados por un tokenizer real, dimensioná los chunks a tu tipo de query, y agregá maquinaria semántica, tardía o contextual solo cuando tu propio golden set diga que el costo extra compra accuracy. La escalera 35 → 49 → 67% de contextual retrieval y la correferencia gratis de late chunking son herramientas reales, no magia — reproducilas sobre tus datos.
Corré tu primer barrido esta semana: 50 preguntas, tres tamaños, una tarde. Los equipos que miden chunking dejan de apagar incendios de recuperación en producción — y todo lo downstream, del reranking a la generación, mejora gratis.
Receta de Producción: Resumen
Chunking
- • Recursivo 512 + 10–20% overlap
- • Tamaño por tipo de query
- • Ruteá Markdown / código / tablas
Enriquecimiento
- • Contexto de 50–100 tokens
- • BM25 contextual + rerank
- • Late chunk para cross-refs
Medición
- • 50 queries doradas por spans
- • recall@k + accuracy end-to-end
- • Re-barrido ante drift
Fuentes
- Anthropic — Contextual Retrieval (sep 2024): cortes de fallos 35% / 49% / 67%
- PremAI — RAG Chunking Strategies: The 2026 Benchmark Guide
- Firecrawl — Best Chunking Strategies for RAG in 2026
- Docs LangChain — Guía de recursive text splitter
- Digital Applied — RAG Chunking Strategies: A 2026 Retrieval Playbook
- Jina AI — Paper Late Chunking (arXiv:2409.04701)



