Claudio Vargas · Notas y herramientas de IA

Pruebas de fragmentación RAG

Resultados reproducibles y una corrección local para un caso de código abierto.

Contribución técnica reproducida · 30 octubre 2026

Un caso real: límites de fragmentación en GodRad RAG

Revisamos la función pública de fragmentación de GodRad y ejecutamos pruebas locales con datos sintéticos. No llamamos a su servicio, no procesamos documentos de usuarios y no consumimos una API de pago.

Necesidad identificada: comprobar que los fragmentos respeten el tamaño configurado y que entradas vacías no produzcan registros vacíos.

Entrada / pruebaOriginalCorrección local
1.001 caracteres, límite 1.000Longitudes [1001, 0][1000, 1]
2.500 caracteres sin puntos[1001, 1001, 498][1000, 1000, 500]
Texto vacío o solo espaciosUn fragmento vacíoNingún fragmento
Barrido de 3.000 longitudes (1..3000)2.000 casos con exceso de longitud0 casos con exceso
Casos con fragmento vacío en el barrido20

Qué se cambió

La división sin punto usa un índice inclusivo y sumaba un carácter al límite. Se reduce ese índice en uno. Además, se comprueba el texto sin espacios antes de añadir un fragmento. Es una corrección pequeña, probada fuera del proyecto original.

Limitación pendiente: cambiar chunk_overlap de 0 a 200 produjo el mismo texto en la prueba seleccionada; el código revisado almacena ese parámetro sin usarlo. Esta propuesta no implementa solapamiento ni demuestra cambios de calidad en recuperación.

Reproducir y revisar

Entorno de ejecución observado: Python 3.12.14, Pydantic 2.14.1. Ocho entradas dirigidas más un barrido de 3.000 longitudes. Prueba de función aislada, no de integración. No se infieren rendimiento de producción, ahorro económico ni impacto en respuestas RAG.

SHA-256 del archivo original con saltos de línea LF: f8cff1723bdd103f6c2bd98b1b20b520341618d4e264c6670c22c3ed2bd31b2a.

Descargar prueba Python · Descargar corrección propuesta · Resultados de la corrección

Con una copia del repositorio y sus dependencias: python probe_chunking.py /ruta/al/repositorio. El script carga únicamente los dos módulos indicados; revisa cualquier código externo antes de ejecutarlo. Aplica el parche en una copia y repite el comando para comparar.

Ver el parche
--- a/app/services/chunking.py
+++ b/app/services/chunking.py
@@ -23,7 +23,7 @@
             if len(current_chunk_text) + len(para) <= self.chunk_size:
                 current_chunk_text += para + "\n\n"
             else:
-                if current_chunk_text:
+                if current_chunk_text.strip():
                     chunks.append(Chunk(
                         id=str(uuid.uuid4()),
                         tenant_id=tenant_id,
@@ -39,7 +39,7 @@
                     sub_para = para
                     while len(sub_para) > self.chunk_size:
                         split_idx = sub_para.rfind('.', 0, self.chunk_size)
-                        if split_idx == -1: split_idx = self.chunk_size
+                        if split_idx == -1: split_idx = self.chunk_size - 1
                         
                         chunks.append(Chunk(
                             id=str(uuid.uuid4()),
@@ -54,7 +54,7 @@
                 else:
                     current_chunk_text = para + "\n\n"
         
-        if current_chunk_text:
+        if current_chunk_text.strip():
             chunks.append(Chunk(
                 id=str(uuid.uuid4()),
                 tenant_id=tenant_id,

Estado: material preparado y publicado independientemente para revisión. No se ha enviado un mensaje al autor ni modificado su repositorio. La aceptación del cambio y cualquier colaboración posterior siguen pendientes.

Primero una entrega compartida

Un desarrollador puede aportar implementación y mantenimiento; otra persona puede aportar investigación de usuarios, distribución o acceso a un problema concreto. Esas aportaciones necesitan hacerse visibles. Antes de hablar de porcentajes, describe qué resultado entregarán juntos y cómo sabrán si valió la pena.

Esta plantilla genera una propuesta exploratoria. No es un contrato ni implica que una persona mencionada en otros recursos haya aceptado colaborar.

Los seis campos del piloto

La propuesta aparecerá aquí. No se envía automáticamente.

Una conversación comercial más clara

Revenue sharing describe reparto de ingresos; profit sharing, reparto de utilidades. La segunda expresión requiere acordar qué costos se descuentan. Ninguna define por sí sola propiedad del código, obligaciones de soporte, exclusividad o duración.

Como agenda de conversación, anoten: aportaciones, titularidad de los materiales previos y nuevos, costos autorizados, forma de medir ingresos, calendario de revisión y salida. Los términos definitivos requieren un acuerdo específico entre las partes; esta página no los establece.

Ejemplo de alcance pequeño

Probar respuestas con fuentes sobre veinte documentos públicos. Una parte prepara diez preguntas y evalúa resultados; otra adapta la demo. Tras dos semanas se revisan errores, tiempo de trabajo y solicitudes de continuidad. Si no hay interés suficiente, se documenta el resultado y se cierra el piloto.

La utilidad de ese piloto es producir evidencia compartida. No requiere prometer una empresa, clientes o ingresos que aún no existen.

English summary: a non-binding collaboration brief. Start with scope, contributions and an exit criterion; discuss commercial terms only with clear definitions and mutual agreement.