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と通信します。

前提条件

このソリューションを実装するための要件は次のとおりです。
  1. Oracle Exadata Database (26ai)を作成します。
  2. Oracle Database Pluggable Database (PDB)の接続文字列を取得します。
ノート

Azure OpenAI Foundryサービスの割当て制限の引上げをリクエストするには、Microsoft Foundryモデルの割当て制限と制限に関するAzure OpenAIを参照してください。
  • この解答には、次のステップがあります。

    1. データベースのスキーマを作成します。
      1. 現在の状態のデータベース表を作成します。
      2. AI Vectorを将来の状態で使用するようにスキーマを更新します。
    2. Azure OpenAIを作成します。
      1. テキスト埋込みモデルをデプロイします。
    3. Azure Machine Learningを作成します。
      1. コンピュート・インスタンスを作成します。
        1. コンピュート・インスタンスを使用してノートブック・コードを実行します。
      2. Pythonノートブックを作成します。
        1. 既存の表にサンプル・データをロードします。
        2. Oracle AI Vector Searchでデータをエンリッチします。
        3. セマンティック検索問合せを実行します(マジック問合せ)。

    次のステップ: 「Oracle AI Database」タブに切り替えて、ステップバイステップの手順に従います。

  • Oracle AI Database表の作成(現在の状態)

    1. Oracle Exadata Databaseに接続します。手順については、「接続- Exadata Database」の項を参照してください。
    2. データベースに新しいユーザーを作成し、そのユーザーにデータベースへの接続を許可するdbaロールを付与します。
      
      create user DEMO_USER identified by "demo****password";
      grant connect, dba to DEMO_USER;
    3. 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表を更新します。

    1. Oracle AI Databaseで次のSQL文を実行して、製品表を変更し、ベクトル列を追加します:
      ALTER TABLE product  ADD (title_embedding VECTOR(3072, FLOAT32));
    2. Oracle AI Databaseで次のSQL文を実行して、AI論理識別用のNULLタイトル値を持つ行を更新します。
      
      UPDATE "DEMO_USER"."PRODUCT"
      SET title = 'Missing Title'
      WHERE title IS NULL;

    次のステップ: 「Azure OpenAI」タブに切り替えて、ステップバイステップの手順に従います。

  • 次に、Azure OpenAIリソースを作成するステップを示します。

    1. Azureポータルから、Azure OpenAIに移動します。このスクリーンショットは、Azure OpenAIにナビゲートする方法を示しています。
    2. 左側のナビゲーション・メニューで、「Foundryで使用」セクションを見つけて、「Azure OpenAI」を選択します。このスクリーンショットは、Azure OpenAIにナビゲートする方法を示しています。
    3. 「+作成」ボタンを選択します。
      • 上部のツールバーで「+作成」を選択できます。
      • ページの中央にある「+ Create」ボタンを「No Azure OpenAI to display」で選択します。
    4. 「+作成」ドロップダウン・リストから、「Azure OpenAI」オプションを選択して、「Azure OpenAIの作成」ワークフローを開始します。
    5. 「Azure OpenAIの作成」ワークフローの「基本」タブで、次の情報を入力します:
      1. 「サブスクリプション」ドロップダウン・リストから、Azureサブスクリプションを選択します。
      2. 既存のリソース・グループを選択するか、「新規作成」を選択して作成します。
      3. 選択したサブスクリプション内で一意のリソース「名前」を入力します。英数字とハイフンのみが使用可能です。値は2から64文字の長さにする必要があり、ハイフンで開始または終了することはできません。
      4. サイズ設定と容量に必要な価格設定階層を選択します。詳細は、全価格詳細の表示を参照してください。
      5. 「コンテンツ・レビュー・ポリシー」セクションで、ポリシー情報およびリンクを確認します。
      6. 先に進むには、「Next」ボタンを選択します。
      このスクリーンショットは、Azure OpenAIの作成方法を示しています。
    6. 「Azure OpenAIの作成」ワークフローの「ネットワーク」タブで、次の情報を入力します:
      1. 「タイプ」セクションで、「選択したネットワーク、Azure AIサービス・リソースのネットワーク・セキュリティの構成」オプションを選択して、特定の仮想ネットワークおよびサブネットからのアクセスを許可します。
      2. 既存の仮想ネットワークのリストから「仮想ネットワーク」を選択します。
      3. 「サブネット」のリストから、アプリケーション用に作成したサブネットを選択します。
      4. 「ファイアウォール」セクションで、ソースIP/CIDRをホワイトリストに登録しないかぎり、「アドレス範囲」フィールドを空白のままにできます。
      5. 先に進むには、「Next」ボタンを選択します。
      このスクリーンショットは、Azure OpenAIの作成方法を示しています。
    7. 「Azure OpenAIの作成」ワークフローの「タグ」タブで、次の情報を入力します:
      1. タグに「名前」および「値」を追加します。複数のタグを追加できます。
      2. 先に進むには、「Next」ボタンを選択します。
      このスクリーンショットは、Azure OpenAIの作成方法を示しています。
    8. 「Azure OpenAIの作成」ワークフローの「確認して送信」タブで、情報を確認します。「作成」ボタンを選択してリソースの作成を開始するか、「前」を選択して必要な変更を行います。このスクリーンショットは、Azure OpenAIの作成方法を示しています。
    9. 「Microsoft Foundry」→「Use with Foundry」→「Azure OpenAI」から、新しく作成した「Azure OpenAI」リソースに移動します。次に、「Azure OpenAI」→「Overview」で、「Explore Foundry portal」を選択してテキスト埋込みモデルをデプロイします。このスクリーンショットは、Explore Foundryポータルにナビゲートする方法を示しています。

    テキスト埋込みモデルのデプロイ

    1. Azure AI Foundryポータルで、「プレイグラウンド」セクションに移動し、「チャット」を選択します。このスクリーンショットは、デプロイメントの作成方法を示しています。
    2. 「+デプロイメントの作成」ボタンを選択します。このスクリーンショットは、デプロイメントの作成方法を示しています。
    3. デプロイメント・オプションを表示するには、「+モデルのデプロイ」ボタンを選択します。「ベース・モデルのデプロイ」オプションを選択します。
    4. モデルのリストから、「text-embedding-3-large」を選択します。このスクリーンショットは、デプロイメントの作成方法を示しています。
    5. 「text-embedding-3-largeのデプロイ」ページで、次の情報を入力します:
      1. モデルのわかりやすい一意のデプロイメント名を入力します。
      2. 「デプロイメント・タイプ」「標準」として選択し、他の構成を許可します
      3. 「モデル・バージョン」「AIリソース」および「コンテンツ・フィルタ」がデフォルトに設定されます。
      4. 要件に基づいて、このデプロイメントの「トークン/分レート制限」を設定します。たとえば、400Kに設定されます。
      5. 動的割当てを有効にします。
      6. 選択した設定でデプロイメントを作成するには、「デプロイ」を選択します。
      このスクリーンショットは、デプロイメントの作成方法を示しています。
    6. 「共有リソース」に移動し、「デプロイメント」を選択します。最近デプロイされたテキスト埋込みモデルを選択して、後からノートブックと統合するための構成情報を取得します。
      1. さらなる統合には、ターゲットURIおよびキーなどのエンドポイント情報が必要です。
      このスクリーンショットは、デプロイメントの作成方法を示しています。

    次のステップ: 「Azure Machine Learning」タブに切り替えて、ステップバイステップの手順に従います。

  • Azure Machine Learningの作成

    1. Azureポータルから、Azure Machine Learningに移動します。このスクリーンショットは、機械学習ワークスペースの作成方法を示しています。
    2. 「+作成」ボタンを選択し、ドロップダウン・リストから「新規ワークスペース」オプションを選択します。このスクリーンショットは、機械学習ワークスペースの作成方法を示しています。
    3. Azure Machine Learningワークフローの「基本」タブから、次の情報を入力します:
      1. 「サブスクリプション」ドロップダウン・リストから、Azureサブスクリプションを選択します。
      2. 既存のリソース・グループを選択するか、「新規作成」を選択して作成します。
      3. ワークスペースの「名前」を入力します。名前の長さは3から33文字の間にする必要があります。最初の文字は英数字である必要があり、リストアにはハイフンとアンダースコアを含めることができます。空白は使用できません。
      4. 「リージョン」を選択して、ワークスペースがデプロイされる物理的な場所を指定します。
      5. 新しいストレージ・アカウントを作成するか、サブスクリプション内の既存のストレージ・アカウントを選択します。ストレージ・アカウントは、ワークスペースのデフォルト・データストアとして使用されます。
      6. 新しいAzure キー・ボールト・リソースを作成するか、サブスクリプション内の既存のリソースを選択します。キー・ボールトには、ワークスペースに必要な機密情報が格納されます。
      7. 新しいAzure アプリケーション・インサイト・リソースを作成するか、サブスクリプション内の既存のリソースを選択します。ワークスペースでは、Azureのアプリケーション・インサイトを使用して、デプロイされたモデルに関するモニタリング情報を格納します。
      8. オプションで、コンテナ・レジストリ・リソースを作成するか、サブスクリプション内の既存のリソースを選択します。コンテナ・レジストリには、トレーニングおよびデプロイメントに使用するDockerイメージが格納されます。コストを最小限に抑えるために、Azureは最初のイメージを構築した後にのみ、新しい Azure Container Registryリソースを作成します。
      9. 「次: インバウンド・アクセス」ボタンを選択して続行します。
      このスクリーンショットは、機械学習ワークスペースの作成方法を示しています。
    4. Azure Machine Learningワークフローの「インバウンド・アクセス」タブで、次の情報を入力します:
      1. 「すべてのネットワーク」オプションを「パブリック・ネットワーク・アクセス」として選択します。
      2. 「次: アウトバウンド・アクセス」ボタンを選択して続行します。
      このスクリーンショットは、機械学習ワークスペースの作成方法を示しています。
    5. Azure Machine Learningワークフローの「アウトバウンド・アクセス」タブで、次の情報を入力します:
      1. 「パブリック」オプションを「ネットワーク分離」として選択します。このオプションを使用すると、コンピュートはパブリック・リソースにアクセスでき、アウトバウンド・データの移動は制限されません。
      2. 「Next : Encryption」ボタンを選択して続行します。
      このスクリーンショットは、機械学習ワークスペースの作成方法を示しています。
    6. Azure Machine Learningワークフローの「暗号化」タブから、次の情報を入力します:
      1. 「顧客管理キーを使用したデータの暗号化」チェック・ボックスの選択を解除したままにします。
      2. 「Next : Identity」ボタンを選択して続行します。
      このスクリーンショットは、機械学習ワークスペースの作成方法を示しています。
    7. Azure Machine Learningワークフローの「アイデンティティ」タブから、次の情報を入力します:
      1. 「ストレージ・アカウント・アクセス」セクションまでスクロール・ダウンし、「資格証明ベースのアクセス」オプションを「ストレージ・アカウント・アクセス・タイプ」として選択します。
      2. 「高ビジネス・インパクト・ワークスペース」チェック・ボックスの選択を解除したままにします。
      3. 「次: タグ」ボタンを選択して続行します。
      このスクリーンショットは、機械学習ワークスペースの作成方法を示しています。
    8. Azure Machine Learningワークフローの「タグ」タブから、次の情報を入力します:
      1. タグに「名前」および「値」を追加します。複数のタグを追加できます。
      2. 「次: 確認および作成>」ボタンを選択して続行します。
      このスクリーンショットは、機械学習ワークスペースの作成方法を示しています。
    9. 「Azure Machine Learning」ワークフローの「Review + submit」タブで、情報を確認します。「作成」ボタンを選択して機械学習ワークスペースを作成するか、「<前へ」を選択して必要な変更を行います。このスクリーンショットは、機械学習ワークスペースの作成方法を示しています。
    10. ワークスペースが作成されたら、「リソースに移動」ボタンを選択します。このスクリーンショットは、リソースへのナビゲート方法を示しています。
    11. Azure Machine Learningワークスペースで、「概要」を選択し、「スタジオの起動」ボタンを選択してAzure Machine Learning Studioを開きます。このスクリーンショットは、Studioを起動する方法を示しています。

    Azure Machine Learning Studio

    1. 「Machine Learning Studio」ページから、「管理」セクションに移動します。左側のメニューから、「コンピュート」を選択します。このスクリーンショットは、コンピュート・インスタンスの作成方法を示しています。
    2. 「+新規」ボタンを選択して、コンピュート・インスタンスを作成します。このスクリーンショットは、コンピュート・インスタンスの作成方法を示しています。
    3. コンピュート・インスタンスの作成ワークフローの「必須設定」セクションで、次の情報を入力します:
      1. コンピュート・インスタンスの「コンピュート名」フィールドに一意の名前を入力します。
        1. これは必須フィールドであり、コンピュート名の長さは3文字から24文字である必要があります。
        2. 有効な文字は、大文字と小文字、数字およびハイフンです。
        3. コンピュート名は文字で始める必要があります。
        4. コンピュート名は、Azureリージョン内の既存のすべての計算で一意である必要があります。
        5. ハイフンを使用する場合は、名前の後ろに少なくとも1つの文字が続く必要があります。
      2. CPU集中型の操作では、「CPU」「仮想マシン・タイプ」として選択します。
      3. 「仮想マシン・サイズ」として「Standard_E4ds_v4」を選択するか、中規模から大規模のデータセットでのデータ操作およびトレーニングに適した類似のサイズを選択します。
      4. 先に進むには、「Next」ボタンを選択します。
      このスクリーンショットは、コンピュート・インスタンスの作成方法を示しています。
    4. コンピュート・インスタンスの作成ワークフローの「スケジューリング」セクションで、次の情報を入力します:
      1. アイドル・タイムアウト後に「自動シャットダウン」トグルを有効にします。
      2. 「シャットダウンまでの時間」「60分」に設定します。
      3. 先に進むには、「Next」ボタンを選択します。
      このスクリーンショットは、コンピュート・インスタンスの作成方法を示しています。
    5. コンピュート・インスタンスの作成ワークフローの「セキュリティ」セクションで、次の情報を入力します:
      1. 「ユーザー割当て」「割当て済アイデンティティ」および「SSH」はデフォルトで無効になっています。
      2. 「仮想ネットワーク」トグルを有効にし、ドロップダウン・リストから「仮想ネットワーク」および「サブネット」を選択して、Oracle Databaseへのアクセスが構成されているこのコンピュート・インスタンス接続を構成します。
      3. 「ルート・アクセス」および「SSO」を有効にします。
      4. 先に進むには、「Next」ボタンを選択します。
      このスクリーンショットは、コンピュート・インスタンスの作成方法を示しています。
    6. 「コンピュート・インスタンスの作成」ワークフローの「アプリケーション」セクションから、変更は不要です。先に進むには、「Next」ボタンを選択します。このスクリーンショットは、コンピュート・インスタンスの作成方法を示しています。
    7. 「コンピュート・インスタンスの作成」ワークフローの「タグ」セクションから、タグを「キー」および「値」のペア文字列として入力します。複数のタグを追加できます。先に進むには、「Next」ボタンを選択します。このスクリーンショットは、コンピュート・インスタンスの作成方法を示しています。
    8. 「コンピュート・インスタンスの作成」ワークフローの「レビュー」セクションで、情報を確認します。「作成」ボタンを選択してコンピュート・インスタンスを作成するか、「戻る」ボタンを選択して必要な変更を行います。このスクリーンショットは、コンピュート・インスタンスの作成方法を示しています。
    9. コンピュート・インスタンスが作成されたら、「Machine Learning Studio」ページで「コンピュート」に移動し、「名前」リンクを選択して詳細および構成を表示します。このスクリーンショットは、コンピュート・インスタンスの作成方法を示しています。
    10. 次のステップ: Azure Machine Learning Compute - ノートブックを作成します。

    Azure Machine Learning Studio Compute - ノートブック

    1. 「Machine Learning Studio」ページから、「オーサリング」セクションに移動します。左側のメニューから「ノート」を選択します。このスクリーンショットは、Azure Machine Learningでノートブックを作成する方法を示しています。
    2. 「ノートブック」ページで、「ファイル」タブを選択し、「ユーザー」の下の自分の名前の横にある3つのドット(...)をシークします。次に、ドロップダウン・リストから「新規ファイルの作成」オプションを選択します。このスクリーンショットは、Azure Machine Learningでノートブックを作成する方法を示しています。
    3. 「ファイル名」フィールドに01_Load_Data.ipynbと入力し、「ファイル・タイプ」「ノートブック(*ipynb)」として選択します。「作成」ボタンを選択します。 このスクリーンショットは、Azure Machine Learningでノートブックを作成する方法を示しています。
    4. Pythonノートブックを編集し、次のコード・ブロックをノートブックに追加します。また、インライン・コンテンツおよびドキュメントに「マークダウン」セクションを追加できます。
      1. 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()
    5. ノートブックは、次の例のようになります。このスクリーンショットは、Azure Machine Learningでノートブックを作成する方法を示しています。
    6. 前述のステップに従って、02_Generate_Vector_Embedding.ipynbという名前の別のノートブックを作成し、次のコード・スニペットを追加します。
      1. api_keyおよびazure_endpointの値を、テキスト埋込みモデルの詳細の実際の値で更新します。
      2. 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()
    7. 前のステップに従って、最後のPythonノートブック・ファイル03_Semantic_Search.ipynbを追加し、次のコード・セクションを追加します。
      1. api_keyおよびazure_endpointの値を、テキスト埋込みモデルの詳細の実際の値で更新します。
      2. 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()
    8. 各ノートブック内のコードを次の順序で実行します。
      1. 01_Load_Data: パブリック・データ・セットから小売店カタログ・サンプル・データをプルし、Oracle Databaseに挿入します。
      2. 02_Generate_Vector_Embeeding: 製品タイトルのベクトル・データを生成し、製品ベクトル列に更新します。
      3. 03_Semantic_Search: ユーザー検索テキストのベクトル埋込みを生成し、距離アルゴリズムを使用して「製品」表からレコードを選択し、一致する結果のために出力に表示します。