class: center, middle, inverse, title-slide .title[ # Reunion 2: Comprensión lectora computacional. ] .subtitle[ ## EEFF a tablas de datos. ] .author[ ### Juan Agustín Duarte ] .date[ ### 2025-05-26 ] --- # Introducción La CMF pone a disposición documentos detallados de entidades fiscalizadas con los que podemos construir indices de riesgo fiscal. Por ejemplo, las deudas en regímenes fiscales preferenciales: --  .footnote[<sup>1</sup>Cuentas por pagar a entidades relacionadas. Estados financieros consolidados, CENCOSUD Internacional SPA, 31 de diciembre 2022 y 2021] -- Esta información normalmente se encuentra en formato pdf entre múltiples párrafos de texto. O bien, insertado en tablas o imagenes que contienen tablas. --- # Índice ### Procesamiento - Leer imágenes en PDF - Transformación de PDF a texto - Entrega de texto e instrucción a LLM (e.g. ChatGPT) - Procesamiento de respuesta de LLM ### Desafíos - Generalización - Criticas al procesamiento - Discusión de alternativas. ### Descarga masiva - ¿Cómo descargar masivamente PDFs desde CMF? --- # Procesamiento Tomemos dos ejemplos. .pull-left[ #### EEFF-cencosud-2022.pdf Nos interesa extraer el monto de cuentas por pagar en regímenes fiscales preferenciales (cuentas preferenciales). - Documento de 36 páginas. - Información financiera detallada de la empresa con texto y tablas. - Todas las tablas son imágenes de baja resolución. - Hay más información de la necesaria. ] .pull-right[ #### directorio-cencosud-2025.pdf Nos interesa extraer la porción de mujeres en el directorio (composición directorio). - Documento de una sola página. - Información general de los miembros directivos en una tabla. - Tabla en formato pdf, con texto legible. - No tenemos información sobre el género de los directivos, sólo rut y nombre. ] Nuestro procesamiento tiene que ser capaz de abordar ambos tipos de documentos y extraer ambos tipos de información paralelamente. --- # Leer imágenes .pull-left[ ### Cuentas preferenciales - Este paso es fundamental para procesar las tablas en este documento. - Capturamos imágenes de cada página. - Un algoritmo óptico reconoce caractéres y sus posiciones. - Ahora las palabras en las imagenes son texto legible por computadora.  ] .pull-right[ ### Composición directorio - En este caso, este paso es redundante e innecesario. - Corre el riesgo de malinterpretar algún caracter.  ] ``` python !ocrmypdf -l spa --invalidate-digital-signatures --force-ocr -O0 "./pdfs/EEFF-cencosud-2022.pdf" "./ocrpdfs/EEFF-cencosud-2022.pdf" > /dev/null 2>&1 ``` --- # Transformación de PDF a texto - La librería PyMuPDF parcela los PDF y devuelve una linea de texto ordenada. - Para las __Cuentas preferenciales__ esto resulta en una linea muy larga. - Para la __Composición directorio__ pasamos de un cuadro como este:  A la siguiente linea de texto, --- # Transformación de PDF a texto ``` python def extract_text_from_pdf(pdf_path): with pymupdf.open(pdf_path) as doc: text = chr(12).join([page.get_text() for page in doc]) return text pdf_text1 = extract_text_from_pdf(EEFF) pdf_text2 = extract_text_from_pdf(directorio) ``` ``` r py$pdf_text2 %>% cat(sep = "\n") ``` DIRECTORES, ADMINISTRADORES Y LIQUIDADORES (Fecha Informe: 14/05/2025) Razón Social: CENCOSUD S.A. RUT: 93834000 Composición Actual del Directorio, Administradores y Liquidadores Rut Nombre Cargo Fecha Nombramiento 0-E (Extranjero) JULIO MOURA NETO Presidente 26/04/2024 5.213.938-4 CARLOS FERNANDEZ CALATAYUD Director 26/04/2024 7.012.075-5 FELIPE LARRAIN BASCUÑAN Director 26/04/2024 7.012.865-9 MANFRED PAULMANN KOEPFER Director 26/04/2024 8.953.509-3 PETER PAULMANN KOEPFER Director 26/04/2024 9.979.516-6 | [GNACIO PEREZ ALARCON Director 26/04/2024 10.780.138-3 JOSEFINA TERESITA MONTENEGRO ARANEDA Director 26/04/2024 0-E (Extranjero) | MÓNICA JIMÉNEZ GONZÁLEZ Director 26/04/2024 0-E (Extranjero) | MARÍA LEONIE ROCA . Director 26/04/2024 --- # Entrega de texto e instrucción a LLM (e.g. ChatGPT) La linea de texto anterior (`pdf_text1` y `pdf_text2`) se vuelve el contexto en el que se le da instrucciones a nuestro Large Language Model. .pull-left[ En este caso me comunico con Gemini (LLM de Google). - Le pido una tabla en formato Json en la que se: - __Cuentas preferenciales:__ Resuma las cuentas por pagar a entidades relacionadas, monto y país. - __Composición directorio:__ Resuma los miembros del directorio y prediga su género según su nombre e información disponible en internet. ] .pull-right[ ``` python from google import genai user_query = ("construye una tabla " + "en formato json que resuma las " + "cuentas por pagar a entidades relacionadas. " + "Tiene que describir el nombre de la sociedad, " + "la moneda de origen, el país, " + "el año y el monto de las " + "cuentas por pagar corrientes.") prompt = pdf_text1 + "\n\n" + user_query response1 = generate_response(prompt) ``` ] --- # Procesamiento de respuesta de LLM ### Cuentas preferenciales
-- ### Composición directorio
--- # Procesamiento de la respuesta de LLM Con estas tablas antes creadas, podemos confeccionar los indicadores de riesgo fiscal. Automáticamente, por ejemplo, al procesar la respuesta de la composición del directorio en `directorio`: ``` r compdir <- directorio %>% mutate(female = ifelse(genero == "femenino", 100, 0)) cat(paste0("- Un ",compdir$female %>% mean() %>% round(),"% del directorio son mujeres.")) ``` - Un 33% del directorio son mujeres. Y en el ejemplo de regímenes preferenciales, - En 2022 CENCOSUD reune 70.643 millones de pesos en cuentas por pagar en regímenes fiscales preferenciales, entre Perú y Uruguay. --- # Desafío: Generalización .pull-left[ Con esto ejemplificamos cómo podemos pasar de un documento PDF a un dato informativo sobre el riesgo fiscal. #### Distintas empresas - Si queremos conocer el mismo dato sobre otra empresa, basta con cambiar el documento PDF. - Hacer un `loop` sobre estos documentos nos permite construir una columna con la variable. #### Distintas preguntas - Si queremos un nuevo índice hay que cambiar la instrucción y el procesamiento de la respuesta. - Esto significa programar una función nueva. ] .pull-right[
] --- # Desafío: Generalización Podemos hacer una demostración de cómo se vería este procesamiento en para múltiples empresas a partir de una función cuyos argumentos son la carpeta donde están los PDFs y las instrucciones para el LLM. ``` r process.pdf.female.dir(x = "./pdfs/loop", instruccion = "construye una tabla en formato json que resuma las personas del directorio. Incluya: RUT de la empresa (rut_empresa), año del informe (ano_informe), nombre (nombre), apellido (apellido), y una intuicion del género en funcion del nombre y la información que puedas encontrar en internet sobre esta persona (genero) (masculino, femenino, probablemente masculino, probablemente femenino, o ambiguo).") ``` ``` ## empresa ano female ## 1 94271000 2025 0.1428571 ## 2 93834000 2025 0.3333333 ``` --- # Desafío: Críticas al proceso empleado ### OCR - La lectura óptica de los PDFs corre el riesgo de malinterpretar los caracteres. - Es la única forma de procesar las imagenes que contengan tablas. -- ### LLM - Google Gemini o ChatGPT son modelos inconsistentes, es decir, con el mismo input el output puede variar. De modo que el proceso tiene el riesgo de entregar información distinta entre repeticiones. - Esta inconsistencia es el precio por la flexibilidad que nos permite leer PDFs comprensivamente y entregar instrucciones diversas. Aunque la información está desordenada, Google Gemini la puede interpretar correctamente (a veces).  --- # Desafío: Críticas al proceso empleado  --- # Desafío: Discusión de alternativas ### OCR - Hay procesos más involucrados de OCR que pueden reconcer tablas sin reprocesar el texto que ya está en el documento. Además parcelan y se aseguran de identificar las partes dentro de las tablas. - Estas alternativas no suelen admitir distintos formatos de tablas. - Y en mi experiencia tienen peor reconocimiento de caracteres que OCRmyPDF. -- ### LLM - Hay modelos de lenguaje largo que tienen objetivos particulares y que su output es determinístico. - Estos modelos son más aceptados en la literatura. También en trabajos en finanzas. - No tengo experiencia con ellos, a priori entiendo que tienen funciones específicas, de modo que no son flexibles en las instrucciones que pueden seguir. --- # ¿Cómo descargar masivamente PDFs? El proceso involucra crear un usuario vitual que: - Navegue por la CMF. - Identifique los links de descarga. - Baje los documentos. No es llegar y correr el documento que enviaste. A priori, tengo que dedicar tiempo para aprender `selenium` (Tutoriales de mínimo 15 horas). 