paint-brush
Cómo desarrollar aplicaciones de IA basadas en datos: una guía para crear servicios de IA directamente desde la base de datosby@paulparkinson
1,756
1,756

Cómo desarrollar aplicaciones de IA basadas en datos: una guía para crear servicios de IA directamente desde la base de datos

Paul Parkinson9m2024/01/07
Read on Terminal Reader

Este blog describe un enfoque optimizado para la arquitectura de aplicaciones de IA basada en datos donde las llamadas de IA se realizan directamente desde la base de datos vectorial de Oracle.
featured image - Cómo desarrollar aplicaciones de IA basadas en datos: una guía para crear servicios de IA directamente desde la base de datos
Paul Parkinson HackerNoon profile picture
0-item

A medida que los servicios de IA y los datos que consumen y crean se vuelven más importantes y prevalentes en diversas aplicaciones y procesos, también lo hacen las plataformas y arquitecturas sobre las que se basan. Como es habitual, no existe una “talla única”, sin embargo, lo que se presenta brevemente aquí es un enfoque optimizado para este tipo de arquitecturas de aplicaciones de IA basadas en datos.


Todo el código fuente mencionado y más se puede encontrar aquí , y un taller gratuito "Desarrollo con Oracle AI y servicios de bases de datos: generación, visión, voz, lenguaje y OML" (donde todos los casos de uso se basan en los 17 de la ONU). Objetivos de Desarrollo Sostenible) que ofrecen muchos más ejemplos, se pueden encontrar aquí .


A menudo, se deben realizar múltiples llamadas de red en una aplicación de IA determinada, lo que implica llamadas a los servicios de IA, así como llamadas para recuperar y conservar el contenido (ya sea texto, audio, imágenes, video, etc.) que es la entrada o producción. Luego, la información persistente a menudo se procesa y analiza más a fondo y, como reacción, se realizan llamadas adicionales, IA o de otro tipo.


La base de datos de Oracle brinda la capacidad de realizar llamadas a otros servicios, nuevamente AI y otros, ya sea dentro de Oracle Cloud o externo.


Cuando las llamadas se realizan desde la propia base de datos, se proporciona una arquitectura optimizada con varios beneficios que incluyen:


  1. Reducción de llamadas de red, reduciendo así la latencia.


  2. Reducción de llamadas de red, aumentando así la confiabilidad.


  3. Operaciones transaccionales (ACID) sobre IA y otros datos (e incluso mensajes cuando se usa TxEventQ) que evitan la necesidad de una lógica de procesamiento idempotente/duplicada, etc., y los recursos relacionados desperdiciados allí.


  4. La optimización del procesamiento se debe a la localidad de los datos, ya sea que esos datos se almacenen directamente en la base de datos o en un almacén de objetos u otra fuente. Esto se debe a que la base de datos Oracle proporciona una interfaz funcional sólida para depósitos de almacenamiento de objetos que de otro modo serían tontos, y la base de datos proporciona muchas opciones para sincronizar u operar de manera óptima los datos existentes en el almacén de objetos y otras fuentes de datos.


  5. Seguridad mejorada gracias a un mecanismo de autenticación común y la reutilización de una base de datos y una infraestructura de seguridad en la nube famosamente robustas.


  6. Configuración general reducida ya que las llamadas se realizan desde una ubicación central. El punto de entrada a la base de datos se puede exponer como un punto final Rest (usando ORDS) con un solo clic y, por supuesto, también se pueden usar controladores en varios idiomas para acceder a la base de datos.


  7. Ventajas de las bases de datos vectoriales. Este tema es un blog en sí mismo y lo publicaré a continuación, especialmente porque Oracle ha agregado y está agregando varias características poderosas en esta área.


  8. Aprendizaje automático de bases de datos Oracle. Además de varios servicios de IA, la propia base de datos Oracle cuenta desde hace muchos años con un motor de aprendizaje automático. OML agiliza el ciclo de vida de ML, ofreciendo SQL escalable, R, Python, REST, AutoML y herramientas sin código con más de 30 algoritmos en la base de datos, mejorando la sincronización y la seguridad de los datos al procesarlos directamente en la base de datos.


  9. Base de datos autónoma de Oracle. Seleccione IA, que permite consultar datos utilizando lenguaje natural y generar SQL específico para su base de datos.


  10. Base de datos autónoma de Oracle. AI Vector Search, que incluye un nuevo tipo de datos vectoriales, índices vectoriales y operadores SQL de búsqueda vectorial, permite que Oracle Database almacene el contenido semántico de documentos, imágenes y otros datos no estructurados como vectores, y los utilice para ejecutar consultas rápidas de similitud. .


    Estas nuevas capacidades también son compatibles con RAG (Generación Aumentada de Recuperación), que proporciona mayor precisión y evita tener que exponer datos privados al incluirlos en los datos de capacitación de LLM.


Nuevamente, existen muchos flujos y requisitos de aplicaciones de IA diferentes, pero se puede visualizar una comparación básica de los dos enfoques de la siguiente manera:

El código

Es posible ejecutar varios idiomas diferentes en la base de datos, lo que permite llevar a cabo allí varias lógicas de aplicación. Estos incluyen Java, JavaScript y PL/SQL. Aquí se proporcionan ejemplos de PL/SQL y se pueden ejecutar desde la página Acciones de base de datos -> SQL en la consola OCI, desde la herramienta de línea de comandos SQLcl (que está preinstalada en OCI Cloud Shell o se puede descargar), desde SQLDeveloper, VS Code (donde Oracle tiene un complemento conveniente), etc.


También hay algunas formas de realizar llamadas a AI y otros servicios. Las llamadas Rest estándar utilizando el paquete UTL_HTTP de la base de datos o buscar desde JavaScript, etc., es un enfoque. Si los servicios de IA se ejecutan dentro de OCI (Oracle Cloud), también se pueden utilizar los SDK de OCI, que están escritos para los principales idiomas.


Considero que el uso del paquete DBMS_CLOUD.send_request para todas las llamadas a servicios OCI (en lugar de, por ejemplo, llamadas OCI SDK más específicas como DBMS_CLOUD_OCI_AIV_AI_SERVICE_VISION) es el enfoque más simple y dinámico.


Comenzamos creando una credencial a la que se puede hacer referencia y reutilizar para todas nuestras llamadas de servicio en la nube y que simplemente incluye la información de su cuenta/configuración de OCI.


 BEGIN dbms_cloud.create_credential ( credential_name => 'OCI_KEY_CRED', user_ocid => 'ocid1.user.oc1..[youruserocid]', tenancy_ocid => 'ocid1.tenancy.oc1..[yourtenancyocid]', private_key => '[yourprivatekey - you can read this from file or put the contents of your pem without header, footer, and line wraps]' fingerprint => '[7f:yourfingerprint]' ); END;


A continuación, antes de ver el programa/función principal, echemos un vistazo rápido a la tabla en la que guardaremos los resultados de AI. Observe que, en este caso, la tabla tiene columnas tanto para el JSON de una devolución de llamada de AI como para un texto. campo que se crea a partir de campos clave en el JSON para referencia rápida, búsquedas, etc.


Nuevamente, las estructuras de las tablas, el uso de SQL/relacional frente a JSON, etc., pueden variar y, nuevamente, este es un gran ejemplo de la base de datos multipropósito de Oracle donde puede usar varios modelos y tipos de datos.


Por ejemplo, vale la pena comprobar la función JSON Duality en la base de datos Oracle, ya que permite acceder a los mismos datos mediante SQL/relacional, así como JSON e incluso las API de MongoDB.

 CREATE TABLE aivision_results (id RAW (16) NOT NULL, date_loaded TIMESTAMP WITH TIME ZONE, label varchar2(20), textfromai varchar2(32767), jsondata CLOB CONSTRAINT ensure_aivision_results_json CHECK (jsondata IS JSON)); /


Y ahora, la función simple que tipifica el corazón de la arquitectura... Aquí, vemos una llamada a DBMS_CLOUD.send_request con la credencial que creamos y la URL del punto final de operación del servicio (AI) (la operación analyseImage del servicio Oracle Vision AI). en este caso).


La carga útil JSON del cuerpo consta de las características del servicio que nos gustaría usar y cualquier otra configuración, así como los argumentos de la operación que, en este caso, incluyen la ubicación de almacenamiento del objeto de una imagen (otra opción sería proporcionar la matriz de bytes de imagen directamente/incrustada como parte de la carga útil).


Luego, el resultado JSON se recupera de la respuesta, ciertos elementos del mismo se analizan en un campo de texto para mayor comodidad y el JSON, el texto, etc., se conservan como se mencionó anteriormente.

 CREATE OR REPLACE FUNCTION VISIONAI_TEXTDETECTION ( p_endpoint VARCHAR2, p_compartment_ocid VARCHAR2, p_namespaceName VARCHAR2, p_bucketName VARCHAR2, p_objectName VARCHAR2, p_featureType VARCHAR2, p_label VARCHAR2 ) RETURN VARCHAR2 IS resp DBMS_CLOUD_TYPES.resp; json_response CLOB; v_textfromai VARCHAR2(32767); BEGIN resp := DBMS_CLOUD.send_request( credential_name => 'OCI_KEY_CRED', uri => p_endpoint || '/20220125/actions/analyzeImage', method => 'POST', body => UTL_RAW.cast_to_raw( JSON_OBJECT( 'features' VALUE JSON_ARRAY( JSON_OBJECT('featureType' VALUE p_featureType) ), 'image' VALUE JSON_OBJECT( 'source' VALUE 'OBJECT_STORAGE', 'namespaceName' VALUE p_namespaceName, 'bucketName' VALUE p_bucketName, 'objectName' VALUE p_objectName ), 'compartmentId' VALUE p_compartment_ocid ) ) ); json_response := DBMS_CLOUD.get_response_text(resp); SELECT LISTAGG(text, ', ') WITHIN GROUP (ORDER BY ROWNUM) INTO v_textfromai FROM JSON_TABLE(json_response, '$.imageText.words[*]' COLUMNS ( text VARCHAR2(100) PATH '$.text' ) ); INSERT INTO aivision_results (id, date_loaded, label, textfromai, jsondata) VALUES (SYS_GUID(), SYSTIMESTAMP, p_label, v_textfromai, json_response); RETURN v_textfromai; EXCEPTION WHEN OTHERS THEN RAISE; END VISIONAI_TEXTDETECTION; /


También podemos exponer la función como un punto final Rest mediante programación usando lo siguiente:

 BEGIN ORDS.ENABLE_OBJECT( P_ENABLED => TRUE, P_SCHEMA => 'AIUSER', P_OBJECT => 'VISIONAI_OBJECTDETECTION', P_OBJECT_TYPE => 'FUNCTION', P_OBJECT_ALIAS => 'VISIONAI_OBJECTDETECTION', P_AUTO_REST_AUTH => FALSE ); COMMIT; END; /

Análisis y búsqueda de texto de resultados de IA

Esta arquitectura también hace que el análisis y la búsqueda de texto de todos los resultados de IA sean convenientes y eficientes. A partir de aquí, se pueden realizar más procesamientos y análisis. Echemos un vistazo a tres declaraciones que nos proporcionarán una búsqueda de texto fácil de usar de nuestros resultados de IA.


  • Primero, creamos un índice para búsquedas de texto en nuestra tabla aivision_results .


  • Luego, creamos una función que busca una cadena determinada usando la poderosa funcionalidad de contenido , o podríamos usar adicionalmente/opcionalmente el paquete DBMS_SEARCH para buscar múltiples tablas y devolver el cursor de resultados.


  • Finalmente, exponemos la función como un punto final de descanso.


Es así de simple.

 create index aivisionresultsindex on aivision_results(textfromai) indextype is ctxsys.context; /
 CREATE OR REPLACE FUNCTION VISIONAI_RESULTS_TEXT_SEARCH(p_sql IN VARCHAR2) RETURN SYS_REFCURSOR AS refcursor SYS_REFCURSOR; BEGIN OPEN refcursor FOR select textfromai from AIVISION_RESULTS where contains ( textfromai, p_sql ) > 0; RETURN refcursor; END VISIONAI_RESULTS_TEXT_SEARCH; /
 BEGIN ORDS.ENABLE_OBJECT( P_ENABLED => TRUE, P_SCHEMA => 'AIUSER', P_OBJECT => 'VISIONAI_RESULTS_TEXT_SEARCH', P_OBJECT_TYPE => 'FUNCTION', P_OBJECT_ALIAS => 'VISIONAI_RESULTS_TEXT_SEARCH', P_AUTO_REST_AUTH => FALSE ); COMMIT; END; /

En conclusión…

Este fue un blog rápido que muestra un patrón arquitectónico para desarrollar aplicaciones de IA basadas en datos realizando llamadas a servicios de IA directamente desde la base de datos.


Muchas gracias por leer y cualquier pregunta o comentario que pueda tener, hágamelo saber.


También publicado aquí