martes, 19 de mayo de 2026

La importancia del tamaño del chunk y el overlap a la hora de generar embeddings al procesar documentos PDF.


En el contexto de procesamiento de documentos PDF para generar embeddings y almacenar información vectorial (por ejemplo en Oracle AI Vector Search, LangChain o motores RAG), el siguiente fragmento de un script en Python, define cómo se va a “fragmentar” el texto antes de convertirlo en vectores.

El código en cuestión:
 
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=150
)


Corresponde a un objeto de LangChain utilizado para dividir texto grande en bloques más pequeños (“chunks”).
 
¿Qué significa cada parámetro?
 
chunk_size=1000
Define el tamaño máximo de cada fragmento.

En este caso:
  • Cada chunk tendrá aproximadamente 1000 caracteres.
  • No necesariamente son 1000 palabras.
  • Normalmente incluye espacios, saltos de línea y signos de puntuación.
Ejemplo conceptual:
  • Chunk 1 -> caracteres 1 al 1000
  • Chunk 2 -> caracteres 851 al 1850
  • Chunk 3 -> caracteres 1701 al 2700
chunk_overlap=150

Define cuánto contenido se repite entre un chunk y el siguiente.
Aquí: Los últimos 150 caracteres del chunk anterior se copian al siguiente chunk.
Esto evita pérdida de contexto semántico.

Ejemplo:
Chunk 1:
"...Oracle Database permite trabajar con datos vectoriales y embeddings..."

Chunk 2:
"...datos vectoriales y embeddings son utilizados para búsquedas semánticas..."

La frase compartida ayuda a mantener continuidad contextual.
 
¿Por qué esto es importante en embeddings?

Cuando conviertes texto a embeddings:

Cada chunk se transforma en un vector independiente.
Si el corte es muy agresivo:
    1. se pierde contexto,
    2. disminuye precisión semántica,
    3. empeoran las búsquedas RAG.
El overlap ayuda a preservar relaciones entre conceptos.
 
¿Qué hace “RecursiveCharacterTextSplitter”?

No corta simplemente cada 1000 caracteres de forma brutal.
El algoritmo intenta dividir respetando jerarquías:
  • párrafos
  • saltos de línea
  • oraciones
  • espacios
  • caracteres
Por eso se llama “Recursive”.
Intenta mantener fragmentos semánticamente coherentes.
 
Ejemplo práctico

Supongamos este texto:
Oracle Database 26ai incorpora capacidades avanzadas de IA.
Las búsquedas vectoriales permiten similitud semántica.
Los embeddings pueden generarse desde texto, imágenes y audio.

Con:
chunk_size=50
chunk_overlap=10

Podría producir:
Chunk 1:
Oracle Database 26ai incorpora capacidades

Chunk 2:
capacidades avanzadas de IA.
Las búsquedas

Chunk 3:
búsquedas vectoriales permiten similitud

Observe cómo “capacidades” y “búsquedas” se repiten parcialmente.
 
¿Cómo elegir los tamaños correctos?

Depende del modelo de embeddings y del tipo de documento.
 
Valores típicos

Tipo documento chunk_sizeoverlap
  • Manual técnico 800-1500 100-200
  • Código fuente 300-800 50-100
  • PDFs legales 1500-2500 200-400
  • FAQ/chatbot 300-600 50-80
Riesgos de usar chunks muy pequeños

Si haces:
chunk_size=100

Puedes destruir contexto:
"Oracle Database soporta"
"vector embeddings usando"
"AI Vector Search..."

Eso genera embeddings pobres.
 
Riesgos de chunks demasiado grandes

Si haces:
chunk_size=10000

Puedes:
  •  exceder límites del modelo,
  • aumentar costo,
  • reducir precisión de recuperación,
  • mezclar demasiados temas en un solo vector.

No hay comentarios:

Publicar un comentario

Te agradezco tus comentarios. Te esperamos de vuelta.

Todos los Sábados a las 8:00PM