de la Parte II de Enterprise Document Intelligence, una serie que construye un sistema RAG empresarial a partir de cuatro ladrillos: análisis de documentos, análisis de preguntas, recuperación y generación. El ladrillo de recuperación es una trilogía:
Este compañero (7quater) maneja el caso que el ladrillo encuentra en producción: un documento demasiado largo para leer, con un índice demasiado largo para tirarlo.
📓 Los cuadernos complementarios ejecutables están en GitHub: doc-intel/notebooks-vol1.
Trabajamos en esto en NIST SP 800-53 Rev. 5 (Controles de seguridad y privacidad para organizaciones y sistemas de información, trabajo del gobierno de EE. UU., dominio público en EE. UU.) y el Marco de ciberseguridad 2.0 de NIST. Las rutas de código ejecutables llaman a los servicios de OpenAI que se rigen por los Términos de uso de OpenAI.
1. El problema: un índice demasiado largo para entregarlo
NIST SP 800-53 tiene 492 páginas. Define los controles de seguridad que debe cumplir un sistema federal estadounidense, un control a la vez, veinte familias de ellos. Un usuario hace una pregunta sencilla:
“¿Qué requiere el control de gestión de cuentas?”
La respuesta es cinco páginas, control AC-2, en las páginas 46 a 50. El ingenuo movimiento RAG incrusta cada página y toma la k superior más similar a la pregunta. Aquí falla de una manera específica: las palabras cuenta, administración, control y acceso se encuentran en cientos de páginas, porque todo el documento trata sobre controles. Top-k devuelve AC-2 mezclado con AC-3, AC-17, un par de controles de auditoría y el glosario, y el modelo de generación tiene que adivinar a cuál se refería. La factura se paga dos veces: se insertan 492 páginas y la respuesta sigue siendo confusa.
En su lugar, una persona abre el índice. Aquí está el problema que hace que este artículo sea necesario: la tabla de contenidos tiene en sí misma 358 entradas. No le entregarías a un colega las 358 líneas más que las 492 páginas. Un experto escanea primero la lista de capítulos, once títulos, elige Los controles, la abre a las veinte familias, elige Control de acceso, lo abre a sus controles y llega a AC-2. Primero el nivel superior, luego el inferior, una pequeña decisión a la vez. Ese es el bucle que construye este artículo, y es la tesis de la serie en miniatura: amplificar al experto. Haz lo que hace el experto. No descargue todo el documento o el índice completo en el modelo a la vez.
2. El índice, en tres niveles de profundidad
Aquí está la página de contenido real del documento, junto al toc_df que el analizador lee desde su esquema nativo.
La página impresa se detiene en el nivel familiar. El analizador va más allá. El artículo 5B convierte el esquema nativo del PDF en un toc_df, una fila por título, y para este documento son 358 filas en tres niveles, desde los once capítulos de nivel superior hasta cada uno de los 316 controles individuales (AC-1, AC-2 y el resto), cada uno con su rango de páginas. Las veinte familias de control se encuentran en el medio. Ese árbol es por el que camina la recuperación. Cuando un documento no tiene esquema nativo para recorrer, el artículo 5 septies reconstruye uno a partir de la página; Aquí el contorno está limpio, así que lo usamos directamente.
3. El bucle: un nivel a la vez
La recuperación recorre el árbol de arriba hacia abajo. Le entrega al LLM solo el nivel actual, primero los títulos de los once capítulos, cada uno como una línea compacta: un título, un rango de páginas y, cuando los títulos son ambiguos, un breve recuento de palabras clave. El modelo elige la rama que responde a la pregunta. Si esa rama es amplia y tiene hijos más finos, la recuperación la abre, sus hijos pasan al siguiente nivel y el paso se repite. Se detiene en una hoja o en una sección lo suficientemente pequeña como para leerla completa.
Dos cosas se salen de esta forma. La larga tabla de contenidos nunca entra en un mensaje completo: el modelo lee once líneas, luego veinte, luego veintitantos, nunca 358 a la vez. Y el descenso es efectivamente opcional. En un documento corto, el nivel superior no tiene elementos secundarios que abrir, por lo que el bucle se ejecuta una vez y se comporta exactamente como un enrutamiento plano. El modelo juzga en todos los niveles si hay alguna razón para profundizar más.
4. El paso de enrutamiento, en código
El paso es una función, Reason_on_toc, llamada una vez por nivel. Lee el nivel como texto, nunca como una tabla, por lo que un nivel de veinte entradas son veinte líneas cortas, no una cuadrícula que crece una columna por palabra clave.
# De arriba hacia abajo: alimenta UN nivel a la vez, nunca todo el TOC de 358 filas. # Cada entrada es una línea compacta: título + rango de páginas (+ coincidencias de palabras clave). nivel = toc_df[toc_df.level == toc_df.level.min()] # 11 títulos de capítulos mientras que es Verdadero: pick = Reason_on_toc(question, nivel, cliente=cliente) # una sección de llamada LLM = nivel[level.id.isin(pick.section_ids)]
niños = niños_inmediatos(toc_df, sección) si niños.empty o sección.n_páginas <= PEQUEÑO: # hoja, o nivel de ruptura lo suficientemente pequeño = niños # ábrelo, desciende # 11 capítulos -> 20 familias -> 25 controles -> AC-2 GESTIÓN DE CUENTAS (págs. 46-50)
Ejecútelo en la pregunta de administración de cuentas con el documento real y desciende un nivel a la vez. En cada nivel, el modelo lee los títulos y motivos de ese nivel y elige la rama para abrir. El razonamiento a continuación es propio del modelo, textualmente de la ejecución.
Cincuenta y seis entradas se leen en tres llamadas pequeñas, nunca en el índice de 358 filas. Luego, Generation lee cinco páginas y los otros 315 controles nunca ingresan al mensaje.
Cuando el título por sí solo no es suficiente para separar a dos candidatos, la recuperación se apoya en ese recuento de palabras clave, todavía una línea por entrada: cuántas de las palabras clave de la pregunta se encuentran dentro de esa rama. Es el desempate para el caso en el que un término se usa en una sección y solo se define en otra (el privilegio mínimo se aplica en todo el Control de acceso, pero se define una vez en el Glosario). Nunca se convierte en una columna por palabra clave.
5. Cuando lee toda la sección
El bucle deja de descender en tres casos: la rama seleccionada es una hoja, ya es lo suficientemente pequeña como para leerla completa, o la pregunta es una lista que necesita todos los elementos que hay debajo. El caso de listado es el CSF del NIST del Artículo 12 (listado): cuando se le solicita cada subcategoría de GOVERN, el enrutador elige todo el Apéndice A. CSF Core y, como un listado lo quiere todo, la recuperación lee el apéndice completo en lugar de descender a una subcategoría.
Aquí está el segundo descenso, en el mismo paso de ruta pero con una pregunta de lista. Llega a la sección que contiene la lista en un solo nivel y se detiene, porque debajo de ella no hay nada mejor en el índice.
Eso le da al bucle las tres superficies de control del Artículo 13bis (ingeniería de bucle): un disparador (una rama amplia con hijos), una terminación (una hoja, una sección pequeña o un listado) y una recuperación que cambia algo en cada iteración (desciende un nivel, nunca vuelve a leer el que acaba de juzgar), con una profundidad limitada por el árbol para que no pueda girar. Se diferencia de los bucles de la Parte III en aquello a lo que reacciona: la estructura del documento, no un resultado de generación.
6. Fichas y precisión, juntas
El enrutamiento jerárquico gana en ambos ejes a la vez, lo cual es poco común.
Precisión. Flat top-k en 492 páginas compite con AC-2 contra cualquier otro control que mencione cuenta o acceso. El enrutamiento se compromete con AC-2 Account Management por nombre y lo lee completo, por lo que las cinco páginas de la respuesta llegan juntas en lugar de entrelazadas con cinco vecinas.
Fichas. El canal ingenuo incorpora 492 páginas una vez y paga por la recuperación de todas ellas en cada consulta. El enrutador de arriba hacia abajo nunca incrusta el cuerpo. Lee cincuenta y seis líneas de título breves en tres llamadas y luego en las cinco páginas permanece la respuesta. Incluso el índice nunca se envía completo. En un corpus de miles de documentos de este tipo, esa diferencia es la línea entre un sistema que funciona y otro que no.
7. De un documento a una carpeta de documentos
Este artículo se queda en un solo documento. Una carpeta de muchos documentos es el mismo mapa un nivel superior: el nivel superior es la lista de archivos, cada uno con un título y un resumen de una línea, y el siguiente nivel es la tabla de contenido de cada archivo. El paso de enrutamiento no cambia: usted elige los archivos relevantes del nivel superior y luego desciende a sus secciones exactamente como este artículo desciende a los controles. El movimiento es el mismo, solo crece el número de niveles. Cubrimos ese caso de recopilación en detalle en la Parte IV, comenzando con el Artículo 14 (el problema del corpus) y las tablas del corpus (corpus_toc_df, corpus_index) que lo contienen.
8. Conclusión
Un documento extenso se entrega con su propio mapa y la recuperación lo recorre de arriba hacia abajo en lugar de calificar cada página. El enrutador lee un nivel de la tabla de contenidos a la vez, una línea compacta por entrada, y desciende: once capítulos a Los Controles, veinte familias a Control de Acceso, veintitantos controles a Gestión de Cuentas AC-2, cinco páginas de 492, y los otros 315 controles nunca aparecen en el mensaje. Se detiene en una hoja, en una sección lo suficientemente pequeña como para leerla completa o en una lista que quiere todo bajo un título. Se trata de un bucle acotado dentro de la recuperación, opcional cuando la tabla de contenidos es poco profunda, y ahorra tokens y aumenta la precisión al mismo tiempo, por lo que se amplía sin cambios: una carpeta de documentos es el mismo mapa con un nivel más.
9. Fuentes y lecturas adicionales
Análisis de documentos: Artículo 5A y Artículo 5B: parse_pdf y toc_df por el que se enruta este artículo. Análisis de preguntas: Artículo 6A, Artículo 6B, Artículo 6C: de donde provienen las palabras clave y la forma de la pregunta. Recuperación: Artículo 7A, Artículo 7B, Artículo 7C: el híbrido de primera sección y el enrutador TOC, este artículo camina como un árbol. Artículo 12 (listado): se lee la sección completa para preguntas que necesitan cada elemento. Artículo 13bis (ingeniería de bucle): disciplina de bucle a la que pertenece este bucle de recuperación. Artículo 14 (el problema del corpus): el mismo paso de ruta un nivel más arriba, sobre una carpeta de documentos.