paint-brush
Comment développer des applications d'IA basées sur les données : un guide pour créer des services d'IA directement à partir de la base de donnéespar@paulparkinson
1,802 lectures
1,802 lectures

Comment développer des applications d'IA basées sur les données : un guide pour créer des services d'IA directement à partir de la base de données

par Paul Parkinson9m2024/01/07
Read on Terminal Reader

Trop long; Pour lire

Ce blog décrit une approche optimisée pour l'architecture d'applications d'IA basée sur les données, dans laquelle les appels d'IA sont effectués directement à partir de la base de données vectorielles Oracle.
featured image - Comment développer des applications d'IA basées sur les données : un guide pour créer des services d'IA directement à partir de la base de données
Paul Parkinson HackerNoon profile picture
0-item

À mesure que les services d’IA et les données qu’ils consomment et créent deviennent de plus en plus importants et répandus dans diverses applications et processus, les plates-formes et les architectures sur lesquelles ils sont construits gagnent également en importance. Comme d'habitude, il n'existe pas de solution unique. Cependant, ce qui est brièvement présenté ici est une approche optimisée de telles architectures d'applications d'IA basées sur les données.


Tout le code source mentionné et bien plus encore peut être trouvé ici , ainsi qu'un atelier gratuit « Développer avec Oracle AI et Database Services : Gen, Vision, Speech, Language et OML » (où tous les cas d'utilisation sont basés sur les 17 Objectifs de développement durable) donnant de nombreux autres exemples peuvent être trouvés ici .


Souvent, plusieurs appels réseau doivent être effectués dans une application d'IA donnée, impliquant des appels aux services d'IA ainsi que des appels pour récupérer et conserver le contenu (qu'il s'agisse de texte, d'audio, d'images, de vidéo, etc.) qui constitue l'entrée ou la conservation. sortir. Les informations persistantes sont ensuite souvent traitées et analysées davantage et des appels supplémentaires, IA ou autres, sont effectués en réaction.


La base de données Oracle offre la possibilité d'appeler d'autres services, encore une fois IA et autres, qu'ils soient au sein d'Oracle Cloud ou externes.


Lorsque les appels sont effectués depuis la base de données elle-même, cela fournit une architecture optimisée avec divers avantages, notamment :


  1. Appels réseau réduits, réduisant ainsi la latence.


  2. Appels réseau réduits, augmentant ainsi la fiabilité.


  3. Opérations transactionnelles (ACID) sur l'IA et d'autres données (et même la messagerie lors de l'utilisation de TxEventQ) qui évitent le besoin d'une logique de traitement idempotente/dupliquée, etc., et le gaspillage de ressources qui y est associé.


  4. L'optimisation du traitement est due à la localisation des données, que ces données soient stockées directement dans la base de données, dans un magasin d'objets ou dans une autre source. En effet, la base de données Oracle fournit une interface fonctionnelle robuste pour des compartiments de stockage d'objets autrement stupides, et la base de données offre de nombreuses options pour synchroniser ou exploiter de manière optimale les données en place dans le magasin d'objets et d'autres sources de données.


  5. Sécurité améliorée grâce à un mécanisme d'authentification commun et à la réutilisation d'une base de données et d'une infrastructure de sécurité cloud réputées pour leur robustesse.


  6. Configuration globale réduite car les appels sont passés à partir d’un emplacement central. Le point d'entrée de la base de données elle-même peut être exposé en tant que point de terminaison Rest (à l'aide d'ORDS) en un seul clic, et bien sûr, des pilotes dans différentes langues peuvent également être utilisés pour accéder à la base de données.


  7. Avantages de la base de données vectorielles. Ce sujet est un blog en soi, et je le publierai ultérieurement, d'autant plus qu'Oracle a ajouté et ajoute plusieurs fonctionnalités puissantes dans ce domaine.


  8. Apprentissage automatique de la base de données Oracle. En plus de divers services d'IA, la base de données Oracle elle-même dispose depuis de nombreuses années d'un moteur d'apprentissage automatique. OML rationalise le cycle de vie du ML, offrant des outils évolutifs SQL, R, Python, REST, AutoML et sans code avec plus de 30 algorithmes intégrés à la base de données, améliorant ainsi la synchronisation et la sécurité des données en traitant les données directement dans la base de données.


  9. Base de données autonome Oracle. Sélectionnez AI qui permet d'interroger des données en utilisant le langage naturel et de générer du SQL spécifique à votre base de données.


  10. Base de données autonome Oracle. AI Vector Search, qui comprend un nouveau type de données vectorielles, des index vectoriels et des opérateurs SQL de recherche vectorielle, permet à la base de données Oracle de stocker le contenu sémantique des documents, des images et d'autres données non structurées sous forme de vecteurs, et de les utiliser pour exécuter des requêtes de similarité rapides. .


    Ces nouvelles fonctionnalités prennent également en charge RAG (Retrieval Augmented Generation) qui offre une plus grande précision et évite d'avoir à exposer des données privées en les incluant dans les données de formation LLM.


Encore une fois, il existe de nombreux flux et exigences d'application d'IA différents, mais une comparaison de base des deux approches peut être visualisée de la manière suivante :

Le code

Il est possible d'exécuter plusieurs langages différents dans la base de données, permettant d'y mener diverses logiques applicatives. Ceux-ci incluent Java, JavaScript et PL/SQL. Des exemples PL/SQL sont donnés ici, et ils peuvent être exécutés à partir de la page Actions de base de données -> SQL dans la console OCI, à partir de l'outil de ligne de commande SQLcl (qui est préinstallé dans OCI Cloud Shell ou peut être téléchargé), à partir de SQLDeveloper, VS Code (où Oracle dispose d'un plugin pratique), etc.


Il existe également plusieurs façons de procéder pour appeler l’IA et d’autres services. Les appels Rest standard utilisant le package UTL_HTTP de la base de données ou la récupération à partir de JavaScript, etc., sont une approche. Si les services d'IA s'exécutent au sein d'OCI (Oracle Cloud), les SDK OCI, qui sont écrits pour tous les principaux langages, peuvent également être utilisés.


Je trouve que l'utilisation du package DBMS_CLOUD.send_request pour tous les appels de services OCI (plutôt que, par exemple, des appels SDK OCI plus spécifiques tels que DBMS_CLOUD_OCI_AIV_AI_SERVICE_VISION) est l'approche la plus simple et la plus dynamique.


Nous commençons par créer un identifiant qui peut être référencé et réutilisé pour tous nos appels de service cloud et inclut simplement les informations de votre compte/configuration 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;


Ensuite, avant d'examiner le programme/la fonction principale, examinons rapidement le tableau dans lequel nous enregistrerons les résultats de l'IA. Remarquez que dans ce cas, le tableau comporte des colonnes pour le JSON d'un retour d'appel AI et un texte. champ créé à partir des champs clés du JSON pour une référence rapide, des recherches, etc.


Encore une fois, les structures des tables, l'utilisation de SQL/relationnel vs JSON, etc., peuvent tous varier, et encore une fois, il s'agit d'un excellent exemple de base de données polyvalente Oracle dans laquelle vous pouvez utiliser différents modèles et types de données.


Par exemple, la fonctionnalité JSON Duality dans la base de données Oracle mérite d'être vérifiée car elle permet d'accéder aux mêmes données à l'aide des API SQL/relationnelles ainsi que JSON et même 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)); /


Et maintenant, la fonction simple qui caractérise le cœur de l'architecture… Ici, nous voyons un appel à DBMS_CLOUD.send_request avec les informations d'identification que nous avons créées et l'URL du point de terminaison de l'opération du service (AI) (l'opération analyseImage du service Oracle Vision AI dans ce cas).


La charge utile JSON du corps comprend la ou les fonctionnalités du service que nous aimerions utiliser et toute autre configuration ainsi que les arguments de l'opération qui, dans ce cas, incluent l'emplacement de stockage d'objets d'une image (un autre l'option serait de fournir le tableau d'octets d'image directement/intégré dans le cadre de la charge utile).


Le résultat JSON est ensuite récupéré de la réponse, certains éléments de celui-ci sont analysés dans un champ de texte pour plus de commodité, et le JSON, le texte, etc. sont conservés comme mentionné précédemment.

 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; /


Nous pouvons également exposer la fonction en tant que point de terminaison Rest par programme en utilisant les éléments suivants :

 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; /

Analyse et recherche de texte des résultats de l'IA

Cette architecture rend également l’analyse et la recherche textuelle de tous les résultats de l’IA pratiques et efficaces. À partir de là, davantage de traitements et d’analyses peuvent avoir lieu. Jetons un coup d'œil à trois déclarations qui nous fourniront une recherche textuelle facile à utiliser de nos résultats d'IA.


  • Tout d'abord, nous créons un index pour les recherches de texte sur notre table aivision_results .


  • Ensuite, nous créons une fonction qui recherche une chaîne donnée à l'aide de la puissante fonctionnalité contain , ou nous pouvons également/éventuellement utiliser le package DBMS_SEARCH pour rechercher plusieurs tables et renvoyer le curseur des résultats.


  • Enfin, nous exposons la fonction en tant que point de terminaison Rest.


C'est si 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 conclusion…

Il s'agissait d'un blog rapide montrant un modèle architectural pour développer des applications d'IA basées sur les données en appelant les services d'IA directement à partir de la base de données.


Merci beaucoup d'avoir lu et n'hésitez pas à me faire part de vos questions ou commentaires que vous pourriez avoir.


Également publié ici