Ir al contenido principal

Oracle Database 23ai - Modelos pre-armados para Generar Embedding (incrustaciones) para busquedas vectorizadas


Oracle Database 23ai introdujo la Busqueda Vectorizada por IA, una nueva y emocionante función que revoluciona la búsqueda de similitud semántica mediante la generación de vectores mediante modelos de transformación dentro de la base de datos. Con los vectores, podemos realizar búsquedas de similitud que aprovechan la semántica de los datos, más allá de la simple coincidencia de texto, para encontrar información relevante basada en el significado y el contexto.

Para ello, oracle ofrece una versión descargable del modelo MiniLM-L12-v2 de Hugging Face en formato ONNX. 

Este modelo se puede cargar directamente en la base de datos mediante las funciones DBMS_VECTOR.LOAD_ONNX_MODEL o DBMS_DATA_MINING.IMPORT_ONNX_MODEL

El modelo incluye la tokenización y los pasos de posprocesamiento necesarios para generar embeddings vectoriales sin problemas con Busqueda Vectorizada por IA en base de datos Oracle 23ai.

¿Qué es all-MiniLM-L12-v2?

El modelo all-MiniLM-L12-v2 es un modelo de transformación de oraciones compacto pero potente, ampliamente utilizado para optimizar diversas tareas de procesamiento del lenguaje natural (PLN). La documentación indica que busca la eficiencia y el alto rendimiento, y cuenta con una arquitectura de 12 capas diseñada para destacar en tareas como la similitud de oraciones y la clasificación de texto. 

Su diseño ligero permite un procesamiento más rápido y reduce la demanda computacional en comparación con modelos más grandes. A pesar de su tamaño compacto, se caracteriza por su alta precisión y fiabilidad, lo que lo convierte en una opción versátil para desarrolladores que implementan soluciones de PLN.

Cargar el modelo aumentado en la base de datos Oracle Autonoma

Repasemos los pasos para usar el modelo aumentado de embedding en la base de datos.

  • Cargar el modelo a la base de datos desde el Object Storage.
  • Generar los embeddings vectors.

Cargar el modelo a la base de datos. Especifica el nombre del archivo del modelo ONNX y la URI de ubicación del objeto en el Object Storage.

DECLARE 
  ONNX_MOD_FILE VARCHAR2(100) := 'all_MiniLM_L12_v2.onnx';
  MODNAME VARCHAR2(500);
  LOCATION_URI VARCHAR2(200) := 'https://adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com/p/eLddQappgBJ7jNi6Guz9m9LOtYe2u8LWY19GfgU8flFK4N9YgP4kTlrE9Px3pE12/n/adwc4pm/b/OML-Resources/o/';
BEGIN
  DBMS_OUTPUT.PUT_LINE('Nombre del archivo del modelo ONNX en el Object Storage es: '||ONNX_MOD_FILE); 
  --------------------------------------------
  -- Define un nombre de modelo para el modelo local
  --------------------------------------------
  SELECT UPPER(REGEXP_SUBSTR(ONNX_MOD_FILE, '[^.]+')) INTO MODNAME from dual;
  DBMS_OUTPUT.PUT_LINE('El Modelo será cargado y guardado con el nombre: '||MODNAME);
  -----------------------------------------------------
  -- Lee el archivo del modelo ONNX desde el Object Storage 
  -- al directorio data pump de la Base de Datos
  -----------------------------------------------------
  BEGIN 
    DBMS_DATA_MINING.DROP_MODEL(model_name => MODNAME);
  EXCEPTION WHEN OTHERS THEN NULL; END;
    DBMS_CLOUD.GET_OBJECT(                            
        credential_name => NULL,
        directory_name => 'DATA_PUMP_DIR',
        object_uri => LOCATION_URI||ONNX_MOD_FILE);
  -----------------------------------------
  -- Carga el modelo ONNX a la base de datos
  -----------------------------------------                   
  DBMS_VECTOR.LOAD_ONNX_MODEL(
        directory => 'DATA_PUMP_DIR',
        file_name => ONNX_MOD_FILE,
        model_name => MODNAME);
  DBMS_OUTPUT.PUT_LINE('El nuevo modelo ha sido cargado exitosamente con el nombre: '||MODNAME);
END;

Nombre del archivo del modelo ONNX en el Object Storage es: all_MiniLM_L12_v2.onnx
El Modelo será cargado y guardado con el nombre: ALL_MINILM_L12_V2
El nuevo modelo ha sido cargado exitosamente con el nombre: ALL_MINILM_L12_V2

Validar que el modelo fue importado a la base de datos.

select model_name, algorithm, mining_function from user_mining_models where  model_name='ALL_MINILM_L12_V2';

MODEL_NAME          ALGORITHM     MINING_FUNCTION
----------          ---------     ---------------
ALL_MINILM_L12_V2   ONNX          EMBEDDING

Generar los embeddings vectoriales

Genera los vectores de embeddings utilizando la función de puntuación SQL VECTOR_EMBEDDING. La función VECTOR_EMBEDDING tiene dos parámetros de entrada:
  • El modelo de embedding vectorial
  • Una expresión o nombre de columna como datos a incrustar
La salida de la función SQL VECTOR_EMBEDDING es un vector que captura las características semánticas de los datos de entrada para su uso en búsquedas de similitud en la base de datos.
Aquí, generamos vectores de incrustación utilizando "El rápido zorro marron" como entrada. A continuación se muestra una salida parcial.

SELECT VECTOR_EMBEDDING(ALL_MINILM_L12_V2 USING 'El rápido zorro marron' as DATA) AS embedding;

EMBEDDING
--------------------------------------------------------------------------------
[1.40532674E-002,-4.24734354E-002,-1.42729701E-002,3.90004814E-002,3.84781733E-0
02,-7.44695729E-003,-1.20800901E-002,2.60837115E-002,-3.97795811E-002,3.85206044
E-002,-8.92989617E-003,-5.55456802E-002,5.72643466E-002,3.43147628E-002,-3.51916
...
...

Crea una tabla con algunos datos y luego, vectorizala.

CREATE TABLE vec1 (
  id  NUMBER PRIMARY KEY,
  str VARCHAR2(128),
  v   VECTOR
);

INSERT INTO vec1 (id, str) VALUES (1, 'Twinkle, twinkle, pequeña estrella');
INSERT INTO vec1 (id, str) VALUES (2, 'Baa baa oveja negra');
INSERT INTO vec1 (id, str) VALUES (3, 'Mary tiene una pequeña oveja');
INSERT INTO vec1 (id, str) VALUES (4, 'Jack y Jill suben a la colina');
INSERT INTO vec1 (id, str) VALUES (5, 'Humpty Dumpty tiene una gran caida');
COMMIT;

Ejemplo de como crear un vector para la columna str con id = 2. 
La salida parcial se muestra a continuación.

SELECT VECTOR_EMBEDDING(ALL_MINILM_L12_V2 USING str as data) AS embedding
FROM vec1
WHERE id = 2;

EMBEDDING
--------------------------------------------------------------------------------
[-5.06732985E-002,2.79495809E-002,-2.49498505E-002,-1.40845561E-002,-4.07454036E
-002,1.19132325E-002,4.41188365E-002,-1.03995301E-001,9.50366631E-003,4.92134318
E-003,-4.72284891E-002,-8.59436914E-002,-4.93300222E-002,1.57973133E-002,-5.0117
...
...

Creando vectores para todas las columnas str. 
A continuación se muestra una salida parcial.

SELECT VECTOR_EMBEDDING(ALL_MINILM_L12_V2 USING str as data) AS embedding
FROM vec1;

EMBEDDING
--------------------------------------------------------------------------------
[-5.06732985E-002,2.79495809E-002,-2.49498505E-002,-1.40845561E-002,-4.07454036E
-002,1.19132325E-002,4.41188365E-002,-1.03995301E-001,9.50366631E-003,4.92134318
E-003,-4.72284891E-002,-8.59436914E-002,-4.93300222E-002,1.57973133E-002,-5.0117
...
...

Creando una tabla basada en una tabla existente con los vectores creados en el momento.

CREATE TABLE vec2 as
SELECT
  id,
  str,
  VECTOR_EMBEDDING(ALL_MINILM_L12_V2 USING str as data) as v
FROM vec1;  
Tabla creada.
Carga el modelo aumentado en instancias locales de Oracle Database 23ai
1. Descargua y descomprime el archivo que contiene el modelo ONNX (enlace)

$ unzip all_MiniLM_L12_v2_augmented.zip
  Archive:  all_MiniLM_L12_v2_augmented.zip
  inflating: all_MiniLM_L12_v2.onnx
  inflating: README-ALL_MINILM_L12_V2_augmented.txt

2. Inicia sesión en tu instancia de base de datos como sysdba. En este ejemplo, iniciamos sesión en una base de datos pdb llamada ORCLPDB. Reemplaza ORCLPDB con el nombre de tu base de datos.

$ sqlplus / as sysdba;
SQL> alter session set container=ORCLPDB;

3. Aplica los permisos y define el directorio de volcado de datos como la ruta donde se descomprimió el modelo ONNX. Ten en cuenta que, en este ejemplo, utilizo el esquemaOMLUSER. Reemplaza OMLUSER con el nombre de tu esquema.

SQL> GRANT DB_DEVELOPER_ROLE, CREATE MINING MODEL TO OMLUSER;
SQL> CREATE OR REPLACE DIRECTORY DM_DUMP AS '<path to ONNX model>';
SQL> GRANT READ ON DIRECTORY DM_DUMP TO OMLUSER;
SQL> GRANT WRITE ON DIRECTORY DM_DUMP TO OMLUSER;
SQL> exit

4. Inicia sesión en tu esquema.

$ sqlplus omluser/omluser@ORCLPDB;

Carga el modelo ONNX. Opcionalmente, elimina primero el modelo si ya existe uno con el mismo nombre en la base de datos.

SQL> exec DBMS_VECTOR.DROP_ONNX_MODEL(model_name => 'ALL_MINILM_L12_V2', force => true);
BEGIN
   DBMS_VECTOR.LOAD_ONNX_MODEL(
        directory => 'DM_DUMP',
        file_name => 'all_MiniLM_L12_v2.onnx',
        model_name => 'ALL_MINILM_L12_V2');
END;
/

Una vez importado, el modelo puede generar los embedings como se muestra más arriba.

Según indica Oracle, los modelos ONNX pueden ampliarse mediante una canalización especializada para funcionar con las capacidades de búsqueda vectorial de IA de Oracle Database 23ai. Esta canalización incluye pasos de preprocesamiento tanto para texto (tokenización) como para imágenes, junto con pasos de posprocesamiento como la normalización y la agrupación. Esta canalización permite a los usuarios introducir directamente datos de texto e imágenes sin procesar, ya que todo el preprocesamiento se internaliza, eliminando la necesidad de convertir manualmente las entradas a tensores. A partir de OML4Py 2.0, el cliente OML4Py optimiza este proceso ampliando los modelos de transformadores preentrenados de Hugging Face y convirtiéndolos al formato ONNX. Tras la ampliación, estos modelos pueden importarse a Oracle Database 23ai para generar embeddings para la búsqueda de similitud.

Mi nombre es José Preda.

* José es Analista de Sistemas e Ingeniero de Software con especializaciones en tecnologías de Oracle, Microsoft, redes, infraestructura tecnológica y gestión de recursos humanos. Posee más de 30 años de experiencia en el área de tecnología, es de Paraguay, vive y trabaja en San Luis, Argentina. Fue consultor, capacitador y soporte técnico para Base de Datos y herramientas de Oracle, desde el año 2013 es miembro activo del Grupo de Usuarios Oracle de Argentina del cual es miembro del directorio desde el año 2023. Es CEO de su propia Consultora: Soft San Luis, una startup especializada en brindar formación profesional, consultoría, mentoría y soluciones con tecnología Oracle y Oracle APEX a empresas, equipos de desarrollo de consultoras y a particulares. En 2025 ha sido reconocido como  Oracle ACE Pro por la Corporación Oracle por sus contribuciones a la Comunidad de Usuarios de Tecnologías de Oracle


Comentarios

Entradas populares de este blog

APEX 03 - 09 - Historial de cambios y control de código fuente para Oracle APEX (Segunda Parte)

En esta novena entrega de la SAGA Ciclo de Desarrollo para aplicaciones APEX veremos las estratégias para administrar el historial de cambios en los objetos de base de datos de nuestras aplicaciones Oracle APEX.  Comprendiendo las estrategias disponibles para administrar los objetos de base de datos Existen tres estrategias principales que se pueden adoptar para administrar los objetos del esquema de la base de datos que utiliza nuestra aplicación APEX. El primer enfoque es la opción " completamente manual ". Nosotros creamos y mantenemos los scripts SQL personalizados independientemente de la definición de la aplicación APEX. Ejecutamos nuestros propios scripts para crear tablas, vistas, triggers, paquetes y otros objetos en la primera instalación de nuestra aplicación, y para recrear o alterar adecuadamente los objetos existentes a medida que nuestro equipo entrega nuevas versiones de la aplicación para testers y usuarios de producción.  Con este enfoque, editamos los scri...

APEX 23.1 - Notificaciones Push

Las notificaciones push PWA (Progresive Web App) en Oracle APEX son mensajes instantáneos que pueden ser enviados a los usuarios de una aplicación web progresiva sin que estos tengan que estar activamente utilizando la aplicación en ese momento.  Estas notificaciones se envían directamente a los dispositivos móviles o computadoras de los usuarios, permitiendo que estos se mantengan informados sobre actualizaciones relevantes, novedades o cualquier otra información importante relacionada con la aplicación que deseemos enviarles. Las notificaciones push PWA en Oracle APEX son una herramienta poderosa para aumentar la interacción de los usuarios con la aplicación y mejorar la experiencia del usuario en general.  Algunos usos que se le dan son:  enviar recordatorios, alertas, actualizaciones de contenido, promociones, estos entre otros mensajes que ayudan a mantener a los usuarios comprometidos y conectados con la aplicación. Mediante la configuración adecuada en Oracle APEX,...

APEX 24.2 - Mejoras a la Configuración de IA y Generación de ChatBots con IA

El 15 de enero de 2025 se ha lanzado la versión de Oracle APEX 24.2 que incluye muchas características. En esta serie de blogs vamos a hablar de varias de estas nuevas y actualizadas características basandome en las presentaciones realizadas en las Oracle APEX Office Hours en español. La primera característica que veremos serán las mejoras que se han introducido a la Configuración de IA que viene con la versión 24.2 Típicamente, para configurar la IA en APEX debemos seguir los siguientes pasos: 1. Vamos a las Utilidades del Workspace 2. Ingresamos a la opción Generative IA para configurar el servicio de inteligencia artificial 3. Aquí podemos ver, administrar y crear los servicios de inteligencia artificial que utilizaremos en nuestra aplicación. 4. Si se crea algún servicio se puede elegir entre las tres opciones de proveedores de IA disponibles hasta el momento 5. En el caso de mi ejemplo, utilizare la OCI Generative IA Services para el cual se deben ingresar todos los datos de confi...