外部表のベクトル

外部表はVECTOR型の列を使用して作成できるため、外部ファイルに格納されているテキスト形式またはバイナリ形式で表されるベクトル埋込みをOracle DatabaseでVECTORデータ型としてレンダリングできます。

VECTORデータを外部表に格納する機能は、AIワークフローに関連する膨大な量のデータを考慮すると有益な場合があります。外部表を使用すると、データベースをセマンティック検索エンジンとして使用しながら、ベクトル埋込みおよびコンテキスト情報をデータベースの外部に格納する便利なオプションが提供されます。

次のタイプの外部ファイルでは、外部表のVECTOR列がサポートされます:
  • CSV
  • Parquet
  • Avro
  • ORC
  • Dmp

VECTOR列を含む外部表にアクセスするには、ORACLE_LOADERORACLE_DATAPUMPおよびORACLE_BIGDATAドライバを使用します。選択したドライバによってファイル・データがデータベースにロードされたら、結合、SQL関数、集計などの任意のSQL操作(任意のSQLインタフェースでサポート)で外部表の行を操作できます。

任意の次元形式およびストレージ形式のベクトルがサポートされています。ベクトルがSPARSEの場合、データは、配列またはリスト形式ではなくテキストとして指定する必要があります。

VECTOR型の列は、明示的に作成された外部表と、SELECT文の一部として作成されたインライン外部表の両方に含めることができます。この方法の利点は、データベースにロードする前に外部表のベクトルにアクセスするために、静的表を事前に定義する必要がないことです。外部表のマッピングは、SQL問合せで外部表が使用されている間のみ保持されます。例については、「インライン外部表の問合せ」を参照してください。SQL問合せ操作の一部として外部表マッピングがどのように作成されるかを示しています。問合せが完了すると、外部表のマッピングはデータベースから破棄されます。

また、row_limiting_clauseは、外部表を参照するSELECT文で使用できます。内部表と外部表は、同じ問合せで参照できます。CREATE TABLE AS SELECT文を使用すると、VECTOR列を含む外部表から選択して内部表を作成できます。同様に、INSERT INTO SELECT文を使用すると、SELECT副問合せでコールされる外部表から内部表に値を挿入できます。

ノート:

  • 現在、外部表はマルチベクトル類似検索ではサポートされていません。
  • 現在、HNSW索引およびIVF索引は、外部表に格納されているVECTOR列には作成できません。

外部表のベクトル埋込みには、次の問合せのように、内部表を使用する場合と同じ方法で類似検索で使用するためにアクセスできます:

SELECT id, embedding 
FROM external_table 
ORDER BY VECTOR_DISTANCE(embedding, '[1,1]', COSINE)
FETCH APPROX FIRST 3 ROWS ONLY WITH TARGET ACCURACY 90;

次の例は、VECTOR列を含む外部表を作成するために使用される構文をアクセス・ドライバごとに示しています:

  • ORACLE_LOADERの使用:
    CREATE TABLE ext_vec_tab1(
      v1 VECTOR,
      v2 VECTOR
    ) 
      ORGANIZATION EXTERNAL
      (
        TYPE ORACLE_LOADER
        DEFAULT DIRECTORY my_dir
        ACCESS PARAMETERS
        (
          RECORDS DELIMITED BY NEWLINE
          FIELDS TERMINATED BY ":"
          MISSING FIELD VALUES ARE NULL
        )
        LOCATION('my_ext_vec_embeddings.csv')
      )
    REJECT LIMIT UNLIMITED;
  • ORACLE_DATAPUMPの使用:
    -- First create the table with the loader
    CREATE TABLE dp_ext_tab(
      country_code         VARCHAR2(5),
      country_name         VARCHAR2(50),
      country_language     VARCHAR2(50),
      country_vector       VECTOR(*,*)
    )
      ORGANIZATION EXTERNAL 
      (
        TYPE ORACLE_LOADER
        DEFAULT DIRECTORY my_dir
        ACCESS PARAMETERS 
        (
          RECORDS DELIMITED BY NEWLINE
          FIELDS TERMINATED BY ":"
          MISSING FIELD VALUES ARE NULL
          (
            country_code         CHAR(5),
            country_name         CHAR(50),
            country_language     CHAR(50),
            country_vector       CHAR(10000)
          )
        )
        LOCATION ('ext_vectorcountries.dat')
        )
      PARALLEL 5
      REJECT LIMIT UNLIMITED;
    
    -- Then generate the dmp file
    CREATE TABLE ext_export_table
    ORGANIZATION EXTERNAL
    (
      TYPE ORACLE_DATAPUMP
      DEFAULT DIRECTORY my_dir
      LOCATION ('ext.dmp')
    )
      AS SELECT * FROM dp_ext_tab;
    
    -- Finally, create an external table with the datapump driver
    CREATE TABLE dp_ext_tab_final 
    (
      country_code         VARCHAR2(5),
      country_name         VARCHAR2(50),
      country_language     VARCHAR2(50),
      country_vector       VECTOR(3, INT8)
    )
      ORGANIZATION EXTERNAL 
      (
        TYPE ORACLE_DATAPUMP
        DEFAULT DIRECTORY my_dir
        LOCATION ('ext.dmp')
      )
      PARALLEL 5
      REJECT LIMIT UNLIMITED;
  • ORACLE_BIGDATAの使用:
    CREATE TABLE bd_ext_tab
    (
      COL1 vector(5,INT8),
      COL2 vector(5,INT8),
      COL3 vector(5,INT8),
      COL4 vector(5,INT8)
    )
      ORGANIZATION external
      (
        TYPE ORACLE_BIGDATA
        DEFAULT DIRECTORY my_dir
        ACCESS PARAMETERS
      (
        com.oracle.bigdata.credential.name\=OCI_CRED
        com.oracle.bigdata.credential.schema\=PDB_ADMIN
        com.oracle.bigdata.fileformat=parquet
        com.oracle.bigdata.debug=true
      )
      LOCATION ( 'https://swiftobjectstorage.<region>.oraclecloud.com/v1/<namespace>/<filepath>/basic_vec_data.parquet' )
      ) 
    REJECT LIMIT UNLIMITED PARALLEL 2;

関連項目: