Semantic Chunking
La segmentación semántica en fragmentos divide documentos cuando cambia el tema, algo que se mide mediante la similitud entre incrustaciones de oraciones contiguas, para que cada fragmento contenga una sola idea.
La segmentación semántica en fragmentos divide los documentos para la generación aumentada por recuperación (RAG) y la búsqueda en los puntos donde cambia el tema, que se detectan comparando las representaciones vectoriales de oraciones contiguas, en vez de hacerlo cada número fijo de caracteres o tokens. Así, cada fragmento abarca una idea y su único vector en la base de datos vectorial la representa bien; además, el fragmento recuperado proporciona al modelo de lenguaje grande (LLM) una idea completa, en lugar del final de una sección y el principio de la siguiente.
Cómo funciona la segmentación semántica en fragmentos#
El algoritmo habitual, popularizado por los tutoriales de Greg Kamradt sobre división de texto e implementado como SemanticChunker en LangChain, consta de cuatro pasos. El texto se divide en oraciones y se obtiene la representación vectorial de cada una, a menudo agrupándolas con las oraciones vecinas para suavizar el ruido. La similitud del coseno entre cada par de oraciones consecutivas se convierte en una distancia. Un umbral marca los puntos de corte donde la distancia es inusualmente grande: LangChain usa de forma predeterminada el percentil 95 de todas las distancias del documento y también ofrece umbrales basados en la desviación estándar, el rango intercuartílico y el gradiente. Las oraciones entre puntos de corte forman un fragmento. El divisor semántico de LlamaIndex utiliza el mismo punto de corte basado en percentiles.
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
"The XR-12 coolant pump circulates water through the press line.",
"Inspect the XR-12 pump seals for leaks every week.",
"A worn pump bearing grinds loudly before it fails.",
"The staff cafeteria now opens for breakfast at 7:00.",
"The cafeteria menu adds vegetarian lunches in May.",
]
# Distancia del coseno entre cada oración y la siguiente
embeddings = model.encode(sentences, normalize_embeddings=True)
distances = 1 - np.sum(embeddings[:-1] * embeddings[1:], axis=1)
# Empieza un fragmento nuevo cuando la distancia supera el percentil 95
threshold = np.percentile(distances, 95)
chunks = [[sentences[0]]]
for sentence, distance in zip(sentences[1:], distances):
if distance > threshold:
chunks.append([])
chunks[-1].append(sentence)
print(np.round(distances, 2))
print(*[" ".join(chunk) for chunk in chunks], sep="\n")Las distancias entre oraciones contiguas son 0,56, 0,64, 0,98 y 0,62. Por tanto, el único punto de corte está en el salto de 0,98 entre el rodamiento de la bomba y la cafetería, y el resultado es un fragmento de tres oraciones sobre la bomba XR-12 y otro de dos oraciones sobre la cafetería.
Comparación de estrategias de segmentación#
- Segmentación de tamaño fijo: Divide cada N tokens, normalmente con cierto solapamiento entre fragmentos vecinos. Es rápida y predecible, pero ignora los límites entre temas.
- División recursiva: Divide por saltos de párrafo, después por saltos de línea y luego por oraciones, hasta que cada pieza se ajusta al límite de tamaño. LangChain recomienda su divisor recursivo de caracteres para texto genérico.
- División basada en la estructura: Sigue los encabezados, las secciones Markdown, los elementos HTML o la maquetación de las páginas de un PDF.
- Segmentación semántica en fragmentos: Sigue los cambios de significado, a costa de obtener la representación vectorial de cada oración durante la indexación y de que el tamaño de los fragmentos varíe mucho; por eso, las implementaciones añaden longitudes mínima y máxima.
- Segmentación tardía en fragmentos y recuperación contextual: Abordan los casos en que un fragmento carece de contexto del resto del documento, como un pronombre cuyo referente aparece en un fragmento anterior, y se combinan con cualquiera de los métodos de delimitación anteriores.
La segmentación de acciones en fragmentos en robótica solo comparte el nombre: en este caso, una política predice una secuencia de órdenes motoras futuras como una unidad.
Segmentación semántica en fragmentos más allá del texto#
Las transcripciones de los sistemas de voz a texto no tienen saltos de párrafo, así que los puntos de corte basados en representaciones vectoriales son una forma habitual de detectar cuándo cambia el tema de una reunión o un pódcast. También se puede segmentar el vídeo por contenido, de modo que cada clip muestre un evento para la comprensión de vídeo o la RAG multimodal, en vez de un segmento arbitrario de 10 segundos. Ultralytics YOLO26 proporciona estos límites para escenas con personas y vehículos: el modo de seguimiento asigna a cada objeto detectado un ID persistente entre fotogramas, de modo que una canalización puede abrir un clip cuando aparece un ID nuevo en la escena y cerrarlo cuando todos los ID seguidos hayan salido.
¿Mejora la recuperación la segmentación semántica en fragmentos?#
Los límites basados en temas son más importantes cuando hay asuntos no relacionados uno junto a otro sin encabezados, como en transcripciones, páginas web extraídas y notas concatenadas. Los fragmentos semánticos también dependen del modelo de representación vectorial y del umbral, así que el mismo documento se segmenta de forma distinta si cambia cualquiera de los dos; por eso, ambos deben ajustarse según la exhaustividad obtenida con consultas reales. El estudio ¿Merece la pena el coste computacional de la segmentación semántica? (2024) comparó la segmentación semántica y la de tamaño fijo en la recuperación de documentos, la recuperación de pruebas y la generación de respuestas basada en recuperación, y concluyó que el cálculo adicional de la segmentación semántica no ofrecía mejoras sistemáticas frente a los fragmentos de tamaño fijo.










