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.
<?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¿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.