Как разрабатывать приложения ИИ, управляемые данными: руководство по созданию услуг ИИ непосредственно из базы данных

Как разрабатывать приложения ИИ, управляемые данными: руководство по созданию услуг ИИ непосредственно из базы данных

8 января 2024 г.

По мере того как услуги искусственного интеллекта и данные, которые они потребляют и создают, становятся все более важными и распространенными в различных приложениях и процессах, растут и платформы и архитектуры, на которых они построены. Как обычно, не существует «одного размера, подходящего всем», однако здесь кратко представлен оптимизированный подход к таким архитектурам приложений ИИ, управляемых данными.

Весь упомянутый исходный код и многое другое можно найти здесь, а также бесплатный документ «Разработка с Oracle AI и службами баз данных: поколение, видение, речь, язык и OML» (где все варианты использования основаны на 17 целях ООН в области устойчивого развития), где еще много примеров можно найти здесь.

Часто в одном приложении ИИ необходимо выполнить несколько сетевых вызовов, что влечет за собой вызовы служб ИИ, а также вызовы для извлечения и сохранения контента (будь то текст, аудио, изображения, видео и т. д.), который является входными или выход. Постоянная информация затем часто обрабатывается и анализируется, и в ответ выполняются дополнительные вызовы, искусственный интеллект или другие.

База данных Oracle предоставляет возможность выполнять вызовы к другим службам, как искусственного интеллекта, так и другим, независимо от того, находятся ли они в Oracle Cloud или за его пределами.< /п>

Когда вызовы вместо этого выполняются из самой базы данных, это обеспечивает оптимизированную архитектуру с различными преимуществами, включая:

    <ли>

    Уменьшение сетевых вызовов, что снижает задержку.

    2. Сокращение сетевых вызовов, что повышает надежность.

    3. Транзакционные (ACID) операции с искусственным интеллектом и другими данными (и даже обмен сообщениями при использовании TxEventQ), которые позволяют избежать необходимости в идемпотентной/дублирующейся логике обработки и т. д., а также связанных с этим ненужных ресурсов.

    4. Оптимизация обработки обусловлена ​​локальностью данных, независимо от того, хранятся ли эти данные непосредственно в базе данных, хранилище объектов или другом источнике. Это связано с тем, что база данных Oracle обеспечивает надежный функциональный интерфейс для глупых сегментов объектного хранилища, а база данных предоставляет множество возможностей для синхронизации или оптимальной работы с данными, находящимися в хранилище объектов и других источниках данных.

    5. Повышенная безопасность благодаря общему механизму аутентификации и повторному использованию надежной базы данных и облачной инфраструктуры безопасности.

    6. Уменьшение общей конфигурации, поскольку вызовы осуществляются из центрального пункта. Точка входа в саму базу данных может быть представлена ​​как конечная точка Rest (с использованием ORDS) одним щелчком мыши, и, конечно же, для доступа к базе данных также можно использовать драйверы на разных языках.

    7. Преимущества векторной базы данных. Эта тема представляет собой отдельный блог, и я выпущу его в качестве продолжения, тем более что Oracle уже добавила и добавляет несколько мощных функций в этой области.

    8. Машинное обучение баз данных Oracle. Помимо различных сервисов искусственного интеллекта, сама база данных Oracle уже много лет имеет механизм машинного обучения. OML оптимизирует жизненный цикл машинного обучения, предлагая масштабируемые инструменты SQL, R, Python, REST, AutoML и инструменты без написания кода с более чем 30 алгоритмами в базе данных, улучшая синхронизацию и безопасность данных за счет обработки данных непосредственно в базе данных.

    9. Автономная база данных Oracle. Выберите искусственный интеллект, который позволяет запрашивать данные на естественном языке и генерировать SQL, специфичный для вашей базы данных.

    10. Автономная база данных Oracle. AI Vector Search, включающий новый тип векторных данных, векторные индексы и SQL-операторы векторного поиска, позволяет базе данных Oracle хранить семантическое содержимое документов, изображений и других неструктурированных данных в виде векторов и использовать их для быстрого выполнения запросов на сходство. .

    Эти новые возможности также поддерживают RAG (Поисковая расширенная генерация), которая обеспечивает более высокую точность и позволяет избежать раскрытия личных данных путем включения их в данные обучения LLM.

    Опять же, существует множество различных процессов и требований к приложениям ИИ, но базовое сравнение двух подходов можно визуализировать следующим образом:

    Кодекс

    В базе данных можно использовать несколько разных языков, что позволяет реализовать в ней различную логику приложения. К ним относятся Java, JavaScript и PL/SQL. Здесь приведены примеры PL/SQL, которые можно выполнить из меню Действия с базой данных ->>gt; SQL в консоли OCI, из инструмента командной строки SQLcl (который предварительно установлен в OCI Cloud Shell или его можно загрузить), из SQLDeveloper, VS Code (где у Oracle есть удобный плагин) и т. д.

    Есть также несколько способов позвонить в ИИ и другие службы. Стандартные вызовы Rest с использованием пакета UTL_HTTP базы данных или выборки из JavaScript и т. д. являются одним из подходов. Если службы ИИ работают в OCI (Oracle Cloud), то также можно использовать OCI SDK, написанные для всех основных языков.

    Я считаю, что использование пакета DBMS_CLOUD.send_request для всех вызовов служб OCI (а не, например, более конкретных вызовов OCI SDK, таких как DBMS_CLOUD_OCI_AIV_AI_SERVICE_VISION), является самым простым и наиболее динамичным подходом.

    Мы начинаем с создания учетных данных, на которые можно ссылаться и повторно использовать для всех вызовов наших облачных служб, и которые просто включают информацию из вашей учетной записи/конфигурации 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;
    

    Далее, прежде чем мы рассмотрим основную программу/функцию, давайте быстро взглянем на таблицу, в которой мы будем сохранять результаты AI. Обратите внимание: в этом случае в таблице есть столбцы как для JSON из возврата вызова AI, так и для текста. поле, созданное на основе ключевых полей в формате JSON для быстрого ознакомления, поиска и т. д.

    Опять же, структуры таблиц, использование SQL/реляционного формата по сравнению с JSON и т. д. могут различаться, и опять же, это отличный пример многоцелевой базы данных Oracle, где вы можете использовать различные модели и типы данных.

    Например, стоит обратить внимание на функцию JSON Duality в базе данных Oracle, поскольку она позволяет получать доступ к одним и тем же данным с использованием SQL/реляционных API, а также JSON и даже API 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));
    /
    

    А теперь простая функция, которая представляет собой сердце архитектуры... Здесь мы видим вызов DBMS_CLOUD.send_request с созданными нами учетными данными и URL-адресом конечной точки операции службы (AI) (analyzeImage работу службы Oracle Vision AI в данном случае).

    Полезная нагрузка JSON тела состоит из функций службы, которые мы хотели бы использовать, и любой другой конфигурации, а также аргументов операции, которые в данном случае включают место хранения объекта изображения (еще Вариантом может быть предоставление массива байтов изображения напрямую/встроенным как часть полезных данных).

    Затем результат JSON извлекается из ответа, некоторые его элементы для удобства анализируются в текстовое поле, а JSON, текст и т. д. сохраняются, как упоминалось ранее.

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

    Мы также можем представить функцию как конечную точку Rest программно, используя следующее:

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

    Анализ и текстовый поиск результатов ИИ

    Эта архитектура также делает анализ и текстовый поиск всех результатов ИИ удобным и эффективным. Отсюда можно выполнить дополнительную обработку и анализ. Давайте рассмотрим три утверждения, которые обеспечат нам простой в использовании текстовый поиск результатов нашего ИИ.

    * Сначала мы создаем индекс для текстового поиска в нашей таблице aivision_results.

    * Затем мы создаем функцию, которая ищет заданную строку, используя мощную функциональность contains, или мы можем дополнительно/необязательно использовать пакет DBMS_SEARCH для поиска в нескольких таблицах и возврата рекурсор результатов.

    * Наконец, мы предоставляем функцию как конечную точку Rest.

    Это так просто.

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

    В заключение…

    Это был краткий блог, показывающий архитектурный шаблон для разработки приложений ИИ, управляемых данными, путем вызова служб ИИ непосредственно из базы данных.

    Большое спасибо за чтение. Если у вас возникнут вопросы или отзывы, пожалуйста, дайте мне знать.


    Также опубликовано здесь


    Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE