Esta solucion permite obtener todas las ordenes de compra para un conjunto de años del Municipio de Morón. La solución está compuesta por 4 proyectos
- MoronParser: Scrapper y Parser del portal de compras del municipio
- CEOParser: Scrapper y Parser del buscador de sociedades del BORA
- MoronParserTest: Unit tests de MoronParser
- CEOParserTest: Unit test de CEOParser
También hay un script en Python que hace Scrapping y ejecuta localmente un LLM que parsea el contenido del buscador de sociedades del BORA. El mismo se encuentra en CEOLLMParser
Este proyecto genera archivos locales en formato .json
con la siguiente estructura
graph LR
SC[Solicitud Cotización] <--1..n--> OC[Ordenes de Compra]
SC <--1..n--> ITEM[Items]
OC <--1..n--> DOC[Detalle Orden de Compra]
OC <--n..1--> EM[Empresa]
El modelo se puede encontrar en SolicitudCotizacion.cs
Este proyecto genera archivos locales en formato .json
con la siguiente estructura
graph LR
SC[Timeline] <--1..n--> OC[Items]
OC <--1..n--> DOC[Avisos]
DOC <--1..n--> EM[Tags]
El modelo se puede encontrar en Timeline.cs
y es el modelo que devuelve el buscador de sociedades del BORA.
Esta carpeta tiene el script generateCeoTimeline.py
que toma como entrada el archivo input_with_bora.csv
y genera uno nuevo con los cambios en las juntas directivas de las empresas.
Esto se logra gracias a que el archivo de entrada tiene el link al extracto del BORA en donde se nombra a la empresa. Este extracto se envía en un prompt personalizado al LLM para que genere el json
con los cambios de la junta directiva.
El modelo usado es Orca 2, del paper Orca2: Teaching Small Language Models How to Reason, en su version cuantizada Orca-2-13B-GGUF.
El script se puede modificar para leer cualquier otro archivo de cualquier otro formato. Realmente lo único que necesita es es link al BORA.
Se requiere el .Net runtime y SDK 8. Ambos se pueden descargar acá
Python 3.9, ctransformers y bs4. Se puede instalar Python desde la página oficial. Luego abrir un terminal y ejecutar
pip install ctransformers
pip install bs4
Abrir un terminal en ./MoronParser
y ejecutar dotnet run --project .\MoronParser.csproj
Abrir un terminal en ./CEOParser
y ejecutar dotnet run --project .\CEOParser.csproj
Abrir un terminal en ./CEOLLMParser
y ejecutar python generateCeoTimeline.py
En el archivo ./MoronParser/Program.cs
se pueden modificar las variables
FROM_YEAR
: El año mínimo inclusive a obtener las solicitudes de cotizaciónTO_YEAR
: El año máximo inclusive a obtener las solicitudes de cotizaciónTARGET_FOLDER
: La carpeta donde se van a guardar las solicitudes de cotización en.json
. Por defecto es "C:\CompraConcluida"
En el archivo ./CEOParser/Program.cs
se pueden modificar las variables
TARGET_FOLDER
: La carpeta donde se van a guardar los datos de las empresas con sus juntas directivasCOMPRAS_FOLDER
: La carpeta donde ya están guardadas las solicitudes de cotización
En el archivo CEOLLMParser/generateCeoTimeline.py
se pueden modificar todas las varibles para resutlados distintos. A destacar:
model_path_or_repo_id
ymodel_file
: Para usar un modelo distintogpu_layers
: Para usar más o menos memoria de GPU. Si este valor es muy alto, el script puede fallar, dependiendo la GPUthreads
: Para usar más hilos de la CPUsystem
: Para modificar el prompt
Los valores por defecto de generateCeoTimeline.py
generaron los resultados con una precisión del 96% en un equipo con un procesador Ryzen 5 3600g y gpu RTX 3060ti. La generación tardó ~50 segundos de media para los ~1800 casos, lo que son unas 25 horas de ejecución.