Azure Machine LearningおよびOpenAI
Oracle AI Database@Azureを使用してオンプレミス環境からMicrosoft Azureにeコマース・アプリケーションを移行し、製品カタログ・データを格納できます。オンプレミス環境のLike検索に制限されている場合は、Oracle AI Database 26aiとAzure OpenAIのOracle AI Vector Search機能を活用して、Likeベースの検索をセマンティック検索に置き換えることができます。
ソリューション・アーキテクチャ

このアーキテクチャでは、アプリケーションとOracle AI Database@Azureは仮想ネットワーク(VNET)で実行されます。アプリケーション・サーバーは、専用サブネットで実行され、クライアント・サブネットにマップされる委任サブネットを介してOracle AI Database@Azureと通信します。既存の製品カタログ・データの場合、Azure OpenAIはベクトル埋込みを生成します。Azure OpenAIワークスペース・コンピュートは、1回かぎりのベクトル埋込み生成用のバッチ・サーバーとして機能します。アプリケーション・サーバーは、リアルタイムのベクトル埋込み生成のためにAzure OpenAIと通信します。
前提条件
- Oracle Exadata Database (26ai)を作成します。
- Oracle Database Pluggable Database (PDB)の接続文字列を取得します。
Azure OpenAI Foundryサービスの割当て制限の引上げをリクエストするには、Microsoft Foundryモデルの割当て制限と制限に関するAzure OpenAIを参照してください。
この解答には、次のステップがあります。
- データベースのスキーマを作成します。
- 現在の状態のデータベース表を作成します。
- AI Vectorを将来の状態で使用するようにスキーマを更新します。
- Azure OpenAIを作成します。
- テキスト埋込みモデルをデプロイします。
- Azure Machine Learningを作成します。
- コンピュート・インスタンスを作成します。
- コンピュート・インスタンスを使用してノートブック・コードを実行します。
- Pythonノートブックを作成します。
- 既存の表にサンプル・データをロードします。
- Oracle AI Vector Searchでデータをエンリッチします。
- セマンティック検索問合せを実行します(マジック問合せ)。
- コンピュート・インスタンスを作成します。
次のステップ: 「Oracle AI Database」タブに切り替えて、ステップバイステップの手順に従います。
- データベースのスキーマを作成します。
Oracle AI Database表の作成(現在の状態)
- Oracle Exadata Databaseに接続します。手順については、「接続- Exadata Database」の項を参照してください。
- データベースに新しいユーザーを作成し、そのユーザーにデータベースへの接続を許可する
dbaロールを付与します。create user DEMO_USER identified by "demo****password"; grant connect, dba to DEMO_USER; - Oracle AI DatabaseでProductという名前の新しいデータベース表を作成します。
CREATE TABLE product ( product_id INT GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1), main_category VARCHAR2(255), title VARCHAR2(2000), average_rating FLOAT, rating_number INT, features CLOB, description CLOB, price VARCHAR2(256), images JSON, videos CLOB, store VARCHAR2(4000), categories CLOB, details CLOB, parent_asin VARCHAR2(255), bought_together CLOB ); -- Add indexes alter table "DEMO_USER"."PRODUCT" add constraint PK_PRODUCT_PRODUCTID primary key("PRODUCT_ID");
Oracle AI Vector Searchによるスキーマの最新化(将来の状態)
Azure OpenAIテキスト埋込みモデルとの統合のために、Oracle AI Database 26ai以降で使用可能なAI機能を使用するように既存のOracle AI Database表を更新します。
- Oracle AI Databaseで次のSQL文を実行して、製品表を変更し、ベクトル列を追加します:
ALTER TABLE product ADD (title_embedding VECTOR(3072, FLOAT32)); - Oracle AI Databaseで次のSQL文を実行して、AI論理識別用のNULLタイトル値を持つ行を更新します。
UPDATE "DEMO_USER"."PRODUCT" SET title = 'Missing Title' WHERE title IS NULL;
次のステップ: 「Azure OpenAI」タブに切り替えて、ステップバイステップの手順に従います。
次に、Azure OpenAIリソースを作成するステップを示します。
- Azureポータルから、Azure OpenAIに移動します。

- 左側のナビゲーション・メニューで、「Foundryで使用」セクションを見つけて、「Azure OpenAI」を選択します。

- 「+作成」ボタンを選択します。
- 上部のツールバーで「+作成」を選択できます。
- ページの中央にある「+ Create」ボタンを「No Azure OpenAI to display」で選択します。
- 「+作成」ドロップダウン・リストから、「Azure OpenAI」オプションを選択して、「Azure OpenAIの作成」ワークフローを開始します。
- 「Azure OpenAIの作成」ワークフローの「基本」タブで、次の情報を入力します:
- 「サブスクリプション」ドロップダウン・リストから、Azureサブスクリプションを選択します。
- 既存のリソース・グループを選択するか、「新規作成」を選択して作成します。
- 選択したサブスクリプション内で一意のリソース「名前」を入力します。英数字とハイフンのみが使用可能です。値は2から64文字の長さにする必要があり、ハイフンで開始または終了することはできません。
- サイズ設定と容量に必要な価格設定階層を選択します。詳細は、全価格詳細の表示を参照してください。
- 「コンテンツ・レビュー・ポリシー」セクションで、ポリシー情報およびリンクを確認します。
- 先に進むには、「Next」ボタンを選択します。

- 「Azure OpenAIの作成」ワークフローの「ネットワーク」タブで、次の情報を入力します:
- 「タイプ」セクションで、「選択したネットワーク、Azure AIサービス・リソースのネットワーク・セキュリティの構成」オプションを選択して、特定の仮想ネットワークおよびサブネットからのアクセスを許可します。
- 既存の仮想ネットワークのリストから「仮想ネットワーク」を選択します。
- 「サブネット」のリストから、アプリケーション用に作成したサブネットを選択します。
- 「ファイアウォール」セクションで、ソースIP/CIDRをホワイトリストに登録しないかぎり、「アドレス範囲」フィールドを空白のままにできます。
- 先に進むには、「Next」ボタンを選択します。

- 「Azure OpenAIの作成」ワークフローの「タグ」タブで、次の情報を入力します:
- タグに「名前」および「値」を追加します。複数のタグを追加できます。
- 先に進むには、「Next」ボタンを選択します。

- 「Azure OpenAIの作成」ワークフローの「確認して送信」タブで、情報を確認します。「作成」ボタンを選択してリソースの作成を開始するか、「前」を選択して必要な変更を行います。

- 「Microsoft Foundry」→「Use with Foundry」→「Azure OpenAI」から、新しく作成した「Azure OpenAI」リソースに移動します。次に、「Azure OpenAI」→「Overview」で、「Explore Foundry portal」を選択してテキスト埋込みモデルをデプロイします。

テキスト埋込みモデルのデプロイ
- Azure AI Foundryポータルで、「プレイグラウンド」セクションに移動し、「チャット」を選択します。

- 「+デプロイメントの作成」ボタンを選択します。

- デプロイメント・オプションを表示するには、「+モデルのデプロイ」ボタンを選択します。「ベース・モデルのデプロイ」オプションを選択します。
- モデルのリストから、「text-embedding-3-large」を選択します。

- 「text-embedding-3-largeのデプロイ」ページで、次の情報を入力します:
- モデルのわかりやすい一意のデプロイメント名を入力します。
- 「デプロイメント・タイプ」を「標準」として選択し、他の構成を許可します
- 「モデル・バージョン」、「AIリソース」および「コンテンツ・フィルタ」がデフォルトに設定されます。
- 要件に基づいて、このデプロイメントの「トークン/分レート制限」を設定します。たとえば、400Kに設定されます。
- 動的割当てを有効にします。
- 選択した設定でデプロイメントを作成するには、「デプロイ」を選択します。

- 「共有リソース」に移動し、「デプロイメント」を選択します。最近デプロイされたテキスト埋込みモデルを選択して、後からノートブックと統合するための構成情報を取得します。
- さらなる統合には、ターゲットURIおよびキーなどのエンドポイント情報が必要です。

次のステップ: 「Azure Machine Learning」タブに切り替えて、ステップバイステップの手順に従います。
- Azureポータルから、Azure OpenAIに移動します。
Azure Machine Learningの作成
- Azureポータルから、Azure Machine Learningに移動します。

- 「+作成」ボタンを選択し、ドロップダウン・リストから「新規ワークスペース」オプションを選択します。

- Azure Machine Learningワークフローの「基本」タブから、次の情報を入力します:
- 「サブスクリプション」ドロップダウン・リストから、Azureサブスクリプションを選択します。
- 既存のリソース・グループを選択するか、「新規作成」を選択して作成します。
- ワークスペースの「名前」を入力します。名前の長さは3から33文字の間にする必要があります。最初の文字は英数字である必要があり、リストアにはハイフンとアンダースコアを含めることができます。空白は使用できません。
- 「リージョン」を選択して、ワークスペースがデプロイされる物理的な場所を指定します。
- 新しいストレージ・アカウントを作成するか、サブスクリプション内の既存のストレージ・アカウントを選択します。ストレージ・アカウントは、ワークスペースのデフォルト・データストアとして使用されます。
- 新しいAzure キー・ボールト・リソースを作成するか、サブスクリプション内の既存のリソースを選択します。キー・ボールトには、ワークスペースに必要な機密情報が格納されます。
- 新しいAzure アプリケーション・インサイト・リソースを作成するか、サブスクリプション内の既存のリソースを選択します。ワークスペースでは、Azureのアプリケーション・インサイトを使用して、デプロイされたモデルに関するモニタリング情報を格納します。
- オプションで、コンテナ・レジストリ・リソースを作成するか、サブスクリプション内の既存のリソースを選択します。コンテナ・レジストリには、トレーニングおよびデプロイメントに使用するDockerイメージが格納されます。コストを最小限に抑えるために、Azureは最初のイメージを構築した後にのみ、新しい Azure Container Registryリソースを作成します。
- 「次: インバウンド・アクセス」ボタンを選択して続行します。

- Azure Machine Learningワークフローの「インバウンド・アクセス」タブで、次の情報を入力します:
- 「すべてのネットワーク」オプションを「パブリック・ネットワーク・アクセス」として選択します。
- 「次: アウトバウンド・アクセス」ボタンを選択して続行します。

- Azure Machine Learningワークフローの「アウトバウンド・アクセス」タブで、次の情報を入力します:
- 「パブリック」オプションを「ネットワーク分離」として選択します。このオプションを使用すると、コンピュートはパブリック・リソースにアクセスでき、アウトバウンド・データの移動は制限されません。
- 「Next : Encryption」ボタンを選択して続行します。

- Azure Machine Learningワークフローの「暗号化」タブから、次の情報を入力します:
- 「顧客管理キーを使用したデータの暗号化」チェック・ボックスの選択を解除したままにします。
- 「Next : Identity」ボタンを選択して続行します。

- Azure Machine Learningワークフローの「アイデンティティ」タブから、次の情報を入力します:
- 「ストレージ・アカウント・アクセス」セクションまでスクロール・ダウンし、「資格証明ベースのアクセス」オプションを「ストレージ・アカウント・アクセス・タイプ」として選択します。
- 「高ビジネス・インパクト・ワークスペース」チェック・ボックスの選択を解除したままにします。
- 「次: タグ」ボタンを選択して続行します。

- Azure Machine Learningワークフローの「タグ」タブから、次の情報を入力します:
- タグに「名前」および「値」を追加します。複数のタグを追加できます。
- 「次: 確認および作成>」ボタンを選択して続行します。

- 「Azure Machine Learning」ワークフローの「Review + submit」タブで、情報を確認します。「作成」ボタンを選択して機械学習ワークスペースを作成するか、「<前へ」を選択して必要な変更を行います。

- ワークスペースが作成されたら、「リソースに移動」ボタンを選択します。

- Azure Machine Learningワークスペースで、「概要」を選択し、「スタジオの起動」ボタンを選択してAzure Machine Learning Studioを開きます。

Azure Machine Learning Studio
- 「Machine Learning Studio」ページから、「管理」セクションに移動します。左側のメニューから、「コンピュート」を選択します。

- 「+新規」ボタンを選択して、コンピュート・インスタンスを作成します。

- コンピュート・インスタンスの作成ワークフローの「必須設定」セクションで、次の情報を入力します:
- コンピュート・インスタンスの「コンピュート名」フィールドに一意の名前を入力します。
- これは必須フィールドであり、コンピュート名の長さは3文字から24文字である必要があります。
- 有効な文字は、大文字と小文字、数字およびハイフンです。
- コンピュート名は文字で始める必要があります。
- コンピュート名は、Azureリージョン内の既存のすべての計算で一意である必要があります。
- ハイフンを使用する場合は、名前の後ろに少なくとも1つの文字が続く必要があります。
- CPU集中型の操作では、「CPU」を「仮想マシン・タイプ」として選択します。
- 「仮想マシン・サイズ」として「Standard_E4ds_v4」を選択するか、中規模から大規模のデータセットでのデータ操作およびトレーニングに適した類似のサイズを選択します。
- 先に進むには、「Next」ボタンを選択します。

- コンピュート・インスタンスの「コンピュート名」フィールドに一意の名前を入力します。
- コンピュート・インスタンスの作成ワークフローの「スケジューリング」セクションで、次の情報を入力します:
- アイドル・タイムアウト後に「自動シャットダウン」トグルを有効にします。
- 「シャットダウンまでの時間」を「60分」に設定します。
- 先に進むには、「Next」ボタンを選択します。

- コンピュート・インスタンスの作成ワークフローの「セキュリティ」セクションで、次の情報を入力します:
- 「ユーザー割当て」、「割当て済アイデンティティ」および「SSH」はデフォルトで無効になっています。
- 「仮想ネットワーク」トグルを有効にし、ドロップダウン・リストから「仮想ネットワーク」および「サブネット」を選択して、Oracle Databaseへのアクセスが構成されているこのコンピュート・インスタンス接続を構成します。
- 「ルート・アクセス」および「SSO」を有効にします。
- 先に進むには、「Next」ボタンを選択します。

- 「コンピュート・インスタンスの作成」ワークフローの「アプリケーション」セクションから、変更は不要です。先に進むには、「Next」ボタンを選択します。

- 「コンピュート・インスタンスの作成」ワークフローの「タグ」セクションから、タグを「キー」および「値」のペア文字列として入力します。複数のタグを追加できます。先に進むには、「Next」ボタンを選択します。

- 「コンピュート・インスタンスの作成」ワークフローの「レビュー」セクションで、情報を確認します。「作成」ボタンを選択してコンピュート・インスタンスを作成するか、「戻る」ボタンを選択して必要な変更を行います。

- コンピュート・インスタンスが作成されたら、「Machine Learning Studio」ページで「コンピュート」に移動し、「名前」リンクを選択して詳細および構成を表示します。

- 次のステップ: Azure Machine Learning Compute - ノートブックを作成します。
Azure Machine Learning Studio Compute - ノートブック
- 「Machine Learning Studio」ページから、「オーサリング」セクションに移動します。左側のメニューから「ノート」を選択します。

- 「ノートブック」ページで、「ファイル」タブを選択し、「ユーザー」の下の自分の名前の横にある3つのドット(...)をシークします。次に、ドロップダウン・リストから「新規ファイルの作成」オプションを選択します。

- 「ファイル名」フィールドに
01_Load_Data.ipynbと入力し、「ファイル・タイプ」を「ノートブック(*ipynb)」として選択します。「作成」ボタンを選択します。
- Pythonノートブックを編集し、次のコード・ブロックをノートブックに追加します。また、インライン・コンテンツおよびドキュメントに「マークダウン」セクションを追加できます。
- Oracle Database接続文字列の「接続」値を更新します。
次のコードを実行して、必要なPythonライブラリをインストールします:
%pip install -U oracledb %pip install datasets==3.6.0次のコードを実行して、必要なすべてのライブラリで環境を設定します。
import json from datasets import load_dataset import getpass import oracledb
次のコードを実行して、データベース接続をテストします。
userpwd = getpass.getpass("Enter password: ") connection = oracledb.connect(user="DEMO_USER", password=demo****password, host="vm-*****-scan.ocidemoclients.ocidemovnet01.oraclevcn.com", port=1521, service_name="DEMOCDB1_DEMOPDB01.paas.oracle.com") print("Successfully connected to Oracle Database")次のコードを実行して、このアプローチを使用して
McAuley-Lab/Amazon-Reviews-2023 meta_Clothing_Shoes_and_JewelryデータをOracle Databaseにロードします。dataset = load_dataset("McAuley-Lab/Amazon-Reviews-2023", "raw_meta_Amazon_Fashion", split="full", trust_remote_code=True) # print(dataset[0]) userpwd = getpass.getpass("Enter password: ") connection = oracledb.connect(user="DEMO_USER", password=demo****password, host="vm-****-scan.ocidemoclients.ocidemovnet01.oraclevcn.com", port=1521, service_name="DEMOCDB1_DEMOPDB01.paas.oracle.com") print("Successfully connected to Oracle Database") cursor = connection.cursor() insert_query = """ INSERT INTO product (main_category, title, average_rating, rating_number, features, description, price, images, videos, store, categories, details, parent_asin, bought_together) VALUES (:main_category, :title, :average_rating, :rating_number, :features, :description, :price, :images, :videos, :store, :categories, :details, :parent_asin, :bought_together) """ for record in dataset: cursor.execute(insert_query, main_category=record['main_category'], title=record['title'], average_rating=record['average_rating'], rating_number=record['rating_number'], features=json.dumps(record.get('features', [])), description=json.dumps(record.get('description', [])), price=record['price'], images=json.dumps(record.get('images', {})), videos=json.dumps(record.get('videos', {})), store=record['store'], categories=json.dumps(record.get('categories', [])), details=json.dumps(record.get('details', {})), parent_asin=record['parent_asin'], bought_together=record['bought_together'] ) connection.commit() cursor.close() connection.close() - Oracle Database接続文字列の「接続」値を更新します。
- ノートブックは、次の例のようになります。

- 前述のステップに従って、02_Generate_Vector_Embedding.ipynbという名前の別のノートブックを作成し、次のコード・スニペットを追加します。
- api_keyおよびazure_endpointの値を、テキスト埋込みモデルの詳細の実際の値で更新します。
- Oracle Database接続文字列の「接続」の値を更新します。
ノート
ベクトル埋込みを生成すると、データ量に基づいてコンピュート・コストが発生します。「製品」表のレコード数を制限して、コンピュート・コストを削減します。次のコードを実行して、必要なライブラリをインストールします。%pip install openai --upgrade %pip install oracledb --upgrade次のコードを実行して、Azure OpenAIを設定し、埋込みを生成します。import pandas as pd import json import os import getpass import oracledb import openai import array import time # Set your OpenAI API Key api_type = "azure" api_key = "Adw3Y1QIG5ueN6TPUD7**************************w3AAABACOGiX0G" azure_endpoint = "https://demo-azure-openai-service.openai.azure.com/" api_version = "2024-02-01" client = openai.AzureOpenAI( azure_endpoint=azure_endpoint, api_key=api_key, api_version=api_version ) # Function to Generate the Embeddings deployment = "text-embedding-3-large" def generate_embeddings(text): response = client.embeddings.create( input=text, model=deployment ) return response.data[0].embedding # Batch Size batch_size = 100 record_count = 826108 start_id = 824101 end_id = 0 # Load your dataset userpwd = getpass.getpass("Enter password: ") connection = oracledb.connect(user="DEMO_USER", password=demo****password, host="vm-*****-scan.ocidemoclients.ocidemovnet01.oraclevcn.com", port=1521, service_name="DEMOCDB1_DEMOPDB01.paas.oracle.com") print("Successfully connected to Oracle Database") cursor = connection.cursor() select_query = """select product_id, title from product where product_id between :startid and :endid""" for i in range(start_id, record_count, batch_size): start_id = i end_id = i + batch_size # Generate embeddings for each row in the "title" column binds = [] for product_id, title in cursor.execute(select_query, startid=start_id, endid=end_id): response = generate_embeddings(title) vec = array.array("f", response) binds.append([vec, product_id]) print("Embedding completed for " + str(end_id)) connection.autocommit = True # Update the database with Vector Embeddings cursor.executemany( """update product set title_embedding = :1 where product_id = :2""", binds, ) time.sleep(2) # Close the connection connection.commit() cursor.close() connection.close()
- 前のステップに従って、最後のPythonノートブック・ファイル03_Semantic_Search.ipynbを追加し、次のコード・セクションを追加します。
- api_keyおよびazure_endpointの値を、テキスト埋込みモデルの詳細の実際の値で更新します。
- Oracle Database接続文字列の「接続」の値を更新します。
次のコードを実行して、必要なライブラリをインストールします。
%pip install openai --upgrade %pip install oracledb --upgrade次のコードを実行して入力に埋込みを生成し、データベース検索を実行します。
import os import sys import getpass import array import oracledb import openai from skimage import io import matplotlib.pyplot as plt import requests # Set your OpenAI API Key api_type = "azure" api_key = "Adw3Y1QIG5ueN6TPUD7**************************w3AAABACOGiX0G" azure_endpoint = "https://demo-azure-openai-service.openai.azure.com/" api_version = "2024-02-01" client = openai.AzureOpenAI( azure_endpoint=azure_endpoint, api_key=api_key, api_version=api_version ) # Function to Generate the Embeddings deployment = "text-embedding-3-large" def generate_embeddings(text): response = client.embeddings.create( input=text, model=deployment ) return response.data[0].embedding # Create a connection to the database userpwd = getpass.getpass("Enter password: ") connection = oracledb.connect(user="DEMO_USER", password=demo****password, host="vm-*****-scan.ocidemoclients.ocidemovnet01.oraclevcn.com", port=1521, service_name="DEMOCDB1_DEMOPDB01.paas.oracle.com") print("Successfully connected to Oracle Database") cursor = connection.cursor() search_query = """select product_id, json_value(images, '$.hi_res[0]') as image_url, title from product where json_value(images, '$.hi_res[0]') is not null order by vector_distance(title_embedding, :1, EUCLIDEAN) fetch first 5 rows only""" while True: # Get the input text to vectorize text = input("\Enter a phrase. Type quit to exit : ") if (text == "quit") or (text == "exit"): break if text == "": continue sentence = [text] response = generate_embeddings(sentence) vec = array.array("f", response) print("vector embedding generated") cursor.execute(search_query, [vec]) result = cursor.fetchall() image_urls = [] plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True for record in result: image_url = record[1] urldata = requests.get(image_url).content print("Product Id: " + str(record[0])) a = io.imread(image_url) plt.imshow(a) plt.axis('off') plt.show() # Close the connection connection.commit() cursor.close() connection.close()
- 各ノートブック内のコードを次の順序で実行します。
01_Load_Data: パブリック・データ・セットから小売店カタログ・サンプル・データをプルし、Oracle Databaseに挿入します。02_Generate_Vector_Embeeding: 製品タイトルのベクトル・データを生成し、製品ベクトル列に更新します。03_Semantic_Search: ユーザー検索テキストのベクトル埋込みを生成し、距離アルゴリズムを使用して「製品」表からレコードを選択し、一致する結果のために出力に表示します。
- Azureポータルから、Azure Machine Learningに移動します。