paint-brush
Как разрабатывать приложения ИИ, управляемые данными: руководство по созданию услуг ИИ непосредственно из базы данныхк@paulparkinson
1,801 чтения
1,801 чтения

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

к Paul Parkinson9m2024/01/07
Read on Terminal Reader

Слишком долго; Читать

В этом блоге описывается оптимизированный подход к архитектуре приложений ИИ, управляемых данными, где вызовы ИИ выполняются непосредственно из векторной базы данных Oracle.
featured image - Как разрабатывать приложения ИИ, управляемые данными: руководство по созданию услуг ИИ непосредственно из базы данных
Paul Parkinson HackerNoon profile picture
0-item

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


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


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


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


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


  1. Сокращение сетевых вызовов, что снижает задержку.


  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 приведены здесь, и их можно выполнить на странице «Действия базы данных» -> «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) (операция AnalysisImage службы 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 .


  • Затем мы создаем функцию, которая ищет заданную строку, используя мощные функциональные возможности, или мы можем дополнительно/необязательно использовать пакет 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; /

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

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


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


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