Tema 11 · Chunking

11. Estrategias de Chunking: Fragmentación de Texto, Solapamiento y Metadatos

Optimiza la fragmentación de documentos en bloques semánticos de 400-800 tokens con overlap y enriquecimiento contextual de metadatos.

La Regla de Oro del RAG: La Calidad del Chunk Determina el Éxito

El error más frecuente al construir un sistema RAG es pensar que el éxito depende de cuál LLM uses (GPT-4o, Claude 3.5 Sonnet, Llama 3). En la realidad práctica, el 80% de los fallos de un asistente se deben a un mal proceso de Chunking (fragmentación) de los documentos originales.

Si fragmentas tus textos en trozos demasiado grandes (por ejemplo, capítulos enteros de 3,000 tokens), el vector de embeddings se diluye y pierde los detalles específicos. Si los haces diminutos (de 20 tokens), el fragmento dirá "Cuesta 99 dólares mensuales", pero el modelo no sabrá a qué producto o plan se refiere porque el sujeto quedó en el fragmento anterior.

Técnicas Clave: Tamaño Óptimo, Solapamiento y Metadatos

Parámetro / Técnica Rango Recomendado Beneficio Técnico
Tamaño del Fragmento (Chunk Size) 400 a 600 tokens (~1,500 a 2,500 caracteres) Equilibrio perfecto entre especificidad semántica y suficiente contexto para el LLM.
Solapamiento (Chunk Overlap) 10% a 15% (50 a 100 tokens) Evita cortar oraciones o ideas clave por la mitad en la frontera entre dos bloques contiguos.
División Jerárquica Recursiva Párrafos (\n\n) ➔ Oraciones (. ) ➔ Palabras Respeta la estructura natural de la redacción humana antes de forzar un corte abrupto.
Enriquecimiento de Encabezado Anteponer Título y Sección al inicio de cada chunk Garantiza que el embedding y el modelo sepan siempre de qué documento proviene el dato.

⚡ Fragmentador de Texto con Solapamiento y Enriquecimiento de Metadatos en PHP

Algoritmo que divide un texto largo en fragmentos configurables preservando solapamiento entre bloques consecutivos.

text-chunker.php
Solo lectura
<?php
declare(strict_types=1);

namespace App\Utils;

class TextChunker
{
    /**
     * Divide un documento en fragmentos de tamaño controlado con solapamiento (overlap).
     *
     * @param string $text Texto completo del documento original
     * @param int $chunkSize Longitud aproximada de caracteres por fragmento (ej. 1500)
     * @param int $overlap Longitud de solapamiento entre bloques contiguos (ej. 200)
     * @param string $documentTitle Título que se antepone a cada chunk para darle contexto
     * @return array<int, array{index: int, text: string, char_length: int}>
     */
    public static function createChunks(
        string $text,
        int $chunkSize = 1500,
        int $overlap = 200,
        string $documentTitle = ''
    ): array {
        $cleanText = trim(preg_replace('/\s+/', ' ', $text) ?? '');
        $totalLength = mb_strlen($cleanText);
        $chunks = [];
        $start = 0;
        $index = 1;

        while ($start < $totalLength) {
            // Extraer el segmento inicial según el tamaño del chunk
            $end = min($start + $chunkSize, $totalLength);
            $segment = mb_substr($cleanText, $start, $end - $start);

            // Si no estamos al final del texto, buscar el último punto o salto para no cortar a mitad de palabra
            if ($end < $totalLength) {
                $lastPeriod = mb_strrpos($segment, '. ');
                if ($lastPeriod !== false && $lastPeriod > ($chunkSize / 2)) {
                    $segment = mb_substr($segment, 0, $lastPeriod + 1);
                    $end = $start + mb_strlen($segment);
                }
            }

            // Enriquecimiento de contexto: anteponer el título del documento
            $enrichedText = $documentTitle !== '' 
                ? "Documento: {$documentTitle}\n\n" . trim($segment) 
                : trim($segment);

            $chunks[] = [
                'index'       => $index++,
                'text'        => $enrichedText,
                'char_length' => mb_strlen($enrichedText)
            ];

            // Avanzar el puntero restando el solapamiento para no perder continuidad
            $start = $end - $overlap;
            if ($start >= $totalLength || $segment === '') {
                break;
            }
        }

        return $chunks;
    }
}
🧠
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección
1 Pregunta
Pregunta 1
¿Cuál es el propósito de aplicar solapamiento (overlap) al dividir un documento en chunks para RAG?
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar IA Aplicada a Desarrollo Web: APIs, RAG & Agentes y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.