¿Medicamento o no? Técnicas de búsqueda semántica y clasificación por IA para la comparación de precios en Brasil
El problema
En resumen: No sabemos si un ítem es realmente un medicamento o no.
Más de 15 millones de brasileños carecen de acceso a medicamentos esenciales, en parte debido a la ineficiencia en la contratación pública. La falta de procesos estandarizados, la opacidad y la falta de datos estructurados obstaculizan la toma de decisiones y la fiscalización, lo que contribuye al sobreprecio y a la corrupción.
La nueva Ley de Contrataciones Públicas (14.133/2021) ordenó la creación del Portal Nacional de Contrataciones Públicas (PNCP), que centraliza las compras de entidades nacionales y subnacionales. Para mejorar la eficiencia en el sector salud, la Ley exige que, al realizar compras para el sistema universal de salud, las entidades consulten un «Banco de Precios de Salud», una base de datos especializada que proporciona precios de referencia para medicamentos basados en compras históricas.
Sin embargo, actualmente es imposible monitorear los precios de los medicamentos utilizando el PNCP. Solo en 2024 se publicaron alrededor de 12 millones de artículos de compra en el portal, pero no existe una forma de identificar sistemáticamente cuáles de esos artículos son medicamentos.
¿Por qué utilizar Inteligencia Artificial?
En resumen: ¡Tenemos demasiados datos sin estandarizar y muy poco tiempo!
Actualmente, la descripción de los artículos de contratación pública (especialmente medicamentos) en Brasil no siempre sigue un catálogo estándar. Esto dificulta y ralentiza la comparación de precios entre artículos similares, y las comparaciones manuales serían muy costosas. A una persona le toma aproximadamente 90 minutos identificar manualmente 100 artículos comprados buscando sus descripciones en un catálogo. Con IA, este tiempo se reduce a segundos.
La solución
En resumen: Utilizamos un modelo de «embeddings» basado en LLM para clasificar si un artículo es un medicamento, comparando su descripción con un catálogo existente.
Vinculamos las descripciones de los artículos de contratación pública con las entradas del catálogo de bienes y servicios, utilizando los datos de contratación abierta publicados en la PNCP y el Sistema de Catálogo de Materiais e Serviços do Governo Federal (CATMAT/CATSER), el catálogo federal de Brasil. En la PNCP las descripciones de los bienes y servicios adquiridos aparecen como texto libre en los campos de las descripciones de los ítems asociados a las licitaciones y adjudicaciones. Utilizamos un modelo de incrustación basado en LLM para asociar cada ítem de la PNCP relacionado con medicamentos con una entrada del CATMAT (identificada por su código de catálogo, codeBr), basándonos en la similitud semántica, y luego aplicamos un umbral de similitud para decidir si el ítem debe clasificarse como medicamento.
El proyecto Medicamentos Transparentes fue desarrollado con el apoyo del programa acelerador de impacto Lift de OCP por una coalición de socios, entre los que se incluyen la organización de la sociedad civil Transparência Brasil y la Controladoria-Geral da União (CGU), con la colaboración de la Secretaría de Gestión e Innovación (SEGES), que forma parte del Ministerio de Gestión e Innovación en los Servicios Públicos, responsable del sistema federal de contratación electrónica y que gestiona el PNCP, entre otros socios.
Resultados
En resumen: En las pruebas, el modelo identificó correctamente la mayoría de las compras de medicamentos.
Es posible calcular la precisión, la exhaustividad y la exactitud general del modelo a través de sus predicciones. En nuestras pruebas, utilizando una muestra de 1000 medicamentos etiquetados manualmente, el modelo alcanzó una precisión del 98% al predecir si un ítem determinado es un medicamento o no, y una exactitud del 86% al predecir el codeBr del medicamento del catálogo nacional.
Enfoque técnico detallado
Esta sección describe el enfoque técnico detallado que utilizamos para desarrollar la solución. Como se explicó en nuestra entrada anterior del blog: «Una introducción sencilla a la aplicación de la IA en las compras», vamos a describir la tarea, seleccionar el método, delimitar la tarea, comprender los datos de entrada y seleccionar el modelo.
- 1. Descripción de la tarea
En nuestro caso, la tarea consiste en buscar descripciones de ítems similares a los de un catálogo de medicamentos existente. Nuestra tarea se basa en la similitud semántica de oraciones. Queremos comparar la descripción de un ítem del PNCP con las descripciones del catálogo, asignar una puntuación de similitud y, a continuación, utilizar esa puntuación para clasificar el ítem como medicamento o no.
- 2. Selección del método
Para la similitud de oraciones, el método más apropiado consistió en convertir las descripciones de medicamentos del PNCP en representaciones vectoriales mediante un Modelo de Lenguaje Grande (LLM) y compararlas con todos los ítems del catálogo utilizando la similitud del coseno. Dado que CATMAT utiliza vocabulario controlado para describir los ítems del catálogo —donde cada categoría de productos tiene un conjunto definido de términos y atributos—, podemos usar esta estructura para optimizar la búsqueda. En el proceso de producción, primero realizamos un prefiltro léxico para detectar los principios activos del grupo de medicamentos de CATMAT en la descripción del ítem. Luego, comparamos la representación (embedding) de cada ítem únicamente con las entradas de CATMAT que comparten esos mismos principios activos, seleccionando la coincidencia más cercana y su código de catálogo (codeBR).
- 3. Limitación de la tarea
Según esta formulación, la tarea no consiste en interpretar cada ítem de adquisición publicado en el PNCP, ni en buscar cada ítem en todo el catálogo, sino en realizar una búsqueda restringida centrada en la identificación de medicamentos. Los ítems con un índice de similitud de 0,5 o superior se clasifican como medicamentos.
- 4. Análisis de los datos de entrada
Nuestros datos de entrada consistieron en descripciones de ítems en texto libre en portugués procedentes del PNCP. Estas descripciones suelen ser breves, inconsistentes y confusas: pueden omitir acentos, abreviar la dosis y la presentación, o combinar el nombre del producto, las concentraciones y la información del envase en un solo campo.
Por ejemplo, una descripción de catálogo como “267203 – Dipirona Sódica, Dosis: 500 MG – Comprimido” (código Br 267203 en CATMAT) puede aparecer en el PNCP como “Dipirona S. 500 mg comp.”. En este caso, el prefiltro léxico, primero, vincula la descripción del PNCP con el grupo CATMAT para “dipirona sódica”, y el modelo de representación (embedding) la compara únicamente con las entradas CATMAT de ese grupo, identificando la descripción del catálogo como la más similar, ya que ambas se refieren al mismo principio activo, concentración y forma farmacéutica.
En contraste, el catálogo de referencia está altamente estandarizado. Las descripciones de CATMAT incluyen atributos e identificadores estructurados, como el Padrão Descritivo de Material (PDM), que en este contexto corresponde en términos generales al ingrediente activo principal, y el codeBr. Esto convierte a CATMAT en un objetivo adecuado para la coincidencia semántica, pero también exige que el modelo reduzca la brecha entre el texto de ítems con ruido y las entradas de catálogo seleccionadas.
- 5. Selección del modelo
Utilizamos Snowflake/snowflake-arctic-embed-l-v2.0, cargado mediante Sentence Transformers, porque es un modelo de embeddings multilingüe optimizado para la recuperación semántica. Esto es importante para nuestro caso de uso, ya que el proceso trata las descripciones de los artículos del PNCP como consultas (como entrada de búsqueda) y las descripciones del CATMAT como documentos (las entradas de referencia que se recuperarán). El modelo se utiliza en un entorno de zero-shot aprendizaje cero, lo que significa que aplicamos el modelo preentrenado directamente, sin ajustarlo ni volver a entrenarlo con nuestros propios datos de adquisiciones.
Este repositorio también almacena los embeddings del catálogo en un archivo de caché, evitando la necesidad de recalcularlos en cada ejecución. El modelo de embeddings y la ubicación de la caché se pueden modificar si es necesario. Podrás encontrar más detalles en el archivo README del clasificador, y el código fuente está disponible en Transparencia-Brasil/cesta-de-precos-pncp · GitHub.
¿Listo para probarlo?
Este proyecto demuestra cómo se pueden combinar los datos de contratación abierta y las técnicas de Inteligencia Artificial para generar datos de calidad que permitan tomar mejores decisiones de adquisición. El enfoque es replicable: cualquier sistema de adquisiciones con descripciones de los artículos adjudicados y un catálogo de productos puede beneficiarse de un modelo de clasificación similar. Ya sea que el objetivo sea mejorar la compra de medicamentos, comparar precios o mejorar las adquisiciones en otro sector en general. Si te interesa aplicar estas técnicas en tu contexto, contáctanos.