Avanzado 11 minOptimización

Estrategias de chunking

Respuesta directa

Para un RAG local, empieza con fragmentos de 300 a 500 tokens con un solapamiento del 0 al 10 %, divididos por párrafos y títulos en lugar de por caracteres, y luego evalúa los resultados con tus propias preguntas antes de ajustar. No se ha demostrado que el chunking semántico compense su coste: un estudio de 2024 concluye que sus mejoras no justifican el cálculo adicional. El ajuste más importante es dividir el texto en sus límites naturales.

La división de los documentos en pasajes determina lo que la búsqueda puede recuperar: un pasaje cortado en el lugar equivocado nunca contiene la respuesta completa; uno demasiado amplio ahoga la respuesta entre el ruido. Esta guía compara las estrategias habituales, ofrece tamaños iniciales respaldados por estudios publicados, advierte de la trampa de las unidades (tokens o caracteres) y propone un protocolo para comprobar tu elección con tus documentos.

Por Mohamed Meguedmi·Actualización 2026-09-30·Probado en Windows, macOS y Linux

#¿Por qué el chunking pesa tanto como el modelo de embedding?

El chunking es la operación que divide un documento en pasajes antes de indexarlos: cada pasaje recibe un vector, y lo que se recupera y se transmite al modelo de lenguaje es un pasaje, nunca el documento completo. Todo lo que viene después depende de esta división. Si la frase que responde a la pregunta queda dividida entre dos pasajes, ninguno de los dos la contiene completa y la búsqueda no la encuentra; si el pasaje mezcla tres temas, su vector es un promedio difuso que no guarda una semejanza clara con ninguna pregunta. Un embedding más potente no corrige una división deficiente, puesto que solo puede vectorizar lo que se le proporciona.

Un estudio de Chroma sobre la evaluación de estrategias de división lo demuestra: los métodos heurísticos como RecursiveCharacterTextSplitter suelen dar buenos resultados en la práctica cuando están bien configurados, y los resultados varían notablemente según el tamaño y el solapamiento elegidos. Por tanto, esta guía no promete ninguna mejora cuantificada de carácter general: lo único fiable es medir los resultados con tus documentos.

i
Un buen chunk
Un buen fragmento contiene una idea completa que se entiende por sí sola. Si es demasiado pequeño, la idea queda incompleta y el vector resulta impreciso; si es demasiado grande, se mezclan varias ideas y la búsqueda devuelve ruido.

#¿Qué tamaño de chunk elegir?

El kit RAG Local

Tus documentos, tu IA: un RAG local fiable sobre tus PDF, notas y correos — sin enviar nada a la nube.

  • Espacio en línea de por vida
  • PDF + archivos
  • Reembolsado 30 j

No existe un tamaño universal, pero sí hay valores de referencia. En el estudio de Chroma, la estrategia recursiva supera la segmentación por tokens para tamaños de 400 tokens o menos sin solapamiento, y el comportamiento difiere para tamaños mayores y con solapamiento. La configuración predeterminada de la herramienta de búsqueda de archivos de OpenAI, 800 tokens con 400 de solapamiento, obtiene en este banco de pruebas un recall ligeramente inferior a la media y las puntuaciones más bajas en las demás métricas. Los valores de referencia que aparecen a continuación se derivan de estos resultados, sin pretender ser exactos para tu corpus.

Tamaños iniciales según el tipo de documento y pregunta
TamañoAdecuado paraRiesgo
200 a 300 tokensPreguntas factuales precisas (una fecha, una cláusula, un valor) en documentos densosPierde el contexto alrededor de la respuesta; piensa en incluir el título de sección
300 a 500 tokensPunto de partida general para documentación, procedimientos, artículosPocos riesgos; es la zona que conviene probar primero
500 a 800 tokensTextos argumentativos cuyas ideas se extienden en varios párrafosEl vector diluye varias ideas; el prompt se llena más rápido
Más de 1.000 tokensRara vez adecuado para la búsqueda; reservarlo para un nivel padre en una segmentación jerárquicaVector demasiado general, pasajes difíciles de clasificar
→
Punto de partida
Empieza con 400 tokens y un solapamiento de 0 a 50 tokens, prueba 250 y 700, y solo cambia después de haber medido el recall en tus preguntas.

#Tokens o caracteres: la trampa de las unidades

No todas las bibliotecas cuentan en la misma unidad. El SentenceSplitter de LlamaIndex expresa chunk_size y chunk_overlap en tokens, con valores predeterminados de 1024 y 200 según su documentación. Otras herramientas, como el RecursiveCharacterTextSplitter de LangChain, cuentan por defecto en caracteres; revisa el parámetro length_function de tu versión. Establecer «500» en uno u otro da fragmentos cuyo tamaño difiere aproximadamente por un factor de cuatro. Segunda restricción: el modelo de embedding tiene su propia longitud máxima de entrada. El modelo BGE-M3 admite entradas de hasta 8 192 tokens según su ficha; otros modelos de embedding, más antiguos o más ligeros, admiten bastante menos, y si se supera ese límite, se ignora el final del pasaje. Comprueba el límite de tu modelo antes de elegir el tamaño y cuenta usando el tokenizer del modelo, en lugar de hacerlo a ojo.

#Solapamiento: útil, pero no siempre

El solapamiento repite el final de un chunk al principio del siguiente para que una frase cortada en el límite siga siendo legible al menos en uno de los dos. Tiene un coste: más chunks, un índice más grande y duplicados en los resultados. El estudio de Chroma señala que reducir el solapamiento mejora la puntuación IoU, una métrica que penaliza la información redundante. El solapamiento se justifica si divides el texto en fragmentos de tamaño fijo; importa menos si ya lo divides por párrafos y títulos, puesto que los cortes coinciden entonces con los límites naturales.

0 tokens
Suficiente con una división en fragmentos por párrafos o por estructura; la opción más económica.
10 a 15 % del tamaño
Buen equilibrio cuando se divide el texto por frases o caracteres.
Más del 25 por ciento
Raramente justificado: mucha redundancia, pasajes casi idénticos en los resultados.

#Estrategias de partición, desde la más sencilla hasta la más costosa

#1. Por un número fijo de caracteres

Cortar cada N caracteres o tokens, sin examinar el texto. Es el método más sencillo y el más destructivo: corta en medio de palabras, frases y tablas. Reservarlo para prototipos.

#2. Por párrafos o por frases

Cortar en dobles saltos de línea o en puntuación, luego agrupar unidades hasta alcanzar el tamaño objetivo. Mejora significativa sin costo, ya que cada chunk comienza y termina en una frontera natural.

#3. Recursivo

Primero se prueban los separadores de unidades más grandes (párrafo, línea, frase, espacio), y solo se llega al nivel de los caracteres como último recurso. Este es el comportamiento predeterminado en los principales frameworks y una base sólida: el estudio de Chroma constata que este tipo de división, con los parámetros adecuados, suele dar buenos resultados.

#4. Según la estructura del documento

Se respetan los títulos, las listas, las tablas y los bloques de código. El MarkdownNodeParser de LlamaIndex, por ejemplo, divide el contenido según los títulos y adjunta a cada nodo la ruta de títulos que conduce hasta él, lo que proporciona al pasaje un contexto que su texto por sí solo no ofrece. Es la mejor opción para documentación técnica, wikis y páginas HTML exportadas.

#5. Semántica

Se calcula un embedding por frase, luego se corta donde la similitud baja entre dos frases vecinas. En LlamaIndex, el SemanticSplitterNodeParser toma un buffer_size (número de frases comparadas juntas, 1 por defecto) y un breakpoint_percentile_threshold (95 por defecto; un valor más bajo crea más nodos). El costo es un cálculo adicional de embeddings durante la indexación, y el beneficio no está establecido: un estudio de octubre de 2024 sobre tres tareas de recuperación concluye que los costos de cálculo del corte semántico no se justifican con ganancias de rendimiento constantes. Pruébalo en tu corpus antes de adoptarlo.

#6. Jerárquico (padre e hijo)

Indexamos fragmentos pequeños para lograr precisión en la búsqueda y enviamos al modelo el bloque padre más grande para aportar contexto. El HierarchicalNodeParser de LlamaIndex produce este tipo de jerarquía, por ejemplo con tres niveles de 2048, 512 y 128 tokens según su documentación. Es la respuesta a los pasajes largos: sin limitarse solo a fragmentos pequeños ni solo a fragmentos grandes.

¿Qué estrategia para qué documento?
Tipo de documentoEstrategia recomendada
Documentación, wiki, Markdown, HTMLPor estructura (títulos) y luego de forma recursiva dentro de las secciones largas
Contratos, textos jurídicosEstructura por artículos o cláusulas; tamaño de 300 a 500 tokens; título del artículo repetido en cada chunk
Prosa libre sin estructura (correos, notas, transcripciones)Recursivo, con un solapamiento del 10 %, posiblemente jerárquico
PDF con tablasExtracción previa de la estructura, una tabla por chunk o por fila según las preguntas
Código fuenteDivisión por función o por clase, nunca en medio de un bloque

#Implementaciones con LlamaIndex

División por frases con superposición
from llama_index.core.node_parser import SentenceSplitter

splitter = SentenceSplitter(chunk_size=400, chunk_overlap=40)  # en tokens
nodes = splitter.get_nodes_from_documents(docs)
Según la estructura Markdown
from llama_index.core.node_parser import MarkdownNodeParser

parser = MarkdownNodeParser()
nodes = parser.get_nodes_from_documents(docs)
# le chemin des titres est stocké dans les métadonnées de chaque nœud
Jerárquico
from llama_index.core.node_parser import HierarchicalNodeParser, get_leaf_nodes

parser = HierarchicalNodeParser.from_defaults(chunk_sizes=[2048, 512, 128])
nodes = parser.get_nodes_from_documents(docs)
leaves = get_leaf_nodes(nodes)  # ce sont les feuilles qu'on vectorise
Semántica (probar antes de adoptarla)
from llama_index.core.node_parser import SemanticSplitterNodeParser
from llama_index.embeddings.huggingface import HuggingFaceEmbedding

embed = HuggingFaceEmbedding(model_name="BAAI/bge-m3")
splitter = SemanticSplitterNodeParser(embed_model=embed, buffer_size=1, breakpoint_percentile_threshold=95)
nodes = splitter.get_nodes_from_documents(docs)

#Volver a dar contexto a cada chunk

Un fragmento extraído de su documento pierde sus referencias: «El plazo es de 30 días» no indica de qué se trata. Tres prácticas sencillas lo solucionan. Anteponer a cada chunk el título del documento y la ruta de la sección; almacenar esta información en metadatos para filtrar (por fecha, por fuente, por tipo de documento); y, para los fragmentos que comiencen por un pronombre o una referencia («esta cláusula»), considerar el nivel padre de la segmentación jerárquica. A menudo basta una sola línea de contexto antes del texto, y cuesta mucho menos que cambiar de modelo.

#Evaluar tu chunking antes de fijarlo

  1. 01
    Escribir 30 a 50 preguntas reales
    Preguntas que harían tus usuarios, cada una con el pasaje de la fuente que se espera obtener; redáctalas antes de ver los resultados.
  2. 02
    Indexar con dos o tres configuraciones
    Por ejemplo, 250, 400 y 700 tokens, con un solapamiento del 0 % y del 10 %. Mantén los demás parámetros iguales.
  3. 03
    Medir la exhaustividad en los 5 primeros resultados
    Para cada pregunta, ¿el pasaje esperado aparece en los 5 primeros resultados? El porcentaje da el recall@5.
  4. 04
    Ver también la precisión y la redundancia
    Un ajuste con el mismo recall y resultados más variados es mejor. Cuenta los duplicados entre los 5 primeros resultados.
  5. 05
    Leer los errores uno por uno
    Para cada pregunta mal respondida, abre el chunk que debería haber proporcionado la respuesta: ¿está cortado, es demasiado amplio o el fragmento extraído está dañado? La causa determina la corrección.

#Errores frecuentes

Tablas rotas
Un extractor de PDF que aplana una tabla produce líneas de celdas sin sentido: extrae primero la estructura, antes de dividir el contenido en fragmentos.
Bloques de código cortados
Un segmentador que no tiene en cuenta la sintaxis corta un bloque por la mitad; utiliza una segmentación basada en la estructura.
Documentos mixtos
Un chunk mitad francés, mitad inglés, produce un vector medio poco útil: separa por idioma si el corpus es mixto.
Chunks casi vacíos
Un título solo (« 3.2.1 Obligaciones ») sin el texto que sigue es ruido: filtra los chunks demasiado cortos o únelos con el siguiente.
Cambiar de chunking sin reindexar
La división en fragmentos queda fijada durante la indexación: cualquier cambio obliga a recalcular los vectores. Prevé un script de reindexación desde el principio.
!
No optimizar a ciegas
Sin un conjunto de preguntas, no se sabe si un ajuste mejora o empeora los resultados. Un tamaño «que parece razonable» tiene un efecto medible, en un sentido o en otro, sobre la exhaustividad (recall).

#Preguntas frecuentes sobre el chunking

FAQ
¿Qué tamaño de chunk para un RAG local?+
Comienza con fragmentos de entre 300 y 500 tokens, con un solapamiento del 0 al 10 %, y corta en los límites de los párrafos o los títulos. Luego prueba tamaños de 250 y 700 tokens con entre 30 y 50 de tus preguntas reales, comparando la exhaustividad (recall) en los primeros 5 resultados. No existe un valor universal: depende de tus documentos y de tus preguntas.
¿El chunking semántico justifica su coste?+
No siempre. Requiere un cálculo adicional de embeddings durante la indexación, y un estudio de octubre de 2024 sobre tres tareas de recuperación concluye que este coste no está justificado por mejoras constantes respecto a una división en fragmentos de tamaño fijo. Pruébalo en tu corpus: si no ofrece mejores resultados, mantén el método recursivo.
¿Se necesita solapamiento entre los chunks?+
No siempre. Si ya divides el texto por párrafos y títulos, suele bastar con no usar solapamiento. Si lo divides en fragmentos de tamaño fijo o por frases, un solapamiento del 10 al 15 % evita perder una frase en el límite entre fragmentos. Un solapamiento elevado multiplica los duplicados en los resultados y aumenta el tamaño del índice.
Tokens o caracteres: ¿cómo ajustar chunk_size?+
Revisa la unidad de tu biblioteca. El SentenceSplitter de LlamaIndex cuenta en tokens; otras herramientas cuentan por defecto en caracteres, lo que cambia el tamaño real en un factor de aproximadamente cuatro. Revisa también la longitud máxima de entrada de tu modelo de embeddings: si el pasaje supera ese límite, se trunca durante la indexación.
¿Cómo dividir un PDF con tablas?+
Extrae primero la estructura con una herramienta que reconozca las tablas y luego divide el contenido: una tabla por fragmento si es pequeña, o una fila de la tabla por fragmento, acompañada del encabezado, si es grande. Un extractor que convierte la tabla en texto plano produce pasajes inutilizables, sea cual sea la división que se elija después.
¿Se debe reindexar cuando se cambia el tamaño del chunk?+
Sí, siempre. Los vectores se calculan a partir de los pasajes tal como estaban en el momento de la indexación: cambiar el tamaño, el solapamiento o el segmentador obliga a recalcular todos los vectores. Conserva un script que reconstruya el índice a partir de los documentos fuente y mantén bajo control de versiones los parámetros de segmentación utilizados.
¿Esta guía te ha ayudado?

¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.