El tamaño del fragmento como variable experimental en sistemas RAG

Usuario: "¿Qué significa el resaltado verde en este documento?"
Sistema RAG: "El texto resaltado en verde se interpreta como ajustes de configuración".

el tipo de respuestas que esperamos hoy de los sistemas de recuperación-generación aumentada (RAG).

En los últimos años, RAG se ha convertido en uno de los pilares arquitectónicos centrales de los modelos de lenguaje basados ​​en el conocimiento: en lugar de depender exclusivamente del conocimiento almacenado en el modelo, los sistemas RAG combinan modelos de lenguaje con fuentes de documentos externos.

El término fue introducido por Lewis et al. y describe un enfoque que se utiliza ampliamente para reducir las alucinaciones, mejorar la trazabilidad de las respuestas y permitir que los modelos de lenguaje funcionen con datos patentados.

Quería entender por qué un sistema selecciona una respuesta específica en lugar de una alternativa muy similar. Esta decisión a menudo se toma ya en la etapa de recuperación, mucho antes de que entre en juego un LLM.

Por esta razón, realicé tres experimentos en este artículo para investigar cómo los diferentes tamaños de fragmentos (80, 220, 500) influyen en el comportamiento de recuperación.

Tabla de contenido
1 – Por qué el tamaño del fragmento es más que un simple parámetro
2 – ¿Cómo influye el tamaño del fragmento en la estabilidad de los resultados de recuperación en sistemas RAG pequeños?
3 – Sistema RAG mínimo sin generación de salida
4 – Tres experimentos: el tamaño del fragmento como variable
5 – Pensamientos finales

1 – Por qué el tamaño del fragmento es más que un simple parámetro

En una canalización RAG típica, los documentos primero se dividen en segmentos de texto más pequeños, se incrustan en vectores y se almacenan en un índice. Cuando se emite una consulta, se recuperan segmentos de texto semánticamente similares y luego se procesan para obtener una respuesta. Este último paso suele realizarse en combinación con un modelo de lenguaje.

Los componentes típicos de un sistema RAG incluyen:

Preprocesamiento de documentos Chunking Incrustación Índice de vectores Lógica de recuperación Opcional: Generación de la salida

En este artículo, me centro en el paso de recuperación. Este paso depende de varios parámetros:

Elección del modelo de empotramiento:
El modelo de incrustación determina cómo se convierte el texto en vectores numéricos. Los diferentes modelos capturan el significado en diferentes niveles de granularidad y se entrenan con diferentes objetivos. Por ejemplo, los modelos ligeros de transformadores de oraciones suelen ser suficientes para la búsqueda semántica, mientras que los modelos más grandes pueden capturar más matices pero conllevan un mayor costo computacional. Métrica de distancia o similitud:
La métrica de distancia o similitud define cómo se mide la cercanía entre dos vectores. Las opciones comunes incluyen similitud de coseno, producto escalar o distancia euclidiana. Para incrustaciones normalizadas, a menudo se usa la similitud de coseno. Número de resultados recuperados (Top-k):
El número de resultados recuperados especifica cuántos segmentos de texto devuelve el paso de recuperación. Un Top-k pequeño puede perder contexto relevante, mientras que un Top-k grande aumenta la recuperación pero puede introducir ruido. Superposición entre segmentos de texto:
La superposición define cuánto texto se comparte entre fragmentos consecutivos. Normalmente se utiliza para evitar la pérdida de información importante en los límites de los fragmentos. Una pequeña superposición reduce la redundancia pero corre el riesgo de reducir las explicaciones a la mitad, mientras que una mayor superposición aumenta la solidez a costa de almacenar y procesar más fragmentos similares. Tamaño del trozo:
Describe el tamaño de las unidades de texto que se extraen de un documento y se almacenan como vectores individuales. Dependiendo de la implementación, el tamaño del fragmento se puede definir en función de caracteres, palabras o tokens. El tamaño determina cuánto contexto representa un solo vector.

Los fragmentos pequeños contienen muy poco contexto y son muy específicos. Los fragmentos grandes incluyen más información circundante, pero a un nivel mucho más burdo. Como resultado, el tamaño del fragmento determina qué partes del significado se comparan realmente cuando una consulta se compara con un fragmento.

El tamaño del fragmento refleja implícitamente suposiciones sobre cuánto contexto se requiere para capturar el significado, cuán fuertemente se puede fragmentar la información y cuán claramente se puede medir la similitud semántica.

Con este artículo quería explorar exactamente esto a través de un pequeño experimento con el sistema RAG y me pregunté:

¿Cómo afectan los diferentes tamaños de fragmentos al comportamiento de recuperación?

La atención no se centra en un sistema destinado al uso en producción. En cambio, quería descubrir cómo los diferentes tamaños de fragmentos afectan los resultados de la recuperación.

2 – ¿Cómo influye el tamaño del fragmento en los resultados de recuperación en sistemas RAG pequeños?

Por eso me hice las siguientes preguntas:

¿Cómo resulta la recuperación del cambio de tamaño de fragmentos en un sistema RAG pequeño y controlado? ¿Qué segmentos de texto llegan a la cima de la clasificación cuando las consultas son idénticas pero los tamaños de los fragmentos difieren?

Para investigar esto, definí deliberadamente una configuración simple en la que todas las condiciones (excepto el tamaño del fragmento) siguen siendo las mismas:

Tres documentos Markdown como base de conocimientos Tres preguntas fijas idénticas El mismo modelo de incrustación para vectorizar los textos

El texto utilizado en los tres archivos Markdown se basa en la documentación de una herramienta real llamada OneLatex. Para mantener el experimento centrado en el comportamiento de recuperación, el contenido se simplificó ligeramente y se redujo a las explicaciones centrales relevantes para las preguntas.

Las tres preguntas que utilicé fueron:

"P1: ¿Cuál es la principal ventaja de separar la creación de contenido del formato en OneLatex?" "P2: ¿Cómo interpreta OneLatex el texto resaltado en verde en OneNote?" "P3: ¿Cómo interpreta OneLatex el texto resaltado en amarillo en OneNote?"

Además, omití deliberadamente un LLM para la generación de resultados.

La razón de esto es simple: no quería que un LLM convirtiera segmentos de texto incompletos o mal coincidentes en una respuesta coherente. Esto deja mucho más claro lo que realmente sucede en el paso de recuperación, cómo interactúan los parámetros de la recuperación y qué papel juega el transformador de oraciones.

3 – Sistema RAG mínimo sin generación de salida

Por lo tanto, para los experimentos utilicé un pequeño sistema RAG con los siguientes componentes: documentos Markdown como base de conocimiento, una lógica de fragmentación simple con superposición, un modelo de transformador de oraciones para generar incrustaciones y una clasificación de segmentos de texto usando similitud de coseno.

Como modelo de incrustación, utilicé all-MiniLM-L6-v2 de la biblioteca Sentence-Transformers. Este modelo es liviano y, por lo tanto, adecuado para ejecutarlo localmente en una computadora portátil personal (yo lo ejecuté localmente en mi computadora portátil Lenovo con 64 GB de RAM). La similitud entre una consulta y un segmento de texto se calcula mediante la similitud del coseno. Debido a que los vectores están normalizados, el producto escalar se puede comparar directamente.

Deliberadamente mantuve el sistema pequeño y, por lo tanto, no incluí ningún historial de chat, memoria o lógica de agente, ni generación de respuestas basada en LLM.

Como "respuesta", el sistema simplemente devuelve el segmento de texto mejor clasificado. Esto deja mucho más claro qué contenido se identifica realmente como relevante en el paso de recuperación.

El código completo para el sistema mini RAG se puede encontrar en mi repositorio de GitHub:

→ 🤓 Encuentra el código completo en GitHub Repo 🤓 ←

4 – Tres experimentos: el tamaño del fragmento como variable

Para la evaluación, ejecuté los tres comandos siguientes a través de la línea de comando:

#Experimento 1: línea base python main.py –chunk-size 220 –overlap 40 –top-k 3 #Experimento 2: tamaño de fragmento pequeño python main.py –chunk-size 80 –overlap 10 –top-k 3 #Experimento 3: tamaño de fragmento grande python main.py –chunk-size 500 –overlap 50 –top-k 3

La configuración de la Sección 3 sigue siendo exactamente la misma: los mismos tres documentos, las mismas tres preguntas y el mismo modelo de incorporación.

El tamaño del fragmento define la cantidad de caracteres por segmento de texto. Además, utilicé una superposición en cada experimento para reducir la pérdida de información en los límites de los fragmentos. Para cada experimento, calculé las puntuaciones de similitud semántica entre la consulta y todos los fragmentos y clasifiqué los segmentos con la puntuación más alta.

Pequeños fragmentos (80 caracteres): pérdida de contexto

En fragmentos muy pequeños (tamaño de fragmento 80), se manifiesta una fuerte fragmentación del contenido: los segmentos de texto individuales a menudo contienen sólo fragmentos de frases o declaraciones aisladas sin suficiente contexto. Las explicaciones se dividen en varios fragmentos, de modo que los segmentos individuales contengan solo partes del contenido original.

Formalmente, la recuperación sigue funcionando correctamente: se encuentran fragmentos semánticamente similares y se clasifican en una posición alta.

Sin embargo, cuando miramos el contenido real, vemos que los resultados apenas son utilizables:

Captura de pantalla tomada por el autor.

Los fragmentos devueltos están relacionados temáticamente, pero no proporcionan una respuesta independiente. El sistema reconoce aproximadamente de qué se trata el tema, pero desglosa el contenido con tanta precisión que los resultados individuales no dicen mucho por sí solos.

Trozos medianos (220 caracteres): estabilidad aparente

Con los trozos medianos (tamaño de trozo 220), los resultados ya mejoraron claramente. La mayoría de los segmentos de texto devueltos contenían explicaciones completas y eran plausibles en cuanto a contenido. A primera vista, la recuperación parecía estable y confiable: generalmente devolvía exactamente la información que uno esperaría.

Sin embargo, se hizo evidente un problema concreto al distinguir entre texto resaltado en verde y amarillo. Independientemente de si pregunté sobre el significado del resaltado verde o amarillo, el sistema devolvió la parte sobre el resaltado amarillo como el resultado principal en ambos casos. El fragmento correcto estaba presente, pero no fue seleccionado como Top-1.

Muestra los resultados del experimento de recuperación con un tamaño de fragmento de 220.
Captura de pantalla tomada por el autor.

La razón radica en las puntuaciones de similitud muy similares de los dos resultados principales:

Puntuación del Top-1: 0,873 Puntuación del Top-2: 0,774

El sistema apenas puede distinguir semánticamente entre los dos candidatos y finalmente selecciona la porción con la puntuación ligeramente más alta.

¿El problema? No coincide con el contenido de la pregunta y simplemente es incorrecto.

Para nosotros como seres humanos, esto es muy fácil de reconocer. Para un transformador de sentencias como el MiniLM-L6-v2, parece ser un desafío.

Lo que importa aquí es esto: si solo miramos el resultado del Top-1, este error permanece invisible. Sólo comparando las puntuaciones vemos que el sistema es incierto en esta situación. Dado que se ve obligado a tomar una decisión clara en nuestra configuración, devuelve el fragmento Top-1 como respuesta.

Grandes fragmentos (500 caracteres): contextos sólidos

Con los fragmentos más grandes (tamaño de fragmento 500), los segmentos de texto contienen un contexto mucho más coherente. Además, ya casi no hay fragmentación: las explicaciones ya no se dividen en varios fragmentos.

Y efectivamente, ya no se produce el error al distinguir entre verde y amarillo. Las preguntas sobre el resaltado verde y amarillo ahora se distinguen correctamente y el fragmento coincidente respectivo se clasifica claramente como el mejor resultado. También podemos ver que las puntuaciones de similitud de los fragmentos relevantes ahora están más claramente separadas.

Muestra el resultado del experimento de recuperación con un tamaño de fragmento 500.
Captura de pantalla tomada por el autor.

Esto hace que la clasificación sea más estable y más fácil de entender. La desventaja de esta configuración, sin embargo, es la granularidad más gruesa: los fragmentos individuales contienen más información y están menos adaptados a aspectos específicos.

En nuestra configuración con tres archivos Markdown, donde el contenido ya está bien separado temáticamente, este inconveniente apenas influye. Con documentación estructurada de manera diferente, como textos largos y continuos con múltiples temas por sección, un tamaño de fragmento excesivamente grande podría dar lugar a que se recupere información irrelevante junto con contenido relevante.

En mi Substack Data Science Espresso, comparto guías prácticas y actualizaciones breves del mundo de la ciencia de datos, Python, la inteligencia artificial, el aprendizaje automático y la tecnología, diseñadas para mentes curiosas como la suya.

Eche un vistazo y suscríbase en Medium o en Substack si desea mantenerse informado.

5 – Pensamientos finales

Los resultados de los tres experimentos muy simples se remontan al funcionamiento de la recuperación. Cada fragmento se representa como un vector y su proximidad a la consulta se calcula mediante similitud de coseno. La puntuación resultante indica qué tan similares son la pregunta y el segmento de texto en el espacio semántico.

Lo importante aquí es que la puntuación no es una medida de corrección. Es una medida de comparación relativa dentro de los fragmentos disponibles para una pregunta determinada en una sola ejecución.

Cuando varios segmentos son semánticamente muy similares, incluso diferencias mínimas en las puntuaciones pueden determinar qué fragmento se devuelve como Top-1. Un ejemplo de esto fue la distinción incorrecta entre verde y amarillo en trozos de tamaño mediano.

Una posible extensión sería permitir que el sistema señale explícitamente la incertidumbre. Si las puntuaciones de los segmentos Top 1 y Top 2 son muy cercanas, el sistema podría devolver una respuesta de "No sé" o "No estoy seguro" en lugar de forzar una decisión.

Con base en este pequeño experimento del sistema RAG, en realidad no es posible derivar una conclusión sobre el "mejor tamaño de fragmento".

Pero lo que podemos observar en cambio es lo siguiente:

Los fragmentos pequeños generan una gran variación: la recuperación reacciona con mucha precisión a términos individuales pero rápidamente pierde el contexto general. Frases de tamaño mediano: parecen estables a primera vista, pero pueden crear ambigüedades peligrosas cuando varios candidatos obtienen puntuaciones casi iguales. Grandes porciones: proporcionan un contexto más sólido y clasificaciones más claras, pero son más generales y menos precisas.

Por lo tanto, el tamaño del fragmento determina con qué precisión la recuperación puede distinguir entre fragmentos de contenido similares.

En esta pequeña configuración, esto no jugó un papel importante. Sin embargo, cuando pensamos en sistemas RAG más grandes en entornos de producción, este tipo de inestabilidad de recuperación podría convertirse en un problema real: a medida que crece el número de documentos, también aumenta el número de fragmentos semánticamente similares. Esto significa que es probable que se produzcan muchas situaciones con diferencias de puntuación muy pequeñas. También puedo imaginar que tales efectos a menudo quedan enmascarados por modelos lingüísticos posteriores, cuando un LLM convierte segmentos de texto incompletos o que solo coinciden parcialmente en respuestas plausibles.

¿Dónde puedes seguir aprendiendo?