Fragmentador de texto para embeddings y RAG — división por tokens

Divide texto largo en fragmentos medidos en tokens con solapamiento para embeddings y RAG. Corta en los límites de frase y párrafo, nunca a mitad de palabra, y muestra cada corte.

Trocear texto para embeddings: dónde cae el corte decide qué recuperas

Los sistemas de recuperación fallan en silencio. Incrustas un corpus, montas una búsqueda, haces una pregunta y recuperas algo que es temáticamente vecino y no la responde. El instinto es culpar al modelo de embeddings o a la métrica de similitud. Mucho más a menudo el problema ocurrió antes que ambos: el texto se cortó en piezas que no contienen cada una una idea completa, y ningún reordenamiento ingenioso recupera un significado destruido en el momento del corte.

Esta herramienta divide el texto en fragmentos acotados por tokens con solapamiento, cortando en la frontera más significativa disponible en lugar de en un desplazamiento fijo. Te muestra cada frontera, porque un mal corte solo se ve leyendo dónde termina un fragmento y empieza el siguiente. Todo corre en esta pestaña.

División recursiva por fronteras

El enfoque ingenuo es rebanar cada N tokens. Es rápido y es incorrecto, porque una frontera de token no guarda relación con una semántica: cortarás a mitad de frase, a veces a mitad de palabra, y el vector resultante describe un fragmento que nadie escribió.

El método de aquí baja por una escalera de separadores y usa el primero que produce piezas lo bastante pequeñas para caber. Por orden: antes de un título Markdown, luego líneas en blanco, luego cualquier salto de línea, luego fronteras de frase, luego fronteras de oración en comas y puntos y comas, luego espacios entre palabras. Solo si no existe ninguno de ellos — un paquete minificado, una única palabra enorme — se recurre a cortar por índice de token.

El efecto práctico es que la estructura se conserva cuando el texto tiene alguna. Un documento con títulos se divide por secciones. La prosa se divide por párrafos, o por frases cuando un párrafo es demasiado largo. Un muro de texto sin interrupción se divide por palabras. Cada fragmento termina donde lo habría terminado una persona, salvo que el texto no ofreciera esa oportunidad.

Para qué sirve realmente el solapamiento

El solapamiento repite la cola de un fragmento en la cabeza del siguiente. Existe porque un hecho y aquello a lo que se refiere quedan a menudo a lados distintos de una frontera. «La migración corrió de noche. Falló en la tercera tabla.» Corta entre esas frases y el segundo fragmento contiene un fallo sin sujeto, mientras el primero contiene una migración sin desenlace. Ninguno recupera de forma útil. Con solapamiento, el segundo fragmento se lleva su antecedente.

El coste es la duplicación: los tokens solapados se almacenan, se incrustan y se buscan más de una vez. Entre el diez y el quince por ciento del tamaño del fragmento es el compromiso habitual, y ahí es donde se sitúan los ajustes preestablecidos. El panel de estadísticas informa exactamente de cuántos tokens ha añadido el solapamiento: el compromiso pasa a ser un número en lugar de una sensación.

Conviene conocer una protección: un solapamiento igual o mayor que el tamaño del fragmento significaría que cada fragmento empieza con todo aquello con lo que acabó el anterior, y el proceso nunca avanza. Ese valor se recorta en lugar de dejar que la herramienta se quede colgada.

Elegir un tamaño

El tamaño del fragmento es un compromiso entre precisión y contexto, y no hay una respuesta universalmente correcta:

  • Los fragmentos pequeños, en torno a 256 tokens, dan coincidencias nítidas. Un vector sobre dos o tres frases está dominado por lo que esas frases dicen. Bueno para preguntas y respuestas sobre material de referencia denso. El riesgo son fragmentos que coinciden bien pero a los que les falta el contexto circundante necesario para responder de verdad.
  • Los fragmentos medianos, en torno a 512, son el valor por defecto habitual y donde la mayoría de modelos de embeddings se encuentran más cómodos. Aproximadamente un párrafo con sustancia.
  • Los fragmentos grandes, de 1024 en adelante, llevan más contexto por acierto pero diluyen el vector. Un fragmento que cubre cuatro temas se sitúa en la media de los cuatro y no coincide con fuerza con ninguno.
  • Los fragmentos muy grandes, de varios miles de tokens, dejan de ser una unidad de recuperación y se convierten en una unidad de paginación: para hacer pasar un documento largo por un modelo en pasadas sucesivas en lugar de buscar en él.

Cuatro estrategias de división

La división inteligente es la escalera recursiva descrita arriba, y es lo adecuado para la mayor parte de la prosa. Párrafos empaqueta párrafos enteros y nunca divide ninguno, lo que conviene a textos donde el párrafo ya es la unidad de pensamiento y prefieres tamaños desiguales a un párrafo roto. Títulos Markdown da un fragmento por sección, la elección natural para documentación donde un título nombra exactamente lo que hay debajo. Líneas empaqueta líneas enteras, para registros, extractos CSV y listas donde cada fila es independiente.

En todos los modos, cualquier unidad que siga excediendo el límite se reduce con el divisor recursivo antes de empaquetar, de modo que una elección de estrategia nunca produce un fragmento fuera de medida.

El recuento, y qué significa el número

Los tokens se cuentan con el mismo tokenizador que este sitio usa para dimensionar repositorios, de la familia que emplean los modelos de OpenAI. Los recuentos para Claude y Gemini difieren algo — vocabularios distintos segmentan el mismo texto de forma distinta — pero se siguen lo bastante de cerca como para dimensionar un fragmento frente a un límite. Si tu presupuesto va justo, deja margen en lugar de tomar el número como exacto.

Ten en cuenta además que el límite declarado de un modelo de embeddings es un punto de truncado duro, no un objetivo. Si lo superas, la cola se descarta en silencio: un modo de fallo que no produce ningún error y degrada la recuperación de una manera francamente difícil de diagnosticar.

Una salida que puedes darle a algo

Tres descargas. Texto plano con cabeceras --- Chunk n/N --- opcionales, para leer y comprobar. JSON como array de objetos con índice, número de tokens y texto, para un script que se lo trague todo. JSONL con un objeto por línea, que es lo que esperan la ingesta en flujo y la mayoría de puntos de acceso de incrustación por lotes, y lo que quieres cuando el corpus es demasiado grande para mantenerlo en memoria como un único array analizado.

Esto encaja de forma natural con el resto del sitio: convierte primero un repositorio, un PDF, una página web o una transcripción a texto, y luego trocea el resultado aquí. No se sube nada en ninguno de los dos pasos.